diff --git a/.cargo/config.toml b/.cargo/config.toml deleted file mode 100644 index e248c473..00000000 --- a/.cargo/config.toml +++ /dev/null @@ -1,137 +0,0 @@ -[build] -rustflags = [ - "-Wtrivial-casts", - "-Wtrivial-numeric-casts", - "-Wunsafe-code", - "-Wunused-lifetimes", - "-Wunused-qualifications", - # TODO: 1.63+ "-Wclippy::as-underscore", - # TODO: 1.65+ ""-Wclippy::bool-to-int-with-if", - "-Wclippy::borrow-as-ptr", - "-Wclippy::case-sensitive-file-extension-comparisons", - "-Wclippy::cast-lossless", - "-Wclippy::cast-possible-truncation", - "-Wclippy::cast-possible-wrap", - "-Wclippy::cast-precision-loss", - "-Wclippy::cast-ptr-alignment", - "-Wclippy::cast-sign-loss", - "-Wclippy::checked-conversions", - "-Wclippy::clone-on-ref-ptr", - "-Wclippy::cloned-instead-of-copied", - "-Wclippy::copy-iterator", - "-Wclippy::dbg-macro", - "-Wclippy::decimal-literal-representation", - "-Wclippy::default-trait-access", - "-Wclippy::default-union-representation", - # TODO: 1.61+ "-Wclippy::deref-by-slicing", - # TODO: 1.63+ "-Wclippy::doc-link-with-quotes", - # TODO: 1.62+ "-Wclippy::empty-drop", - "-Wclippy::empty-enum", - # TODO: on major version "-Wclippy::empty-structs-with-brackets", - "-Wclippy::enum-glob-use", - "-Wclippy::exit", - "-Wclippy::expect-used", - "-Wclippy::expl-impl-clone-on-copy", - "-Wclippy::explicit-deref-methods", - "-Wclippy::explicit-into-iter-loop", - "-Wclippy::explicit-iter-loop", - "-Wclippy::filter-map-next", - "-Wclippy::flat-map-option", - "-Wclippy::fn-to-numeric-cast-any", - # TODO: 1.62+ "-Wclippy::format-push-string", - "-Wclippy::from-iter-instead-of-collect", - "-Wclippy::get-unwrap", - "-Wclippy::if-not-else", - "-Wclippy::if-then-some-else-none", - "-Wclippy::implicit-clone", - "-Wclippy::inconsistent-struct-constructor", - "-Wclippy::index-refutable-slice", - "-Wclippy::inefficient-to-string", - "-Wclippy::inline-always", - "-Wclippy::inline-asm-x86-att-syntax", - "-Wclippy::inline-asm-x86-intel-syntax", - "-Wclippy::invalid-upcast-comparisons", - "-Wclippy::items-after-statements", - "-Wclippy::large-digit-groups", - # TODO: 1.68+ "-Wclippy::large-futures", - "-Wclippy::large-stack-arrays", - "-Wclippy::large-types-passed-by-value", - "-Wclippy::let-underscore-must-use", - "-Wclippy::let-unit-value", - "-Wclippy::linkedlist", - "-Wclippy::lossy-float-literal", - "-Wclippy::macro-use-imports", - "-Wclippy::manual-assert", - # TODO: 1.65+ "-Wclippy::manual-instant-elapsed", - # TODO: 1.67+ "-Wclippy::manual-let-else", - "-Wclippy::manual-ok-or", - # TODO: 1.65+ "-Wclippy::manual-string-new", - "-Wclippy::many-single-char-names", - "-Wclippy::map-unwrap-or", - "-Wclippy::match-bool", - "-Wclippy::match-same-arms", - "-Wclippy::match-wildcard-for-single-variants", - "-Wclippy::maybe-infinite-iter", - "-Wclippy::mem-forget", - # TODO: 1.63+ "-Wclippy::mismatching-type-param-order", - "-Wclippy::multiple-inherent-impl", - "-Wclippy::mut-mut", - "-Wclippy::mutex-atomic", - "-Wclippy::naive-bytecount", - "-Wclippy::needless-bitwise-bool", - "-Wclippy::needless-continue", - "-Wclippy::needless-pass-by-value", - "-Wclippy::no-effect-underscore-binding", - # TODO: 1.69+ "-Wclippy::no-mangle-with-rust-abi", - "-Wclippy::non-ascii-literal", - "-Wclippy::print-stderr", - "-Wclippy::print-stdout", - "-Wclippy::ptr-as-ptr", - "-Wclippy::range-minus-one", - "-Wclippy::range-plus-one", - "-Wclippy::rc-buffer", - "-Wclippy::rc-mutex", - "-Wclippy::redundant-closure-for-method-calls", - "-Wclippy::redundant-else", - "-Wclippy::redundant-feature-names", - "-Wclippy::ref-binding-to-reference", - "-Wclippy::ref-option-ref", - "-Wclippy::rest-pat-in-fully-bound-structs", - "-Wclippy::return-self-not-must-use", - "-Wclippy::same-functions-in-if-condition", - # TODO: strange failure on 1.60 "-Wclippy::same-name-method", - # TODO: 1.68+ "-Wclippy::semicolon-outside-block", - "-Wclippy::single-match-else", - "-Wclippy::stable-sort-primitive", - "-Wclippy::str-to-string", - "-Wclippy::string-add", - "-Wclippy::string-add-assign", - "-Wclippy::string-lit-as-bytes", - "-Wclippy::string-to-string", - # TODO: 1.67+ "-Wclippy::suspicious-xor-used-as-pow", - "-Wclippy::todo", - "-Wclippy::transmute-ptr-to-ptr", - "-Wclippy::trivially-copy-pass-by-ref", - "-Wclippy::try-err", - "-Wclippy::unicode-not-nfc", - "-Wclippy::unimplemented", - # TODO: 1.66+ "-Wclippy::uninlined-format-args", - # TODO: 1.70+ "-Wclippy::unnecessary-box-returns", - # TODO: 1.61+ "-Wclippy::unnecessary-join", - # TODO: 1.67+ "-Wclippy::unnecessary-safety-comment", - # TODO: 1.67+ "-Wclippy::unnecessary-safety-doc", - "-Wclippy::unnecessary-self-imports", - "-Wclippy::unnecessary-wraps", - "-Wclippy::unneeded-field-pattern", - "-Wclippy::unnested-or-patterns", - "-Wclippy::unreadable-literal", - "-Wclippy::unseparated-literal-suffix", - "-Wclippy::unused-async", - "-Wclippy::unused-self", - "-Wclippy::use-debug", - "-Wclippy::used-underscore-binding", - "-Wclippy::verbose-bit-mask", - "-Wclippy::verbose-file-reads", - "-Wclippy::wildcard-dependencies", - "-Wclippy::zero-sized-map-values", -] \ No newline at end of file diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh index 7782c767..44671ce3 100755 --- a/.clusterfuzzlite/build.sh +++ b/.clusterfuzzlite/build.sh @@ -15,10 +15,14 @@ function build_seed_corpus() { cd "$SRC"/oxigraph cargo fuzz build -O --debug-assertions -for TARGET in sparql_eval sparql_results_json sparql_results_tsv # sparql_results_xml https://github.com/tafia/quick-xml/issues/608 +for TARGET in sparql_eval sparql_results_json sparql_results_tsv sparql_results_xml n3 nquads trig rdf_xml do cp fuzz/target/x86_64-unknown-linux-gnu/release/$TARGET "$OUT"/ done build_seed_corpus sparql_results_json srj build_seed_corpus sparql_results_tsv tsv build_seed_corpus sparql_results_xml srx +build_seed_corpus n3 n3 +build_seed_corpus nquads nq +build_seed_corpus trig trig +build_seed_corpus rdf_xml rdf diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index a7a58796..00000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.241.1/containers/rust/.devcontainer/base.Dockerfile - -# [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): buster, bullseye -ARG VARIANT="bullseye" -FROM mcr.microsoft.com/vscode/devcontainers/rust:0-${VARIANT} - -# [Optional] Uncomment this section to install additional packages. -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends \ - python3 \ - python3-venv \ - python-is-python3 \ - libclang-dev - -ENV VIRTUAL_ENV=/opt/venv -RUN python -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" -RUN pip install --no-cache-dir -r python/requirements.dev.txt - -# Change owner to the devcontainer user -RUN chown -R 1000:1000 $VIRTUAL_ENV diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index e8978483..00000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,69 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.241.1/containers/rust -{ - "name": "Rust", - "build": { - "dockerfile": "Dockerfile", - "args": { - // Use the VARIANT arg to pick a Debian OS version: buster, bullseye - // Use bullseye when on local on arm64/Apple Silicon. - "VARIANT": "bullseye" - } - }, - "runArgs": ["--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined"], - - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "lldb.executable": "/usr/bin/lldb", - // VS Code don't watch files under ./target - "files.watcherExclude": { - "**/target/**": true - }, - "rust-analyzer.checkOnSave.command": "clippy", - - "python.defaultInterpreterPath": "/opt/venv/bin/python", - "python.linting.enabled": true, - "python.linting.pylintEnabled": true, - "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", - "python.formatting.blackPath": "/usr/local/py-utils/bin/black", - "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", - "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", - "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", - "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", - "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", - "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", - "python.linting.pylintPath": "/opt/venv/bin/pylint", - "python.testing.pytestPath": "/opt/venv/bin/pytest" - }, - - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "vadimcn.vscode-lldb", - "mutantdino.resourcemonitor", - "rust-lang.rust-analyzer", - "tamasfe.even-better-toml", - "serayuzgur.crates", - "ms-python.python", - "ms-python.vscode-pylance", - "esbenp.prettier-vscode", - "stardog-union.stardog-rdf-grammars" - ] - } - }, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "git submodule update --init && cargo build", - - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "vscode", - "features": { - "python": "3.10" - } -} diff --git a/.github/actions/setup-rust/action.yml b/.github/actions/setup-rust/action.yml new file mode 100644 index 00000000..09349135 --- /dev/null +++ b/.github/actions/setup-rust/action.yml @@ -0,0 +1,27 @@ +name: 'Setup Rust' +description: 'Setup Rust using Rustup' +inputs: + version: + description: 'Rust version to use. By default latest stable version' + required: false + default: 'stable' + component: + description: 'Rust extra component to install like clippy' + required: false + target: + description: 'Rust extra target to install like wasm32-unknown-unknown' + required: false +runs: + using: "composite" + steps: + - run: rustup update + shell: bash + - run: rustup default ${{ inputs.version }} + shell: bash + - run: rustup component add ${{ inputs.component }} + shell: bash + if: ${{ inputs.component }} + - run: rustup target add ${{ inputs.target }} + shell: bash + if: ${{ inputs.target }} + - uses: Swatinem/rust-cache@v2 diff --git a/.github/workflows/install_rocksdb.sh b/.github/workflows/install_rocksdb.sh new file mode 100644 index 00000000..ac2b712b --- /dev/null +++ b/.github/workflows/install_rocksdb.sh @@ -0,0 +1,11 @@ +if [ -f "rocksdb" ] +then + cd rocksdb || exit +else + git clone https://github.com/facebook/rocksdb.git + cd rocksdb || exit + git checkout v8.0.0 + make shared_lib +fi +sudo make install-shared +sudo ldconfig /usr/local/lib diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9e83790b..1bda765f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + - next schedule: - cron: "12 3 * * *" @@ -16,7 +17,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run: rustup update && rustup component add rustfmt + - uses: ./.github/actions/setup-rust + with: + component: rustfmt - run: cargo fmt -- --check clippy: @@ -25,17 +28,38 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update && rustup component add clippy - - uses: Swatinem/rust-cache@v2 - - run: cargo clippy + - uses: ./.github/actions/setup-rust + with: + version: 1.74.1 + component: clippy + - run: cargo clippy --all-targets -- -D warnings -D clippy::all working-directory: ./lib/oxsdatatypes - - run: cargo clippy + - run: cargo clippy --all-targets -- -D warnings -D clippy::all working-directory: ./lib/oxrdf - - run: cargo clippy + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./lib/oxrdfxml + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./lib/oxttl + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./lib/oxrdfio + - run: cargo clippy --all-targets --features async-tokio -- -D warnings -D clippy::all + working-directory: ./lib/oxrdfio + - run: cargo clippy --all-targets -- -D warnings -D clippy::all working-directory: ./lib/sparesults - - run: cargo clippy + - run: cargo clippy --all-targets --features async-tokio -- -D warnings -D clippy::all + working-directory: ./lib/sparesults + - run: cargo clippy --all-targets -- -D warnings -D clippy::all working-directory: ./lib/spargebra - - run: cargo clippy --all-targets --all-features + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./lib/sparopt + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./lib/oxigraph + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./python + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./cli + - run: cargo clippy --all-targets -- -D warnings -D clippy::all + working-directory: ./testsuite clippy_msv: runs-on: ubuntu-latest @@ -60,9 +84,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run: rustup update - - uses: Swatinem/rust-cache@v2 - - run: cargo install cargo-deny || true + - uses: taiki-e/install-action@v2 + with: { tool: cargo-deny } - run: cargo deny check semver_checks: @@ -71,71 +94,109 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update - - uses: Swatinem/rust-cache@v2 - - run: cargo install cargo-semver-checks || true - - run: cargo semver-checks check-release --exclude oxrocksdb-sys --exclude oxigraph_js --exclude pyoxigraph --exclude oxigraph_testsuite --exclude oxigraph_server + - uses: ./.github/actions/setup-rust + - uses: taiki-e/install-action@v2 + with: { tool: cargo-semver-checks } + - uses: actions/cache@v3 + with: + path: rocksdb + key: ${{ runner.os }}-rocksdb-8.0.0 + - run: bash .github/workflows/install_rocksdb.sh + - run: cargo semver-checks check-release --exclude oxrocksdb-sys --exclude oxigraph-js --exclude pyoxigraph --exclude oxigraph-testsuite --exclude oxigraph-cli - test_linux: + test_linux_x86_64: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update - - uses: Swatinem/rust-cache@v2 - - run: cargo test --all-features - env: - RUST_BACKTRACE: 1 + - uses: ./.github/actions/setup-rust + - run: cargo test - address_sanitizer: + test_linux_i686: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update && rustup override set nightly - - run: sudo apt install -y llvm - - uses: Swatinem/rust-cache@v2 - - run: cargo test --tests --target x86_64-unknown-linux-gnu --workspace --exclude pyoxigraph --exclude oxigraph_testsuite --exclude oxigraph_server - env: - RUST_BACKTRACE: 1 - RUSTFLAGS: -Z sanitizer=address + - uses: ./.github/actions/setup-rust + with: + target: i686-unknown-linux-gnu + - run: sudo apt-get update && sudo apt-get install -y g++-multilib + - run: cargo test --target i686-unknown-linux-gnu --no-default-features --features http-client-rustls-native + working-directory: ./lib/oxigraph - test_windows: - runs-on: windows-latest + test_linux_msv: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update - - uses: Swatinem/rust-cache@v2 - - run: Remove-Item -LiteralPath "C:\msys64\" -Force -Recurse - - run: cargo test --all-features + - uses: ./.github/actions/setup-rust + with: + version: 1.70.0 + - run: rustup toolchain install nightly + - run: rm Cargo.lock && cargo +nightly update -Z direct-minimal-versions + - run: cargo test + + test_linux_latest: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - uses: ./.github/actions/setup-rust + - run: rm Cargo.lock && cargo update + - run: cargo test + + test_linux_address_sanitizer: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - uses: ./.github/actions/setup-rust + with: + version: nightly + - run: sudo apt-get update && sudo apt-get install -y llvm + - run: cargo test --tests --target x86_64-unknown-linux-gnu --workspace --exclude pyoxigraph --exclude oxigraph-testsuite --exclude oxigraph-cli env: - RUST_BACKTRACE: 1 + RUSTFLAGS: -Z sanitizer=address - rustdoc: + test_linux_dynamic_linking: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update - - uses: Swatinem/rust-cache@v2 - - run: cargo doc --all-features - working-directory: ./lib + - uses: ./.github/actions/setup-rust + - uses: actions/cache@v3 + with: + path: rocksdb + key: ${{ runner.os }}-rocksdb-8.0.0 + - run: bash .github/workflows/install_rocksdb.sh + - run: cargo test --tests --features oxrocksdb-sys/pkg-config - rustdoc_msrv: + test_windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - uses: ./.github/actions/setup-rust + - run: Remove-Item -LiteralPath "C:\msys64\" -Force -Recurse + - run: cargo test + + rustdoc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true - - run: rustup update && rustup override set 1.60.0 - - uses: Swatinem/rust-cache@v2 - - run: cargo doc --all-features - working-directory: ./lib + - uses: ./.github/actions/setup-rust + with: + version: 1.74.1 + - run: cargo doc env: RUSTDOCFLAGS: -D warnings @@ -143,24 +204,21 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: Swatinem/rust-cache@v2 - - run: cargo install typos-cli || true + - uses: taiki-e/install-action@v2 + with: { tool: typos-cli } - run: typos clang_fmt: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run: sudo apt install -y clang-format + - run: sudo apt-get update && sudo apt-get install -y clang-format - run: clang-format --Werror --dry-run oxrocksdb-sys/api/* fuzz_changes: if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - submodules: true - uses: google/clusterfuzzlite/actions/build_fuzzers@v1 with: language: rust @@ -170,7 +228,7 @@ jobs: - uses: google/clusterfuzzlite/actions/run_fuzzers@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} - fuzz-seconds: 600 + fuzz-seconds: 900 mode: code-change sanitizer: address minimize-crashes: true @@ -181,9 +239,6 @@ jobs: if: github.event_name != 'pull_request' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - submodules: true - uses: google/clusterfuzzlite/actions/build_fuzzers@v1 with: language: rust @@ -192,7 +247,7 @@ jobs: - uses: google/clusterfuzzlite/actions/run_fuzzers@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} - fuzz-seconds: 3600 + fuzz-seconds: 7200 mode: batch sanitizer: address minimize-crashes: true diff --git a/.gitmodules b/.gitmodules index d96fd0dc..fba23723 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,10 @@ [submodule "oxrocksdb-sys/lz4"] path = oxrocksdb-sys/lz4 url = https://github.com/lz4/lz4.git +[submodule "testsuite/N3"] + path = testsuite/N3 + url = https://github.com/w3c/N3.git + branch = master +[submodule "testsuite/rdf-canon"] + path = testsuite/rdf-canon + url = https://github.com/w3c/rdf-canon.git diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 57d4f630..da4c7a80 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -7,7 +7,7 @@ build: os: "ubuntu-22.04" tools: python: "3" - rust: "1.64" + rust: "1.70" apt_packages: - clang diff --git a/CHANGELOG.md b/CHANGELOG.md index 789913ca..d52008ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,99 @@ +## [0.4.0-alpha.3] - 2024-01-25 + +### Added +- `oxttl`: expose base IRIs. +- `oxttl`: allows to inject prefixes for serialization. +- `oxrdf`: `vocab::geosparql::WKT_LITERAL`. + +### Changed +- Turtle: Fixes parsing bug with escaped dot at the end of local name. +- `oxttl`: Changes `prefixes` getter return type. +- JS: simplify build. +- Python: uses rustls by default all platforms that are not Windows/macOS/iOS/WASM. +- Strips debug info of the Rust std library in release build. + + +## [0.4.0-alpha.2] - 2024-01-08 + +### Added +- i686 linux support + +### Changed +- Docker: fixes Docker image Glib version error. +- Docker: tags now use semver e.g. `0.3.22` and not `v0.3.22`. Preversions are also not tagged `latest` anymore. +- Python: `QuerySolution` is now thread safe. + + +## [0.4.0-alpha.1] - 2024-01-03 + +### Added +- `sparopt` crate: A new still quite naive query optimizer. +- `oxttl` crate: A N-Triples/N-Quads/Turtle/TriG/N3 parser and serializer compatible with Tokio. +- `oxrdfxml` crate: A RDF/XML parser and serializer compatible with Tokio. +- `oxrdfio` crate: A stand-alone crate with oxigraph I/O related APIs. +- Rust: SPARQL results I/O is now exposed in the `oxigraph` crate (`oxigraph::sparql::results` module). +- Rust: It is now possible to dynamically link rocksdb with the `rocksdb-pkg-config` feature. +- Python: error location is now included in some `SyntaxError` exceptions. +- Python: the file type can be guessed from the file path extension during parsing and serialization. +- Python: the serialization method returns a `bytes` value if no output-related argument is given. +- Python: SPARQL query results I/O is now exposed (`parse_query_results` function and `.serialize` method). +- Python: `RdfFormat` and `QueryResultsFormat` enum to encode supported formats. +- CLI: a `convert` command to convert RDF file between different formats. + +### Removed +- Rust: automated flush at the end of serialization. This should be done explicitly now. +- oxsdatatypes: Deprecated methods. +- Python: 3.7 and Musl linux 1.1 support. +- Python: `GraphName.value`. + +### Changed +- SPARQL: a digit after `.` is now required for `xsd:decimal`. +- SPARQL: calendar subtraction returns `xsd:dayTimeDuration` and not `xsd:duration`. +- SPARQL: Unicode escapes (`\u` and `\U`) are now only supported in IRIs and strings and not everywhere. +- Literal serialization now produces canonical N-Triples according to the RDF 1.2 and RDF Dataset Canonicalization drafts +- Rust: MSRV is now 1.70. +- Rust Makes `GraphName` implement `Default`. +- Rust: `wasm32-unknown-unknown` does not assumes JS platform by default. Enable the `js` feature for that. +- Rust: Parsers take `Read` and not `BufRead` for input. +- Rust: `GraphFormat` and `DatasetFormat` have been merged into `RdfFormat`. +- Rust: `GraphParser` and `DatasetParser` have been merged into `RdfParser`. +- Rust: `GraphSerializer` and `DatasetSerializer` have been merged into `RdfSerializer`. +- Rust: query results are now `Send` and `Sync`. +- Rust: `Store.load_graph` and `Store.load_dataset` have been merged into a `load_from_read` method. +- Rust: `Store.dump_graph` and `Store.dump_dataset` have been renamed to `dump_graph_to_write` and `dump_to_write`. +- Rust: `BulkLoader.set_*` methods have been renamed to `BulkLoader.with_*`. +- oxsdatatypes: pass by-values instead of by-reference parameters when relevant. +- oxsdatatypes: error types have been redesigned. +- oxsdatatypes: return an error when building not serializable duration (year-month and day-time of opposite signs). +- sparesults: renames some methods to move closer to the new oxrdfio crate. +- Python: raise `OSError` instead of `IOError` on OS errors. +- Python: the `mime_type` parameter have been renamed to `format`. +- Python: boolean SPARQL results are now encoded with a `QueryBoolean` class and not a simple `bool`. +- Python: a `path` parameter has been added to all I/O method to read from a file. + The existing `input` parameter now consider `str` values to be a serialization to parse. +- JS: the `mime_type` parameter have been renamed to `format`. +- CLI: the `oxigraph_server` binary has been renamed to `oxigraph`. +- CLI: the `--location` argument is now part of sub-commands where it is relevant. + `oxigraph_server --location foo serve` is not possible anymore. + One need to write `oxigraph serve --location foo`. +- CLI: is is now possible to upload gzip encoded files to the HTTP API with the `Content-Encoding: gzip` header. + + +## [0.3.22] - 2023-11-29 + +### Changed +- Allows to compile with more recent `bindgen` and `cc` +- Fixes compatibility with `spin_no_std` feature of `lazy_static` + + +## [0.3.21] - 2023-11-29 + +### Changed +- Bulk loader: do not fail when loading empty files. +- Python: fixes source distribution. +- Upgrades RocksDB to 7.8.1. + + ## [0.3.20] - 2023-10-23 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 169b3652..194e678e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -23,17 +32,65 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +[[package]] +name = "anstream" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arbitrary" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -46,11 +103,12 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "assert_cmd" -version = "2.0.8" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9834fcc22e0874394a010230586367d4a3e9f11b560f469262678547e1d2575e" +checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" dependencies = [ - "bstr 1.6.0", + "anstyle", + "bstr 1.9.0", "doc-comment", "predicates", "predicates-core", @@ -60,10 +118,11 @@ dependencies = [ [[package]] name = "assert_fs" -version = "1.0.10" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d94b2a3f3786ff2996a98afbd6b4e5b7e890d685ccf67577f508ee2342c71cc9" +checksum = "2cd762e110c8ed629b11b6cde59458cc1c71de78ebbcc30099fc8e0403a2a2ec" dependencies = [ + "anstyle", "doc-comment", "globwalk", "predicates", @@ -72,49 +131,53 @@ dependencies = [ "tempfile", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi 0.3.9", -] - [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.2" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bindgen" -version = "0.66.1" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.2", "cexpr", "clang-sys", + "itertools 0.12.1", "lazy_static", "lazycell", "log", - "peeking_take_while", "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.29", + "syn", "which", ] @@ -126,9 +189,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block-buffer" @@ -164,26 +227,26 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", - "regex-automata 0.3.6", + "regex-automata 0.4.5", "serde", ] [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" dependencies = [ "bytemuck_derive", ] @@ -196,7 +259,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn", ] [[package]] @@ -205,6 +268,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + [[package]] name = "cast" version = "0.3.0" @@ -213,11 +282,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -237,9 +307,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -248,15 +318,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -264,9 +334,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -275,60 +345,80 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.25" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap", - "textwrap", + "clap_builder", + "clap_derive", ] [[package]] -name = "clap" -version = "4.0.32" +name = "clap_builder" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ - "bitflags 1.3.2", - "clap_derive", - "clap_lex 0.3.0", - "is-terminal", - "once_cell", + "anstream", + "anstyle", + "clap_lex", "strsim", - "termcolor", ] [[package]] name = "clap_derive" -version = "4.0.21" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "clap_lex" -version = "0.2.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "codspeed" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb4ab4dcb6554eb4f590fb16f99d3b102ab76f5f56554c9a5340518b32c499b" dependencies = [ - "os_str_bytes", + "colored", + "libc", + "serde_json", ] [[package]] -name = "clap_lex" -version = "0.3.0" +name = "codspeed-criterion-compat" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +checksum = "cc07a3d3f7e0c8961d0ffdee149d39b231bafdcdc3d978dc5ad790c615f55f3f" dependencies = [ - "os_str_bytes", + "codspeed", + "colored", + "criterion", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", ] [[package]] @@ -343,9 +433,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -353,43 +443,43 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] [[package]] name = "criterion" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", - "atty", "cast", "ciborium", - "clap 3.2.25", + "clap", "criterion-plot", - "itertools", - "lazy_static", + "is-terminal", + "itertools 0.10.5", "num-traits", + "once_cell", "oorandom", "plotters", "rayon", @@ -408,51 +498,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" @@ -466,19 +553,22 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "derive_arbitrary" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn", ] [[package]] @@ -505,36 +595,25 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "errno" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "escargot" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5584ba17d7ab26a8a7284f13e5bd196294dd2f2d79773cff29b9e9edef601a6" +checksum = "704ab670cffff92792405528eb8ec3d9f00be8939d56d947f6bc809f9ae249f8" dependencies = [ "log", "once_cell", @@ -544,18 +623,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -576,11 +652,26 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -606,9 +697,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -633,6 +724,12 @@ dependencies = [ "regex", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "glob" version = "0.3.1" @@ -641,33 +738,37 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", - "bstr 1.6.0", - "fnv", + "bstr 1.9.0", "log", - "regex", + "regex-automata 0.4.5", + "regex-syntax", ] [[package]] name = "globwalk" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "ignore", "walkdir", ] [[package]] name = "half" -version = "1.8.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] [[package]] name = "handlegraph" @@ -685,12 +786,6 @@ dependencies = [ "succinct", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "heck" version = "0.4.1" @@ -699,18 +794,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -718,6 +804,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "httparse" version = "1.8.0" @@ -726,9 +821,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -736,108 +831,87 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.18" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ - "crossbeam-utils", + "crossbeam-deque", "globset", - "lazy_static", "log", "memchr", - "regex", + "regex-automata 0.4.5", "same-file", - "thread_local", "walkdir", "winapi-util", ] -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown", -] - [[package]] name = "indoc" -version = "1.0.9" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" [[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "is-terminal" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] -name = "is-terminal" -version = "0.4.7" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "hermit-abi 0.3.2", - "io-lifetimes", - "rustix", - "windows-sys", + "either", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] [[package]] name = "json-event-parser" -version = "0.1.1" +version = "0.2.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f12e624eaeb74accb9bb48f01cb071427f68115aaafa5689acb372d7e22977" +checksum = "5b5ddd02379e99769e117ab30d21ad42dcec8ad3c12be77f9a34779e62d46346" +dependencies = [ + "tokio", +] [[package]] name = "kernel32-sys" @@ -876,31 +950,31 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi 0.3.9", + "windows-sys 0.48.0", ] [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -914,18 +988,19 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap" @@ -954,13 +1029,31 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nom" version = "5.1.3" @@ -988,30 +1081,35 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ - "hermit-abi 0.3.2", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -1019,6 +1117,32 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.4.2", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -1026,30 +1150,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] -name = "os_str_bytes" -version = "6.5.1" +name = "openssl-sys" +version = "0.9.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "ae94056a791d0e1217d18b6cbdccb02c61e3054fc69893607f4067e3bb0b1fd1" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "oxhttp" -version = "0.1.7" +version = "0.2.0-alpha.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f8f4b616372a7e657a05100d1389325fc2f7d3fee5c9de05166d979cb2b729" +checksum = "7c066f9fac8c5b7cad775f89a53a039a74107b384e170886e748a3d6a9ffe1fd" dependencies = [ + "flate2", "httparse", - "lazy_static", - "rayon-core", + "native-tls", "rustls", "rustls-native-certs", + "rustls-pki-types", "url", + "webpki-roots", ] [[package]] name = "oxigraph" -version = "0.3.20" +version = "0.4.0-alpha.3-dev" dependencies = [ - "criterion", + "codspeed-criterion-compat", "digest", "getrandom", "gfa", @@ -1057,72 +1189,67 @@ dependencies = [ "hex", "js-sys", "json-event-parser", - "lazy_static", "libc", "md-5", "oxhttp", "oxilangtag", "oxiri", "oxrdf", + "oxrdfio", "oxrocksdb-sys", "oxsdatatypes", "rand", - "regex", - "rio_api", - "rio_turtle", - "rio_xml", - "sha-1", - "sha2", - "siphasher", - "sparesults", - "spargebra", - "zstd", -] - -[[package]] -name = "oxigraph_js" -version = "0.3.20" -dependencies = [ - "console_error_panic_hook", - "js-sys", - "oxigraph", - "wasm-bindgen", + "regex", + "sha1", + "sha2", + "siphasher", + "sparesults", + "spargebra", + "sparopt", + "thiserror", + "zstd", ] [[package]] -name = "oxigraph_server" -version = "0.3.20" +name = "oxigraph-cli" +version = "0.4.0-alpha.3-dev" dependencies = [ "anyhow", "assert_cmd", "assert_fs", - "clap 4.0.32", - "clap_lex 0.3.0", + "clap", "escargot", "flate2", - "ignore", - "is-terminal", "oxhttp", "oxigraph", "oxiri", "predicates", - "predicates-core", - "predicates-tree", "rand", "rayon-core", - "sparesults", - "tempfile", "url", ] [[package]] -name = "oxigraph_testsuite" +name = "oxigraph-js" +version = "0.4.0-alpha.3-dev" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "oxigraph", + "wasm-bindgen", +] + +[[package]] +name = "oxigraph-testsuite" version = "0.0.0" dependencies = [ "anyhow", - "clap 4.0.32", - "criterion", + "clap", + "codspeed-criterion-compat", "oxigraph", + "oxttl", + "spargebra", + "sparopt", "text-diff", "time", ] @@ -1135,34 +1262,72 @@ checksum = "8d91edf4fbb970279443471345a4e8c491bf05bb283b3e6c88e4e606fd8c181b" [[package]] name = "oxiri" -version = "0.2.2" +version = "0.2.3-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb175ec8981211357b7b379869c2f8d555881c55ea62311428ec0de46d89bd5c" +checksum = "b225dad32cfaa43a960b93f01fa7f87528ac07e794b80f6d9a0153e0222557e2" [[package]] name = "oxrdf" -version = "0.1.7" +version = "0.2.0-alpha.2" dependencies = [ "oxilangtag", "oxiri", "oxsdatatypes", "rand", + "thiserror", +] + +[[package]] +name = "oxrdfio" +version = "0.1.0-alpha.3-dev" +dependencies = [ + "oxrdf", + "oxrdfxml", + "oxttl", + "thiserror", + "tokio", +] + +[[package]] +name = "oxrdfxml" +version = "0.1.0-alpha.3-dev" +dependencies = [ + "oxilangtag", + "oxiri", + "oxrdf", + "quick-xml", + "thiserror", + "tokio", ] [[package]] name = "oxrocksdb-sys" -version = "0.3.20" +version = "0.4.0-alpha.3-dev" dependencies = [ "bindgen", "cc", "libc", + "pkg-config", ] [[package]] name = "oxsdatatypes" -version = "0.1.3" +version = "0.2.0-alpha.1" dependencies = [ "js-sys", + "thiserror", +] + +[[package]] +name = "oxttl" +version = "0.1.0-alpha.3-dev" +dependencies = [ + "memchr", + "oxilangtag", + "oxiri", + "oxrdf", + "thiserror", + "tokio", ] [[package]] @@ -1177,28 +1342,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "peg" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07f2cafdc3babeebc087e499118343442b742cc7c31b4d054682cc598508554" +checksum = "400bcab7d219c38abf8bd7cc2054eb9bbbd4312d66f6a5557d572a203f646f61" dependencies = [ "peg-macros", "peg-runtime", @@ -1206,9 +1365,9 @@ dependencies = [ [[package]] name = "peg-macros" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a90084dc05cf0428428e3d12399f39faad19b0909f64fb9170c9fdd6d9cd49b" +checksum = "46e61cce859b76d19090f62da50a9fe92bab7c2a5f09e183763559a2ac392c90" dependencies = [ "peg-runtime", "proc-macro2", @@ -1217,21 +1376,27 @@ dependencies = [ [[package]] name = "peg-runtime" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa00462b37ead6d11a82c9d568b26682d78e0477dc02d1966c013af80969739" +checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" @@ -1261,6 +1426,12 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1269,13 +1440,13 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "predicates" -version = "2.1.5" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" dependencies = [ + "anstyle", "difflib", "float-cmp", - "itertools", "normalize-line-endings", "predicates-core", "regex", @@ -1283,15 +1454,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f883590242d3c6fc5bf50299011695fa6590c2c70eac95ee1bdb9a733ad1a2" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] name = "predicates-tree" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ff541861505aabf6ea722d2131ee980b8276e10a1297b94e896dd8b621850d" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" dependencies = [ "predicates-core", "termtree", @@ -1299,52 +1470,28 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" -dependencies = [ - "proc-macro2", - "syn 2.0.29", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "quote", - "version_check", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" -version = "0.19.2" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38" +checksum = "9a89dc7a5850d0e983be1ec2a463a171d20990487c3cfcd68b5363f1ee3d6fe0" dependencies = [ "cfg-if", "indoc", @@ -1359,9 +1506,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.19.2" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5" +checksum = "07426f0d8fe5a601f26293f300afd1a7b1ed5e78b2a705870c5f30893c5163be" dependencies = [ "once_cell", "target-lexicon", @@ -1369,9 +1516,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.19.2" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9" +checksum = "dbb7dec17e17766b46bca4f1a4215a85006b4c2ecde122076c562dd058da6cf1" dependencies = [ "libc", "pyo3-build-config", @@ -1379,30 +1526,31 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.19.2" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1" +checksum = "05f738b4e40d50b5711957f142878cfa0f28e054aa0ebdfc3fd137a843f74ed3" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "pyo3-macros-backend" -version = "0.19.2" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536" +checksum = "0fc910d4851847827daf9d6cdd4a823fbdaab5b8818325c5e97a86da79e8881f" dependencies = [ + "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "pyoxigraph" -version = "0.3.20" +version = "0.4.0-alpha.3-dev" dependencies = [ "oxigraph", "pyo3", @@ -1410,18 +1558,19 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.28.2" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" dependencies = [ "memchr", + "tokio", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1458,9 +1607,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -1468,34 +1617,32 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.9.3" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", + "regex-automata 0.4.5", "regex-syntax", ] @@ -1507,9 +1654,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1518,53 +1665,30 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "ring" -version = "0.16.20" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", + "getrandom", "libc", - "once_cell", "spin", "untrusted", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "rio_api" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1924fa1f0e6d851f9b73b3c569e607c368a0d92995d99d563ad7bf1414696603" - -[[package]] -name = "rio_turtle" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec59971eafd99b9c7e3544bfcabafea81a7072ac51c9f46985ca0bd7ba6016" -dependencies = [ - "oxilangtag", - "oxiri", - "rio_api", + "windows-sys 0.52.0", ] [[package]] -name = "rio_xml" -version = "0.8.4" +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2edda57b877119dc326c612ba822e3ca1ee22bfc86781a4e9dc0884756b58c3" -dependencies = [ - "oxilangtag", - "oxiri", - "quick-xml", - "rio_api", -] +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -1574,66 +1698,76 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.25" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4eb579851244c2c03e7c24f501c3432bed80b8f720af1d6e5b0e0f01555a035" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.21.6" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" dependencies = [ "log", "ring", + "rustls-pki-types", "rustls-webpki", - "sct", + "subtle", + "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", "rustls-pemfile", + "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "3c333bb734fcdedcea57de1602543590f545f127dc8b533324318fd492c5c70b" dependencies = [ "base64", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" + [[package]] name = "rustls-webpki" -version = "0.101.4" +version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ "ring", + "rustls-pki-types", "untrusted", ] [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -1646,11 +1780,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1659,16 +1793,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "security-framework" version = "2.9.2" @@ -1694,29 +1818,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.185" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.185" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1724,10 +1848,10 @@ dependencies = [ ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -1736,9 +1860,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1747,54 +1871,67 @@ dependencies = [ [[package]] name = "shlex" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "54ac45299ccbd390721be55b412d41931911f654fa99e2cb8bfb57184b2061fe" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "sparesults" -version = "0.1.8" +version = "0.2.0-alpha.2" dependencies = [ "json-event-parser", + "memchr", "oxrdf", "quick-xml", + "thiserror", + "tokio", ] [[package]] name = "spargebra" -version = "0.2.8" +version = "0.3.0-alpha.2" dependencies = [ "oxilangtag", "oxiri", "oxrdf", "peg", "rand", + "thiserror", +] + +[[package]] +name = "sparopt" +version = "0.1.0-alpha.2" +dependencies = [ + "oxrdf", + "rand", + "spargebra", ] [[package]] name = "sparql-smith" -version = "0.1.0-alpha.4" +version = "0.1.0-alpha.5" dependencies = [ "arbitrary", ] [[package]] name = "spin" -version = "0.5.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "static_assertions" @@ -1804,9 +1941,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + +[[package]] +name = "subtle" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "succinct" @@ -1820,20 +1963,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.29" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -1842,22 +1974,20 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tempfile" -version = "3.6.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ - "autocfg", "cfg-if", "fastrand", - "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1870,15 +2000,6 @@ dependencies = [ "winapi 0.2.8", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "termtree" version = "0.4.1" @@ -1896,29 +2017,35 @@ dependencies = [ ] [[package]] -name = "textwrap" -version = "0.16.0" +name = "thiserror" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] [[package]] -name = "thread_local" -version = "1.1.7" +name = "thiserror-impl" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ - "cfg-if", - "once_cell", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "time" -version = "0.3.27" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -1926,16 +2053,17 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.13" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -1964,23 +2092,46 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "bytes", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -1993,33 +2144,45 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unindent" -version = "0.1.11" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" @@ -2037,9 +2200,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -2053,9 +2216,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2063,24 +2226,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2088,42 +2251,52 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -2156,9 +2329,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi 0.3.9", ] @@ -2175,7 +2348,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -2184,13 +2366,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -2199,42 +2396,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "wyhash" version = "0.5.0" @@ -2244,32 +2483,36 @@ dependencies = [ "rand_core", ] +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + [[package]] name = "zstd" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.6" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" dependencies = [ - "libc", "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 75a171d3..7e0fe900 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,274 @@ [workspace] members = [ + "cli", "js", - "lib", + "lib/oxigraph", "lib/oxrdf", + "lib/oxrdfio", + "lib/oxrdfxml", "lib/oxsdatatypes", - "lib/spargebra", + "lib/oxttl", "lib/sparesults", + "lib/spargebra", + "lib/sparopt", "lib/sparql-smith", "oxrocksdb-sys", "python", - "server", "testsuite" ] resolver = "2" +[workspace.package] +version = "0.4.0-alpha.3-dev" +authors = ["Tpt <thomas@pellissier-tanon.fr>"] +license = "MIT OR Apache-2.0" +edition = "2021" +rust-version = "1.70" + +[workspace.dependencies] +anyhow = "1.0.72" +arbitrary = "1.3" +assert_cmd = "2.0" +assert_fs = "1.0" +bindgen = ">=0.60, <0.70" +cc = "1.0.73" +clap = "4.0" +codspeed-criterion-compat = "2.3.3" +console_error_panic_hook = "0.1.7" +digest = "0.10" +escargot = "0.5" +flate2 = "1.0" +getrandom = "0.2.8" +hex = "0.4" +js-sys = "0.3.60" +json-event-parser = "0.2.0-alpha.2" +libc = "0.2.147" +md-5 = "0.10" +memchr = "2.5" +oxhttp = "0.2.0-alpha.3" +oxilangtag = "0.1" +oxiri = "0.2.3-alpha.1" +peg = "0.8" +pkg-config = "0.3.25" +predicates = ">=2.0, <4.0" +pyo3 = "0.20.1" +quick-xml = ">=0.29, <0.32" +rand = "0.8" +rayon-core = "1.11" +regex = "1.7" +sha1 = "0.10" +sha2 = "0.10" +siphasher = ">=0.3, <2.0" +text-diff = "0.4" +thiserror = "1.0.50" +time = "0.3" +tokio = "1.29" +url = "2.4" +wasm-bindgen = "0.2.83" +zstd = ">=0.12, <0.14" + +# Internal dependencies +oxigraph = { version = "0.4.0-alpha.3-dev", path = "lib/oxigraph" } +oxrdf = { version = "0.2.0-alpha.2", path = "lib/oxrdf" } +oxrdfio = { version = "0.1.0-alpha.3-dev", path = "lib/oxrdfio" } +oxrdfxml = { version = "0.1.0-alpha.3-dev", path = "lib/oxrdfxml" } +oxrocksdb-sys = { version = "0.4.0-alpha.3-dev", path = "./oxrocksdb-sys" } +oxsdatatypes = { version = "0.2.0-alpha.1", path = "lib/oxsdatatypes" } +oxttl = { version = "0.1.0-alpha.3-dev", path = "lib/oxttl" } +sparesults = { version = "0.2.0-alpha.2", path = "lib/sparesults" } +spargebra = { version = "0.3.0-alpha.2", path = "lib/spargebra" } +sparopt = { version = "0.1.0-alpha.2", path = "lib/sparopt" } +sparql-smith = { version = "0.1.0-alpha.5", path = "lib/sparql-smith" } + +[workspace.lints.rust] +absolute_paths_not_starting_with_crate = "warn" +elided_lifetimes_in_paths = "warn" +explicit_outlives_requirements = "warn" +let_underscore_drop = "warn" +macro_use_extern_crate = "warn" +# TODO missing_docs = "warn" +trivial_casts = "warn" +trivial_numeric_casts = "warn" +unsafe_code = "warn" +unused_import_braces = "warn" +unused_lifetimes = "warn" +unused_macro_rules = "warn" +unused_qualifications = "warn" + +[workspace.lints.clippy] +allow_attributes = "warn" +allow_attributes_without_reason = "warn" +as_underscore = "warn" +assertions_on_result_states = "warn" +bool_to_int_with_if = "warn" +borrow_as_ptr = "warn" +case_sensitive_file_extension_comparisons = "warn" +cast_lossless = "warn" +cast_possible_truncation = "warn" +cast_possible_wrap = "warn" +cast_precision_loss = "warn" +cast_ptr_alignment = "warn" +cast_sign_loss = "warn" +checked_conversions = "warn" +clone_on_ref_ptr = "warn" +cloned_instead_of_copied = "warn" +copy_iterator = "warn" +create_dir = "warn" +dbg_macro = "warn" +decimal_literal_representation = "warn" +default_trait_access = "warn" +default_union_representation = "warn" +deref_by_slicing = "warn" +disallowed_script_idents = "warn" +doc_link_with_quotes = "warn" +empty_drop = "warn" +empty_enum = "warn" +empty_structs_with_brackets = "warn" +enum_glob_use = "warn" +error_impl_error = "warn" +exit = "warn" +expect_used = "warn" +expl_impl_clone_on_copy = "warn" +explicit_deref_methods = "warn" +explicit_into_iter_loop = "warn" +explicit_iter_loop = "warn" +filetype_is_file = "warn" +filter_map_next = "warn" +flat_map_option = "warn" +fn_params_excessive_bools = "warn" +fn_to_numeric_cast_any = "warn" +format_push_string = "warn" +from_iter_instead_of_collect = "warn" +get_unwrap = "warn" +host_endian_bytes = "warn" +if_not_else = "warn" +if_then_some_else_none = "warn" +ignored_unit_patterns = "warn" +implicit_clone = "warn" +implicit_hasher = "warn" +inconsistent_struct_constructor = "warn" +index_refutable_slice = "warn" +inefficient_to_string = "warn" +inline_always = "warn" +inline_asm_x86_att_syntax = "warn" +inline_asm_x86_intel_syntax = "warn" +invalid_upcast_comparisons = "warn" +items_after_statements = "warn" +iter_not_returning_iterator = "warn" +large_digit_groups = "warn" +large_futures = "warn" +large_include_file = "warn" +large_stack_arrays = "warn" +large_types_passed_by_value = "warn" +let_underscore_must_use = "warn" +let_underscore_untyped = "warn" +linkedlist = "warn" +lossy_float_literal = "warn" +macro_use_imports = "warn" +manual_assert = "warn" +manual_instant_elapsed = "warn" +manual_let_else = "warn" +manual_ok_or = "warn" +manual_string_new = "warn" +many_single_char_names = "warn" +map_unwrap_or = "warn" +match_bool = "warn" +match_on_vec_items = "warn" +match_same_arms = "warn" +match_wild_err_arm = "warn" +match_wildcard_for_single_variants = "warn" +maybe_infinite_iter = "warn" +mem_forget = "warn" +mismatching_type_param_order = "warn" +missing_assert_message = "warn" +missing_asserts_for_indexing = "warn" +missing_enforced_import_renames = "warn" +missing_fields_in_debug = "warn" +multiple_inherent_impl = "warn" +mut_mut = "warn" +mutex_atomic = "warn" +naive_bytecount = "warn" +needless_bitwise_bool = "warn" +needless_continue = "warn" +needless_for_each = "warn" +needless_pass_by_value = "warn" +needless_raw_strings = "warn" +negative_feature_names = "warn" +no_effect_underscore_binding = "warn" +no_mangle_with_rust_abi = "warn" +non_ascii_literal = "warn" +panic = "warn" +panic_in_result_fn = "warn" +partial_pub_fields = "warn" +print_stderr = "warn" +print_stdout = "warn" +ptr_as_ptr = "warn" +ptr_cast_constness = "warn" +pub_without_shorthand = "warn" +range_minus_one = "warn" +range_plus_one = "warn" +rc_buffer = "warn" +rc_mutex = "warn" +redundant_closure_for_method_calls = "warn" +redundant_else = "warn" +redundant_feature_names = "warn" +redundant_type_annotations = "warn" +ref_binding_to_reference = "warn" +ref_option_ref = "warn" +ref_patterns = "warn" +rest_pat_in_fully_bound_structs = "warn" +return_self_not_must_use = "warn" +same_functions_in_if_condition = "warn" +same_name_method = "warn" +semicolon_inside_block = "warn" +shadow_same = "warn" +should_panic_without_expect = "warn" +single_match_else = "warn" +stable_sort_primitive = "warn" +str_to_string = "warn" +string_add = "warn" +string_add_assign = "warn" +string_lit_chars_any = "warn" +string_to_string = "warn" +struct_excessive_bools = "warn" +suspicious_xor_used_as_pow = "warn" +tests_outside_test_module = "warn" +todo = "warn" +transmute_ptr_to_ptr = "warn" +trivially_copy_pass_by_ref = "warn" +try_err = "warn" +unchecked_duration_subtraction = "warn" +undocumented_unsafe_blocks = "warn" +unicode_not_nfc = "warn" +unimplemented = "warn" +uninlined_format_args = "warn" +unnecessary_box_returns = "warn" +unnecessary_join = "warn" +unnecessary_safety_comment = "warn" +unnecessary_safety_doc = "warn" +unnecessary_self_imports = "warn" +unnecessary_wraps = "warn" +unneeded_field_pattern = "warn" +unnested_or_patterns = "warn" +unreadable_literal = "warn" +unsafe_derive_deserialize = "warn" +unseparated_literal_suffix = "warn" +unused_async = "warn" +unused_self = "warn" +unwrap_in_result = "warn" +use_debug = "warn" +used_underscore_binding = "warn" +verbose_bit_mask = "warn" +verbose_file_reads = "warn" +wildcard_dependencies = "warn" +zero_sized_map_values = "warn" + [profile.release] lto = true codegen-units = 1 +strip = "debuginfo" -[profile.release.package.oxigraph_js] +[profile.release.package.oxigraph-js] +codegen-units = 1 opt-level = "z" +strip = "debuginfo" diff --git a/README.md b/README.md index af1130c6..835c0210 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,18 @@ This is a fork of oxigraph that includes [rs-handlegraph](https://github.com/chfi/rs-handlegraph). The purpose is to make pangenomic GFA-files accessible with SPARQL queries. -Oxigraph implements the following specifications: - -- [SPARQL 1.1 Query](https://www.w3.org/TR/sparql11-query/), [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/), and [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/). -- [Turtle](https://www.w3.org/TR/turtle/), [TriG](https://www.w3.org/TR/trig/), [N-Triples](https://www.w3.org/TR/n-triples/), [N-Quads](https://www.w3.org/TR/n-quads/), and [RDF XML](https://www.w3.org/TR/rdf-syntax-grammar/) RDF serialization formats for both data ingestion and retrieval using the [Rio library](https://github.com/oxigraph/rio). -- [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/), [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) and [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/). +Also, some parts of Oxigraph are available as standalone Rust crates: +* [`oxrdf`](https://crates.io/crates/oxrdf), datastructures encoding RDF basic concepts (the [`oxigraph::model`](crate::model) module). +* [`oxrdfio`](https://crates.io/crates/oxrdfio), a unified parser and serializer API for RDF formats (the [`oxigraph::io`](crate::io) module). It itself relies on: + * [`oxttl`](https://crates.io/crates/oxttl), N-Triple, N-Quad, Turtle, TriG and N3 parsing and serialization. + * [`oxrdfxml`](https://crates.io/crates/oxrdfxml), RDF/XML parsing and serialization. +* [`spargebra`](https://crates.io/crates/spargebra), a SPARQL parser. +* [`sparesults`](https://crates.io/crates/sparesults), parsers and serializers for SPARQL result formats. +* [`sparopt`](https://crates.io/crates/sparesults), a SPARQL optimizer. +* [`oxsdatatypes`](https://crates.io/crates/oxsdatatypes), an implementation of some XML Schema datatypes. + +The library layers in Oxigraph. The elements above depend on the elements below: + When cloning this codebase, don't forget to clone the submodules using `git clone --recursive https://github.com/oxigraph/oxigraph.git` to clone the repository including submodules or diff --git a/bench/bsbm_oxigraph.sh b/bench/bsbm_oxigraph.sh index 7ee691cb..a4b15201 100755 --- a/bench/bsbm_oxigraph.sh +++ b/bench/bsbm_oxigraph.sh @@ -6,10 +6,10 @@ PARALLELISM=16 set -eu cd bsbm-tools ./generate -fc -pc ${DATASET_SIZE} -s nt -fn "explore-${DATASET_SIZE}" -ud -ufn "explore-update-${DATASET_SIZE}" -cargo build --release --manifest-path="../../server/Cargo.toml" -VERSION=$(./../../target/release/oxigraph_server --version | sed 's/oxigraph_server //g') -./../../target/release/oxigraph_server --location oxigraph_data load --file "explore-${DATASET_SIZE}.nt" -./../../target/release/oxigraph_server --location oxigraph_data serve --bind 127.0.0.1:7878 & +cargo build --release --manifest-path="../../cli/Cargo.toml" +VERSION=$(./../../target/release/oxigraph --version | sed 's/oxigraph //g') +./../../target/release/oxigraph --location oxigraph_data load --file "explore-${DATASET_SIZE}.nt" +./../../target/release/oxigraph --location oxigraph_data serve --bind 127.0.0.1:7878 & sleep 1 ./testdriver -mt ${PARALLELISM} -ucf usecases/explore/sparql.txt -o "../bsbm.explore.oxigraph.${VERSION}.${DATASET_SIZE}.${PARALLELISM}.xml" http://127.0.0.1:7878/query ./testdriver -mt ${PARALLELISM} -ucf usecases/exploreAndUpdate/sparql.txt -o "../bsbm.exploreAndUpdate.oxigraph.${VERSION}.${DATASET_SIZE}.${PARALLELISM}.xml" http://127.0.0.1:7878/query -u http://127.0.0.1:7878/update -udataset "explore-update-${DATASET_SIZE}.nt" diff --git a/cli/Cargo.toml b/cli/Cargo.toml new file mode 100644 index 00000000..88cef55c --- /dev/null +++ b/cli/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "oxigraph-cli" +version.workspace = true +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["RDF", "SPARQL", "graph-database", "database"] +categories = ["command-line-utilities", "database"] +repository = "https://github.com/oxigraph/oxigraph/tree/main/cli" +homepage = "https://oxigraph.org/cli/" +description = """ +Oxigraph command line toolkit and SPARQL HTTP server +""" +edition.workspace = true +rust-version.workspace = true + +[[bin]] +name = "oxigraph" +path = "src/main.rs" +doc = false + +[features] +default = ["native-tls"] +native-tls = ["oxigraph/http-client-native-tls"] +rocksdb-pkg-config = ["oxigraph/rocksdb-pkg-config"] +rustls-native = ["oxigraph/http-client-rustls-native"] +rustls-webpki = ["oxigraph/http-client-rustls-webpki"] + +[dependencies] +anyhow.workspace = true +clap = { workspace = true, features = ["derive"] } +flate2.workspace = true +oxhttp = { workspace = true, features = ["flate2"] } +oxigraph.workspace = true +oxiri.workspace = true +rand.workspace = true +rayon-core.workspace = true +url.workspace = true + +[dev-dependencies] +assert_cmd.workspace = true +assert_fs.workspace = true +escargot.workspace = true +predicates.workspace = true + +[lints] +workspace = true diff --git a/server/Dockerfile b/cli/Dockerfile similarity index 64% rename from server/Dockerfile rename to cli/Dockerfile index 92a6f4d4..004f7525 100644 --- a/server/Dockerfile +++ b/cli/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM rust:1-bullseye as builder +FROM --platform=$BUILDPLATFORM rust:1-bookworm as builder ARG BUILDARCH TARGETARCH RUN apt-get update && \ apt-get install -y libclang-dev clang && \ @@ -8,18 +8,18 @@ RUN apt-get update && \ rustup target add aarch64-unknown-linux-gnu ; \ fi COPY . /oxigraph -WORKDIR /oxigraph/server +WORKDIR /oxigraph/cli RUN if [ "$BUILDARCH" != "$TARGETARCH" ] && [ "$TARGETARCH" = "arm64" ] ; \ then \ export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc && \ export BINDGEN_EXTRA_CLANG_ARGS="--sysroot /usr/aarch64-linux-gnu" && \ - cargo build --release --target aarch64-unknown-linux-gnu && \ - mv /oxigraph/target/aarch64-unknown-linux-gnu/release/oxigraph_server /oxigraph/target/release/oxigraph_server ; \ + cargo build --release --target aarch64-unknown-linux-gnu --no-default-features --features rustls-webpki && \ + mv /oxigraph/target/aarch64-unknown-linux-gnu/release/oxigraph /oxigraph/target/release/oxigraph ; \ else \ - cargo build --release ; \ + cargo build --release --no-default-features --features rustls-webpki ; \ fi -FROM --platform=$TARGETPLATFORM gcr.io/distroless/cc-debian11 -COPY --from=builder /oxigraph/target/release/oxigraph_server /usr/local/bin/oxigraph_server -ENTRYPOINT [ "/usr/local/bin/oxigraph_server" ] +FROM --platform=$TARGETPLATFORM gcr.io/distroless/cc-debian12 +COPY --from=builder /oxigraph/target/release/oxigraph /usr/local/bin/oxigraph +ENTRYPOINT [ "/usr/local/bin/oxigraph" ] CMD [ "serve", "--location", "/data", "--bind", "0.0.0.0:7878" ] diff --git a/server/README.md b/cli/README.md similarity index 79% rename from server/README.md rename to cli/README.md index 851d7521..8d4b14d2 100644 --- a/server/README.md +++ b/cli/README.md @@ -1,21 +1,19 @@ -Oxigraph Server -=============== +Oxigraph CLI +============ -[](https://crates.io/crates/oxigraph_server) -[](https://crates.io/crates/oxigraph_server) +[](https://crates.io/crates/oxigraph-cli) +[](https://crates.io/crates/oxigraph-cli) [](https://anaconda.org/conda-forge/oxigraph-server) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) -Oxigraph Server is a standalone HTTP server providing a graph database implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. - -Its goal is to provide a compliant, safe, and fast graph database based on the [RocksDB](https://rocksdb.org/) key-value store. -It is written in Rust. -It also provides a set of utility functions for reading, writing, and processing RDF files. +Oxigraph CLI is a graph database implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. +It is packaged as a command line tool allowing to manipulate an RDF files, query them using SPARQL... +It also allows to spawn a HTTP server on top of the database. Oxigraph is in heavy development and SPARQL query evaluation has not been optimized yet. -Oxigraph provides different installation methods for Oxigraph server: +Oxigraph provides different installation methods for Oxigraph CLI: * [`cargo install`](#installation) (multiplatform) * [A Docker image](#using-a-docker-image) * [A Homebrew formula](#homebrew) @@ -32,19 +30,29 @@ Oxigraph implements the following specifications: A preliminary benchmark [is provided](../bench/README.md). +Note that Oxigraph CLI was previously named Oxigraph Server before version 0.4. Older versions are available under [this name](https://crates.io/crates/oxigraph_server). + + ## Installation You need to have [a recent stable version of Rust and Cargo installed](https://www.rust-lang.org/tools/install). -To download, build and install the latest released version run `cargo install oxigraph_server`. +To download, build and install the latest released version run `cargo install oxigraph-cli`. There is no need to clone the git repository. -To compile the server from source, clone this git repository including its submodules (`git clone --recursive https://github.com/oxigraph/oxigraph.git`), and execute `cargo build --release` in the `server` directory to compile the full server after having downloaded its dependencies. -It will create a fat binary in `target/release/oxigraph_server`. +To compile the command line tool from source, clone this git repository including its submodules (`git clone --recursive https://github.com/oxigraph/oxigraph.git`), and execute `cargo build --release` in the `cli` directory to compile the full binary after having downloaded its dependencies. +It will create a fat binary in `target/release/oxigraph`. + +Some build options (cargo features) are available: +- `rocksdb-pkg-config`: links against an already compiled rocksdb shared library found using [pkg-config](https://crates.io/crates/pkg-config). +- `native-tls`: Enables Oxigraph HTTP client for query federation using the host OS TLS stack (enabled by default). +- `rustls-native` Enables Oxigraph HTTP client for query federation using [Rustls](https://crates.io/crates/rustls) and the native certificates. +- `rustls-webpki` Enables Oxigraph HTTP client for query federation using [Rustls](https://crates.io/crates/rustls) and the [Common CA Database](https://www.ccadb.org/) certificates. + ## Usage -Run `oxigraph_server --location my_data_storage_directory serve` to start the server where `my_data_storage_directory` is the directory where you want Oxigraph data to be stored. It listens by default on `localhost:7878`. +Run `oxigraph serve --location my_data_storage_directory` to start the server where `my_data_storage_directory` is the directory where you want Oxigraph data to be stored. It listens by default on `localhost:7878`. The server provides an HTML UI, based on [YASGUI](https://yasgui.triply.cc), with a form to execute SPARQL requests. @@ -78,10 +86,10 @@ It provides the following REST actions: ``` will add the N-Quads file `MY_FILE.nq` to the server dataset. -Use `oxigraph_server --help` to see the possible options when starting the server. +Use `oxigraph --help` to see the possible options when starting the server. It is also possible to load RDF data offline using bulk loading: -`oxigraph_server --location my_data_storage_directory load --file my_file.nq` +`oxigraph load --location my_data_storage_directory --file my_file.nq` ## Using a Docker image @@ -93,7 +101,7 @@ docker run --rm ghcr.io/oxigraph/oxigraph --help ### Run the Webserver Expose the server on port `7878` of the host machine, and save data on the local `./data` folder ```sh -docker run --rm -v $PWD/data:/data -p 7878:7878 ghcr.io/oxigraph/oxigraph --location /data serve --bind 0.0.0.0:7878 +docker run --rm -v $PWD/data:/data -p 7878:7878 ghcr.io/oxigraph/oxigraph serve --location /data --bind 0.0.0.0:7878 ``` You can then access it from your machine on port `7878`: @@ -217,14 +225,14 @@ To install Oxigraph server using Homebrew do: brew tap oxigraph/oxigraph brew install oxigraph ``` -It installs the `oxigraph_server` binary. [See the usage documentation to know how to use it](#usage). +It installs the `oxigraph` binary. [See the usage documentation to know how to use it](#usage). ## Systemd It is possible to run Oxigraph in the background using systemd. -For that, you can use the following `oxigraph_server.service` file (it might be inserted into `/etc/systemd/system/` or `$HOME/.config/systemd/user`): +For that, you can use the following `oxigraph.service` file (it might be inserted into `/etc/systemd/system/` or `$HOME/.config/systemd/user`): ```ini [Unit] Description=Oxigraph database server @@ -233,7 +241,7 @@ Wants=network-online.target [Service] Type=notify -ExecStart=/PATH/TO/oxigraph_server serve --location /PATH/TO/OXIGRAPH/DATA +ExecStart=/PATH/TO/oxigraph serve --location /PATH/TO/OXIGRAPH/DATA [Install] WantedBy=multi-user.target @@ -242,8 +250,8 @@ WantedBy=multi-user.target ## Migration guide ### From 0.2 to 0.3 -* The cli API has been completely rewritten. To start the server run `oxigraph_server serve --location MY_STORAGE` instead of `oxigraph_server --file MY_STORAGE`. -* Fast data bulk loading is not supported using `oxigraph_server load --location MY_STORAGE --file MY_FILE`. The file format is guessed from the extension (`.nt`, `.ttl`, `.nq`...). +* The cli API has been completely rewritten. To start the server run `oxigraph serve --location MY_STORAGE` instead of `oxigraph --file MY_STORAGE`. +* Fast data bulk loading is not supported using `oxigraph load --location MY_STORAGE --file MY_FILE`. The file format is guessed from the extension (`.nt`, `.ttl`, `.nq`...). * [RDF-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html) is now implemented. * All operations are now transactional using the "repeatable read" isolation level: the store only exposes changes that have been "committed" (i.e. no partial writes) diff --git a/server/logo.svg b/cli/logo.svg similarity index 100% rename from server/logo.svg rename to cli/logo.svg diff --git a/server/src/main.rs b/cli/src/main.rs similarity index 75% rename from server/src/main.rs rename to cli/src/main.rs index f57ada51..99a9015d 100644 --- a/server/src/main.rs +++ b/cli/src/main.rs @@ -1,19 +1,19 @@ #![allow(clippy::print_stderr, clippy::cast_precision_loss, clippy::use_debug)] -use anyhow::{anyhow, bail, Context, Error}; -use clap::{Parser, Subcommand}; +use anyhow::{bail, ensure, Context}; +use clap::{Parser, Subcommand, ValueHint}; use flate2::read::MultiGzDecoder; use oxhttp::model::{Body, HeaderName, HeaderValue, Method, Request, Response, Status}; use oxhttp::Server; -use oxigraph::io::{DatasetFormat, DatasetSerializer, GraphFormat, GraphSerializer}; +use oxigraph::io::{RdfFormat, RdfParser, RdfSerializer}; use oxigraph::model::{ GraphName, GraphNameRef, IriParseError, NamedNode, NamedNodeRef, NamedOrBlankNode, }; +use oxigraph::sparql::results::{QueryResultsFormat, QueryResultsSerializer}; use oxigraph::sparql::{Query, QueryOptions, QueryResults, Update}; use oxigraph::store::{BulkLoader, LoaderError, Store}; use oxiri::Iri; use rand::random; use rayon_core::ThreadPoolBuilder; -use sparesults::{QueryResultsFormat, QueryResultsSerializer}; use std::borrow::Cow; use std::cell::RefCell; use std::cmp::{max, min}; @@ -21,7 +21,8 @@ use std::cmp::{max, min}; use std::env; use std::ffi::OsStr; use std::fs::File; -use std::io::{self, stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; +use std::io::{self, stdin, stdout, BufWriter, Read, Write}; +use std::net::ToSocketAddrs; #[cfg(target_os = "linux")] use std::os::unix::net::UnixDatagram; use std::path::{Path, PathBuf}; @@ -38,14 +39,9 @@ const HTML_ROOT_PAGE: &str = include_str!("../templates/query.html"); const LOGO: &str = include_str!("../logo.svg"); #[derive(Parser)] -#[command(about, version)] -/// Oxigraph SPARQL server. +#[command(about, version, name = "oxigraph")] +/// Oxigraph command line toolkit and SPARQL HTTP server. struct Args { - /// Directory in which the data should be persisted. - /// - /// If not present. An in-memory storage will be used. - #[arg(short, long, global = true)] - location: Option<PathBuf>, //TODO: move into commands on next breaking release #[command(subcommand)] command: Command, } @@ -54,8 +50,13 @@ struct Args { enum Command { /// Start Oxigraph HTTP server in read-write mode. Serve { + /// Directory in which the data should be persisted. + /// + /// If not present. An in-memory storage will be used. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: Option<PathBuf>, /// Host and port to listen to. - #[arg(short, long, default_value = "localhost:7878")] + #[arg(short, long, default_value = "localhost:7878", value_hint = ValueHint::Hostname)] bind: String, /// Allows cross-origin requests #[arg(long)] @@ -67,6 +68,9 @@ enum Command { /// Opening as read-only while having an other process writing the database is undefined behavior. /// Please use the serve-secondary command in this case. ServeReadOnly { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// Host and port to listen to. #[arg(short, long, default_value = "localhost:7878")] bind: String, @@ -83,12 +87,12 @@ enum Command { /// Dirty reads might happen. ServeSecondary { /// Directory where the primary Oxigraph instance is writing to. - #[arg(long, conflicts_with = "location")] - primary_location: Option<PathBuf>, + #[arg(long, value_hint = ValueHint::DirPath)] + primary_location: PathBuf, /// Directory to which the current secondary instance might write to. /// /// By default, temporary storage is used. - #[arg(long)] + #[arg(long, value_hint = ValueHint::DirPath)] secondary_location: Option<PathBuf>, /// Host and port to listen to. #[arg(short, long, default_value = "localhost:7878")] @@ -109,18 +113,26 @@ enum Command { /// /// If you want to move your data to another RDF storage system, you should use the dump operation instead. Backup { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// Directory in which the backup will be written. - #[arg(short, long)] + #[arg(short, long, value_hint = ValueHint::DirPath)] destination: PathBuf, }, /// Load file(s) into the store. + /// + /// Feel free to enable the --lenient option if you know your input is valid to get better performances. Load { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// File(s) to load. /// /// If multiple files are provided they are loaded in parallel. /// /// If no file is given, stdin is read. - #[arg(short, long, num_args = 0..)] + #[arg(short, long, num_args = 0.., value_hint = ValueHint::FilePath)] file: Vec<PathBuf>, /// The format of the file(s) to load. /// @@ -129,9 +141,12 @@ enum Command { /// By default the format is guessed from the loaded file extension. #[arg(long, required_unless_present = "file")] format: Option<String>, + /// Base IRI of the file(s) to load. + #[arg(long, value_hint = ValueHint::Url)] + base: Option<String>, /// Attempt to keep loading even if the data file is invalid. /// - /// Only works with N-Triples and N-Quads for now. + /// This disables most of validation on RDF content. #[arg(long)] lenient: bool, /// Name of the graph to load the data to. @@ -139,15 +154,18 @@ enum Command { /// By default the default graph is used. /// /// Only available when loading a graph file (N-Triples, Turtle...) and not a dataset file (N-Quads, TriG...). - #[arg(long)] + #[arg(long, value_hint = ValueHint::Url)] graph: Option<String>, }, /// Dump the store content into a file. Dump { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// File to dump to. /// /// If no file is given, stdout is used. - #[arg(short, long)] + #[arg(short, long, value_hint = ValueHint::FilePath)] file: Option<PathBuf>, /// The format of the file(s) to dump. /// @@ -159,11 +177,14 @@ enum Command { /// Name of the graph to dump. /// /// By default all graphs are dumped if the output format supports datasets. - #[arg(long)] + #[arg(long, value_hint = ValueHint::Url)] graph: Option<String>, }, /// Executes a SPARQL query against the store. Query { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// The SPARQL query to execute. /// /// If no query or query file are given, stdin is used. @@ -172,15 +193,15 @@ enum Command { /// File in which the query is stored. /// /// If no query or query file are given, stdin is used. - #[arg(long, conflicts_with = "query")] + #[arg(long, conflicts_with = "query", value_hint = ValueHint::FilePath)] query_file: Option<PathBuf>, - /// Base URI of the query. - #[arg(long)] + /// Base IRI of the query. + #[arg(long, value_hint = ValueHint::Url)] query_base: Option<String>, /// File in which the query results will be stored. /// /// If no file is given, stdout is used. - #[arg(short, long)] + #[arg(short, long, value_hint = ValueHint::FilePath)] results_file: Option<PathBuf>, /// The format of the results. /// @@ -199,7 +220,7 @@ enum Command { /// If the file extension is .json the JSON format is used, if .txt a human readable format is used. /// /// Use the stats option to print also query evaluation statistics. - #[arg(long, conflicts_with = "explain")] + #[arg(long, conflicts_with = "explain", value_hint = ValueHint::FilePath)] explain_file: Option<PathBuf>, /// Computes some evaluation statistics to print as part of the query explanations. /// @@ -209,6 +230,9 @@ enum Command { }, /// Executes a SPARQL update against the store. Update { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, /// The SPARQL update to execute. /// /// If no query or query file are given, stdin is used. @@ -217,91 +241,131 @@ enum Command { /// File in which the update is stored. /// /// If no update or update file are given, stdin is used. - #[arg(long, conflicts_with = "update")] + #[arg(long, conflicts_with = "update", value_hint = ValueHint::FilePath)] update_file: Option<PathBuf>, - /// Base URI of the update. - #[arg(long)] + /// Base IRI of the update. + #[arg(long, value_hint = ValueHint::Url)] update_base: Option<String>, }, /// Optimizes the database storage. /// /// Done by default in the background when serving requests. /// It is likely to not be useful in most of cases except if you provide a read-only SPARQL endpoint under heavy load. - Optimize {}, + Optimize { + /// Directory in which Oxigraph data are persisted. + #[arg(short, long, value_hint = ValueHint::DirPath)] + location: PathBuf, + }, + /// Converts a RDF serialization from one format to an other. + Convert { + /// File to convert from. + /// + /// If no file is given, stdin is read. + #[arg(short, long, value_hint = ValueHint::FilePath)] + from_file: Option<PathBuf>, + /// The format of the file(s) to convert from. + /// + /// Can be an extension like "nt" or a MIME type like "application/n-triples". + /// + /// By default the format is guessed from the input file extension. + #[arg(long, required_unless_present = "from_file")] + from_format: Option<String>, + /// Base IRI of the file to read. + #[arg(long, value_hint = ValueHint::Url)] + from_base: Option<String>, + /// File to convert to. + /// + /// If no file is given, stdout is written. + #[arg(short, long, value_hint = ValueHint::FilePath)] + to_file: Option<PathBuf>, + /// The format of the file(s) to convert from. + /// + /// Can be an extension like "nt" or a MIME type like "application/n-triples". + /// + /// By default the format is guessed from the target file extension. + #[arg(long, required_unless_present = "to_file")] + to_format: Option<String>, + /// Attempt to keep converting even if the data file is invalid. + #[arg(long)] + lenient: bool, + /// Only load the given named graph from the input file. + /// + /// By default all graphs are loaded. + #[arg(long, conflicts_with = "from_default_graph", value_hint = ValueHint::Url)] + from_graph: Option<String>, + /// Only load the default graph from the input file. + #[arg(long, conflicts_with = "from_graph")] + from_default_graph: bool, + /// Name of the graph to map the default graph to. + /// + /// By default the default graph is used. + #[arg(long, value_hint = ValueHint::Url)] + to_graph: Option<String>, + }, } pub fn main() -> anyhow::Result<()> { let matches = Args::parse(); match matches.command { - Command::Serve { bind, cors } => serve( - if let Some(location) = matches.location { + Command::Serve { + location, + bind, + cors, + } => serve( + if let Some(location) = location { Store::open(location) } else { Store::new() }?, - bind, + &bind, false, cors, ), - Command::ServeReadOnly { bind, cors } => serve( - Store::open_read_only( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?, + Command::ServeReadOnly { + location, bind, - true, cors, - ), + } => serve(Store::open_read_only(location)?, &bind, true, cors), Command::ServeSecondary { primary_location, secondary_location, bind, cors, + } => serve( + if let Some(secondary_location) = secondary_location { + Store::open_persistent_secondary(primary_location, secondary_location) + } else { + Store::open_secondary(primary_location) + }?, + &bind, + true, + cors, + ), + Command::Backup { + location, + destination, } => { - let primary_location = primary_location.or(matches.location).ok_or_else(|| { - anyhow!("Either the --location or the --primary-location argument is required") - })?; - serve( - if let Some(secondary_location) = secondary_location { - Store::open_persistent_secondary(primary_location, secondary_location) - } else { - Store::open_secondary(primary_location) - }?, - bind, - true, - cors, - ) - } - Command::Backup { destination } => { - let store = Store::open_read_only( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?; + let store = Store::open_read_only(location)?; store.backup(destination)?; Ok(()) } Command::Load { + location, file, lenient, format, + base, graph, } => { - let store = if let Some(location) = matches.location { - Store::open(location) - } else { - eprintln!("Warning: opening an in-memory store. It will not be possible to read the written data."); - Store::new() - }?; + let store = Store::open(location)?; let format = if let Some(format) = format { - Some(GraphOrDatasetFormat::from_str(&format)?) + Some(rdf_format_from_name(&format)?) } else { None }; let graph = if let Some(iri) = &graph { Some( - NamedNodeRef::new(iri) + NamedNode::new(iri) .with_context(|| format!("The target graph name {iri} is invalid"))?, ) } else { @@ -328,11 +392,10 @@ pub fn main() -> anyhow::Result<()> { bulk_load( &loader, stdin().lock(), - format.ok_or_else(|| { - anyhow!("The --format option must be set when loading from stdin") - })?, - None, + format.context("The --format option must be set when loading from stdin")?, + base.as_deref(), graph, + lenient, ) } else { ThreadPoolBuilder::new() @@ -342,6 +405,8 @@ pub fn main() -> anyhow::Result<()> { .scope(|s| { for file in file { let store = store.clone(); + let graph = graph.clone(); + let base = base.clone(); s.spawn(move |_| { let f = file.clone(); let start = Instant::now(); @@ -377,25 +442,25 @@ pub fn main() -> anyhow::Result<()> { if file.extension().map_or(false, |e| e == OsStr::new("gz")) { bulk_load( &loader, - BufReader::new(MultiGzDecoder::new(fp)), + MultiGzDecoder::new(fp), format.unwrap_or_else(|| { - GraphOrDatasetFormat::from_path( - &file.with_extension(""), - ) - .unwrap() + rdf_format_from_path(&file.with_extension("")) + .unwrap() }), - None, + base.as_deref(), graph, + lenient, ) } else { bulk_load( &loader, - BufReader::new(fp), + fp, format.unwrap_or_else(|| { - GraphOrDatasetFormat::from_path(&file).unwrap() + rdf_format_from_path(&file).unwrap() }), - None, + base.as_deref(), graph, + lenient, ) } } { @@ -404,7 +469,7 @@ pub fn main() -> anyhow::Result<()> { file.display(), error ) - //TODO: hard fail + // TODO: hard fail } }) } @@ -414,25 +479,22 @@ pub fn main() -> anyhow::Result<()> { } } Command::Dump { + location, file, format, graph, } => { - let store = Store::open_read_only( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?; + let store = Store::open_read_only(location)?; let format = if let Some(format) = format { - GraphOrDatasetFormat::from_str(&format)? + rdf_format_from_name(&format)? } else if let Some(file) = &file { - GraphOrDatasetFormat::from_path(file)? + rdf_format_from_path(file)? } else { bail!("The --format option must be set when writing to stdout") }; let graph = if let Some(graph) = &graph { Some(if graph.eq_ignore_ascii_case("default") { - GraphName::DefaultGraph + GraphNameRef::DefaultGraph } else { NamedNodeRef::new(graph) .with_context(|| format!("The target graph name {graph} is invalid"))? @@ -442,19 +504,19 @@ pub fn main() -> anyhow::Result<()> { None }; if let Some(file) = file { - dump( + close_file_writer(dump( &store, - BufWriter::new(File::create(&file).map_err(|e| { - anyhow!("Error while opening file {}: {e}", file.display()) - })?), + BufWriter::new(File::create(file)?), format, graph, - ) + )?)?; } else { - dump(&store, stdout().lock(), format, graph) + dump(&store, stdout().lock(), format, graph)?.flush()?; } + Ok(()) } Command::Query { + location, query, query_file, query_base, @@ -471,17 +533,10 @@ pub fn main() -> anyhow::Result<()> { format!("Not able to read query file {}", query_file.display()) })? } else { - // TODO: use io::read_to_string - let mut query = String::new(); - stdin().lock().read_to_string(&mut query)?; - query + io::read_to_string(stdin().lock())? }; let query = Query::parse(&query, query_base.as_deref())?; - let store = Store::open_read_only( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?; + let store = Store::open_read_only(location)?; let (results, explanation) = store.explain_query_opt(query, QueryOptions::default(), stats)?; let print_result = (|| { @@ -498,31 +553,33 @@ pub fn main() -> anyhow::Result<()> { } } else if let Some(results_file) = &results_file { format_from_path(results_file, |ext| { - QueryResultsFormat::from_extension(ext) - .ok_or_else(|| anyhow!("The file extension '{ext}' is unknown")) + QueryResultsFormat::from_extension(ext).with_context(|| { + format!("The file extension '{ext}' is unknown") + }) })? } else { bail!("The --results-format option must be set when writing to stdout") }; if let Some(results_file) = results_file { let mut writer = QueryResultsSerializer::from_format(format) - .solutions_writer( + .serialize_solutions_to_write( BufWriter::new(File::create(results_file)?), solutions.variables().to_vec(), )?; for solution in solutions { writer.write(&solution?)?; } - writer.finish()?; + close_file_writer(writer.finish()?)?; } else { - let stdout = stdout(); // Not needed in Rust 1.61 let mut writer = QueryResultsSerializer::from_format(format) - .solutions_writer(stdout.lock(), solutions.variables().to_vec())?; + .serialize_solutions_to_write( + stdout().lock(), + solutions.variables().to_vec(), + )?; for solution in solutions { writer.write(&solution?)?; } - #[allow(clippy::let_underscore_must_use)] - let _ = writer.finish()?; + writer.finish()?.flush()?; } } QueryResults::Boolean(result) => { @@ -537,55 +594,49 @@ pub fn main() -> anyhow::Result<()> { } } else if let Some(results_file) = &results_file { format_from_path(results_file, |ext| { - QueryResultsFormat::from_extension(ext) - .ok_or_else(|| anyhow!("The file extension '{ext}' is unknown")) + QueryResultsFormat::from_extension(ext).with_context(|| { + format!("The file extension '{ext}' is unknown") + }) })? } else { bail!("The --results-format option must be set when writing to stdout") }; if let Some(results_file) = results_file { - QueryResultsSerializer::from_format(format).write_boolean_result( - BufWriter::new(File::create(results_file)?), - result, + close_file_writer( + QueryResultsSerializer::from_format(format) + .serialize_boolean_to_write( + BufWriter::new(File::create(results_file)?), + result, + )?, )?; } else { - #[allow(clippy::let_underscore_must_use)] - let _ = QueryResultsSerializer::from_format(format) - .write_boolean_result(stdout().lock(), result)?; + QueryResultsSerializer::from_format(format) + .serialize_boolean_to_write(stdout().lock(), result)? + .flush()?; } } QueryResults::Graph(triples) => { - let format = if let Some(name) = results_format { - if let Some(format) = GraphFormat::from_extension(&name) { - format - } else if let Some(format) = GraphFormat::from_media_type(&name) { - format - } else { - bail!("The file format '{name}' is unknown") - } + let format = if let Some(name) = &results_format { + rdf_format_from_name(name) } else if let Some(results_file) = &results_file { - format_from_path(results_file, |ext| { - GraphFormat::from_extension(ext) - .ok_or_else(|| anyhow!("The file extension '{ext}' is unknown")) - })? + rdf_format_from_path(results_file) } else { bail!("The --results-format option must be set when writing to stdout") - }; + }?; + let serializer = RdfSerializer::from_format(format); if let Some(results_file) = results_file { - let mut writer = GraphSerializer::from_format(format) - .triple_writer(BufWriter::new(File::create(results_file)?))?; + let mut writer = serializer + .serialize_to_write(BufWriter::new(File::create(results_file)?)); for triple in triples { - writer.write(triple?.as_ref())?; + writer.write_triple(triple?.as_ref())?; } - writer.finish()?; + close_file_writer(writer.finish()?)?; } else { - let stdout = stdout(); // Not needed in Rust 1.61 - let mut writer = GraphSerializer::from_format(format) - .triple_writer(stdout.lock())?; + let mut writer = serializer.serialize_to_write(stdout().lock()); for triple in triples { - writer.write(triple?.as_ref())?; + writer.write_triple(triple?.as_ref())?; } - writer.finish()?; + writer.finish()?.flush()?; } } } @@ -597,19 +648,21 @@ pub fn main() -> anyhow::Result<()> { .extension() .and_then(OsStr::to_str) { Some("json") => { - explanation.write_in_json(file)?; + explanation.write_in_json(&mut file)?; }, Some("txt") => { - write!(file, "{:?}", explanation)?; + write!(file, "{explanation:?}")?; }, _ => bail!("The given explanation file {} must have an extension that is .json or .txt", explain_file.display()) } + close_file_writer(file)?; } else if explain || stats { - eprintln!("{:#?}", explanation); + eprintln!("{explanation:#?}"); } print_result } Command::Update { + location, update, update_file, update_base, @@ -621,117 +674,197 @@ pub fn main() -> anyhow::Result<()> { format!("Not able to read update file {}", update_file.display()) })? } else { - // TODO: use io::read_to_string - let mut update = String::new(); - stdin().lock().read_to_string(&mut update)?; - update + io::read_to_string(stdin().lock())? }; let update = Update::parse(&update, update_base.as_deref())?; - let store = Store::open( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?; + let store = Store::open(location)?; store.update(update)?; store.flush()?; Ok(()) } - Command::Optimize {} => { - let store = Store::open( - matches - .location - .ok_or_else(|| anyhow!("The --location argument is required"))?, - )?; + Command::Optimize { location } => { + let store = Store::open(location)?; store.optimize()?; Ok(()) } + Command::Convert { + from_file, + from_format, + from_base, + to_file, + to_format, + lenient, + from_graph, + from_default_graph, + to_graph, + } => { + let from_format = if let Some(format) = from_format { + rdf_format_from_name(&format)? + } else if let Some(file) = &from_file { + rdf_format_from_path(file)? + } else { + bail!("The --from-format option must be set when reading from stdin") + }; + let mut parser = RdfParser::from_format(from_format); + if let Some(base) = from_base { + parser = parser + .with_base_iri(&base) + .with_context(|| format!("Invalid base IRI {base}"))?; + } + + let to_format = if let Some(format) = to_format { + rdf_format_from_name(&format)? + } else if let Some(file) = &to_file { + rdf_format_from_path(file)? + } else { + bail!("The --to-format option must be set when writing to stdout") + }; + let serializer = RdfSerializer::from_format(to_format); + + let from_graph = if let Some(from_graph) = from_graph { + Some( + NamedNode::new(&from_graph) + .with_context(|| format!("The source graph name {from_graph} is invalid"))? + .into(), + ) + } else if from_default_graph { + Some(GraphName::DefaultGraph) + } else { + None + }; + let to_graph = if let Some(to_graph) = to_graph { + NamedNode::new(&to_graph) + .with_context(|| format!("The target graph name {to_graph} is invalid"))? + .into() + } else { + GraphName::DefaultGraph + }; + + match (from_file, to_file) { + (Some(from_file), Some(to_file)) => close_file_writer(do_convert( + parser, + File::open(from_file)?, + serializer, + BufWriter::new(File::create(to_file)?), + lenient, + &from_graph, + &to_graph, + )?), + (Some(from_file), None) => do_convert( + parser, + File::open(from_file)?, + serializer, + stdout().lock(), + lenient, + &from_graph, + &to_graph, + )? + .flush(), + (None, Some(to_file)) => close_file_writer(do_convert( + parser, + stdin().lock(), + serializer, + BufWriter::new(File::create(to_file)?), + lenient, + &from_graph, + &to_graph, + )?), + (None, None) => do_convert( + parser, + stdin().lock(), + serializer, + stdout().lock(), + lenient, + &from_graph, + &to_graph, + )? + .flush(), + }?; + Ok(()) + } } } fn bulk_load( loader: &BulkLoader, - reader: impl BufRead, - format: GraphOrDatasetFormat, + read: impl Read, + format: RdfFormat, base_iri: Option<&str>, - to_graph_name: Option<NamedNodeRef<'_>>, + to_graph_name: Option<NamedNode>, + lenient: bool, ) -> anyhow::Result<()> { - match format { - GraphOrDatasetFormat::Graph(format) => loader.load_graph( - reader, - format, - to_graph_name.map_or(GraphNameRef::DefaultGraph, GraphNameRef::from), - base_iri, - )?, - GraphOrDatasetFormat::Dataset(format) => { - if to_graph_name.is_some() { - bail!("The --graph option is not allowed when loading a dataset format like NQuads or TriG"); - } - loader.load_dataset(reader, format, base_iri)? - } + let mut parser = RdfParser::from_format(format); + if let Some(to_graph_name) = to_graph_name { + parser = parser.with_default_graph(to_graph_name); } - Ok(()) -} - -fn dump( - store: &Store, - writer: impl Write, - format: GraphOrDatasetFormat, - to_graph_name: Option<GraphName>, -) -> anyhow::Result<()> { - match format { - GraphOrDatasetFormat::Graph(format) => store.dump_graph( - writer, - format, - &to_graph_name.ok_or_else(|| anyhow!("The --graph option is required when writing a graph format like NTriples, Turtle or RDF/XML"))?, - )?, - GraphOrDatasetFormat::Dataset(format) => { - if to_graph_name.is_some() { - bail!("The --graph option is not allowed when writing a dataset format like NQuads or TriG"); - } - store.dump_dataset(writer, format)? - } + if let Some(base_iri) = base_iri { + parser = parser + .with_base_iri(base_iri) + .with_context(|| format!("Invalid base IRI {base_iri}"))?; + } + if lenient { + parser = parser.unchecked(); } + loader.load_from_read(parser, read)?; Ok(()) } -#[derive(Copy, Clone)] -enum GraphOrDatasetFormat { - Graph(GraphFormat), - Dataset(DatasetFormat), +fn dump<W: Write>( + store: &Store, + write: W, + format: RdfFormat, + from_graph_name: Option<GraphNameRef<'_>>, +) -> anyhow::Result<W> { + ensure!(format.supports_datasets() || from_graph_name.is_some(), "The --graph option is required when writing a format not supporting datasets like NTriples, Turtle or RDF/XML"); + Ok(if let Some(from_graph_name) = from_graph_name { + store.dump_graph_to_write(from_graph_name, format, write) + } else { + store.dump_to_write(format, write) + }?) } -impl GraphOrDatasetFormat { - fn from_path(path: &Path) -> anyhow::Result<Self> { - format_from_path(path, Self::from_extension) - } - - fn from_extension(name: &str) -> anyhow::Result<Self> { - Ok(match (GraphFormat::from_extension(name), DatasetFormat::from_extension(name)) { - (Some(g), Some(d)) => bail!("The file extension '{name}' can be resolved to both '{}' and '{}', not sure what to pick", g.file_extension(), d.file_extension()), - (Some(g), None) => Self::Graph(g), - (None, Some(d)) => Self::Dataset(d), - (None, None) => - bail!("The file extension '{name}' is unknown") - }) - } - - fn from_media_type(name: &str) -> anyhow::Result<Self> { - Ok( - match ( - GraphFormat::from_media_type(name), - DatasetFormat::from_media_type(name), - ) { - (Some(g), Some(d)) => bail!( - "The media type '{name}' can be resolved to both '{}' and '{}', not sure what to pick", - g.file_extension(), - d.file_extension() - ), - (Some(g), None) => Self::Graph(g), - (None, Some(d)) => Self::Dataset(d), - (None, None) => bail!("The media type '{name}' is unknown"), - }, - ) +fn do_convert<R: Read, W: Write>( + parser: RdfParser, + read: R, + mut serializer: RdfSerializer, + write: W, + lenient: bool, + from_graph: &Option<GraphName>, + default_graph: &GraphName, +) -> anyhow::Result<W> { + let mut parser = parser.parse_read(read); + let first = parser.next(); // We read the first element to get prefixes + for (prefix_name, prefix_iri) in parser.prefixes() { + serializer = serializer + .with_prefix(prefix_name, prefix_iri) + .with_context(|| format!("Invalid IRI for prefix {prefix_name}: {prefix_iri}"))?; + } + let mut writer = serializer.serialize_to_write(write); + for quad_result in first.into_iter().chain(parser) { + match quad_result { + Ok(mut quad) => { + if let Some(from_graph) = from_graph { + if quad.graph_name == *from_graph { + quad.graph_name = GraphName::DefaultGraph; + } else { + continue; + } + } + if quad.graph_name.is_default_graph() { + quad.graph_name = default_graph.clone(); + } + writer.write_quad(&quad)?; + } + Err(e) => { + if lenient { + eprintln!("Parsing error: {e}"); + } else { + return Err(e.into()); + } + } + } } + Ok(writer.finish()?) } fn format_from_path<T>( @@ -752,21 +885,24 @@ fn format_from_path<T>( } } -impl FromStr for GraphOrDatasetFormat { - type Err = Error; +fn rdf_format_from_path(path: &Path) -> anyhow::Result<RdfFormat> { + format_from_path(path, |ext| { + RdfFormat::from_extension(ext) + .with_context(|| format!("The file extension '{ext}' is unknown")) + }) +} - fn from_str(name: &str) -> anyhow::Result<Self> { - if let Ok(t) = Self::from_extension(name) { - return Ok(t); - } - if let Ok(t) = Self::from_media_type(name) { - return Ok(t); - } - bail!("The file format '{name}' is unknown") +fn rdf_format_from_name(name: &str) -> anyhow::Result<RdfFormat> { + if let Some(t) = RdfFormat::from_extension(name) { + return Ok(t); } + if let Some(t) = RdfFormat::from_media_type(name) { + return Ok(t); + } + bail!("The file format '{name}' is unknown") } -fn serve(store: Store, bind: String, read_only: bool, cors: bool) -> anyhow::Result<()> { +fn serve(store: Store, bind: &str, read_only: bool, cors: bool) -> anyhow::Result<()> { let mut server = if cors { Server::new(cors_middleware(move |request| { handle_request(request, store.clone(), read_only) @@ -777,13 +913,18 @@ fn serve(store: Store, bind: String, read_only: bool, cors: bool) -> anyhow::Res handle_request(request, store.clone(), read_only) .unwrap_or_else(|(status, message)| error(status, message)) }) - }; - server.set_global_timeout(HTTP_TIMEOUT); - server.set_server_name(concat!("Oxigraph/", env!("CARGO_PKG_VERSION")))?; + } + .with_global_timeout(HTTP_TIMEOUT) + .with_server_name(concat!("Oxigraph/", env!("CARGO_PKG_VERSION")))? + .with_max_concurrent_connections(available_parallelism()?.get() * 128); + for socket in bind.to_socket_addrs()? { + server = server.bind(socket); + } + let server = server.spawn()?; #[cfg(target_os = "linux")] systemd_notify_ready()?; - eprintln!("Listening for requests at http://{}", &bind); - server.listen(bind)?; + eprintln!("Listening for requests at http://{bind}"); + server.join()?; Ok(()) } @@ -862,16 +1003,12 @@ fn handle_request( let content_type = content_type(request).ok_or_else(|| bad_request("No Content-Type given"))?; if content_type == "application/sparql-query" { - let mut buffer = String::new(); - request - .body_mut() - .take(MAX_SPARQL_BODY_SIZE) - .read_to_string(&mut buffer) + let query = io::read_to_string(request.body_mut().take(MAX_SPARQL_BODY_SIZE)) .map_err(bad_request)?; configure_and_evaluate_sparql_query( &store, &[url_query(request)], - Some(buffer), + Some(query), request, ) } else if content_type == "application/x-www-form-urlencoded" { @@ -898,16 +1035,12 @@ fn handle_request( let content_type = content_type(request).ok_or_else(|| bad_request("No Content-Type given"))?; if content_type == "application/sparql-update" { - let mut buffer = String::new(); - request - .body_mut() - .take(MAX_SPARQL_BODY_SIZE) - .read_to_string(&mut buffer) + let update = io::read_to_string(request.body_mut().take(MAX_SPARQL_BODY_SIZE)) .map_err(bad_request)?; configure_and_evaluate_sparql_update( &store, &[url_query(request)], - Some(buffer), + Some(update), request, ) } else if content_type == "application/x-www-form-urlencoded" { @@ -930,8 +1063,9 @@ fn handle_request( (path, "GET") if path.starts_with("/store") => { if let Some(target) = store_target(request)? { assert_that_graph_exists(&store, &target)?; - let format = graph_content_negotiation(request)?; - let triples = store.quads_for_pattern( + let format = rdf_content_negotiation(request)?; + + let quads = store.quads_for_pattern( None, None, None, @@ -940,14 +1074,14 @@ fn handle_request( ReadForWrite::build_response( move |w| { Ok(( - GraphSerializer::from_format(format).triple_writer(w)?, - triples, + RdfSerializer::from_format(format).serialize_to_write(w), + quads, )) }, - |(mut writer, mut triples)| { - Ok(if let Some(t) = triples.next() { - writer.write(&t?.into())?; - Some((writer, triples)) + |(mut writer, mut quads)| { + Ok(if let Some(q) = quads.next() { + writer.write_triple(&q?.into())?; + Some((writer, quads)) } else { writer.finish()?; None @@ -956,17 +1090,22 @@ fn handle_request( format.media_type(), ) } else { - let format = dataset_content_negotiation(request)?; + let format = rdf_content_negotiation(request)?; + if !format.supports_datasets() { + return Err(bad_request(format!( + "It is not possible to serialize the full RDF dataset using {format} that does not support named graphs" + ))); + } ReadForWrite::build_response( move |w| { Ok(( - DatasetSerializer::from_format(format).quad_writer(w)?, + RdfSerializer::from_format(format).serialize_to_write(w), store.iter(), )) }, |(mut writer, mut quads)| { Ok(if let Some(q) = quads.next() { - writer.write(&q?)?; + writer.write_quad(&q?)?; Some((writer, quads)) } else { writer.finish()?; @@ -984,7 +1123,7 @@ fn handle_request( let content_type = content_type(request).ok_or_else(|| bad_request("No Content-Type given"))?; if let Some(target) = store_target(request)? { - let format = GraphFormat::from_media_type(&content_type) + let format = RdfFormat::from_media_type(&content_type) .ok_or_else(|| unsupported_media_type(&content_type))?; let new = !match &target { NamedGraphName::NamedNode(target) => { @@ -1008,7 +1147,7 @@ fn handle_request( true } }; - web_load_graph(&store, request, format, GraphName::from(target).as_ref())?; + web_load_graph(&store, request, format, &GraphName::from(target))?; Ok(Response::builder(if new { Status::CREATED } else { @@ -1016,7 +1155,7 @@ fn handle_request( }) .build()) } else { - let format = DatasetFormat::from_media_type(&content_type) + let format = RdfFormat::from_media_type(&content_type) .ok_or_else(|| unsupported_media_type(&content_type))?; store.clear().map_err(internal_server_error)?; web_load_dataset(&store, request, format)?; @@ -1060,10 +1199,10 @@ fn handle_request( let content_type = content_type(request).ok_or_else(|| bad_request("No Content-Type given"))?; if let Some(target) = store_target(request)? { - let format = GraphFormat::from_media_type(&content_type) + let format = RdfFormat::from_media_type(&content_type) .ok_or_else(|| unsupported_media_type(&content_type))?; let new = assert_that_graph_exists(&store, &target).is_ok(); - web_load_graph(&store, request, format, GraphName::from(target).as_ref())?; + web_load_graph(&store, request, format, &GraphName::from(target))?; Ok(Response::builder(if new { Status::CREATED } else { @@ -1071,22 +1210,19 @@ fn handle_request( }) .build()) } else { - match GraphOrDatasetFormat::from_media_type(&content_type) - .map_err(|_| unsupported_media_type(&content_type))? - { - GraphOrDatasetFormat::Graph(format) => { - let graph = - resolve_with_base(request, &format!("/store/{:x}", random::<u128>()))?; - web_load_graph(&store, request, format, graph.as_ref().into())?; - Ok(Response::builder(Status::CREATED) - .with_header(HeaderName::LOCATION, graph.into_string()) - .unwrap() - .build()) - } - GraphOrDatasetFormat::Dataset(format) => { - web_load_dataset(&store, request, format)?; - Ok(Response::builder(Status::NO_CONTENT).build()) - } + let format = RdfFormat::from_media_type(&content_type) + .ok_or_else(|| unsupported_media_type(&content_type))?; + if format.supports_datasets() { + web_load_dataset(&store, request, format)?; + Ok(Response::builder(Status::NO_CONTENT).build()) + } else { + let graph = + resolve_with_base(request, &format!("/store/{:x}", random::<u128>()))?; + web_load_graph(&store, request, format, &graph.clone().into())?; + Ok(Response::builder(Status::CREATED) + .with_header(HeaderName::LOCATION, graph.into_string()) + .unwrap() + .build()) } } } @@ -1115,13 +1251,11 @@ fn base_url(request: &Request) -> String { } fn resolve_with_base(request: &Request, url: &str) -> Result<NamedNode, HttpError> { - Ok(NamedNode::new_unchecked( - Iri::parse(base_url(request)) - .map_err(bad_request)? - .resolve(url) - .map_err(bad_request)? - .into_inner(), - )) + Ok(Iri::parse(base_url(request)) + .map_err(bad_request)? + .resolve(url) + .map_err(bad_request)? + .into()) } fn url_query(request: &Request) -> &[u8] { @@ -1214,7 +1348,7 @@ fn evaluate_sparql_query( move |w| { Ok(( QueryResultsSerializer::from_format(format) - .solutions_writer(w, solutions.variables().to_vec())?, + .serialize_solutions_to_write(w, solutions.variables().to_vec())?, solutions, )) }, @@ -1234,7 +1368,7 @@ fn evaluate_sparql_query( let format = query_results_content_negotiation(request)?; let mut body = Vec::new(); QueryResultsSerializer::from_format(format) - .write_boolean_result(&mut body, result) + .serialize_boolean_to_write(&mut body, result) .map_err(internal_server_error)?; Ok(Response::builder(Status::OK) .with_header(HeaderName::CONTENT_TYPE, format.media_type()) @@ -1242,17 +1376,17 @@ fn evaluate_sparql_query( .with_body(body)) } QueryResults::Graph(triples) => { - let format = graph_content_negotiation(request)?; + let format = rdf_content_negotiation(request)?; ReadForWrite::build_response( move |w| { Ok(( - GraphSerializer::from_format(format).triple_writer(w)?, + RdfSerializer::from_format(format).serialize_to_write(w), triples, )) }, |(mut writer, mut triples)| { Ok(if let Some(t) = triples.next() { - writer.write(&t?)?; + writer.write_triple(&t?)?; Some((writer, triples)) } else { writer.finish()?; @@ -1418,106 +1552,99 @@ impl From<NamedGraphName> for GraphName { } } -fn graph_content_negotiation(request: &Request) -> Result<GraphFormat, HttpError> { - content_negotiation( - request, - &[ - GraphFormat::NTriples.media_type(), - GraphFormat::Turtle.media_type(), - GraphFormat::RdfXml.media_type(), - ], - GraphFormat::from_media_type, - ) -} - -fn dataset_content_negotiation(request: &Request) -> Result<DatasetFormat, HttpError> { +fn rdf_content_negotiation(request: &Request) -> Result<RdfFormat, HttpError> { content_negotiation( request, + RdfFormat::from_media_type, + RdfFormat::NQuads, &[ - DatasetFormat::NQuads.media_type(), - DatasetFormat::TriG.media_type(), + ("application", RdfFormat::NQuads), + ("text", RdfFormat::NQuads), ], - DatasetFormat::from_media_type, + "application/n-quads or text/turtle", ) } fn query_results_content_negotiation(request: &Request) -> Result<QueryResultsFormat, HttpError> { content_negotiation( request, + QueryResultsFormat::from_media_type, + QueryResultsFormat::Json, &[ - QueryResultsFormat::Json.media_type(), - QueryResultsFormat::Xml.media_type(), - QueryResultsFormat::Csv.media_type(), - QueryResultsFormat::Tsv.media_type(), + ("application", QueryResultsFormat::Json), + ("text", QueryResultsFormat::Json), ], - QueryResultsFormat::from_media_type, + "application/sparql-results+json or text/tsv", ) } -fn content_negotiation<F>( +fn content_negotiation<F: Copy>( request: &Request, - supported: &[&str], parse: impl Fn(&str) -> Option<F>, + default: F, + default_by_base: &[(&str, F)], + example: &str, ) -> Result<F, HttpError> { - let default = HeaderValue::default(); + let default_value = HeaderValue::default(); let header = request .header(&HeaderName::ACCEPT) - .unwrap_or(&default) + .unwrap_or(&default_value) .to_str() .map_err(|_| bad_request("The Accept header should be a valid ASCII string"))?; if header.is_empty() { - return parse(supported.first().unwrap()) - .ok_or_else(|| internal_server_error("Unknown media type")); + return Ok(default); } let mut result = None; let mut result_score = 0_f32; - - for possible in header.split(',') { - let (possible, parameters) = possible.split_once(';').unwrap_or((possible, "")); + for mut possible in header.split(',') { + let mut score = 1.; + if let Some((possible_type, last_parameter)) = possible.rsplit_once(';') { + if let Some((name, value)) = last_parameter.split_once('=') { + if name.trim().eq_ignore_ascii_case("q") { + score = f32::from_str(value.trim()).map_err(|_| { + bad_request(format!("Invalid Accept media type score: {value}")) + })?; + possible = possible_type; + } + } + } + if score <= result_score { + continue; + } let (possible_base, possible_sub) = possible + .split_once(';') + .unwrap_or((possible, "")) + .0 .split_once('/') .ok_or_else(|| bad_request(format!("Invalid media type: '{possible}'")))?; let possible_base = possible_base.trim(); let possible_sub = possible_sub.trim(); - let mut score = 1.; - for parameter in parameters.split(';') { - let parameter = parameter.trim(); - if let Some(s) = parameter.strip_prefix("q=") { - score = f32::from_str(s.trim()) - .map_err(|_| bad_request(format!("Invalid Accept media type score: {s}")))? + let mut format = None; + if possible_base == "*" && possible_sub == "*" { + format = Some(default); + } else if possible_sub == "*" { + for (base, sub_format) in default_by_base { + if *base == possible_base { + format = Some(*sub_format); + } } + } else { + format = parse(possible); } - if score <= result_score { - continue; - } - for candidate in supported { - let (candidate_base, candidate_sub) = candidate - .split_once(';') - .map_or(*candidate, |(p, _)| p) - .split_once('/') - .ok_or_else(|| { - internal_server_error(format!("Invalid media type: '{possible}'")) - })?; - if (possible_base == candidate_base || possible_base == "*") - && (possible_sub == candidate_sub || possible_sub == "*") - { - result = Some(candidate); - result_score = score; - break; - } + if let Some(format) = format { + result = Some(format); + result_score = score; } } - let result = result.ok_or_else(|| { + result.ok_or_else(|| { ( Status::NOT_ACCEPTABLE, - format!("The available Content-Types are {}", supported.join(", "),), + format!("The accept header does not provide any accepted format like {example}"), ) - })?; - - parse(result).ok_or_else(|| internal_server_error("Unknown media type")) + }) } fn content_type(request: &Request) -> Option<String> { @@ -1534,28 +1661,24 @@ fn content_type(request: &Request) -> Option<String> { fn web_load_graph( store: &Store, request: &mut Request, - format: GraphFormat, - to_graph_name: GraphNameRef<'_>, + format: RdfFormat, + to_graph_name: &GraphName, ) -> Result<(), HttpError> { - let base_iri = if let GraphNameRef::NamedNode(graph_name) = to_graph_name { + let base_iri = if let GraphName::NamedNode(graph_name) = to_graph_name { Some(graph_name.as_str()) } else { None }; + let mut parser = RdfParser::from_format(format) + .without_named_graphs() + .with_default_graph(to_graph_name.clone()); + if let Some(base_iri) = base_iri { + parser = parser.with_base_iri(base_iri).map_err(bad_request)?; + } if url_query_parameter(request, "no_transaction").is_some() { - web_bulk_loader(store, request).load_graph( - BufReader::new(request.body_mut()), - format, - to_graph_name, - base_iri, - ) + web_bulk_loader(store, request).load_from_read(parser, request.body_mut()) } else { - store.load_graph( - BufReader::new(request.body_mut()), - format, - to_graph_name, - base_iri, - ) + store.load_from_read(parser, request.body_mut()) } .map_err(loader_to_http_error) } @@ -1563,16 +1686,12 @@ fn web_load_graph( fn web_load_dataset( store: &Store, request: &mut Request, - format: DatasetFormat, + format: RdfFormat, ) -> Result<(), HttpError> { if url_query_parameter(request, "no_transaction").is_some() { - web_bulk_loader(store, request).load_dataset( - BufReader::new(request.body_mut()), - format, - None, - ) + web_bulk_loader(store, request).load_from_read(format, request.body_mut()) } else { - store.load_dataset(BufReader::new(request.body_mut()), format, None) + store.load_from_read(format, request.body_mut()) } .map_err(loader_to_http_error) } @@ -1628,6 +1747,7 @@ fn loader_to_http_error(e: LoaderError) -> HttpError { match e { LoaderError::Parsing(e) => bad_request(e), LoaderError::Storage(e) => internal_server_error(e), + LoaderError::InvalidBaseIri { .. } => bad_request(e), } } @@ -1652,7 +1772,7 @@ impl<O: 'static, U: (Fn(O) -> io::Result<Option<O>>) + 'static> ReadForWrite<O, .map_err(internal_server_error)?; Ok(Response::builder(Status::OK) .with_header(HeaderName::CONTENT_TYPE, content_type) - .unwrap() + .map_err(internal_server_error)? .with_body(Body::from_read(Self { buffer, position: 0, @@ -1709,6 +1829,14 @@ impl Write for ReadForWriteWriter { } } +fn close_file_writer(writer: BufWriter<File>) -> io::Result<()> { + let mut file = writer + .into_inner() + .map_err(io::IntoInnerError::into_error)?; + file.flush()?; + file.sync_all() +} + #[cfg(target_os = "linux")] fn systemd_notify_ready() -> io::Result<()> { if let Some(path) = env::var_os("NOTIFY_SOCKET") { @@ -1719,20 +1847,24 @@ fn systemd_notify_ready() -> io::Result<()> { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; use anyhow::Result; use assert_cmd::Command; - use assert_fs::{prelude::*, NamedTempFile, TempDir}; + use assert_fs::prelude::*; + use assert_fs::{NamedTempFile, TempDir}; use flate2::write::GzEncoder; use flate2::Compression; use oxhttp::model::Method; use predicates::prelude::*; use std::fs::remove_dir_all; + use std::io::read_to_string; fn cli_command() -> Result<Command> { Ok(Command::from_std( escargot::CargoBuild::new() - .bin(env!("CARGO_PKG_NAME")) + .bin("oxigraph") .manifest_path(format!("{}/Cargo.toml", env!("CARGO_MANIFEST_DIR"))) .run()? .command(), @@ -1779,15 +1911,16 @@ mod tests { #[test] fn cli_load_optimize_and_dump_graph() -> Result<()> { let store_dir = TempDir::new()?; - let input_file = NamedTempFile::new("input.nt")?; - input_file - .write_str("<http://example.com/s> <http://example.com/p> <http://example.com/o> .")?; + let input_file = NamedTempFile::new("input.ttl")?; + input_file.write_str("<s> <http://example.com/p> <http://example.com/o> .")?; cli_command()? + .arg("load") .arg("--location") .arg(store_dir.path()) - .arg("load") .arg("--file") .arg(input_file.path()) + .arg("--base") + .arg("http://example.com/") .assert() .success(); @@ -2110,6 +2243,60 @@ mod tests { ) } + #[test] + fn cli_convert_file() -> Result<()> { + let input_file = NamedTempFile::new("input.ttl")?; + input_file.write_str("@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person ;\n\tschema:name \"Foo Bar\"@en .\n")?; + let output_file = NamedTempFile::new("output.rdf")?; + cli_command()? + .arg("convert") + .arg("--from-file") + .arg(input_file.path()) + .arg("--from-base") + .arg("http://example.com/") + .arg("--to-file") + .arg(output_file.path()) + .assert() + .success(); + output_file + .assert("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>"); + Ok(()) + } + + #[test] + fn cli_convert_from_default_graph_to_named_graph() -> Result<()> { + cli_command()? + .arg("convert") + .arg("--from-format") + .arg("trig") + .arg("--to-format") + .arg("nq") + .arg("--from-default-graph") + .arg("--to-graph") + .arg("http://example.com/t") + .write_stdin("@base <http://example.com/> . <s> <p> <o> . <g> { <sg> <pg> <og> . }") + .assert() + .stdout("<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/t> .\n") + .success(); + Ok(()) + } + + #[test] + fn cli_convert_from_named_graph() -> Result<()> { + cli_command()? + .arg("convert") + .arg("--from-format") + .arg("trig") + .arg("--to-format") + .arg("nq") + .arg("--from-graph") + .arg("http://example.com/g") + .write_stdin("@base <http://example.com/> . <s> <p> <o> . <g> { <sg> <pg> <og> . }") + .assert() + .stdout("<http://example.com/sg> <http://example.com/pg> <http://example.com/og> .\n"); + Ok(()) + } + #[test] fn get_ui() -> Result<()> { ServerTest::new()?.test_status( @@ -2175,7 +2362,22 @@ mod tests { .build(); ServerTest::new()?.test_body( request, - "{\"head\":{\"vars\":[\"s\",\"p\",\"o\"]},\"results\":{\"bindings\":[]}}", + r#"{"head":{"vars":["s","p","o"]},"results":{"bindings":[]}}"#, + ) + } + + #[test] + fn get_query_accept_substar() -> Result<()> { + let request = Request::builder( + Method::GET, + "http://localhost/query?query=SELECT%20?s%20?p%20?o%20WHERE%20{%20?s%20?p%20?o%20}" + .parse()?, + ) + .with_header(HeaderName::ACCEPT, "text/*")? + .build(); + ServerTest::new()?.test_body( + request, + r#"{"head":{"vars":["s","p","o"]},"results":{"bindings":[]}}"#, ) } @@ -2193,7 +2395,7 @@ mod tests { .build(); ServerTest::new()?.test_body( request, - "{\"head\":{\"vars\":[\"s\",\"p\",\"o\"]},\"results\":{\"bindings\":[]}}", + r#"{"head":{"vars":["s","p","o"]},"results":{"bindings":[]}}"#, ) } @@ -2201,13 +2403,55 @@ mod tests { fn get_query_accept_bad() -> Result<()> { let request = Request::builder( Method::GET, - "http://localhost/query?query=SELECT%20*%20WHERE%20{%20?s%20?p%20?o%20}".parse()?, + "http://localhost/query?query=SELECT%20?s%20?p%20?o%20WHERE%20{%20?s%20?p%20?o%20}" + .parse()?, ) .with_header(HeaderName::ACCEPT, "application/foo")? .build(); ServerTest::new()?.test_status(request, Status::NOT_ACCEPTABLE) } + #[test] + fn get_query_accept_explicit_priority() -> Result<()> { + let request = Request::builder( + Method::GET, + "http://localhost/query?query=SELECT%20?s%20?p%20?o%20WHERE%20{%20?s%20?p%20?o%20}" + .parse()?, + ) + .with_header(HeaderName::ACCEPT, "text/foo;q=0.5 , text/json ; q = 0.7")? + .build(); + ServerTest::new()?.test_body( + request, + r#"{"head":{"vars":["s","p","o"]},"results":{"bindings":[]}}"#, + ) + } + + #[test] + fn get_query_accept_implicit_priority() -> Result<()> { + let request = Request::builder( + Method::GET, + "http://localhost/query?query=SELECT%20?s%20?p%20?o%20WHERE%20{%20?s%20?p%20?o%20}" + .parse()?, + ) + .with_header(HeaderName::ACCEPT, "text/json,text/foo")? + .build(); + ServerTest::new()?.test_body( + request, + r#"{"head":{"vars":["s","p","o"]},"results":{"bindings":[]}}"#, + ) + } + #[test] + fn get_query_accept_implicit_and_explicit_priority() -> Result<()> { + let request = Request::builder( + Method::GET, + "http://localhost/query?query=SELECT%20?s%20?p%20?o%20WHERE%20{%20?s%20?p%20?o%20}" + .parse()?, + ) + .with_header(HeaderName::ACCEPT, "text/foo;q=0.9,text/csv")? + .build(); + ServerTest::new()?.test_body(request, "s,p,o\r\n") + } + #[test] fn get_bad_query() -> Result<()> { ServerTest::new()?.test_status( @@ -2443,16 +2687,16 @@ mod tests { let request = Request::builder(Method::PUT, "http://localhost/store/person/1.ttl".parse()?) .with_header(HeaderName::CONTENT_TYPE, "text/turtle; charset=utf-8")? .with_body( - " + r#" @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix v: <http://www.w3.org/2006/vcard/ns#> . <http://$HOST$/$GRAPHSTORE$/person/1> a foaf:Person; foaf:businessCard [ a v:VCard; - v:fn \"John Doe\" + v:fn "John Doe" ]. -", +"#, ); server.test_status(request, Status::CREATED)?; @@ -2481,16 +2725,16 @@ mod tests { let request = Request::builder(Method::PUT, "http://localhost/store/person/1.ttl".parse()?) .with_header(HeaderName::CONTENT_TYPE, "text/turtle; charset=utf-8")? .with_body( - " + r#" @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix v: <http://www.w3.org/2006/vcard/ns#> . <http://$HOST$/$GRAPHSTORE$/person/1> a foaf:Person; foaf:businessCard [ a v:VCard; - v:fn \"Jane Doe\" + v:fn "Jane Doe" ]. -", +"#, ); server.test_status(request, Status::NO_CONTENT)?; @@ -2504,16 +2748,16 @@ mod tests { let request = Request::builder(Method::PUT, "http://localhost/store?default".parse()?) .with_header(HeaderName::CONTENT_TYPE, "text/turtle; charset=utf-8")? .with_body( - " + r#" @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix v: <http://www.w3.org/2006/vcard/ns#> . [] a foaf:Person; foaf:businessCard [ a v:VCard; - v:given-name \"Alice\" + v:given-name "Alice" ] . -", +"#, ); server.test_status(request, Status::NO_CONTENT)?; // The default graph always exists in Oxigraph @@ -2545,16 +2789,16 @@ mod tests { let request = Request::builder(Method::PUT, "http://localhost/store/person/2.ttl".parse()?) .with_header(HeaderName::CONTENT_TYPE, "text/turtle; charset=utf-8")? .with_body( - " + r#" @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix v: <http://www.w3.org/2006/vcard/ns#> . [] a foaf:Person; foaf:businessCard [ a v:VCard; - v:given-name \"Alice\" + v:given-name "Alice" ] . -", +"#, ); server.test_status(request, Status::NO_CONTENT)?; @@ -2603,16 +2847,16 @@ mod tests { let request = Request::builder(Method::POST, "http://localhost/store".parse()?) .with_header(HeaderName::CONTENT_TYPE, "text/turtle; charset=utf-8")? .with_body( - " + r#" @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix v: <http://www.w3.org/2006/vcard/ns#> . [] a foaf:Person; foaf:businessCard [ a v:VCard; - v:given-name \"Alice\" + v:given-name "Alice" ] . -", +"#, ); let response = server.exec(request); assert_eq!(response.status(), Status::CREATED); @@ -2748,18 +2992,16 @@ mod tests { } fn check_status(mut response: Response, expected_status: Status) -> Result<()> { - let mut buf = String::new(); - response.body_mut().read_to_string(&mut buf)?; - assert_eq!(response.status(), expected_status, "Error message: {buf}"); + let body = read_to_string(response.body_mut())?; + assert_eq!(response.status(), expected_status, "Error message: {body}"); Ok(()) } fn test_body(&self, request: Request, expected_body: &str) -> Result<()> { let mut response = self.exec(request); - let mut buf = String::new(); - response.body_mut().read_to_string(&mut buf)?; - assert_eq!(response.status(), Status::OK, "Error message: {buf}"); - assert_eq!(&buf, expected_body); + let body = read_to_string(response.body_mut())?; + assert_eq!(response.status(), Status::OK, "Error message: {body}"); + assert_eq!(&body, expected_body); Ok(()) } } diff --git a/server/templates/query.html b/cli/templates/query.html similarity index 100% rename from server/templates/query.html rename to cli/templates/query.html diff --git a/clippy.toml b/clippy.toml index 302f26e0..13d3926a 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1,4 +1,4 @@ -avoid-breaking-exported-api = true +avoid-breaking-exported-api = false cognitive-complexity-threshold = 50 too-many-arguments-threshold = 10 type-complexity-threshold = 500 \ No newline at end of file diff --git a/docs/arch-diagram.svg b/docs/arch-diagram.svg new file mode 100644 index 00000000..749c466b --- /dev/null +++ b/docs/arch-diagram.svg @@ -0,0 +1,120 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="624" height="384" class="svgbob"> + <style>.svgbob line, .svgbob path, .svgbob circle, .svgbob rect, .svgbob polygon { + stroke: black; + stroke-width: 2; + stroke-opacity: 1; + fill-opacity: 1; + stroke-linecap: round; + stroke-linejoin: miter; + } + .svgbob text { + white-space: pre; + fill: black; + font-family: Iosevka Fixed, monospace; + font-size: 14px; + } + .svgbob rect.backdrop { + stroke: none; + fill: white; + } + .svgbob .broken { + stroke-dasharray: 8; + } + .svgbob .filled { + fill: black; + } + .svgbob .bg_filled { + fill: white; + stroke-width: 1; + } + .svgbob .nofill { + fill: white; + } + .svgbob .end_marked_arrow { + marker-end: url(#arrow); + } + .svgbob .start_marked_arrow { + marker-start: url(#arrow); + } + .svgbob .end_marked_diamond { + marker-end: url(#diamond); + } + .svgbob .start_marked_diamond { + marker-start: url(#diamond); + } + .svgbob .end_marked_circle { + marker-end: url(#circle); + } + .svgbob .start_marked_circle { + marker-start: url(#circle); + } + .svgbob .end_marked_open_circle { + marker-end: url(#open_circle); + } + .svgbob .start_marked_open_circle { + marker-start: url(#open_circle); + } + .svgbob .end_marked_big_open_circle { + marker-end: url(#big_open_circle); + } + .svgbob .start_marked_big_open_circle { + marker-start: url(#big_open_circle); + }<!--separator-->.svgbob .r{ + fill: papayawhip; + } + .svgbob .p{ + fill: lightyellow; + } + .svgbob .j{ + fill: lightgreen; + } + </style> + <defs> + <marker id="arrow" viewBox="-2 -2 8 8" refX="4" refY="2" markerWidth="7" markerHeight="7" + orient="auto-start-reverse"> + <polygon points="0,0 0,4 4,2 0,0"></polygon> + </marker> + <marker id="diamond" viewBox="-2 -2 8 8" refX="4" refY="2" markerWidth="7" markerHeight="7" + orient="auto-start-reverse"> + <polygon points="0,2 2,0 4,2 2,4 0,2"></polygon> + </marker> + <marker id="circle" viewBox="0 0 8 8" refX="4" refY="4" markerWidth="7" markerHeight="7" + orient="auto-start-reverse"> + <circle cx="4" cy="4" r="2" class="filled"></circle> + </marker> + <marker id="open_circle" viewBox="0 0 8 8" refX="4" refY="4" markerWidth="7" markerHeight="7" + orient="auto-start-reverse"> + <circle cx="4" cy="4" r="2" class="bg_filled"></circle> + </marker> + <marker id="big_open_circle" viewBox="0 0 8 8" refX="4" refY="4" markerWidth="7" markerHeight="7" + orient="auto-start-reverse"> + <circle cx="4" cy="4" r="3" class="bg_filled"></circle> + </marker> + </defs> + <rect class="backdrop" x="0" y="0" width="624" height="384"></rect> + <rect x="4" y="8" width="152" height="32" class="solid nofill r" rx="0"></rect> + <text x="18" y="28">oxigraph CLI</text> + <rect x="244" y="8" width="136" height="32" class="solid nofill p" rx="0"></rect> + <text x="258" y="28">pyoxigraph</text> + <rect x="468" y="8" width="144" height="32" class="solid nofill j" rx="0"></rect> + <text x="482" y="28">oxigraph</text> + <text x="554" y="28">JS</text> + <rect x="4" y="72" width="608" height="32" class="solid nofill r" rx="0"></rect> + <text x="18" y="92">oxigraph</text> + <rect x="68" y="136" width="232" height="32" class="solid nofill r" rx="0"></rect> + <text x="82" y="156">oxrdfio</text> + <rect x="348" y="136" width="112" height="32" class="solid nofill r" rx="0"></rect> + <text x="362" y="156">sparopt</text> + <rect x="68" y="200" width="96" height="32" class="solid nofill r" rx="0"></rect> + <text x="82" y="220">oxttl</text> + <rect x="180" y="200" width="120" height="32" class="solid nofill r" rx="0"></rect> + <text x="194" y="220">oxrdfxml</text> + <rect x="316" y="200" width="144" height="32" class="solid nofill r" rx="0"></rect> + <text x="330" y="220">spargebra</text> + <rect x="476" y="200" width="136" height="32" class="solid nofill r" rx="0"></rect> + <text x="490" y="220">sparesults</text> + <rect x="36" y="264" width="576" height="32" class="solid nofill r" rx="0"></rect> + <text x="50" y="284">oxrdf</text> + <rect x="4" y="328" width="152" height="32" class="solid nofill r" rx="0"></rect> + <text x="18" y="348">oxsdatatypes</text> +</svg> \ No newline at end of file diff --git a/docs/arch-diagram.txt b/docs/arch-diagram.txt new file mode 100644 index 00000000..ff3a5be0 --- /dev/null +++ b/docs/arch-diagram.txt @@ -0,0 +1,35 @@ ++------------------+ +----------------+ +-----------------+ ++ oxigraph CLI {r} + + pyoxigraph {p} + + oxigraph JS {j} + ++------------------+ +----------------+ +-----------------+ + ++---------------------------------------------------------------------------+ ++ oxigraph (Rust) {r} + ++---------------------------------------------------------------------------+ + + +----------------------------+ +-------------+ + + oxrdfio {r} + + sparopt {r} + + +----------------------------+ +-------------+ + + +-----------+ +--------------+ +-----------------+ +----------------+ + + oxttl {r} + + oxrdfxml {r} + + spargebra {r} + + sparesults {r} + + +-----------+ +--------------+ +-----------------+ +----------------+ + + +-----------------------------------------------------------------------+ + + oxrdf {r} + + +-----------------------------------------------------------------------+ + ++------------------+ ++ oxsdatatypes {r} + ++------------------+ + + +# Legend: +r = { + fill: papayawhip; +} +p = { + fill: lightyellow; +} +j = { + fill: lightgreen; +} diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 0c8a0b72..8ce8daf3 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -1,7 +1,6 @@ [package] name = "oxigraph-fuzz" version = "0.0.0" -authors = ["Automatically generated"] publish = false edition = "2021" @@ -9,13 +8,15 @@ edition = "2021" cargo-fuzz = true [dependencies] -anyhow = "1" -lazy_static = "1" +anyhow = "1.0.72" libfuzzer-sys = "0.4" -spargebra = { path = "../lib/spargebra", features = ["rdf-star", "sep-0006"] } +oxigraph = { path = "../lib/oxigraph" } +oxrdf = { path = "../lib/oxrdf", features = ["rdf-star"] } +oxrdfxml = { path = "../lib/oxrdfxml" } +oxttl = { path = "../lib/oxttl", features = ["rdf-star"] } sparesults = { path = "../lib/sparesults", features = ["rdf-star"] } +spargebra = { path = "../lib/spargebra", features = ["rdf-star", "sep-0006"] } sparql-smith = { path = "../lib/sparql-smith", features = ["sep-0006"] } -oxigraph = { path = "../lib" } [profile.release] codegen-units = 1 @@ -23,6 +24,18 @@ debug = true [workspace] +[[bin]] +name = "nquads" +path = "fuzz_targets/nquads.rs" + +[[bin]] +name = "n3" +path = "fuzz_targets/n3.rs" + +[[bin]] +name = "rdf_xml" +path = "fuzz_targets/rdf_xml.rs" + [[bin]] name = "sparql_eval" path = "fuzz_targets/sparql_eval.rs" @@ -46,3 +59,7 @@ path = "fuzz_targets/sparql_results_xml.rs" [[bin]] name = "sparql_results_tsv" path = "fuzz_targets/sparql_results_tsv.rs" + +[[bin]] +name = "trig" +path = "fuzz_targets/trig.rs" diff --git a/fuzz/fuzz_targets/n3.rs b/fuzz/fuzz_targets/n3.rs new file mode 100644 index 00000000..29e63458 --- /dev/null +++ b/fuzz/fuzz_targets/n3.rs @@ -0,0 +1,28 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use oxttl::N3Parser; + +fuzz_target!(|data: &[u8]| { + let mut quads = Vec::new(); + let mut parser = N3Parser::new() + .with_base_iri("http://example.com/") + .unwrap() + .parse(); + for chunk in data.split(|c| *c == 0xFF) { + parser.extend_from_slice(chunk); + while let Some(result) = parser.read_next() { + if let Ok(quad) = result { + quads.push(quad); + } + } + } + parser.end(); + while let Some(result) = parser.read_next() { + if let Ok(quad) = result { + quads.push(quad); + } + } + assert!(parser.is_end()); + //TODO: serialize +}); diff --git a/fuzz/fuzz_targets/nquads.rs b/fuzz/fuzz_targets/nquads.rs new file mode 100644 index 00000000..8852343c --- /dev/null +++ b/fuzz/fuzz_targets/nquads.rs @@ -0,0 +1,84 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use oxrdf::Quad; +use oxttl::{NQuadsParser, NQuadsSerializer}; + +fn parse<'a>( + chunks: impl IntoIterator<Item = &'a [u8]>, + unchecked: bool, +) -> (Vec<Quad>, Vec<String>) { + let mut quads = Vec::new(); + let mut errors = Vec::new(); + let mut parser = NQuadsParser::new().with_quoted_triples(); + if unchecked { + parser = parser.unchecked(); + } + let mut reader = parser.parse(); + for chunk in chunks { + reader.extend_from_slice(chunk); + while let Some(result) = reader.read_next() { + match result { + Ok(quad) => quads.push(quad), + Err(error) => errors.push(error.to_string()), + } + } + } + reader.end(); + while let Some(result) = reader.read_next() { + match result { + Ok(quad) => quads.push(quad), + Err(error) => errors.push(error.to_string()), + } + } + assert!(reader.is_end()); + (quads, errors) +} + +fuzz_target!(|data: &[u8]| { + // We parse with splitting + let (quads, errors) = parse(data.split(|c| *c == 0xFF), false); + // We parse without splitting + let (quads_without_split, errors_without_split) = parse( + [data + .iter() + .copied() + .filter(|c| *c != 0xFF) + .collect::<Vec<_>>() + .as_slice()], + false, + ); + assert_eq!(quads, quads_without_split); + assert_eq!(errors, errors_without_split); + + // We test also unchecked if valid + if errors.is_empty() { + let (quads_unchecked, errors_unchecked) = parse(data.split(|c| *c == 0xFF), true); + assert!(errors_unchecked.is_empty()); + assert_eq!(quads, quads_unchecked); + } + + // We serialize + let mut writer = NQuadsSerializer::new().serialize_to_write(Vec::new()); + for quad in &quads { + writer.write_quad(quad).unwrap(); + } + let new_serialization = writer.finish(); + + // We parse the serialization + let new_quads = NQuadsParser::new() + .with_quoted_triples() + .parse_read(new_serialization.as_slice()) + .collect::<Result<Vec<_>, _>>() + .map_err(|e| { + format!( + "Error on {:?} from {quads:?} based on {:?}: {e}", + String::from_utf8_lossy(&new_serialization), + String::from_utf8_lossy(data) + ) + }) + .unwrap(); + + // We check the roundtrip has not changed anything + assert_eq!(new_quads, quads); +}); diff --git a/fuzz/fuzz_targets/rdf_xml.rs b/fuzz/fuzz_targets/rdf_xml.rs new file mode 100644 index 00000000..e1efc7e9 --- /dev/null +++ b/fuzz/fuzz_targets/rdf_xml.rs @@ -0,0 +1,37 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use oxrdfxml::{RdfXmlParser, RdfXmlSerializer}; + +fuzz_target!(|data: &[u8]| { + // We parse + let mut triples = Vec::new(); + for triple in RdfXmlParser::new().parse_read(data) { + if let Ok(triple) = triple { + triples.push(triple); + } + } + + // We serialize + let mut writer = RdfXmlSerializer::new().serialize_to_write(Vec::new()); + for triple in &triples { + writer.write_triple(triple).unwrap(); + } + let new_serialization = writer.finish().unwrap(); + + // We parse the serialization + let new_triples = RdfXmlParser::new() + .parse_read(new_serialization.as_slice()) + .collect::<Result<Vec<_>, _>>() + .map_err(|e| { + format!( + "Error on {:?} from {triples:?} based on {:?}: {e}", + String::from_utf8_lossy(&new_serialization), + String::from_utf8_lossy(data) + ) + }) + .unwrap(); + + // We check the roundtrip has not changed anything + assert_eq!(new_triples, triples); +}); diff --git a/fuzz/fuzz_targets/sparql_eval.rs b/fuzz/fuzz_targets/sparql_eval.rs index 969bafe1..142f0be9 100644 --- a/fuzz/fuzz_targets/sparql_eval.rs +++ b/fuzz/fuzz_targets/sparql_eval.rs @@ -1,31 +1,26 @@ #![no_main] -use lazy_static::lazy_static; use libfuzzer_sys::fuzz_target; -use oxigraph::io::DatasetFormat; +use oxigraph::io::RdfFormat; use oxigraph::sparql::{Query, QueryOptions, QueryResults, QuerySolutionIter}; use oxigraph::store::Store; +use std::sync::OnceLock; -lazy_static! { - static ref STORE: Store = { +fuzz_target!(|data: sparql_smith::Query| { + static STORE: OnceLock<Store> = OnceLock::new(); + let store = STORE.get_or_init(|| { let store = Store::new().unwrap(); store - .load_dataset( - sparql_smith::DATA_TRIG.as_bytes(), - DatasetFormat::TriG, - None, - ) + .load_dataset(sparql_smith::DATA_TRIG.as_bytes(), RdfFormat::TriG, None) .unwrap(); store - }; -} + }); -fuzz_target!(|data: sparql_smith::Query| { let query_str = data.to_string(); if let Ok(query) = Query::parse(&query_str, None) { let options = QueryOptions::default(); - let with_opt = STORE.query_opt(query.clone(), options.clone()).unwrap(); - let without_opt = STORE + let with_opt = store.query_opt(query.clone(), options.clone()).unwrap(); + let without_opt = store .query_opt(query, options.without_optimizations()) .unwrap(); match (with_opt, without_opt) { @@ -52,7 +47,7 @@ fn query_solutions_key(iter: QuerySolutionIter, is_reduced: bool) -> String { let mut b = t .unwrap() .iter() - .map(|(var, val)| format!("{}: {}", var, val)) + .map(|(var, val)| format!("{var}: {val}")) .collect::<Vec<_>>(); b.sort_unstable(); b.join(" ") diff --git a/fuzz/fuzz_targets/sparql_query.rs b/fuzz/fuzz_targets/sparql_query.rs index 889d3e79..136a2c0f 100644 --- a/fuzz/fuzz_targets/sparql_query.rs +++ b/fuzz/fuzz_targets/sparql_query.rs @@ -3,5 +3,5 @@ use libfuzzer_sys::fuzz_target; use spargebra::Query; fuzz_target!(|data: &str| { - Query::parse(data, None); + let _ = Query::parse(data, None); }); diff --git a/fuzz/fuzz_targets/sparql_results_json.rs b/fuzz/fuzz_targets/sparql_results_json.rs index cd917481..f9588f8b 100644 --- a/fuzz/fuzz_targets/sparql_results_json.rs +++ b/fuzz/fuzz_targets/sparql_results_json.rs @@ -3,4 +3,4 @@ use libfuzzer_sys::fuzz_target; use oxigraph_fuzz::result_format::fuzz_result_format; use sparesults::QueryResultsFormat; -fuzz_target!(|data: &[u8]| { fuzz_result_format(QueryResultsFormat::Json, data) }); +fuzz_target!(|data: &[u8]| fuzz_result_format(QueryResultsFormat::Json, data)); diff --git a/fuzz/fuzz_targets/sparql_results_tsv.rs b/fuzz/fuzz_targets/sparql_results_tsv.rs index 4cf3f4cf..1aa600b7 100644 --- a/fuzz/fuzz_targets/sparql_results_tsv.rs +++ b/fuzz/fuzz_targets/sparql_results_tsv.rs @@ -3,4 +3,4 @@ use libfuzzer_sys::fuzz_target; use oxigraph_fuzz::result_format::fuzz_result_format; use sparesults::QueryResultsFormat; -fuzz_target!(|data: &[u8]| { fuzz_result_format(QueryResultsFormat::Tsv, data) }); +fuzz_target!(|data: &[u8]| fuzz_result_format(QueryResultsFormat::Tsv, data)); diff --git a/fuzz/fuzz_targets/sparql_results_xml.rs b/fuzz/fuzz_targets/sparql_results_xml.rs index 6c4747ec..451f528a 100644 --- a/fuzz/fuzz_targets/sparql_results_xml.rs +++ b/fuzz/fuzz_targets/sparql_results_xml.rs @@ -3,4 +3,4 @@ use libfuzzer_sys::fuzz_target; use oxigraph_fuzz::result_format::fuzz_result_format; use sparesults::QueryResultsFormat; -fuzz_target!(|data: &[u8]| { fuzz_result_format(QueryResultsFormat::Xml, data) }); +fuzz_target!(|data: &[u8]| fuzz_result_format(QueryResultsFormat::Xml, data)); diff --git a/fuzz/fuzz_targets/sparql_update.rs b/fuzz/fuzz_targets/sparql_update.rs index 15c0a995..56ffdae3 100644 --- a/fuzz/fuzz_targets/sparql_update.rs +++ b/fuzz/fuzz_targets/sparql_update.rs @@ -4,5 +4,5 @@ use spargebra::Update; use std::str; fuzz_target!(|data: &str| { - Update::parse(data, None); + let _ = Update::parse(data, None); }); diff --git a/fuzz/fuzz_targets/trig.rs b/fuzz/fuzz_targets/trig.rs new file mode 100644 index 00000000..64253e3c --- /dev/null +++ b/fuzz/fuzz_targets/trig.rs @@ -0,0 +1,167 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use oxrdf::{Dataset, GraphName, Quad, Subject, Term, Triple}; +use oxttl::{TriGParser, TriGSerializer}; + +fn parse<'a>( + chunks: impl IntoIterator<Item = &'a [u8]>, + unchecked: bool, +) -> (Vec<Quad>, Vec<String>, Vec<(String, String)>) { + let mut quads = Vec::new(); + let mut errors = Vec::new(); + let mut parser = TriGParser::new() + .with_quoted_triples() + .with_base_iri("http://example.com/") + .unwrap(); + if unchecked { + parser = parser.unchecked(); + } + let mut reader = parser.parse(); + for chunk in chunks { + reader.extend_from_slice(chunk); + while let Some(result) = reader.read_next() { + match result { + Ok(quad) => quads.push(quad), + Err(error) => errors.push(error.to_string()), + } + } + } + reader.end(); + while let Some(result) = reader.read_next() { + match result { + Ok(quad) => quads.push(quad), + Err(error) => errors.push(error.to_string()), + } + } + assert!(reader.is_end()); + ( + quads, + errors, + reader + .prefixes() + .map(|(k, v)| (k.to_owned(), v.to_owned())) + .collect(), + ) +} + +fn count_triple_blank_nodes(triple: &Triple) -> usize { + (match &triple.subject { + Subject::BlankNode(_) => 1, + Subject::Triple(t) => count_triple_blank_nodes(t), + _ => 0, + }) + (match &triple.object { + Term::BlankNode(_) => 1, + Term::Triple(t) => count_triple_blank_nodes(t), + _ => 0, + }) +} + +fn count_quad_blank_nodes(quad: &Quad) -> usize { + (match &quad.subject { + Subject::BlankNode(_) => 1, + Subject::Triple(t) => count_triple_blank_nodes(t), + _ => 0, + }) + (match &quad.object { + Term::BlankNode(_) => 1, + Term::Triple(t) => count_triple_blank_nodes(t), + _ => 0, + }) + usize::from(matches!(quad.graph_name, GraphName::BlankNode(_))) +} + +fn serialize_quads(quads: &[Quad], prefixes: Vec<(String, String)>) -> Vec<u8> { + let mut serializer = TriGSerializer::new(); + for (prefix_name, prefix_iri) in prefixes { + serializer = serializer.with_prefix(prefix_name, prefix_iri).unwrap(); + } + let mut writer = serializer.serialize_to_write(Vec::new()); + for quad in quads { + writer.write_quad(quad).unwrap(); + } + writer.finish().unwrap() +} + +fuzz_target!(|data: &[u8]| { + // We parse with splitting + let (quads, errors, prefixes) = parse(data.split(|c| *c == 0xFF), false); + // We parse without splitting + let (quads_without_split, errors_without_split, _) = parse( + [data + .iter() + .copied() + .filter(|c| *c != 0xFF) + .collect::<Vec<_>>() + .as_slice()], + false, + ); + let (quads_unchecked, errors_unchecked, _) = parse(data.split(|c| *c == 0xFF), true); + if errors.is_empty() { + assert!(errors_unchecked.is_empty()); + } + + let bnodes_count = quads.iter().map(count_quad_blank_nodes).sum::<usize>(); + if bnodes_count == 0 { + assert_eq!( + quads, + quads_without_split, + "With split:\n{}\nWithout split:\n{}", + String::from_utf8_lossy(&serialize_quads(&quads, Vec::new())), + String::from_utf8_lossy(&serialize_quads(&quads_without_split, Vec::new())) + ); + if errors.is_empty() { + assert_eq!( + quads, + quads_unchecked, + "Validating:\n{}\nUnchecked:\n{}", + String::from_utf8_lossy(&serialize_quads(&quads, Vec::new())), + String::from_utf8_lossy(&serialize_quads(&quads_unchecked, Vec::new())) + ); + } + } else if bnodes_count <= 4 { + let mut dataset_with_split = quads.iter().collect::<Dataset>(); + let mut dataset_without_split = quads_without_split.iter().collect::<Dataset>(); + dataset_with_split.canonicalize(); + dataset_without_split.canonicalize(); + assert_eq!( + dataset_with_split, + dataset_without_split, + "With split:\n{}\nWithout split:\n{}", + String::from_utf8_lossy(&serialize_quads(&quads, Vec::new())), + String::from_utf8_lossy(&serialize_quads(&quads_without_split, Vec::new())) + ); + if errors.is_empty() { + if errors.is_empty() { + let mut dataset_unchecked = quads_unchecked.iter().collect::<Dataset>(); + dataset_unchecked.canonicalize(); + assert_eq!( + dataset_with_split, + dataset_unchecked, + "Validating:\n{}\nUnchecked:\n{}", + String::from_utf8_lossy(&serialize_quads(&quads, Vec::new())), + String::from_utf8_lossy(&serialize_quads(&quads_unchecked, Vec::new())) + ); + } + } + } + assert_eq!(errors, errors_without_split); + + // We serialize + let new_serialization = serialize_quads(&quads, prefixes); + + // We parse the serialization + let new_quads = TriGParser::new() + .with_quoted_triples() + .parse_read(new_serialization.as_slice()) + .collect::<Result<Vec<_>, _>>() + .map_err(|e| { + format!( + "Error on {:?} from {quads:?} based on {:?}: {e}", + String::from_utf8_lossy(&new_serialization), + String::from_utf8_lossy(data) + ) + }) + .unwrap(); + + // We check the roundtrip has not changed anything + assert_eq!(new_quads, quads); +}); diff --git a/fuzz/src/result_format.rs b/fuzz/src/result_format.rs index cc00f9be..d6e15c54 100644 --- a/fuzz/src/result_format.rs +++ b/fuzz/src/result_format.rs @@ -1,24 +1,24 @@ use anyhow::Context; use sparesults::{ - QueryResultsFormat, QueryResultsParser, QueryResultsReader, QueryResultsSerializer, + FromReadQueryResultsReader, QueryResultsFormat, QueryResultsParser, QueryResultsSerializer, }; pub fn fuzz_result_format(format: QueryResultsFormat, data: &[u8]) { let parser = QueryResultsParser::from_format(format); let serializer = QueryResultsSerializer::from_format(format); - let Ok(reader) = parser.read_results(data) else { + let Ok(reader) = parser.parse_read(data) else { return; }; match reader { - QueryResultsReader::Solutions(solutions) => { + FromReadQueryResultsReader::Solutions(solutions) => { let Ok(solutions) = solutions.collect::<Result<Vec<_>, _>>() else { return; }; // We try to write again let mut writer = serializer - .solutions_writer( + .serialize_solutions_to_write( Vec::new(), solutions .get(0) @@ -31,30 +31,30 @@ pub fn fuzz_result_format(format: QueryResultsFormat, data: &[u8]) { let serialized = String::from_utf8(writer.finish().unwrap()).unwrap(); // And to parse again - if let QueryResultsReader::Solutions(roundtrip_solutions) = parser - .read_results(serialized.as_bytes()) - .with_context(|| format!("Parsing {:?}", &serialized)) + if let FromReadQueryResultsReader::Solutions(roundtrip_solutions) = parser + .parse_read(serialized.as_bytes()) + .with_context(|| format!("Parsing {serialized:?}")) .unwrap() { assert_eq!( roundtrip_solutions .collect::<Result<Vec<_>, _>>() - .with_context(|| format!("Parsing {:?}", &serialized)) + .with_context(|| format!("Parsing {serialized:?}")) .unwrap(), solutions ) } } - QueryResultsReader::Boolean(value) => { + FromReadQueryResultsReader::Boolean(value) => { // We try to write again let mut serialized = Vec::new(); serializer - .write_boolean_result(&mut serialized, value) + .serialize_boolean_to_write(&mut serialized, value) .unwrap(); // And to parse again - if let QueryResultsReader::Boolean(roundtrip_value) = - parser.read_results(serialized.as_slice()).unwrap() + if let FromReadQueryResultsReader::Boolean(roundtrip_value) = + parser.parse_read(serialized.as_slice()).unwrap() { assert_eq!(roundtrip_value, value) } diff --git a/js/Cargo.toml b/js/Cargo.toml index 208a23c3..8e62e147 100644 --- a/js/Cargo.toml +++ b/js/Cargo.toml @@ -1,20 +1,26 @@ [package] -name = "oxigraph_js" -version = "0.3.20" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +name = "oxigraph-js" +version.workspace = true +authors.workspace = true +license.workspace = true readme = "README.md" -keywords = ["RDF", "N-Triples", "Turtle", "RDF/XML", "SPARQL"] +keywords = ["RDF", "N-Triples", "Turtle", "XML", "SPARQL"] repository = "https://github.com/oxigraph/oxigraph/tree/main/js" description = "JavaScript bindings of Oxigraph" -edition = "2021" +edition.workspace = true +rust-version.workspace = true +publish = false [lib] crate-type = ["cdylib"] name = "oxigraph" +doc = false [dependencies] -oxigraph = { version = "0.3.20", path="../lib" } -wasm-bindgen = "0.2" -js-sys = "0.3" -console_error_panic_hook = "0.1" +console_error_panic_hook.workspace = true +js-sys.workspace = true +oxigraph = { workspace = true, features = ["js"] } +wasm-bindgen.workspace = true + +[lints] +workspace = true diff --git a/js/README.md b/js/README.md index 6891bbb4..f21c1d12 100644 --- a/js/README.md +++ b/js/README.md @@ -3,7 +3,7 @@ Oxigraph for JavaScript [](https://www.npmjs.com/package/oxigraph) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) This package provides a JavaScript API on top of [Oxigraph](https://crates.io/crates/oxigraph), compiled with WebAssembly. @@ -197,40 +197,42 @@ Example of update: store.update("DELETE WHERE { <http://example.com/s> ?p ?o }") ``` -#### `Store.prototype.load(String data, String mimeType, NamedNode|String? baseIRI, NamedNode|BlankNode|DefaultGraph? toNamedGraph)` +#### `Store.prototype.load(String data, String format, NamedNode|String? baseIRI, NamedNode|BlankNode|DefaultGraph? toNamedGraph)` Loads serialized RDF triples or quad into the store. The method arguments are: 1. `data`: the serialized RDF triples or quads. -2. `mimeType`: the MIME type of the serialization. See below for the supported mime types. +2. `format`: the format of the serialization. See below for the supported formats. 3. `baseIRI`: the base IRI to use to resolve the relative IRIs in the serialization. 4. `toNamedGraph`: for triple serialization formats, the name of the named graph the triple should be loaded to. The available formats are: -* [Turtle](https://www.w3.org/TR/turtle/): `text/turtle` -* [TriG](https://www.w3.org/TR/trig/): `application/trig` -* [N-Triples](https://www.w3.org/TR/n-triples/): `application/n-triples` -* [N-Quads](https://www.w3.org/TR/n-quads/): `application/n-quads` -* [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/): `application/rdf+xml` +* [Turtle](https://www.w3.org/TR/turtle/): `text/turtle` or `ttl` +* [TriG](https://www.w3.org/TR/trig/): `application/trig` or `trig` +* [N-Triples](https://www.w3.org/TR/n-triples/): `application/n-triples` or `nt` +* [N-Quads](https://www.w3.org/TR/n-quads/): `application/n-quads` or `nq` +* [N3](https://w3c.github.io/N3/spec/): `text/n3` or `n3` +* [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/): `application/rdf+xml` or `rdf` Example of loading a Turtle file into the named graph `<http://example.com/graph>` with the base IRI `http://example.com`: ```js store.load("<http://example.com> <http://example.com> <> .", "text/turtle", "http://example.com", oxigraph.namedNode("http://example.com/graph")); ``` -#### `Store.prototype.dump(String mimeType, NamedNode|BlankNode|DefaultGraph? fromNamedGraph)` +#### `Store.prototype.dump(String format, NamedNode|BlankNode|DefaultGraph? fromNamedGraph)` Returns serialized RDF triples or quad from the store. The method arguments are: -1. `mimeType`: the MIME type of the serialization. See below for the supported mime types. +1. `format`: the format type of the serialization. See below for the supported types. 2. `fromNamedGraph`: for triple serialization formats, the name of the named graph the triple should be loaded from. The available formats are: -* [Turtle](https://www.w3.org/TR/turtle/): `text/turtle` -* [TriG](https://www.w3.org/TR/trig/): `application/trig` -* [N-Triples](https://www.w3.org/TR/n-triples/): `application/n-triples` -* [N-Quads](https://www.w3.org/TR/n-quads/): `application/n-quads` -* [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/): `application/rdf+xml` +* [Turtle](https://www.w3.org/TR/turtle/): `text/turtle` or `ttl` +* [TriG](https://www.w3.org/TR/trig/): `application/trig` or `trig` +* [N-Triples](https://www.w3.org/TR/n-triples/): `application/n-triples` or `nt` +* [N-Quads](https://www.w3.org/TR/n-quads/): `application/n-quads` or `nq` +* [N3](https://w3c.github.io/N3/spec/): `text/n3` or `n3` +* [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/): `application/rdf+xml` or `rdf` Example of building a Turtle file from the named graph `<http://example.com/graph>`: ```js @@ -260,7 +262,7 @@ To setup a dev environment: Testing and linting: - Rust code is formatted with [rustfmt](https://github.com/rust-lang/rustfmt) and linted with [clippy](https://github.com/rust-lang/rust-clippy). You can execute them with `cargo fmt` and `cargo clippy`. -- JS code is formatted and linted with [Rome](https://rome.tools/). `npm run fmt` to auto-format and `npm test` to lint and test. +- JS code is formatted and linted with [Biome](https://biomejs.dev/). `npm run fmt` to auto-format and `npm test` to lint and test. - Tests are written in JavaScript using [Mocha](https://mochajs.org/) in the `test` directory. `npm test` to run them. diff --git a/js/rome.json b/js/biome.json similarity index 67% rename from js/rome.json rename to js/biome.json index 272422a5..966a8b1e 100644 --- a/js/rome.json +++ b/js/biome.json @@ -1,7 +1,8 @@ { + "$schema": "https://biomejs.dev/schemas/1.0.0/schema.json", "formatter": { "indentStyle": "space", - "indentSize": 4, + "indentWidth": 4, "lineWidth": 100 }, "linter": { diff --git a/js/build_package.js b/js/build_package.js index e06f84dc..5975aa46 100644 --- a/js/build_package.js +++ b/js/build_package.js @@ -1,16 +1,6 @@ #! /usr/bin/env node const fs = require("fs"); - -// We copy file to the new directory -fs.mkdirSync("pkg"); -for (const file of fs.readdirSync("./pkg-web")) { - fs.copyFileSync(`./pkg-web/${file}`, `./pkg/${file}`); -} -for (const file of fs.readdirSync("./pkg-node")) { - fs.copyFileSync(`./pkg-node/${file}`, `./pkg/${file}`); -} - const pkg = JSON.parse(fs.readFileSync("./pkg/package.json")); pkg.name = "oxigraph"; pkg.main = "node.js"; diff --git a/js/package-lock.json b/js/package-lock.json new file mode 100644 index 00000000..3f28849a --- /dev/null +++ b/js/package-lock.json @@ -0,0 +1,1079 @@ +{ + "name": "oxigraph_tests", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oxigraph_tests", + "devDependencies": { + "@biomejs/biome": "^1.0.0", + "@rdfjs/data-model": "^2.0.1", + "mocha": "^10.0.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.3.tgz", + "integrity": "sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.5.3", + "@biomejs/cli-darwin-x64": "1.5.3", + "@biomejs/cli-linux-arm64": "1.5.3", + "@biomejs/cli-linux-arm64-musl": "1.5.3", + "@biomejs/cli-linux-x64": "1.5.3", + "@biomejs/cli-linux-x64-musl": "1.5.3", + "@biomejs/cli-win32-arm64": "1.5.3", + "@biomejs/cli-win32-x64": "1.5.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.3.tgz", + "integrity": "sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.3.tgz", + "integrity": "sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.3.tgz", + "integrity": "sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.3.tgz", + "integrity": "sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.3.tgz", + "integrity": "sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.3.tgz", + "integrity": "sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.3.tgz", + "integrity": "sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.3.tgz", + "integrity": "sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@rdfjs/data-model": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.0.1.tgz", + "integrity": "sha512-oRDYpy7/fJ9NNjS+M7m+dbnhi4lOWYGbBiM/A+u9bBExnN6ifXUF5mUsFxwZaQulmwTDaMhKERdV6iKTBUMgtw==", + "dev": true, + "bin": { + "rdfjs-data-model-test": "bin/test.js" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/js/package.json b/js/package.json index e8744994..5a81afa5 100644 --- a/js/package.json +++ b/js/package.json @@ -3,14 +3,14 @@ "description": "Oxigraph JS build and tests", "private": true, "devDependencies": { + "@biomejs/biome": "^1.0.0", "@rdfjs/data-model": "^2.0.1", - "mocha": "^10.0.0", - "rome": "^12.0.0" + "mocha": "^10.0.0" }, "scripts": { - "fmt": "rome format . --write && rome check . --apply-unsafe", - "test": "rome ci . && wasm-pack build --debug --target nodejs && mocha", - "build": "rm -rf pkg && wasm-pack build --release --target web --out-name web && mv pkg pkg-web && wasm-pack build --release --target nodejs --out-name node && mv pkg pkg-node && node build_package.js && rm -r pkg-web && rm -r pkg-node", + "fmt": "biome format . --write && biome check . --apply-unsafe && biome format . --write", + "test": "biome ci . && wasm-pack build --debug --target nodejs && mocha", + "build": "wasm-pack build --release --target web --out-name web && wasm-pack build --release --target nodejs --out-name node && node build_package.js", "release": "npm run build && npm publish ./pkg", "pack": "npm run build && npm pack ./pkg" }, diff --git a/js/src/lib.rs b/js/src/lib.rs index 769319e8..b985c5c0 100644 --- a/js/src/lib.rs +++ b/js/src/lib.rs @@ -1,4 +1,4 @@ -#![allow(clippy::unused_unit)] +#![allow(clippy::mem_forget)] use wasm_bindgen::prelude::*; mod model; diff --git a/js/src/model.rs b/js/src/model.rs index 4929068f..dd8a972c 100644 --- a/js/src/model.rs +++ b/js/src/model.rs @@ -1,9 +1,4 @@ -#![allow( - dead_code, - clippy::inherent_to_string, - clippy::unused_self, - clippy::use_self -)] +#![allow(dead_code, clippy::inherent_to_string, clippy::unused_self)] use crate::format_err; use crate::utils::to_err; @@ -56,7 +51,7 @@ pub fn literal( #[wasm_bindgen(js_name = defaultGraph)] pub fn default_graph() -> JsDefaultGraph { - JsDefaultGraph {} + JsDefaultGraph } #[wasm_bindgen(js_name = variable)] @@ -302,7 +297,7 @@ impl From<JsLiteral> for Term { #[wasm_bindgen(js_name = DefaultGraph)] #[derive(Eq, PartialEq, Debug, Clone, Hash)] -pub struct JsDefaultGraph {} +pub struct JsDefaultGraph; #[wasm_bindgen(js_class = DefaultGraph)] impl JsDefaultGraph { @@ -313,7 +308,7 @@ impl JsDefaultGraph { #[wasm_bindgen(getter)] pub fn value(&self) -> String { - "".to_owned() + String::new() } #[wasm_bindgen(js_name = toString)] @@ -393,7 +388,7 @@ impl JsQuad { #[wasm_bindgen(getter)] pub fn value(&self) -> String { - "".to_owned() + String::new() } #[wasm_bindgen(getter = subject)] @@ -532,7 +527,7 @@ impl From<GraphName> for JsTerm { match name { GraphName::NamedNode(node) => node.into(), GraphName::BlankNode(node) => node.into(), - GraphName::DefaultGraph => Self::DefaultGraph(JsDefaultGraph {}), + GraphName::DefaultGraph => Self::DefaultGraph(JsDefaultGraph), } } } @@ -564,7 +559,7 @@ impl From<Quad> for JsTerm { impl TryFrom<JsTerm> for NamedNode { type Error = JsValue; - fn try_from(value: JsTerm) -> Result<Self, JsValue> { + fn try_from(value: JsTerm) -> Result<Self, Self::Error> { match value { JsTerm::NamedNode(node) => Ok(node.into()), JsTerm::BlankNode(node) => Err(format_err!( @@ -588,7 +583,7 @@ impl TryFrom<JsTerm> for NamedNode { impl TryFrom<JsTerm> for NamedOrBlankNode { type Error = JsValue; - fn try_from(value: JsTerm) -> Result<Self, JsValue> { + fn try_from(value: JsTerm) -> Result<Self, Self::Error> { match value { JsTerm::NamedNode(node) => Ok(node.into()), JsTerm::BlankNode(node) => Ok(node.into()), @@ -614,7 +609,7 @@ impl TryFrom<JsTerm> for NamedOrBlankNode { impl TryFrom<JsTerm> for Subject { type Error = JsValue; - fn try_from(value: JsTerm) -> Result<Self, JsValue> { + fn try_from(value: JsTerm) -> Result<Self, Self::Error> { match value { JsTerm::NamedNode(node) => Ok(node.into()), JsTerm::BlankNode(node) => Ok(node.into()), @@ -637,7 +632,7 @@ impl TryFrom<JsTerm> for Subject { impl TryFrom<JsTerm> for Term { type Error = JsValue; - fn try_from(value: JsTerm) -> Result<Self, JsValue> { + fn try_from(value: JsTerm) -> Result<Self, Self::Error> { match value { JsTerm::NamedNode(node) => Ok(node.into()), JsTerm::BlankNode(node) => Ok(node.into()), @@ -657,7 +652,7 @@ impl TryFrom<JsTerm> for Term { impl TryFrom<JsTerm> for GraphName { type Error = JsValue; - fn try_from(value: JsTerm) -> Result<Self, JsValue> { + fn try_from(value: JsTerm) -> Result<Self, Self::Error> { match value { JsTerm::NamedNode(node) => Ok(node.into()), JsTerm::BlankNode(node) => Ok(node.into()), @@ -744,7 +739,7 @@ impl FromJsConverter { )) } } - "DefaultGraph" => Ok(JsTerm::DefaultGraph(JsDefaultGraph {})), + "DefaultGraph" => Ok(JsTerm::DefaultGraph(JsDefaultGraph)), "Variable" => Ok(Variable::new( Reflect::get(value, &self.value)? .as_string() @@ -754,8 +749,7 @@ impl FromJsConverter { .into()), "Quad" => Ok(self.to_quad(value)?.into()), _ => Err(format_err!( - "The termType {} is not supported by Oxigraph", - term_type + "The termType {term_type} is not supported by Oxigraph" )), } } else if term_type.is_undefined() { diff --git a/js/src/store.rs b/js/src/store.rs index adee6eef..0b4b51b8 100644 --- a/js/src/store.rs +++ b/js/src/store.rs @@ -1,14 +1,11 @@ -#![allow(clippy::use_self)] - use crate::format_err; use crate::model::*; use crate::utils::to_err; use js_sys::{Array, Map}; -use oxigraph::io::{DatasetFormat, GraphFormat}; +use oxigraph::io::{RdfFormat, RdfParser}; use oxigraph::model::*; use oxigraph::sparql::QueryResults; use oxigraph::store::Store; -use std::io::Cursor; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name = Store)] @@ -27,7 +24,7 @@ impl JsStore { store: Store::new().map_err(to_err)?, }; if let Some(quads) = quads { - for quad in quads.iter() { + for quad in &*quads { store.add(quad)?; } } @@ -145,10 +142,11 @@ impl JsStore { pub fn load( &self, data: &str, - mime_type: &str, + format: &str, base_iri: &JsValue, to_graph_name: &JsValue, ) -> Result<(), JsValue> { + let format = rdf_format(format)?; let base_iri = if base_iri.is_null() || base_iri.is_undefined() { None } else if base_iri.is_string() { @@ -161,65 +159,41 @@ impl JsStore { )); }; - let to_graph_name = - if let Some(graph_name) = FROM_JS.with(|c| c.to_optional_term(to_graph_name))? { - Some(graph_name.try_into()?) - } else { - None - }; - - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - self.store - .load_graph( - Cursor::new(data), - graph_format, - &to_graph_name.unwrap_or(GraphName::DefaultGraph), - base_iri.as_deref(), - ) - .map_err(to_err) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - if to_graph_name.is_some() { - return Err(format_err!( - "The target graph name parameter is not available for dataset formats" - )); - } - self.store - .load_dataset(Cursor::new(data), dataset_format, base_iri.as_deref()) - .map_err(to_err) - } else { - Err(format_err!("Not supported MIME type: {}", mime_type)) + let mut parser = RdfParser::from_format(format); + if let Some(to_graph_name) = FROM_JS.with(|c| c.to_optional_term(to_graph_name))? { + parser = parser.with_default_graph(GraphName::try_from(to_graph_name)?); + } + if let Some(base_iri) = base_iri { + parser = parser.with_base_iri(base_iri).map_err(to_err)?; } + self.store + .load_from_read(parser, data.as_bytes()) + .map_err(to_err) } - pub fn dump(&self, mime_type: &str, from_graph_name: &JsValue) -> Result<String, JsValue> { - let from_graph_name = - if let Some(graph_name) = FROM_JS.with(|c| c.to_optional_term(from_graph_name))? { - Some(graph_name.try_into()?) - } else { - None - }; - - let mut buffer = Vec::new(); - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - self.store - .dump_graph( - &mut buffer, - graph_format, - &from_graph_name.unwrap_or(GraphName::DefaultGraph), + pub fn dump(&self, format: &str, from_graph_name: &JsValue) -> Result<String, JsValue> { + let format = rdf_format(format)?; + let buffer = + if let Some(from_graph_name) = FROM_JS.with(|c| c.to_optional_term(from_graph_name))? { + self.store.dump_graph_to_write( + &GraphName::try_from(from_graph_name)?, + format, + Vec::new(), ) - .map_err(to_err)?; - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - if from_graph_name.is_some() { - return Err(format_err!( - "The target graph name parameter is not available for dataset formats" - )); + } else { + self.store.dump_to_write(format, Vec::new()) } - self.store - .dump_dataset(&mut buffer, dataset_format) - .map_err(to_err)?; - } else { - return Err(format_err!("Not supported MIME type: {}", mime_type)); - } + .map_err(to_err)?; String::from_utf8(buffer).map_err(to_err) } } + +fn rdf_format(format: &str) -> Result<RdfFormat, JsValue> { + if format.contains('/') { + RdfFormat::from_media_type(format) + .ok_or_else(|| format_err!("Not supported RDF format media type: {format}")) + } else { + RdfFormat::from_extension(format) + .ok_or_else(|| format_err!("Not supported RDF format extension: {format}")) + } +} diff --git a/js/test/model.mjs b/js/test/model.mjs index 37f83199..b9de0164 100644 --- a/js/test/model.mjs +++ b/js/test/model.mjs @@ -1,37 +1,37 @@ /* global describe, it */ +import assert from "assert"; import runTests from "../node_modules/@rdfjs/data-model/test/index.js"; import oxigraph from "../pkg/oxigraph.js"; -import assert from "assert"; runTests({ factory: oxigraph }); -describe("DataModel", function () { - describe("#toString()", function () { - it("namedNode().toString() should return SPARQL compatible syntax", function () { +describe("DataModel", () => { + describe("#toString()", () => { + it("namedNode().toString() should return SPARQL compatible syntax", () => { assert.strictEqual( "<http://example.com>", oxigraph.namedNode("http://example.com").toString(), ); }); - it("blankNode().toString() should return SPARQL compatible syntax", function () { + it("blankNode().toString() should return SPARQL compatible syntax", () => { assert.strictEqual("_:a", oxigraph.blankNode("a").toString()); }); - it("literal().toString() should return SPARQL compatible syntax", function () { + it("literal().toString() should return SPARQL compatible syntax", () => { assert.strictEqual('"a\\"b"@en', oxigraph.literal('a"b', "en").toString()); }); - it("defaultGraph().toString() should return SPARQL compatible syntax", function () { + it("defaultGraph().toString() should return SPARQL compatible syntax", () => { assert.strictEqual("DEFAULT", oxigraph.defaultGraph().toString()); }); - it("variable().toString() should return SPARQL compatible syntax", function () { + it("variable().toString() should return SPARQL compatible syntax", () => { assert.strictEqual("?a", oxigraph.variable("a").toString()); }); - it("quad().toString() should return SPARQL compatible syntax", function () { + it("quad().toString() should return SPARQL compatible syntax", () => { assert.strictEqual( "<http://example.com/s> <http://example.com/p> <<<http://example.com/s1> <http://example.com/p1> <http://example.com/o1>>> <http://example.com/g>", oxigraph diff --git a/js/test/store.mjs b/js/test/store.mjs index 2317c022..0693ac47 100644 --- a/js/test/store.mjs +++ b/js/test/store.mjs @@ -1,8 +1,8 @@ /* global describe, it */ -import { Store } from "../pkg/oxigraph.js"; -import dataModel from "@rdfjs/data-model"; import assert from "assert"; +import dataModel from "@rdfjs/data-model"; +import { Store } from "../pkg/oxigraph.js"; const ex = dataModel.namedNode("http://example.com"); const triple = dataModel.quad( @@ -11,17 +11,17 @@ const triple = dataModel.quad( dataModel.literal("o"), ); -describe("Store", function () { - describe("#add()", function () { - it("an added quad should be in the store", function () { +describe("Store", () => { + describe("#add()", () => { + it("an added quad should be in the store", () => { const store = new Store(); store.add(dataModel.quad(ex, ex, triple)); assert(store.has(dataModel.quad(ex, ex, triple))); }); }); - describe("#delete()", function () { - it("an removed quad should not be in the store anymore", function () { + describe("#delete()", () => { + it("an removed quad should not be in the store anymore", () => { const store = new Store([dataModel.quad(triple, ex, ex)]); assert(store.has(dataModel.quad(triple, ex, ex))); store.delete(dataModel.quad(triple, ex, ex)); @@ -29,22 +29,22 @@ describe("Store", function () { }); }); - describe("#has()", function () { - it("an added quad should be in the store", function () { + describe("#has()", () => { + it("an added quad should be in the store", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert(store.has(dataModel.quad(ex, ex, ex))); }); }); - describe("#size()", function () { - it("A store with one quad should have 1 for size", function () { + describe("#size()", () => { + it("A store with one quad should have 1 for size", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert.strictEqual(1, store.size); }); }); - describe("#match_quads()", function () { - it("blank pattern should return all quads", function () { + describe("#match_quads()", () => { + it("blank pattern should return all quads", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.match(); assert.strictEqual(1, results.length); @@ -52,32 +52,32 @@ describe("Store", function () { }); }); - describe("#query()", function () { - it("ASK true", function () { + describe("#query()", () => { + it("ASK true", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); assert.strictEqual(true, store.query("ASK { ?s ?s ?s }")); }); - it("ASK false", function () { + it("ASK false", () => { const store = new Store(); assert.strictEqual(false, store.query("ASK { FILTER(false)}")); }); - it("CONSTRUCT", function () { + it("CONSTRUCT", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }"); assert.strictEqual(1, results.length); assert(dataModel.quad(ex, ex, ex).equals(results[0])); }); - it("SELECT", function () { + it("SELECT", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("SELECT ?s WHERE { ?s ?p ?o }"); assert.strictEqual(1, results.length); assert(ex.equals(results[0].get("s"))); }); - it("SELECT with NOW()", function () { + it("SELECT with NOW()", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query( "SELECT * WHERE { FILTER(2022 <= YEAR(NOW()) && YEAR(NOW()) <= 2100) }", @@ -85,15 +85,15 @@ describe("Store", function () { assert.strictEqual(1, results.length); }); - it("SELECT with RAND()", function () { + it("SELECT with RAND()", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); const results = store.query("SELECT (RAND() AS ?y) WHERE {}"); assert.strictEqual(1, results.length); }); }); - describe("#update()", function () { - it("INSERT DATA", function () { + describe("#update()", () => { + it("INSERT DATA", () => { const store = new Store(); store.update( "INSERT DATA { <http://example.com> <http://example.com> <http://example.com> }", @@ -101,7 +101,7 @@ describe("Store", function () { assert.strictEqual(1, store.size); }); - it("DELETE DATA", function () { + it("DELETE DATA", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); store.update( "DELETE DATA { <http://example.com> <http://example.com> <http://example.com> }", @@ -109,15 +109,15 @@ describe("Store", function () { assert.strictEqual(0, store.size); }); - it("DELETE WHERE", function () { + it("DELETE WHERE", () => { const store = new Store([dataModel.quad(ex, ex, ex)]); store.update("DELETE WHERE { ?v ?v ?v }"); assert.strictEqual(0, store.size); }); }); - describe("#load()", function () { - it("load NTriples in the default graph", function () { + describe("#load()", () => { + it("load NTriples in the default graph", () => { const store = new Store(); store.load( "<http://example.com> <http://example.com> <http://example.com> .", @@ -126,7 +126,7 @@ describe("Store", function () { assert(store.has(dataModel.quad(ex, ex, ex))); }); - it("load NTriples in an other graph", function () { + it("load NTriples in an other graph", () => { const store = new Store(); store.load( "<http://example.com> <http://example.com> <http://example.com> .", @@ -137,7 +137,7 @@ describe("Store", function () { assert(store.has(dataModel.quad(ex, ex, ex, ex))); }); - it("load Turtle with a base IRI", function () { + it("load Turtle with a base IRI", () => { const store = new Store(); store.load( "<http://example.com> <http://example.com> <> .", @@ -147,7 +147,7 @@ describe("Store", function () { assert(store.has(dataModel.quad(ex, ex, ex))); }); - it("load NQuads", function () { + it("load NQuads", () => { const store = new Store(); store.load( "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .", @@ -156,7 +156,7 @@ describe("Store", function () { assert(store.has(dataModel.quad(ex, ex, ex, ex))); }); - it("load TriG with a base IRI", function () { + it("load TriG with a base IRI", () => { const store = new Store(); store.load( "GRAPH <> { <http://example.com> <http://example.com> <> }", @@ -167,8 +167,8 @@ describe("Store", function () { }); }); - describe("#dump()", function () { - it("dump dataset content", function () { + describe("#dump()", () => { + it("dump dataset content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); assert.strictEqual( "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n", @@ -176,7 +176,7 @@ describe("Store", function () { ); }); - it("dump named graph content", function () { + it("dump named graph content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); assert.strictEqual( "<http://example.com> <http://example.com> <http://example.com> .\n", @@ -184,9 +184,9 @@ describe("Store", function () { ); }); - it("dump default graph content", function () { + it("dump default graph content", () => { const store = new Store([dataModel.quad(ex, ex, ex, ex)]); - assert.strictEqual("", store.dump("application/n-triples")); + assert.strictEqual("", store.dump("application/n-triples", dataModel.defaultGraph())); }); }); }); diff --git a/lib/Cargo.toml b/lib/Cargo.toml deleted file mode 100644 index 00d8cb43..00000000 --- a/lib/Cargo.toml +++ /dev/null @@ -1,65 +0,0 @@ -[package] -name = "oxigraph" -version = "0.3.20" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" -readme = "README.md" -keywords = ["RDF", "SPARQL", "graph-database", "database"] -categories = ["database-implementations"] -repository = "https://github.com/oxigraph/oxigraph/tree/main/lib" -homepage = "https://oxigraph.org/" -documentation = "https://docs.rs/oxigraph" -description = """ -a SPARQL database and RDF toolkit -""" -edition = "2021" -rust-version = "1.60" - -[package.metadata.docs.rs] -all-features = true - -[features] -default = [] -http_client = ["oxhttp", "oxhttp/rustls"] -rocksdb_debug = [] - -[dependencies] -rand = "0.8" -md-5 = "0.10" -sha-1 = "0.10" -sha2 = "0.10" -digest = "0.10" -regex = "1" -oxilangtag = "0.1" -oxiri = "0.2" -rio_api = "0.8" -rio_turtle = "0.8" -rio_xml = "0.8" -hex = "0.4" -siphasher = "0.3" -lazy_static = "1" -json-event-parser = "0.1" -oxrdf = { version = "0.1.7", path="oxrdf", features = ["rdf-star", "oxsdatatypes"] } -oxsdatatypes = { version = "0.1.3", path="oxsdatatypes" } -spargebra = { version = "0.2.8", path="spargebra", features = ["rdf-star", "sep-0002", "sep-0006"] } -sparesults = { version = "0.1.8", path="sparesults", features = ["rdf-star"] } -gfa = "0.10.1" -handlegraph = { git = "https://github.com/chfi/rs-handlegraph", branch = "master" } - -[target.'cfg(not(target_family = "wasm"))'.dependencies] -libc = "0.2" -oxrocksdb-sys = { version = "0.3.20", path="../oxrocksdb-sys" } -oxhttp = { version = "0.1", optional = true } - -[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] -getrandom = { version = "0.2", features = ["js"] } -js-sys = "0.3" - -[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] -criterion = "0.4" -oxhttp = "0.1" -zstd = "0.12" - -[[bench]] -name = "store" -harness = false diff --git a/lib/README.md b/lib/README.md index 80d071ff..47d5eb4c 100644 --- a/lib/README.md +++ b/lib/README.md @@ -1,72 +1,13 @@ -Oxigraph -======== - -[](https://crates.io/crates/oxigraph) -[](https://docs.rs/oxigraph) -[](https://crates.io/crates/oxigraph) -[](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Oxigraph is a graph database library implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. - -Its goal is to provide a compliant, safe and fast on-disk graph database. -It also provides a set of utility functions for reading, writing, and processing RDF files. - -Oxigraph is in heavy development and SPARQL query evaluation has not been optimized yet. - -Oxigraph also provides [a standalone HTTP server](https://crates.io/crates/oxigraph_server) and [a Python library](https://pyoxigraph.readthedocs.io/) based on this library. - - -Oxigraph implements the following specifications: -* [SPARQL 1.1 Query](https://www.w3.org/TR/sparql11-query/), [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/), and [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/). -* [Turtle](https://www.w3.org/TR/turtle/), [TriG](https://www.w3.org/TR/trig/), [N-Triples](https://www.w3.org/TR/n-triples/), [N-Quads](https://www.w3.org/TR/n-quads/), and [RDF XML](https://www.w3.org/TR/rdf-syntax-grammar/) RDF serialization formats for both data ingestion and retrieval using the [Rio library](https://github.com/oxigraph/rio). -* [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/), [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) and [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/). - -A preliminary benchmark [is provided](../bench/README.md). Oxigraph internal design [is described on the wiki](https://github.com/oxigraph/oxigraph/wiki/Architecture). - -The main entry point of Oxigraph is the [`Store`](store::Store) struct: -```rust -use oxigraph::store::Store; -use oxigraph::model::*; -use oxigraph::sparql::QueryResults; - -let store = Store::new().unwrap(); - -// insertion -let ex = NamedNode::new("http://example.com").unwrap(); -let quad = Quad::new(ex.clone(), ex.clone(), ex.clone(), GraphName::DefaultGraph); -store.insert(&quad).unwrap(); - -// quad filter -let results = store.quads_for_pattern(Some(ex.as_ref().into()), None, None, None).collect::<Result<Vec<Quad>,_>>().unwrap(); -assert_eq!(vec![quad], results); - -// SPARQL query -if let QueryResults::Solutions(mut solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }").unwrap() { - assert_eq!(solutions.next().unwrap().unwrap().get("s"), Some(&ex.into())); -} -``` - -Some parts of this library are available as standalone crates: -* [`oxrdf`](https://crates.io/crates/oxrdf) provides datastructures encoding RDF basic concepts (the `oxigraph::model` module). -* [`spargebra`](https://crates.io/crates/spargebra) provides a SPARQL parser. -* [`sparesults`](https://crates.io/crates/sparesults) provides parsers and serializers for SPARQL result formats. - -To build the library, don't forget to clone the submodules using `git clone --recursive https://github.com/oxigraph/oxigraph.git` to clone the repository including submodules or `git submodule update --init` to add submodules to the already cloned repository. - - -## License - -This project is licensed under either of - -* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or - `<http://www.apache.org/licenses/LICENSE-2.0>`) -* MIT license ([LICENSE-MIT](../LICENSE-MIT) or - `<http://opensource.org/licenses/MIT>`) - -at your option. - - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. +Oxigraph Rust crates +==================== + +Oxigraph is implemented in Rust. +It is composed on a main library, [`oxigraph`](./oxigraph) and a set of smaller crates used by the `oxigraph` crate: +* [`oxrdf`](./oxrdf), datastructures encoding RDF basic concepts (the `model` module of the `oxigraph` crate). +* [`oxrdfio`](./oxrdfio), a unified parser and serializer API for RDF formats (the `io` module of the `oxigraph` crate). It itself relies on: + * [`oxttl`](./oxttl), N-Triple, N-Quad, Turtle, TriG and N3 parsing and serialization. + * [`oxrdfxml`](./oxrdfxml), RDF/XML parsing and serialization. +* [`spargebra`](./spargebra), a SPARQL parser. +* [`sparesults`](./sparesults), parsers and serializers for SPARQL result formats (the `sparql::results` module of the `oxigraph` crate). +* [`sparopt`](./sparesults), a SPARQL optimizer. +* [`oxsdatatypes`](./oxsdatatypes), an implementation of some XML Schema datatypes. diff --git a/lib/oxigraph/Cargo.toml b/lib/oxigraph/Cargo.toml new file mode 100644 index 00000000..a952b1aa --- /dev/null +++ b/lib/oxigraph/Cargo.toml @@ -0,0 +1,72 @@ +[package] +name = "oxigraph" +version.workspace = true +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["RDF", "SPARQL", "graph-database", "database"] +categories = ["database-implementations"] +repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/oxigraph" +homepage = "https://oxigraph.org/" +documentation = "https://docs.rs/oxigraph" +description = """ +a SPARQL database and RDF toolkit +""" +edition.workspace = true +rust-version.workspace = true + +[features] +default = [] +js = ["getrandom/js", "oxsdatatypes/js", "js-sys"] +http-client = ["oxhttp"] +http-client-native-tls = ["http-client", "oxhttp/native-tls"] +http-client-rustls-webpki = ["http-client", "oxhttp/rustls-webpki"] +http-client-rustls-native = ["http-client", "oxhttp/rustls-native"] +rocksdb-pkg-config = ["oxrocksdb-sys/pkg-config"] +rocksdb-debug = [] + +[dependencies] +digest.workspace = true +hex.workspace = true +json-event-parser.workspace = true +md-5.workspace = true +oxilangtag.workspace = true +oxiri.workspace = true +oxrdf = { workspace = true, features = ["rdf-star", "oxsdatatypes"] } +oxrdfio = { workspace = true, features = ["rdf-star"] } +oxsdatatypes.workspace = true +rand.workspace = true +regex.workspace = true +sha1.workspace = true +sha2.workspace = true +siphasher.workspace = true +sparesults = { workspace = true, features = ["rdf-star"] } +spargebra = { workspace = true, features = ["rdf-star", "sep-0002", "sep-0006"] } +sparopt = { workspace = true, features = ["rdf-star", "sep-0002", "sep-0006"] } +thiserror.workspace = true +gfa = "0.10.1" +handlegraph = { git = "https://github.com/chfi/rs-handlegraph", branch = "master" } + +[target.'cfg(not(target_family = "wasm"))'.dependencies] +libc.workspace = true +oxhttp = { workspace = true, optional = true } +oxrocksdb-sys.workspace = true + +[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] +getrandom.workspace = true +js-sys = { workspace = true, optional = true } + +[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] +codspeed-criterion-compat.workspace = true +oxhttp.workspace = true +zstd.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +rustdoc-args = ["--cfg", "docsrs"] + +[[bench]] +name = "store" +harness = false diff --git a/lib/oxigraph/README.md b/lib/oxigraph/README.md new file mode 100644 index 00000000..98cd1c8b --- /dev/null +++ b/lib/oxigraph/README.md @@ -0,0 +1,77 @@ +Oxigraph +======== + +[](https://crates.io/crates/oxigraph) +[](https://docs.rs/oxigraph) +[](https://crates.io/crates/oxigraph) +[](https://github.com/oxigraph/oxigraph/actions) +[](https://gitter.im/oxigraph/community) + +Oxigraph is a graph database library implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. + +Its goal is to provide a compliant, safe and fast on-disk graph database. +It also provides a set of utility functions for reading, writing, and processing RDF files. + +Oxigraph is in heavy development and SPARQL query evaluation has not been optimized yet. + +Oxigraph also provides [a CLI tool](https://crates.io/crates/oxigraph-cli) and [a Python library](https://pyoxigraph.readthedocs.io/) based on this library. + + +Oxigraph implements the following specifications: +* [SPARQL 1.1 Query](https://www.w3.org/TR/sparql11-query/), [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/), and [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/). +* [Turtle](https://www.w3.org/TR/turtle/), [TriG](https://www.w3.org/TR/trig/), [N-Triples](https://www.w3.org/TR/n-triples/), [N-Quads](https://www.w3.org/TR/n-quads/), and [RDF XML](https://www.w3.org/TR/rdf-syntax-grammar/) RDF serialization formats for both data ingestion and retrieval using the [Rio library](https://github.com/oxigraph/rio). +* [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/), [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) and [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/). + +A preliminary benchmark [is provided](../bench/README.md). Oxigraph internal design [is described on the wiki](https://github.com/oxigraph/oxigraph/wiki/Architecture). + +The main entry point of Oxigraph is the [`Store`](store::Store) struct: +```rust +use oxigraph::store::Store; +use oxigraph::model::*; +use oxigraph::sparql::QueryResults; + +let store = Store::new().unwrap(); + +// insertion +let ex = NamedNode::new("http://example.com").unwrap(); +let quad = Quad::new(ex.clone(), ex.clone(), ex.clone(), GraphName::DefaultGraph); +store.insert(&quad).unwrap(); + +// quad filter +let results = store.quads_for_pattern(Some(ex.as_ref().into()), None, None, None).collect::<Result<Vec<Quad>,_>>().unwrap(); +assert_eq!(vec![quad], results); + +// SPARQL query +if let QueryResults::Solutions(mut solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }").unwrap() { + assert_eq!(solutions.next().unwrap().unwrap().get("s"), Some(&ex.into())); +} +``` + +It is based on these crates that can be used separately: +* [`oxrdf`](https://crates.io/crates/oxrdf), datastructures encoding RDF basic concepts (the [`oxigraph::model`](crate::model) module). +* [`oxrdfio`](https://crates.io/crates/oxrdfio), a unified parser and serializer API for RDF formats (the [`oxigraph::io`](crate::io) module). It itself relies on: + * [`oxttl`](https://crates.io/crates/oxttl), N-Triple, N-Quad, Turtle, TriG and N3 parsing and serialization. + * [`oxrdfxml`](https://crates.io/crates/oxrdfxml), RDF/XML parsing and serialization. +* [`spargebra`](https://crates.io/crates/spargebra), a SPARQL parser. +* [`sparesults`](https://crates.io/crates/sparesults), parsers and serializers for SPARQL result formats (the [`oxigraph::sparql::results`](crate::sparql::results) module). +* [`sparopt`](https://crates.io/crates/sparesults), a SPARQL optimizer. +* [`oxsdatatypes`](https://crates.io/crates/oxsdatatypes), an implementation of some XML Schema datatypes. + +To build the library locally, don't forget to clone the submodules using `git clone --recursive https://github.com/oxigraph/oxigraph.git` to clone the repository including submodules or `git submodule update --init` to add submodules to the already cloned repository. + + +## License + +This project is licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or + `<http://www.apache.org/licenses/LICENSE-2.0>`) +* MIT license ([LICENSE-MIT](../LICENSE-MIT) or + `<http://opensource.org/licenses/MIT>`) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/lib/benches/store.rs b/lib/oxigraph/benches/store.rs similarity index 57% rename from lib/benches/store.rs rename to lib/oxigraph/benches/store.rs index c562684c..0a606135 100644 --- a/lib/benches/store.rs +++ b/lib/oxigraph/benches/store.rs @@ -1,109 +1,88 @@ -use criterion::{criterion_group, criterion_main, Criterion, Throughput}; +#![allow(clippy::panic)] + +use codspeed_criterion_compat::{criterion_group, criterion_main, Criterion, Throughput}; use oxhttp::model::{Method, Request, Status}; -use oxigraph::io::GraphFormat; -use oxigraph::model::GraphNameRef; +use oxigraph::io::{RdfFormat, RdfParser}; use oxigraph::sparql::{Query, QueryResults, Update}; use oxigraph::store::Store; use rand::random; use std::env::temp_dir; use std::fs::{remove_dir_all, File}; -use std::io::{BufRead, BufReader, Cursor, Read}; +use std::io::Read; use std::path::{Path, PathBuf}; +use std::str; + +fn parse_nt(c: &mut Criterion) { + let data = read_data("explore-1000.nt.zst"); + let mut group = c.benchmark_group("parse"); + group.throughput(Throughput::Bytes(data.len() as u64)); + group.sample_size(50); + group.bench_function("parse BSBM explore 1000", |b| { + b.iter(|| { + for r in RdfParser::from_format(RdfFormat::NTriples).parse_read(data.as_slice()) { + r.unwrap(); + } + }) + }); + group.bench_function("parse BSBM explore 1000 unchecked", |b| { + b.iter(|| { + for r in RdfParser::from_format(RdfFormat::NTriples) + .unchecked() + .parse_read(data.as_slice()) + { + r.unwrap(); + } + }) + }); +} fn store_load(c: &mut Criterion) { - { - let mut data = Vec::new(); - read_data("explore-1000.nt.zst") - .read_to_end(&mut data) - .unwrap(); - - let mut group = c.benchmark_group("store load"); - group.throughput(Throughput::Bytes(data.len() as u64)); - group.sample_size(10); - group.bench_function("load BSBM explore 1000 in memory", |b| { - b.iter(|| { - let store = Store::new().unwrap(); - do_load(&store, &data); - }) - }); - group.bench_function("load BSBM explore 1000 in on disk", |b| { - b.iter(|| { - let path = TempDir::default(); - let store = Store::open(&path).unwrap(); - do_load(&store, &data); - }) - }); - group.bench_function("load BSBM explore 1000 in on disk with bulk load", |b| { - b.iter(|| { - let path = TempDir::default(); - let store = Store::open(&path).unwrap(); - do_bulk_load(&store, &data); - }) - }); - } - - { - let mut data = Vec::new(); - read_data("explore-10000.nt.zst") - .read_to_end(&mut data) - .unwrap(); - - let mut group = c.benchmark_group("store load large"); - group.throughput(Throughput::Bytes(data.len() as u64)); - group.sample_size(10); - group.bench_function("load BSBM explore 10000 in on disk with bulk load", |b| { - b.iter(|| { - let path = TempDir::default(); - let store = Store::open(&path).unwrap(); - do_bulk_load(&store, &data); - }) - }); - } + let data = read_data("explore-1000.nt.zst"); + let mut group = c.benchmark_group("store load"); + group.throughput(Throughput::Bytes(data.len() as u64)); + group.sample_size(10); + group.bench_function("load BSBM explore 1000 in memory", |b| { + b.iter(|| { + let store = Store::new().unwrap(); + do_load(&store, &data); + }) + }); + group.bench_function("load BSBM explore 1000 in on disk", |b| { + b.iter(|| { + let path = TempDir::default(); + let store = Store::open(&path).unwrap(); + do_load(&store, &data); + }) + }); + group.bench_function("load BSBM explore 1000 in on disk with bulk load", |b| { + b.iter(|| { + let path = TempDir::default(); + let store = Store::open(&path).unwrap(); + do_bulk_load(&store, &data); + }) + }); } fn do_load(store: &Store, data: &[u8]) { - store - .load_graph( - Cursor::new(&data), - GraphFormat::NTriples, - GraphNameRef::DefaultGraph, - None, - ) - .unwrap(); + store.load_from_read(RdfFormat::NTriples, data).unwrap(); store.optimize().unwrap(); } fn do_bulk_load(store: &Store, data: &[u8]) { store .bulk_loader() - .load_graph( - Cursor::new(&data), - GraphFormat::NTriples, - GraphNameRef::DefaultGraph, - None, - ) + .load_from_read(RdfFormat::NTriples, data) .unwrap(); store.optimize().unwrap(); } fn store_query_and_update(c: &mut Criterion) { - let mut data = Vec::new(); - read_data("explore-1000.nt.zst") - .read_to_end(&mut data) - .unwrap(); - - let operations = read_data("mix-exploreAndUpdate-1000.tsv.zst") - .lines() - .map(|l| { - let l = l.unwrap(); - let mut parts = l.trim().split('\t'); - let kind = parts.next().unwrap(); - let operation = parts.next().unwrap(); - match kind { - "query" => Operation::Query(Query::parse(operation, None).unwrap()), - "update" => Operation::Update(Update::parse(operation, None).unwrap()), - _ => panic!("Unexpected operation kind {kind}"), - } + let data = read_data("explore-1000.nt.zst"); + let operations = bsbm_sparql_operation() + .into_iter() + .map(|op| match op { + RawOperation::Query(q) => Operation::Query(Query::parse(&q, None).unwrap()), + RawOperation::Update(q) => Operation::Update(Update::parse(&q, None).unwrap()), }) .collect::<Vec<_>>(); let query_operations = operations @@ -162,26 +141,7 @@ fn run_operation(store: &Store, operations: &[Operation]) { } fn sparql_parsing(c: &mut Criterion) { - let mut data = Vec::new(); - read_data("explore-1000.nt.zst") - .read_to_end(&mut data) - .unwrap(); - - let operations = read_data("mix-exploreAndUpdate-1000.tsv.zst") - .lines() - .map(|l| { - let l = l.unwrap(); - let mut parts = l.trim().split('\t'); - let kind = parts.next().unwrap(); - let operation = parts.next().unwrap(); - match kind { - "query" => RawOperation::Query(operation.to_owned()), - "update" => RawOperation::Update(operation.to_owned()), - _ => panic!("Unexpected operation kind {kind}"), - } - }) - .collect::<Vec<_>>(); - + let operations = bsbm_sparql_operation(); let mut group = c.benchmark_group("sparql parsing"); group.sample_size(10); group.throughput(Throughput::Bytes( @@ -209,14 +169,14 @@ fn sparql_parsing(c: &mut Criterion) { }); } +criterion_group!(parse, parse_nt); criterion_group!(store, sparql_parsing, store_query_and_update, store_load); -criterion_main!(store); +criterion_main!(parse, store); -fn read_data(file: &str) -> impl BufRead { +fn read_data(file: &str) -> Vec<u8> { if !Path::new(file).exists() { - let mut client = oxhttp::Client::new(); - client.set_redirection_limit(5); + let client = oxhttp::Client::new().with_redirection_limit(5); let url = format!("https://github.com/Tpt/bsbm-tools/releases/download/v0.2/{file}"); let request = Request::builder(Method::GET, url.parse().unwrap()).build(); let response = client.request(request).unwrap(); @@ -228,7 +188,31 @@ fn read_data(file: &str) -> impl BufRead { ); std::io::copy(&mut response.into_body(), &mut File::create(file).unwrap()).unwrap(); } - BufReader::new(zstd::Decoder::new(File::open(file).unwrap()).unwrap()) + let mut buf = Vec::new(); + zstd::Decoder::new(File::open(file).unwrap()) + .unwrap() + .read_to_end(&mut buf) + .unwrap(); + buf +} + +fn bsbm_sparql_operation() -> Vec<RawOperation> { + String::from_utf8(read_data("mix-exploreAndUpdate-1000.tsv.zst")) + .unwrap() + .lines() + .rev() + .take(300) // We take only 10 groups + .map(|l| { + let mut parts = l.trim().split('\t'); + let kind = parts.next().unwrap(); + let operation = parts.next().unwrap(); + match kind { + "query" => RawOperation::Query(operation.into()), + "update" => RawOperation::Update(operation.into()), + _ => panic!("Unexpected operation kind {kind}"), + } + }) + .collect() } #[derive(Clone)] diff --git a/lib/src/io/format.rs b/lib/oxigraph/src/io/format.rs similarity index 74% rename from lib/src/io/format.rs rename to lib/oxigraph/src/io/format.rs index 7c95ddcb..08b61d8a 100644 --- a/lib/src/io/format.rs +++ b/lib/oxigraph/src/io/format.rs @@ -1,8 +1,13 @@ +#![allow(deprecated)] + +use oxrdfio::{RdfFormat, RdfParser, RdfSerializer}; + /// [RDF graph](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph) serialization formats. /// /// This enumeration is non exhaustive. New formats like JSON-LD will be added in the future. #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] #[non_exhaustive] +#[deprecated(note = "use RdfFormat instead", since = "0.4.0")] pub enum GraphFormat { /// [N-Triples](https://www.w3.org/TR/n-triples/) NTriples, @@ -18,7 +23,10 @@ impl GraphFormat { /// ``` /// use oxigraph::io::GraphFormat; /// - /// assert_eq!(GraphFormat::NTriples.iri(), "http://www.w3.org/ns/formats/N-Triples") + /// assert_eq!( + /// GraphFormat::NTriples.iri(), + /// "http://www.w3.org/ns/formats/N-Triples" + /// ) /// ``` #[inline] pub fn iri(self) -> &'static str { @@ -60,6 +68,7 @@ impl GraphFormat { Self::RdfXml => "rdf", } } + /// Looks for a known format from a media type. /// /// It supports some media type aliases. @@ -69,7 +78,10 @@ impl GraphFormat { /// ``` /// use oxigraph::io::GraphFormat; /// - /// assert_eq!(GraphFormat::from_media_type("text/turtle; charset=utf-8"), Some(GraphFormat::Turtle)) + /// assert_eq!( + /// GraphFormat::from_media_type("text/turtle; charset=utf-8"), + /// Some(GraphFormat::Turtle) + /// ) /// ``` #[inline] pub fn from_media_type(media_type: &str) -> Option<Self> { @@ -89,7 +101,10 @@ impl GraphFormat { /// ``` /// use oxigraph::io::GraphFormat; /// - /// assert_eq!(GraphFormat::from_extension("nt"), Some(GraphFormat::NTriples)) + /// assert_eq!( + /// GraphFormat::from_extension("nt"), + /// Some(GraphFormat::NTriples) + /// ) /// ``` #[inline] pub fn from_extension(extension: &str) -> Option<Self> { @@ -102,11 +117,37 @@ impl GraphFormat { } } +impl From<GraphFormat> for RdfFormat { + #[inline] + fn from(format: GraphFormat) -> Self { + match format { + GraphFormat::NTriples => Self::NTriples, + GraphFormat::Turtle => Self::Turtle, + GraphFormat::RdfXml => Self::RdfXml, + } + } +} + +impl From<GraphFormat> for RdfParser { + #[inline] + fn from(format: GraphFormat) -> Self { + RdfFormat::from(format).into() + } +} + +impl From<GraphFormat> for RdfSerializer { + #[inline] + fn from(format: GraphFormat) -> Self { + RdfFormat::from(format).into() + } +} + /// [RDF dataset](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset) serialization formats. /// /// This enumeration is non exhaustive. New formats like JSON-LD will be added in the future. #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] #[non_exhaustive] +#[deprecated(note = "use RdfFormat instead", since = "0.4.0")] pub enum DatasetFormat { /// [N-Quads](https://www.w3.org/TR/n-quads/) NQuads, @@ -120,7 +161,10 @@ impl DatasetFormat { /// ``` /// use oxigraph::io::DatasetFormat; /// - /// assert_eq!(DatasetFormat::NQuads.iri(), "http://www.w3.org/ns/formats/N-Quads") + /// assert_eq!( + /// DatasetFormat::NQuads.iri(), + /// "http://www.w3.org/ns/formats/N-Quads" + /// ) /// ``` #[inline] pub fn iri(self) -> &'static str { @@ -159,6 +203,7 @@ impl DatasetFormat { Self::TriG => "trig", } } + /// Looks for a known format from a media type. /// /// It supports some media type aliases. @@ -167,7 +212,10 @@ impl DatasetFormat { /// ``` /// use oxigraph::io::DatasetFormat; /// - /// assert_eq!(DatasetFormat::from_media_type("application/n-quads; charset=utf-8"), Some(DatasetFormat::NQuads)) + /// assert_eq!( + /// DatasetFormat::from_media_type("application/n-quads; charset=utf-8"), + /// Some(DatasetFormat::NQuads) + /// ) /// ``` #[inline] pub fn from_media_type(media_type: &str) -> Option<Self> { @@ -186,7 +234,10 @@ impl DatasetFormat { /// ``` /// use oxigraph::io::DatasetFormat; /// - /// assert_eq!(DatasetFormat::from_extension("nq"), Some(DatasetFormat::NQuads)) + /// assert_eq!( + /// DatasetFormat::from_extension("nq"), + /// Some(DatasetFormat::NQuads) + /// ) /// ``` #[inline] pub fn from_extension(extension: &str) -> Option<Self> { @@ -198,12 +249,36 @@ impl DatasetFormat { } } +impl From<DatasetFormat> for RdfFormat { + #[inline] + fn from(format: DatasetFormat) -> Self { + match format { + DatasetFormat::NQuads => Self::NQuads, + DatasetFormat::TriG => Self::TriG, + } + } +} + +impl From<DatasetFormat> for RdfParser { + #[inline] + fn from(format: DatasetFormat) -> Self { + RdfFormat::from(format).into() + } +} + +impl From<DatasetFormat> for RdfSerializer { + #[inline] + fn from(format: DatasetFormat) -> Self { + RdfFormat::from(format).into() + } +} + impl TryFrom<DatasetFormat> for GraphFormat { type Error = (); /// Attempts to find a graph format that is a subset of this [`DatasetFormat`]. #[inline] - fn try_from(value: DatasetFormat) -> Result<Self, ()> { + fn try_from(value: DatasetFormat) -> Result<Self, Self::Error> { match value { DatasetFormat::NQuads => Ok(Self::NTriples), DatasetFormat::TriG => Ok(Self::Turtle), @@ -216,7 +291,7 @@ impl TryFrom<GraphFormat> for DatasetFormat { /// Attempts to find a dataset format that is a superset of this [`GraphFormat`]. #[inline] - fn try_from(value: GraphFormat) -> Result<Self, ()> { + fn try_from(value: GraphFormat) -> Result<Self, Self::Error> { match value { GraphFormat::NTriples => Ok(Self::NQuads), GraphFormat::Turtle => Ok(Self::TriG), diff --git a/lib/oxigraph/src/io/mod.rs b/lib/oxigraph/src/io/mod.rs new file mode 100644 index 00000000..1b15bc8e --- /dev/null +++ b/lib/oxigraph/src/io/mod.rs @@ -0,0 +1,39 @@ +//! Utilities to read and write RDF graphs and datasets using [OxRDF I/O](https://crates.io/crates/oxrdfio). +//! +//! The entry points of this module are the two [`RdfParser`] and [`RdfSerializer`] structs. +//! +//! Usage example converting a Turtle file to a N-Triples file: +//! ``` +//! use oxigraph::io::{RdfFormat, RdfParser, RdfSerializer}; +//! +//! let turtle_file = b"@base <http://example.com/> . +//! @prefix schema: <http://schema.org/> . +//! <foo> a schema:Person ; +//! schema:name \"Foo\" . +//! <bar> a schema:Person ; +//! schema:name \"Bar\" ."; +//! +//! let ntriples_file = b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +//! <http://example.com/foo> <http://schema.org/name> \"Foo\" . +//! <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +//! <http://example.com/bar> <http://schema.org/name> \"Bar\" . +//! "; +//! +//! let mut writer = RdfSerializer::from_format(RdfFormat::NTriples).serialize_to_write(Vec::new()); +//! for quad in RdfParser::from_format(RdfFormat::Turtle).parse_read(turtle_file.as_ref()) { +//! writer.write_quad(&quad.unwrap()).unwrap(); +//! } +//! assert_eq!(writer.finish().unwrap(), ntriples_file); +//! ``` + +mod format; +pub mod read; +pub mod write; + +#[allow(deprecated)] +pub use self::format::{DatasetFormat, GraphFormat}; +#[allow(deprecated)] +pub use self::read::{DatasetParser, GraphParser}; +#[allow(deprecated)] +pub use self::write::{DatasetSerializer, GraphSerializer}; +pub use oxrdfio::*; diff --git a/lib/oxigraph/src/io/read.rs b/lib/oxigraph/src/io/read.rs new file mode 100644 index 00000000..c1c3b332 --- /dev/null +++ b/lib/oxigraph/src/io/read.rs @@ -0,0 +1,200 @@ +#![allow(deprecated)] + +//! Utilities to read RDF graphs and datasets. + +use crate::io::{DatasetFormat, GraphFormat}; +use crate::model::*; +use oxiri::IriParseError; +use oxrdfio::{FromReadQuadReader, RdfParseError, RdfParser}; +use std::io::Read; + +/// Parsers for RDF graph serialization formats. +/// +/// It currently supports the following formats: +/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`GraphFormat::NTriples`]) +/// * [Turtle](https://www.w3.org/TR/turtle/) ([`GraphFormat::Turtle`]) +/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`GraphFormat::RdfXml`]) +/// +/// ``` +/// use oxigraph::io::{GraphFormat, GraphParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; +/// +/// let parser = GraphParser::from_format(GraphFormat::NTriples); +/// let triples = parser +/// .read_triples(file.as_bytes()) +/// .collect::<Result<Vec<_>, _>>()?; +/// +/// assert_eq!(triples.len(), 1); +/// assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[deprecated(note = "use RdfParser instead", since = "0.4.0")] +pub struct GraphParser { + inner: RdfParser, +} + +impl GraphParser { + /// Builds a parser for the given format. + #[inline] + pub fn from_format(format: GraphFormat) -> Self { + Self { + inner: RdfParser::from_format(format.into()) + .without_named_graphs() + .rename_blank_nodes(), + } + } + + /// Provides an IRI that could be used to resolve the file relative IRIs. + /// + /// ``` + /// use oxigraph::io::{GraphFormat, GraphParser}; + /// + /// let file = "</s> </p> </o> ."; + /// + /// let parser = + /// GraphParser::from_format(GraphFormat::Turtle).with_base_iri("http://example.com")?; + /// let triples = parser + /// .read_triples(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// + /// assert_eq!(triples.len(), 1); + /// assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn with_base_iri(self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + Ok(Self { + inner: self.inner.with_base_iri(base_iri)?, + }) + } + + /// Executes the parsing itself on a [`Read`] implementation and returns an iterator of triples. + pub fn read_triples<R: Read>(self, reader: R) -> TripleReader<R> { + TripleReader { + parser: self.inner.parse_read(reader), + } + } +} + +/// An iterator yielding read triples. +/// Could be built using a [`GraphParser`]. +/// +/// ``` +/// use oxigraph::io::{GraphFormat, GraphParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; +/// +/// let parser = GraphParser::from_format(GraphFormat::NTriples); +/// let triples = parser +/// .read_triples(file.as_bytes()) +/// .collect::<Result<Vec<_>, _>>()?; +/// +/// assert_eq!(triples.len(), 1); +/// assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[must_use] +pub struct TripleReader<R: Read> { + parser: FromReadQuadReader<R>, +} + +impl<R: Read> Iterator for TripleReader<R> { + type Item = Result<Triple, RdfParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some(self.parser.next()?.map(Into::into).map_err(Into::into)) + } +} + +/// A parser for RDF dataset serialization formats. +/// +/// It currently supports the following formats: +/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`DatasetFormat::NQuads`]) +/// * [TriG](https://www.w3.org/TR/trig/) ([`DatasetFormat::TriG`]) +/// +/// ``` +/// use oxigraph::io::{DatasetFormat, DatasetParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> ."; +/// +/// let parser = DatasetParser::from_format(DatasetFormat::NQuads); +/// let quads = parser.read_quads(file.as_bytes()).collect::<Result<Vec<_>,_>>()?; +/// +/// assert_eq!(quads.len(), 1); +/// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[deprecated(note = "use RdfParser instead", since = "0.4.0")] +pub struct DatasetParser { + inner: RdfParser, +} + +impl DatasetParser { + /// Builds a parser for the given format. + #[inline] + pub fn from_format(format: DatasetFormat) -> Self { + Self { + inner: RdfParser::from_format(format.into()).rename_blank_nodes(), + } + } + + /// Provides an IRI that could be used to resolve the file relative IRIs. + /// + /// ``` + /// use oxigraph::io::{DatasetFormat, DatasetParser}; + /// + /// let file = "<g> { </s> </p> </o> }"; + /// + /// let parser = + /// DatasetParser::from_format(DatasetFormat::TriG).with_base_iri("http://example.com")?; + /// let triples = parser + /// .read_quads(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// + /// assert_eq!(triples.len(), 1); + /// assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn with_base_iri(self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + Ok(Self { + inner: self.inner.with_base_iri(base_iri)?, + }) + } + + /// Executes the parsing itself on a [`Read`] implementation and returns an iterator of quads. + pub fn read_quads<R: Read>(self, reader: R) -> QuadReader<R> { + QuadReader { + parser: self.inner.parse_read(reader), + } + } +} + +/// An iterator yielding read quads. +/// Could be built using a [`DatasetParser`]. +/// +/// ``` +/// use oxigraph::io::{DatasetFormat, DatasetParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> ."; +/// +/// let parser = DatasetParser::from_format(DatasetFormat::NQuads); +/// let quads = parser.read_quads(file.as_bytes()).collect::<Result<Vec<_>,_>>()?; +/// +/// assert_eq!(quads.len(), 1); +/// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[must_use] +pub struct QuadReader<R: Read> { + parser: FromReadQuadReader<R>, +} + +impl<R: Read> Iterator for QuadReader<R> { + type Item = Result<Quad, RdfParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some(self.parser.next()?.map_err(Into::into)) + } +} diff --git a/lib/oxigraph/src/io/write.rs b/lib/oxigraph/src/io/write.rs new file mode 100644 index 00000000..7f27cd9f --- /dev/null +++ b/lib/oxigraph/src/io/write.rs @@ -0,0 +1,185 @@ +#![allow(deprecated)] + +//! Utilities to write RDF graphs and datasets. + +use crate::io::{DatasetFormat, GraphFormat}; +use crate::model::*; +use oxrdfio::{RdfSerializer, ToWriteQuadWriter}; +use std::io::{self, Write}; + +/// A serializer for RDF graph serialization formats. +/// +/// It currently supports the following formats: +/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`GraphFormat::NTriples`]) +/// * [Turtle](https://www.w3.org/TR/turtle/) ([`GraphFormat::Turtle`]) +/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`GraphFormat::RdfXml`]) +/// +/// ``` +/// use oxigraph::io::{GraphFormat, GraphSerializer}; +/// use oxigraph::model::*; +/// +/// let mut buffer = Vec::new(); +/// let mut writer = GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer); +/// writer.write(&Triple { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// })?; +/// writer.finish()?; +/// +/// assert_eq!( +/// buffer.as_slice(), +/// "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[deprecated(note = "use RdfSerializer instead", since = "0.4.0")] +pub struct GraphSerializer { + inner: RdfSerializer, +} + +impl GraphSerializer { + /// Builds a serializer for the given format + #[inline] + pub fn from_format(format: GraphFormat) -> Self { + Self { + inner: RdfSerializer::from_format(format.into()), + } + } + + /// Returns a [`TripleWriter`] allowing writing triples into the given [`Write`] implementation + pub fn triple_writer<W: Write>(self, write: W) -> TripleWriter<W> { + TripleWriter { + writer: self.inner.serialize_to_write(write), + } + } +} + +/// Allows writing triples. +/// Could be built using a [`GraphSerializer`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](TripleWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// ``` +/// use oxigraph::io::{GraphFormat, GraphSerializer}; +/// use oxigraph::model::*; +/// +/// let mut buffer = Vec::new(); +/// let mut writer = GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer); +/// writer.write(&Triple { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// })?; +/// writer.finish()?; +/// +/// assert_eq!( +/// buffer.as_slice(), +/// "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct TripleWriter<W: Write> { + writer: ToWriteQuadWriter<W>, +} + +impl<W: Write> TripleWriter<W> { + /// Writes a triple + pub fn write<'a>(&mut self, triple: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.writer.write_triple(triple) + } + + /// Writes the last bytes of the file + pub fn finish(self) -> io::Result<()> { + self.writer.finish()?.flush() + } +} + +/// A serializer for RDF graph serialization formats. +/// +/// It currently supports the following formats: +/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`DatasetFormat::NQuads`]) +/// * [TriG](https://www.w3.org/TR/trig/) ([`DatasetFormat::TriG`]) +/// +/// ``` +/// use oxigraph::io::{DatasetFormat, DatasetSerializer}; +/// use oxigraph::model::*; +/// +/// let mut buffer = Vec::new(); +/// let mut writer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer); +/// writer.write(&Quad { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// graph_name: NamedNode::new("http://example.com/g")?.into(), +/// })?; +/// writer.finish()?; +/// +/// assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes()); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[deprecated(note = "use RdfSerializer instead", since = "0.4.0")] +pub struct DatasetSerializer { + inner: RdfSerializer, +} + +impl DatasetSerializer { + /// Builds a serializer for the given format + #[inline] + pub fn from_format(format: DatasetFormat) -> Self { + Self { + inner: RdfSerializer::from_format(format.into()), + } + } + + /// Returns a [`QuadWriter`] allowing writing triples into the given [`Write`] implementation + pub fn quad_writer<W: Write>(self, write: W) -> QuadWriter<W> { + QuadWriter { + writer: self.inner.serialize_to_write(write), + } + } +} + +/// Allows writing triples. +/// Could be built using a [`DatasetSerializer`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](QuadWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// ``` +/// use oxigraph::io::{DatasetFormat, DatasetSerializer}; +/// use oxigraph::model::*; +/// +/// let mut buffer = Vec::new(); +/// let mut writer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer); +/// writer.write(&Quad { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// graph_name: NamedNode::new("http://example.com/g")?.into(), +/// })?; +/// writer.finish()?; +/// +/// assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes()); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct QuadWriter<W: Write> { + writer: ToWriteQuadWriter<W>, +} + +impl<W: Write> QuadWriter<W> { + /// Writes a quad + pub fn write<'a>(&mut self, quad: impl Into<QuadRef<'a>>) -> io::Result<()> { + self.writer.write_quad(quad) + } + + /// Writes the last bytes of the file + pub fn finish(self) -> io::Result<()> { + self.writer.finish()?.flush() + } +} diff --git a/lib/oxigraph/src/lib.rs b/lib/oxigraph/src/lib.rs new file mode 100644 index 00000000..b36c4d6c --- /dev/null +++ b/lib/oxigraph/src/lib.rs @@ -0,0 +1,12 @@ +#![doc = include_str!("../README.md")] +#![doc(test(attr(deny(warnings))))] +#![doc(test(attr(allow(deprecated))))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] + +pub mod io; +pub mod model; +pub mod sparql; +mod storage; +pub mod store; diff --git a/lib/oxigraph/src/model.rs b/lib/oxigraph/src/model.rs new file mode 100644 index 00000000..3a9fd053 --- /dev/null +++ b/lib/oxigraph/src/model.rs @@ -0,0 +1,20 @@ +//! Implements data structures for [RDF 1.1 Concepts](https://www.w3.org/TR/rdf11-concepts/) using [OxRDF](https://crates.io/crates/oxrdf). +//! +//! Usage example: +//! +//! ``` +//! use oxigraph::model::*; +//! +//! let mut graph = Graph::default(); +//! +//! // insertion +//! let ex = NamedNodeRef::new("http://example.com").unwrap(); +//! let triple = TripleRef::new(ex, ex, ex); +//! graph.insert(triple); +//! +//! // simple filter +//! let results: Vec<_> = graph.triples_for_subject(ex).collect(); +//! assert_eq!(vec![triple], results); +//! ``` + +pub use oxrdf::*; diff --git a/lib/src/sparql/algebra.rs b/lib/oxigraph/src/sparql/algebra.rs similarity index 78% rename from lib/src/sparql/algebra.rs rename to lib/oxigraph/src/sparql/algebra.rs index 41fad114..8b3f385e 100644 --- a/lib/src/sparql/algebra.rs +++ b/lib/oxigraph/src/sparql/algebra.rs @@ -1,15 +1,13 @@ //! [SPARQL 1.1 Query Algebra](https://www.w3.org/TR/sparql11-query/#sparqlQuery) //! //! The root type for SPARQL queries is [`Query`] and the root type for updates is [`Update`]. -//! -//! Warning: this implementation is an unstable work in progress use crate::model::*; use crate::sparql::eval::Timer; +use oxsdatatypes::DayTimeDuration; use spargebra::GraphUpdateOperation; use std::fmt; use std::str::FromStr; -use std::time::Duration; /// A parsed [SPARQL query](https://www.w3.org/TR/sparql11-query/). /// @@ -25,25 +23,31 @@ use std::time::Duration; /// // We edit the query dataset specification /// let default = vec![NamedNode::new("http://example.com")?.into()]; /// query.dataset_mut().set_default_graph(default.clone()); -/// assert_eq!(query.dataset().default_graph_graphs(), Some(default.as_slice())); +/// assert_eq!( +/// query.dataset().default_graph_graphs(), +/// Some(default.as_slice()) +/// ); /// # Ok::<_, Box<dyn std::error::Error>>(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct Query { pub(super) inner: spargebra::Query, pub(super) dataset: QueryDataset, - pub(super) parsing_duration: Option<Duration>, + pub(super) parsing_duration: Option<DayTimeDuration>, } impl Query { /// Parses a SPARQL query with an optional base IRI to resolve relative IRIs in the query. - pub fn parse(query: &str, base_iri: Option<&str>) -> Result<Self, spargebra::ParseError> { + pub fn parse( + query: &str, + base_iri: Option<&str>, + ) -> Result<Self, spargebra::SparqlSyntaxError> { let start = Timer::now(); let query = Self::from(spargebra::Query::parse(query, base_iri)?); Ok(Self { dataset: query.dataset, inner: query.inner, - parsing_duration: Some(start.elapsed()), + parsing_duration: start.elapsed(), }) } @@ -60,30 +64,30 @@ impl Query { impl fmt::Display for Query { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.inner.fmt(f) //TODO: override + self.inner.fmt(f) // TODO: override } } impl FromStr for Query { - type Err = spargebra::ParseError; + type Err = spargebra::SparqlSyntaxError; - fn from_str(query: &str) -> Result<Self, spargebra::ParseError> { + fn from_str(query: &str) -> Result<Self, Self::Err> { Self::parse(query, None) } } -impl<'a> TryFrom<&'a str> for Query { - type Error = spargebra::ParseError; +impl TryFrom<&str> for Query { + type Error = spargebra::SparqlSyntaxError; - fn try_from(query: &str) -> Result<Self, spargebra::ParseError> { + fn try_from(query: &str) -> Result<Self, Self::Error> { Self::from_str(query) } } -impl<'a> TryFrom<&'a String> for Query { - type Error = spargebra::ParseError; +impl TryFrom<&String> for Query { + type Error = spargebra::SparqlSyntaxError; - fn try_from(query: &String) -> Result<Self, spargebra::ParseError> { + fn try_from(query: &String) -> Result<Self, Self::Error> { Self::from_str(query) } } @@ -112,7 +116,7 @@ impl From<spargebra::Query> for Query { /// let update = Update::parse(update_str, None)?; /// /// assert_eq!(update.to_string().trim(), update_str); -/// # Ok::<_, oxigraph::sparql::ParseError>(()) +/// # Ok::<_, oxigraph::sparql::SparqlSyntaxError>(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct Update { @@ -122,22 +126,11 @@ pub struct Update { impl Update { /// Parses a SPARQL update with an optional base IRI to resolve relative IRIs in the query. - pub fn parse(update: &str, base_iri: Option<&str>) -> Result<Self, spargebra::ParseError> { - let update = spargebra::Update::parse(update, base_iri)?; - Ok(Self { - using_datasets: update - .operations - .iter() - .map(|operation| { - if let GraphUpdateOperation::DeleteInsert { using, .. } = operation { - Some(QueryDataset::from_algebra(using)) - } else { - None - } - }) - .collect(), - inner: update, - }) + pub fn parse( + update: &str, + base_iri: Option<&str>, + ) -> Result<Self, spargebra::SparqlSyntaxError> { + Ok(spargebra::Update::parse(update, base_iri)?.into()) } /// Returns [the query dataset specification](https://www.w3.org/TR/sparql11-query/#specifyingDataset) in [DELETE/INSERT operations](https://www.w3.org/TR/sparql11-update/#deleteInsert). @@ -158,29 +151,48 @@ impl fmt::Display for Update { } impl FromStr for Update { - type Err = spargebra::ParseError; + type Err = spargebra::SparqlSyntaxError; - fn from_str(update: &str) -> Result<Self, spargebra::ParseError> { + fn from_str(update: &str) -> Result<Self, Self::Err> { Self::parse(update, None) } } -impl<'a> TryFrom<&'a str> for Update { - type Error = spargebra::ParseError; +impl TryFrom<&str> for Update { + type Error = spargebra::SparqlSyntaxError; - fn try_from(update: &str) -> Result<Self, spargebra::ParseError> { + fn try_from(update: &str) -> Result<Self, Self::Error> { Self::from_str(update) } } -impl<'a> TryFrom<&'a String> for Update { - type Error = spargebra::ParseError; +impl TryFrom<&String> for Update { + type Error = spargebra::SparqlSyntaxError; - fn try_from(update: &String) -> Result<Self, spargebra::ParseError> { + fn try_from(update: &String) -> Result<Self, Self::Error> { Self::from_str(update) } } +impl From<spargebra::Update> for Update { + fn from(update: spargebra::Update) -> Self { + Self { + using_datasets: update + .operations + .iter() + .map(|operation| { + if let GraphUpdateOperation::DeleteInsert { using, .. } = operation { + Some(QueryDataset::from_algebra(using)) + } else { + None + } + }) + .collect(), + inner: update, + } + } +} + /// A SPARQL query [dataset specification](https://www.w3.org/TR/sparql11-query/#specifyingDataset) #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct QueryDataset { @@ -219,8 +231,15 @@ impl QueryDataset { /// ``` /// use oxigraph::sparql::Query; /// - /// assert!(Query::parse("SELECT ?s ?p ?o WHERE { ?s ?p ?o . }", None)?.dataset().is_default_dataset()); - /// assert!(!Query::parse("SELECT ?s ?p ?o FROM <http://example.com> WHERE { ?s ?p ?o . }", None)?.dataset().is_default_dataset()); + /// assert!(Query::parse("SELECT ?s ?p ?o WHERE { ?s ?p ?o . }", None)? + /// .dataset() + /// .is_default_dataset()); + /// assert!(!Query::parse( + /// "SELECT ?s ?p ?o FROM <http://example.com> WHERE { ?s ?p ?o . }", + /// None + /// )? + /// .dataset() + /// .is_default_dataset()); /// /// # Ok::<_, Box<dyn std::error::Error>>(()) /// ``` @@ -252,7 +271,10 @@ impl QueryDataset { /// let mut query = Query::parse("SELECT ?s ?p ?o WHERE { ?s ?p ?o . }", None)?; /// let default = vec![NamedNode::new("http://example.com")?.into()]; /// query.dataset_mut().set_default_graph(default.clone()); - /// assert_eq!(query.dataset().default_graph_graphs(), Some(default.as_slice())); + /// assert_eq!( + /// query.dataset().default_graph_graphs(), + /// Some(default.as_slice()) + /// ); /// /// # Ok::<_, Box<dyn std::error::Error>>(()) /// ``` @@ -273,8 +295,13 @@ impl QueryDataset { /// /// let mut query = Query::parse("SELECT ?s ?p ?o WHERE { ?s ?p ?o . }", None)?; /// let named = vec![NamedNode::new("http://example.com")?.into()]; - /// query.dataset_mut().set_available_named_graphs(named.clone()); - /// assert_eq!(query.dataset().available_named_graphs(), Some(named.as_slice())); + /// query + /// .dataset_mut() + /// .set_available_named_graphs(named.clone()); + /// assert_eq!( + /// query.dataset().available_named_graphs(), + /// Some(named.as_slice()) + /// ); /// /// # Ok::<_, Box<dyn std::error::Error>>(()) /// ``` diff --git a/lib/src/sparql/dataset.rs b/lib/oxigraph/src/sparql/dataset.rs similarity index 97% rename from lib/src/sparql/dataset.rs rename to lib/oxigraph/src/sparql/dataset.rs index e8c9f149..ac03ac3e 100644 --- a/lib/src/sparql/dataset.rs +++ b/lib/oxigraph/src/sparql/dataset.rs @@ -179,10 +179,6 @@ impl StrLookup for DatasetView { self.reader.get_str(key)? }) } - - fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError> { - Ok(self.extra.borrow().contains_key(key) || self.reader.contains_str(key)?) - } } struct EncodedDatasetSpec { diff --git a/lib/oxigraph/src/sparql/error.rs b/lib/oxigraph/src/sparql/error.rs new file mode 100644 index 00000000..38731ded --- /dev/null +++ b/lib/oxigraph/src/sparql/error.rs @@ -0,0 +1,84 @@ +use crate::io::RdfParseError; +use crate::model::NamedNode; +use crate::sparql::results::QueryResultsParseError as ResultsParseError; +use crate::sparql::SparqlSyntaxError; +use crate::storage::StorageError; +use std::convert::Infallible; +use std::error::Error; +use std::io; + +/// A SPARQL evaluation error. +#[derive(Debug, thiserror::Error)] +#[non_exhaustive] +pub enum EvaluationError { + /// An error in SPARQL parsing. + #[error(transparent)] + Parsing(#[from] SparqlSyntaxError), + /// An error from the storage. + #[error(transparent)] + Storage(#[from] StorageError), + /// An error while parsing an external RDF file. + #[error(transparent)] + GraphParsing(#[from] RdfParseError), + /// An error while parsing an external result file (likely from a federated query). + #[error(transparent)] + ResultsParsing(#[from] ResultsParseError), + /// An error returned during results serialization. + #[error(transparent)] + ResultsSerialization(#[from] io::Error), + /// Error during `SERVICE` evaluation + #[error("{0}")] + Service(#[source] Box<dyn Error + Send + Sync + 'static>), + /// Error when `CREATE` tries to create an already existing graph + #[error("The graph {0} already exists")] + GraphAlreadyExists(NamedNode), + /// Error when `DROP` or `CLEAR` tries to remove a not existing graph + #[error("The graph {0} does not exist")] + GraphDoesNotExist(NamedNode), + /// The variable storing the `SERVICE` name is unbound + #[error("The variable encoding the service name is unbound")] + UnboundService, + /// The given `SERVICE` is not supported + #[error("The service {0} is not supported")] + UnsupportedService(NamedNode), + /// The given content media type returned from an HTTP response is not supported (`SERVICE` and `LOAD`) + #[error("The content media type {0} is not supported")] + UnsupportedContentType(String), + /// The `SERVICE` call has not returns solutions + #[error("The service is not returning solutions but a boolean or a graph")] + ServiceDoesNotReturnSolutions, + /// The results are not a RDF graph + #[error("The query results are not a RDF graph")] + NotAGraph, +} + +impl From<Infallible> for EvaluationError { + #[inline] + fn from(error: Infallible) -> Self { + match error {} + } +} + +impl From<EvaluationError> for io::Error { + #[inline] + fn from(error: EvaluationError) -> Self { + match error { + EvaluationError::Parsing(error) => Self::new(io::ErrorKind::InvalidData, error), + EvaluationError::GraphParsing(error) => error.into(), + EvaluationError::ResultsParsing(error) => error.into(), + EvaluationError::ResultsSerialization(error) => error, + EvaluationError::Storage(error) => error.into(), + EvaluationError::Service(error) => match error.downcast() { + Ok(error) => *error, + Err(error) => Self::new(io::ErrorKind::Other, error), + }, + EvaluationError::GraphAlreadyExists(_) + | EvaluationError::GraphDoesNotExist(_) + | EvaluationError::UnboundService + | EvaluationError::UnsupportedService(_) + | EvaluationError::UnsupportedContentType(_) + | EvaluationError::ServiceDoesNotReturnSolutions + | EvaluationError::NotAGraph => Self::new(io::ErrorKind::InvalidInput, error), + } + } +} diff --git a/lib/src/sparql/eval.rs b/lib/oxigraph/src/sparql/eval.rs similarity index 51% rename from lib/src/sparql/eval.rs rename to lib/oxigraph/src/sparql/eval.rs index 0645f532..45452564 100644 --- a/lib/src/sparql/eval.rs +++ b/lib/oxigraph/src/sparql/eval.rs @@ -1,49 +1,133 @@ use crate::model::vocab::{rdf, xsd}; -use crate::model::{BlankNode, LiteralRef, NamedNode, NamedNodeRef, Term, Triple}; +use crate::model::{BlankNode, LiteralRef, NamedNodeRef, Term, Triple}; use crate::sparql::algebra::{Query, QueryDataset}; use crate::sparql::dataset::DatasetView; use crate::sparql::error::EvaluationError; use crate::sparql::model::*; -use crate::sparql::plan::*; use crate::sparql::service::ServiceHandler; +use crate::sparql::CustomFunctionRegistry; use crate::storage::numeric_encoder::*; use crate::storage::small_string::SmallString; use digest::Digest; +use json_event_parser::{JsonEvent, ToWriteJsonWriter}; use md5::Md5; use oxilangtag::LanguageTag; use oxiri::Iri; -use oxrdf::Variable; +use oxrdf::{TermRef, Variable}; use oxsdatatypes::*; use rand::random; use regex::{Regex, RegexBuilder}; use sha1::Sha1; use sha2::{Sha256, Sha384, Sha512}; -use spargebra::algebra::GraphPattern; +use spargebra::algebra::{AggregateFunction, Function, PropertyPathExpression}; +use spargebra::term::{ + GroundSubject, GroundTerm, GroundTermPattern, GroundTriple, NamedNodePattern, TermPattern, + TriplePattern, +}; +use sparopt::algebra::{ + AggregateExpression, Expression, GraphPattern, JoinAlgorithm, LeftJoinAlgorithm, + MinusAlgorithm, OrderExpression, +}; use std::cell::Cell; use std::cmp::Ordering; use std::collections::hash_map::DefaultHasher; use std::collections::{HashMap, HashSet}; use std::hash::{Hash, Hasher}; -use std::iter::Iterator; -use std::iter::{empty, once}; +use std::iter::{empty, once, Iterator}; use std::rc::Rc; -use std::str; -use std::time::Duration as StdDuration; -#[cfg(not(all(target_family = "wasm", target_os = "unknown")))] -use std::time::Instant; +use std::sync::Arc; +use std::{fmt, io, str}; const REGEX_SIZE_LIMIT: usize = 1_000_000; +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub struct EncodedTuple { + inner: Vec<Option<EncodedTerm>>, +} + +impl EncodedTuple { + pub fn with_capacity(capacity: usize) -> Self { + Self { + inner: Vec::with_capacity(capacity), + } + } + + pub fn capacity(&self) -> usize { + self.inner.capacity() + } + + pub fn contains(&self, index: usize) -> bool { + self.inner.get(index).map_or(false, Option::is_some) + } + + pub fn get(&self, index: usize) -> Option<&EncodedTerm> { + self.inner.get(index).unwrap_or(&None).as_ref() + } + + pub fn iter(&self) -> impl Iterator<Item = Option<EncodedTerm>> + '_ { + self.inner.iter().cloned() + } + + pub fn set(&mut self, index: usize, value: EncodedTerm) { + if self.inner.len() <= index { + self.inner.resize(index + 1, None); + } + self.inner[index] = Some(value); + } + + pub fn combine_with(&self, other: &Self) -> Option<Self> { + if self.inner.len() < other.inner.len() { + let mut result = other.inner.clone(); + for (key, self_value) in self.inner.iter().enumerate() { + if let Some(self_value) = self_value { + match &other.inner[key] { + Some(other_value) => { + if self_value != other_value { + return None; + } + } + None => result[key] = Some(self_value.clone()), + } + } + } + Some(Self { inner: result }) + } else { + let mut result = self.inner.clone(); + for (key, other_value) in other.inner.iter().enumerate() { + if let Some(other_value) = other_value { + match &self.inner[key] { + Some(self_value) => { + if self_value != other_value { + return None; + } + } + None => result[key] = Some(other_value.clone()), + } + } + } + Some(Self { inner: result }) + } + } +} + +impl IntoIterator for EncodedTuple { + type Item = Option<EncodedTerm>; + type IntoIter = std::vec::IntoIter<Option<EncodedTerm>>; + + fn into_iter(self) -> Self::IntoIter { + self.inner.into_iter() + } +} + type EncodedTuplesIterator = Box<dyn Iterator<Item = Result<EncodedTuple, EvaluationError>>>; -type CustomFunctionRegistry = HashMap<NamedNode, Rc<dyn Fn(&[Term]) -> Option<Term>>>; #[derive(Clone)] pub struct SimpleEvaluator { dataset: Rc<DatasetView>, base_iri: Option<Rc<Iri<String>>>, now: DateTime, - service_handler: Rc<dyn ServiceHandler<Error = EvaluationError>>, - custom_functions: Rc<CustomFunctionRegistry>, + service_handler: Arc<dyn ServiceHandler<Error = EvaluationError>>, + custom_functions: Arc<CustomFunctionRegistry>, run_stats: bool, } @@ -51,43 +135,41 @@ impl SimpleEvaluator { pub fn new( dataset: Rc<DatasetView>, base_iri: Option<Rc<Iri<String>>>, - service_handler: Rc<dyn ServiceHandler<Error = EvaluationError>>, - custom_functions: Rc<CustomFunctionRegistry>, + service_handler: Arc<dyn ServiceHandler<Error = EvaluationError>>, + custom_functions: Arc<CustomFunctionRegistry>, run_stats: bool, ) -> Self { Self { dataset, base_iri, - now: DateTime::now().unwrap(), + now: DateTime::now(), service_handler, custom_functions, run_stats, } } - #[allow(clippy::rc_buffer)] - pub fn evaluate_select_plan( - &self, - plan: Rc<PlanNode>, - variables: Rc<Vec<Variable>>, - ) -> (QueryResults, Rc<PlanNodeWithStats>) { - let (eval, stats) = self.plan_evaluator(plan); + pub fn evaluate_select(&self, pattern: &GraphPattern) -> (QueryResults, Rc<EvalNodeWithStats>) { + let mut variables = Vec::new(); + let (eval, stats) = self.graph_pattern_evaluator(pattern, &mut variables); + let from = EncodedTuple::with_capacity(variables.len()); ( QueryResults::Solutions(decode_bindings( Rc::clone(&self.dataset), - eval(EncodedTuple::with_capacity(variables.len())), - variables, + eval(from), + Arc::from(variables), )), stats, ) } - pub fn evaluate_ask_plan( + pub fn evaluate_ask( &self, - plan: Rc<PlanNode>, - ) -> (Result<QueryResults, EvaluationError>, Rc<PlanNodeWithStats>) { - let from = EncodedTuple::with_capacity(plan.used_variables().len()); - let (eval, stats) = self.plan_evaluator(plan); + pattern: &GraphPattern, + ) -> (Result<QueryResults, EvaluationError>, Rc<EvalNodeWithStats>) { + let mut variables = Vec::new(); + let (eval, stats) = self.graph_pattern_evaluator(pattern, &mut variables); + let from = EncodedTuple::with_capacity(variables.len()); ( match eval(from).next() { Some(Ok(_)) => Ok(QueryResults::Boolean(true)), @@ -98,13 +180,32 @@ impl SimpleEvaluator { ) } - pub fn evaluate_construct_plan( + pub fn evaluate_construct( &self, - plan: Rc<PlanNode>, - template: Vec<TripleTemplate>, - ) -> (QueryResults, Rc<PlanNodeWithStats>) { - let from = EncodedTuple::with_capacity(plan.used_variables().len()); - let (eval, stats) = self.plan_evaluator(plan); + pattern: &GraphPattern, + template: &[TriplePattern], + ) -> (QueryResults, Rc<EvalNodeWithStats>) { + let mut variables = Vec::new(); + let (eval, stats) = self.graph_pattern_evaluator(pattern, &mut variables); + let mut bnodes = Vec::new(); + let template = template + .iter() + .map(|t| TripleTemplate { + subject: self.template_value_from_term_or_variable( + &t.subject, + &mut variables, + &mut bnodes, + ), + predicate: self + .template_value_from_named_node_or_variable(&t.predicate, &mut variables), + object: self.template_value_from_term_or_variable( + &t.object, + &mut variables, + &mut bnodes, + ), + }) + .collect(); + let from = EncodedTuple::with_capacity(variables.len()); ( QueryResults::Graph(QueryTripleIter { iter: Box::new(ConstructIterator { @@ -119,12 +220,13 @@ impl SimpleEvaluator { ) } - pub fn evaluate_describe_plan( + pub fn evaluate_describe( &self, - plan: Rc<PlanNode>, - ) -> (QueryResults, Rc<PlanNodeWithStats>) { - let from = EncodedTuple::with_capacity(plan.used_variables().len()); - let (eval, stats) = self.plan_evaluator(plan); + pattern: &GraphPattern, + ) -> (QueryResults, Rc<EvalNodeWithStats>) { + let mut variables = Vec::new(); + let (eval, stats) = self.graph_pattern_evaluator(pattern, &mut variables); + let from = EncodedTuple::with_capacity(variables.len()); ( QueryResults::Graph(QueryTripleIter { iter: Box::new(DescribeIterator { @@ -137,20 +239,80 @@ impl SimpleEvaluator { ) } - pub fn plan_evaluator( + pub fn graph_pattern_evaluator( &self, - node: Rc<PlanNode>, + pattern: &GraphPattern, + encoded_variables: &mut Vec<Variable>, ) -> ( Rc<dyn Fn(EncodedTuple) -> EncodedTuplesIterator>, - Rc<PlanNodeWithStats>, + Rc<EvalNodeWithStats>, ) { let mut stat_children = Vec::new(); - let mut evaluator: Rc<dyn Fn(EncodedTuple) -> EncodedTuplesIterator> = match node.as_ref() { - PlanNode::StaticBindings { encoded_tuples, .. } => { - let tuples = encoded_tuples.clone(); + let mut evaluator = + self.build_graph_pattern_evaluator(pattern, encoded_variables, &mut stat_children); + let stats = Rc::new(EvalNodeWithStats { + label: eval_node_label(pattern), + children: stat_children, + exec_count: Cell::new(0), + exec_duration: Cell::new(self.run_stats.then(DayTimeDuration::default)), + }); + if self.run_stats { + let stats = Rc::clone(&stats); + evaluator = Rc::new(move |tuple| { + let start = Timer::now(); + let inner = evaluator(tuple); + stats.exec_duration.set( + stats + .exec_duration + .get() + .and_then(|stat| stat.checked_add(start.elapsed()?)), + ); + Box::new(StatsIterator { + inner, + stats: Rc::clone(&stats), + }) + }) + } + (evaluator, stats) + } + + fn build_graph_pattern_evaluator( + &self, + pattern: &GraphPattern, + encoded_variables: &mut Vec<Variable>, + stat_children: &mut Vec<Rc<EvalNodeWithStats>>, + ) -> Rc<dyn Fn(EncodedTuple) -> EncodedTuplesIterator> { + match pattern { + GraphPattern::Values { + variables, + bindings, + } => { + let encoding = variables + .iter() + .map(|v| encode_variable(encoded_variables, v)) + .collect::<Vec<_>>(); + let encoded_tuples = bindings + .iter() + .map(|row| { + let mut result = EncodedTuple::with_capacity(variables.len()); + for (key, value) in row.iter().enumerate() { + if let Some(term) = value { + result.set( + encoding[key], + match term { + GroundTerm::NamedNode(node) => self.encode_term(node), + GroundTerm::Literal(literal) => self.encode_term(literal), + GroundTerm::Triple(triple) => self.encode_triple(triple), + }, + ); + } + } + result + }) + .collect::<Vec<_>>(); Rc::new(move |from| { Box::new( - tuples + encoded_tuples .iter() .filter_map(move |t| Some(Ok(t.combine_with(&from)?))) .collect::<Vec<_>>() @@ -158,17 +320,18 @@ impl SimpleEvaluator { ) }) } - PlanNode::Service { - variables, + GraphPattern::Service { + name, + inner, silent, - service_name, - graph_pattern, - .. } => { - let variables = Rc::clone(variables); + #[allow(clippy::shadow_same)] let silent = *silent; - let service_name = service_name.clone(); - let graph_pattern = Rc::clone(graph_pattern); + let service_name = + TupleSelector::from_named_node_pattern(name, encoded_variables, &self.dataset); + self.build_graph_pattern_evaluator(inner, encoded_variables, &mut Vec::new()); // We call recursively to fill "encoded_variables" + let graph_pattern = spargebra::algebra::GraphPattern::from(inner.as_ref()); + let variables = Rc::from(encoded_variables.as_slice()); let eval = self.clone(); Rc::new(move |from| { match eval.evaluate_service( @@ -192,23 +355,39 @@ impl SimpleEvaluator { } }) } - PlanNode::QuadPattern { + GraphPattern::QuadPattern { subject, predicate, object, graph_name, } => { - let subject = TupleSelector::from(subject); - let predicate = TupleSelector::from(predicate); - let object = TupleSelector::from(object); - let graph_name = TupleSelector::from(graph_name); + let subject = TupleSelector::from_ground_term_pattern( + subject, + encoded_variables, + &self.dataset, + ); + let predicate = TupleSelector::from_named_node_pattern( + predicate, + encoded_variables, + &self.dataset, + ); + let object = TupleSelector::from_ground_term_pattern( + object, + encoded_variables, + &self.dataset, + ); + let graph_name = TupleSelector::from_graph_name_pattern( + graph_name, + encoded_variables, + &self.dataset, + ); let dataset = Rc::clone(&self.dataset); Rc::new(move |from| { let iter = dataset.encoded_quads_for_pattern( - get_pattern_value(&subject, &from).as_ref(), - get_pattern_value(&predicate, &from).as_ref(), - get_pattern_value(&object, &from).as_ref(), - get_pattern_value(&graph_name, &from).as_ref(), + subject.get_pattern_value(&from).as_ref(), + predicate.get_pattern_value(&from).as_ref(), + object.get_pattern_value(&from).as_ref(), + graph_name.get_pattern_value(&from).as_ref(), ); let subject = subject.clone(); let predicate = predicate.clone(); @@ -227,21 +406,34 @@ impl SimpleEvaluator { })) }) } - PlanNode::PathPattern { + GraphPattern::Path { subject, path, object, graph_name, } => { - let subject = TupleSelector::from(subject); - let path = Rc::clone(path); - let object = TupleSelector::from(object); - let graph_name = TupleSelector::from(graph_name); + let subject = TupleSelector::from_ground_term_pattern( + subject, + encoded_variables, + &self.dataset, + ); + let path = self.encode_property_path(path); + + let object = TupleSelector::from_ground_term_pattern( + object, + encoded_variables, + &self.dataset, + ); + let graph_name = TupleSelector::from_graph_name_pattern( + graph_name, + encoded_variables, + &self.dataset, + ); let dataset = Rc::clone(&self.dataset); Rc::new(move |from| { - let input_subject = get_pattern_value(&subject, &from); - let input_object = get_pattern_value(&object, &from); - let input_graph_name = get_pattern_value(&graph_name, &from); + let input_subject = subject.get_pattern_value(&from); + let input_object = object.get_pattern_value(&from); + let input_graph_name = graph_name.get_pattern_value(&from); let path_eval = PathEvaluator { dataset: Rc::clone(&dataset), }; @@ -379,61 +571,95 @@ impl SimpleEvaluator { } }) } - PlanNode::HashJoin { left, right } => { - let join_keys: Vec<_> = left - .always_bound_variables() - .intersection(&right.always_bound_variables()) - .copied() - .collect(); - let (left, left_stats) = self.plan_evaluator(Rc::clone(left)); + GraphPattern::Join { + left, + right, + algorithm, + } => { + let (left, left_stats) = self.graph_pattern_evaluator(left, encoded_variables); stat_children.push(left_stats); - let (right, right_stats) = self.plan_evaluator(Rc::clone(right)); + let (right, right_stats) = self.graph_pattern_evaluator(right, encoded_variables); stat_children.push(right_stats); - if join_keys.is_empty() { - // Cartesian product - Rc::new(move |from| { - let mut errors = Vec::default(); - let right_values = right(from.clone()) - .filter_map(|result| match result { - Ok(result) => Some(result), - Err(error) => { - errors.push(Err(error)); - None - } + + match algorithm { + JoinAlgorithm::HashBuildLeftProbeRight { keys } => { + let build = left; + let probe = right; + if keys.is_empty() { + // Cartesian product + Rc::new(move |from| { + let mut errors = Vec::default(); + let build_values = build(from.clone()) + .filter_map(|result| match result { + Ok(result) => Some(result), + Err(error) => { + errors.push(Err(error)); + None + } + }) + .collect::<Vec<_>>(); + Box::new(CartesianProductJoinIterator { + probe_iter: probe(from), + built: build_values, + buffered_results: errors, + }) }) - .collect::<Vec<_>>(); - Box::new(CartesianProductJoinIterator { - left_iter: left(from), - right: right_values, - buffered_results: errors, - }) - }) - } else { - // Real hash join - Rc::new(move |from| { - let mut errors = Vec::default(); - let mut right_values = EncodedTupleSet::new(join_keys.clone()); - right_values.extend(right(from.clone()).filter_map( - |result| match result { - Ok(result) => Some(result), - Err(error) => { - errors.push(Err(error)); - None - } - }, - )); - Box::new(HashJoinIterator { - left_iter: left(from), - right: right_values, - buffered_results: errors, - }) - }) + } else { + // Real hash join + let keys = keys + .iter() + .map(|v| encode_variable(encoded_variables, v)) + .collect::<Vec<_>>(); + Rc::new(move |from| { + let mut errors = Vec::default(); + let mut built_values = EncodedTupleSet::new(keys.clone()); + built_values.extend(build(from.clone()).filter_map(|result| { + match result { + Ok(result) => Some(result), + Err(error) => { + errors.push(Err(error)); + None + } + } + })); + Box::new(HashJoinIterator { + probe_iter: probe(from), + built: built_values, + buffered_results: errors, + }) + }) + } + } } } - PlanNode::ForLoopJoin { left, right } => { - let (left, left_stats) = self.plan_evaluator(Rc::clone(left)); + GraphPattern::Lateral { left, right } => { + let (left, left_stats) = self.graph_pattern_evaluator(left, encoded_variables); stat_children.push(left_stats); - let (right, right_stats) = self.plan_evaluator(Rc::clone(right)); + + if let GraphPattern::LeftJoin { + left: nested_left, + right: nested_right, + expression, + .. + } = right.as_ref() + { + if nested_left.is_empty_singleton() { + // We are in a ForLoopLeftJoin + let right = + GraphPattern::filter(nested_right.as_ref().clone(), expression.clone()); + let (right, right_stats) = + self.graph_pattern_evaluator(&right, encoded_variables); + stat_children.push(right_stats); + return Rc::new(move |from| { + Box::new(ForLoopLeftJoinIterator { + right_evaluator: Rc::clone(&right), + left_iter: left(from), + current_right: Box::new(empty()), + }) + }); + } + } + let (right, right_stats) = self.graph_pattern_evaluator(right, encoded_variables); stat_children.push(right_stats); Rc::new(move |from| { let right = Rc::clone(&right); @@ -443,112 +669,108 @@ impl SimpleEvaluator { })) }) } - PlanNode::AntiJoin { left, right } => { - let join_keys: Vec<_> = left - .always_bound_variables() - .intersection(&right.always_bound_variables()) - .copied() - .collect(); - let (left, left_stats) = self.plan_evaluator(Rc::clone(left)); - stat_children.push(left_stats); - let (right, right_stats) = self.plan_evaluator(Rc::clone(right)); - stat_children.push(right_stats); - if join_keys.is_empty() { - Rc::new(move |from| { - let right: Vec<_> = right(from.clone()).filter_map(Result::ok).collect(); - Box::new(left(from).filter(move |left_tuple| { - if let Ok(left_tuple) = left_tuple { - !right.iter().any(|right_tuple| { - are_compatible_and_not_disjointed(left_tuple, right_tuple) - }) - } else { - true - } - })) - }) - } else { - Rc::new(move |from| { - let mut right_values = EncodedTupleSet::new(join_keys.clone()); - right_values.extend(right(from.clone()).filter_map(Result::ok)); - Box::new(left(from).filter(move |left_tuple| { - if let Ok(left_tuple) = left_tuple { - !right_values.get(left_tuple).iter().any(|right_tuple| { - are_compatible_and_not_disjointed(left_tuple, right_tuple) - }) - } else { - true - } - })) - }) - } - } - PlanNode::HashLeftJoin { + GraphPattern::Minus { left, right, - expression, + algorithm, } => { - let join_keys: Vec<_> = left - .always_bound_variables() - .intersection(&right.always_bound_variables()) - .copied() - .collect(); - let (left, left_stats) = self.plan_evaluator(Rc::clone(left)); + let (left, left_stats) = self.graph_pattern_evaluator(left, encoded_variables); stat_children.push(left_stats); - let (right, right_stats) = self.plan_evaluator(Rc::clone(right)); + let (right, right_stats) = self.graph_pattern_evaluator(right, encoded_variables); stat_children.push(right_stats); - let expression = self.expression_evaluator(expression, &mut stat_children); - // Real hash join - Rc::new(move |from| { - let mut errors = Vec::default(); - let mut right_values = EncodedTupleSet::new(join_keys.clone()); - right_values.extend(right(from.clone()).filter_map(|result| match result { - Ok(result) => Some(result), - Err(error) => { - errors.push(Err(error)); - None + + match algorithm { + MinusAlgorithm::HashBuildRightProbeLeft { keys } => { + if keys.is_empty() { + Rc::new(move |from| { + let right: Vec<_> = + right(from.clone()).filter_map(Result::ok).collect(); + Box::new(left(from).filter(move |left_tuple| { + if let Ok(left_tuple) = left_tuple { + !right.iter().any(|right_tuple| { + are_compatible_and_not_disjointed( + left_tuple, + right_tuple, + ) + }) + } else { + true + } + })) + }) + } else { + let keys = keys + .iter() + .map(|v| encode_variable(encoded_variables, v)) + .collect::<Vec<_>>(); + Rc::new(move |from| { + let mut right_values = EncodedTupleSet::new(keys.clone()); + right_values.extend(right(from.clone()).filter_map(Result::ok)); + Box::new(left(from).filter(move |left_tuple| { + if let Ok(left_tuple) = left_tuple { + !right_values.get(left_tuple).iter().any(|right_tuple| { + are_compatible_and_not_disjointed( + left_tuple, + right_tuple, + ) + }) + } else { + true + } + })) + }) } - })); - Box::new(HashLeftJoinIterator { - left_iter: left(from), - right: right_values, - buffered_results: errors, - expression: Rc::clone(&expression), - }) - }) + } + } } - PlanNode::ForLoopLeftJoin { + GraphPattern::LeftJoin { left, right, - possible_problem_vars, + expression, + algorithm, } => { - let (left, left_stats) = self.plan_evaluator(Rc::clone(left)); + let (left, left_stats) = self.graph_pattern_evaluator(left, encoded_variables); stat_children.push(left_stats); - let (right, right_stats) = self.plan_evaluator(Rc::clone(right)); + let (right, right_stats) = self.graph_pattern_evaluator(right, encoded_variables); stat_children.push(right_stats); - let possible_problem_vars = Rc::clone(possible_problem_vars); - Rc::new(move |from| { - if possible_problem_vars.is_empty() { - Box::new(ForLoopLeftJoinIterator { - right_evaluator: Rc::clone(&right), - left_iter: left(from), - current_right: Box::new(empty()), - }) - } else { - Box::new(BadForLoopLeftJoinIterator { - from_tuple: from.clone(), - right_evaluator: Rc::clone(&right), - left_iter: left(from), - current_left: EncodedTuple::with_capacity(0), - current_right: Box::new(empty()), - problem_vars: Rc::clone(&possible_problem_vars), + let expression = + self.expression_evaluator(expression, encoded_variables, stat_children); + + match algorithm { + LeftJoinAlgorithm::HashBuildRightProbeLeft { keys } => { + // Real hash join + let keys = keys + .iter() + .map(|v| encode_variable(encoded_variables, v)) + .collect::<Vec<_>>(); + Rc::new(move |from| { + let mut errors = Vec::default(); + let mut right_values = EncodedTupleSet::new(keys.clone()); + right_values.extend(right(from.clone()).filter_map( + |result| match result { + Ok(result) => Some(result), + Err(error) => { + errors.push(Err(error)); + None + } + }, + )); + Box::new(HashLeftJoinIterator { + left_iter: left(from), + right: right_values, + buffered_results: errors, + expression: Rc::clone(&expression), + }) }) } - }) + } } - PlanNode::Filter { child, expression } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::Filter { inner, expression } => { + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); - let expression = self.expression_evaluator(expression, &mut stat_children); + let expression = + self.expression_evaluator(expression, encoded_variables, stat_children); + Rc::new(move |from| { let expression = Rc::clone(&expression); Box::new(child(from).filter(move |tuple| { @@ -561,15 +783,17 @@ impl SimpleEvaluator { })) }) } - PlanNode::Union { children } => { - let children: Vec<_> = children + GraphPattern::Union { inner } => { + let children = inner .iter() .map(|child| { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + let (child, child_stats) = + self.graph_pattern_evaluator(child, encoded_variables); stat_children.push(child_stats); child }) - .collect(); + .collect::<Vec<_>>(); + Rc::new(move |from| { Box::new(UnionIterator { plans: children.clone(), @@ -579,15 +803,17 @@ impl SimpleEvaluator { }) }) } - PlanNode::Extend { - child, + GraphPattern::Extend { + inner, variable, expression, } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); - let position = variable.encoded; - let expression = self.expression_evaluator(expression, &mut stat_children); + + let position = encode_variable(encoded_variables, variable); + let expression = + self.expression_evaluator(expression, encoded_variables, stat_children); Rc::new(move |from| { let expression = Rc::clone(&expression); Box::new(child(from).map(move |tuple| { @@ -599,20 +825,20 @@ impl SimpleEvaluator { })) }) } - PlanNode::Sort { child, by } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::OrderBy { inner, expression } => { + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); - let by: Vec<_> = by + let by = expression .iter() .map(|comp| match comp { - Comparator::Asc(expression) => ComparatorFunction::Asc( - self.expression_evaluator(expression, &mut stat_children), + OrderExpression::Asc(expression) => ComparatorFunction::Asc( + self.expression_evaluator(expression, encoded_variables, stat_children), ), - Comparator::Desc(expression) => ComparatorFunction::Desc( - self.expression_evaluator(expression, &mut stat_children), + OrderExpression::Desc(expression) => ComparatorFunction::Desc( + self.expression_evaluator(expression, encoded_variables, stat_children), ), }) - .collect(); + .collect::<Vec<_>>(); let dataset = Rc::clone(&self.dataset); Rc::new(move |from| { let mut errors = Vec::default(); @@ -657,13 +883,13 @@ impl SimpleEvaluator { Box::new(errors.into_iter().chain(values.into_iter().map(Ok))) }) } - PlanNode::HashDeduplicate { child } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::Distinct { inner } => { + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); Rc::new(move |from| Box::new(hash_deduplicate(child(from)))) } - PlanNode::Reduced { child } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::Reduced { inner } => { + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); Rc::new(move |from| { Box::new(ConsecutiveDeduplication { @@ -672,44 +898,57 @@ impl SimpleEvaluator { }) }) } - PlanNode::Skip { child, count } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); - stat_children.push(child_stats); - let count = *count; - Rc::new(move |from| Box::new(child(from).skip(count))) - } - PlanNode::Limit { child, count } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::Slice { + inner, + start, + length, + } => { + let (mut child, child_stats) = + self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); - let count = *count; - Rc::new(move |from| Box::new(child(from).take(count))) + #[allow(clippy::shadow_same)] + let start = *start; + if start > 0 { + child = Rc::new(move |from| Box::new(child(from).skip(start))); + } + if let Some(length) = *length { + child = Rc::new(move |from| Box::new(child(from).take(length))); + } + child } - PlanNode::Project { child, mapping } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + GraphPattern::Project { inner, variables } => { + let mut inner_encoded_variables = variables.clone(); + let (child, child_stats) = + self.graph_pattern_evaluator(inner, &mut inner_encoded_variables); stat_children.push(child_stats); - let mapping = Rc::clone(mapping); + let mapping = variables + .iter() + .enumerate() + .map(|(new_variable, variable)| { + (new_variable, encode_variable(encoded_variables, variable)) + }) + .collect::<Rc<[(usize, usize)]>>(); Rc::new(move |from| { let mapping = Rc::clone(&mapping); let mut input_tuple = EncodedTuple::with_capacity(mapping.len()); - for (input_key, output_key) in mapping.iter() { - if let Some(value) = from.get(output_key.encoded) { - input_tuple.set(input_key.encoded, value.clone()); + for (input_key, output_key) in &*mapping { + if let Some(value) = from.get(*output_key) { + input_tuple.set(*input_key, value.clone()); } } Box::new(child(input_tuple).filter_map(move |tuple| { match tuple { Ok(tuple) => { let mut output_tuple = from.clone(); - for (input_key, output_key) in mapping.iter() { - if let Some(value) = tuple.get(input_key.encoded) { - if let Some(existing_value) = - output_tuple.get(output_key.encoded) + for (input_key, output_key) in &*mapping { + if let Some(value) = tuple.get(*input_key) { + if let Some(existing_value) = output_tuple.get(*output_key) { if existing_value != value { return None; // Conflict } } else { - output_tuple.set(output_key.encoded, value.clone()); + output_tuple.set(*output_key, value.clone()); } } } @@ -720,35 +959,34 @@ impl SimpleEvaluator { })) }) } - PlanNode::Aggregate { - child, - key_variables, + GraphPattern::Group { + inner, aggregates, + variables, } => { - let (child, child_stats) = self.plan_evaluator(Rc::clone(child)); + let (child, child_stats) = self.graph_pattern_evaluator(inner, encoded_variables); stat_children.push(child_stats); - let key_variables = Rc::clone(key_variables); - let aggregate_input_expressions: Vec<_> = aggregates + let key_variables = variables .iter() - .map(|(aggregate, _)| { - aggregate - .parameter - .as_ref() - .map(|p| self.expression_evaluator(p, &mut stat_children)) - }) - .collect(); - let accumulator_builders: Vec<_> = aggregates + .map(|k| encode_variable(encoded_variables, k)) + .collect::<Rc<[_]>>(); + let aggregate_input_expressions = aggregates .iter() - .map(|(aggregate, _)| { - Self::accumulator_builder( - &self.dataset, - &aggregate.function, - aggregate.distinct, - ) + .map(|(_, expression)| match expression { + AggregateExpression::CountSolutions { .. } => None, + AggregateExpression::FunctionCall { expr, .. } => { + Some(self.expression_evaluator(expr, encoded_variables, stat_children)) + } }) - .collect(); - let accumulator_variables: Vec<_> = - aggregates.iter().map(|(_, var)| var.encoded).collect(); + .collect::<Vec<_>>(); + let accumulator_builders = aggregates + .iter() + .map(|(_, aggregate)| Self::accumulator_builder(&self.dataset, aggregate)) + .collect::<Vec<_>>(); + let accumulator_variables = aggregates + .iter() + .map(|(variable, _)| encode_variable(encoded_variables, variable)) + .collect::<Vec<_>>(); Rc::new(move |from| { let tuple_size = from.capacity(); let key_variables = Rc::clone(&key_variables); @@ -771,10 +1009,10 @@ impl SimpleEvaluator { } }) .for_each(|tuple| { - //TODO avoid copy for key? + // TODO avoid copy for key? let key = key_variables .iter() - .map(|v| tuple.get(v.encoded).cloned()) + .map(|v| tuple.get(*v).cloned()) .collect(); let key_accumulators = @@ -802,7 +1040,7 @@ impl SimpleEvaluator { let mut result = EncodedTuple::with_capacity(tuple_size); for (variable, value) in key_variables.iter().zip(key) { if let Some(value) = value { - result.set(variable.encoded, value); + result.set(*variable, value); } } for (accumulator, variable) in @@ -818,45 +1056,26 @@ impl SimpleEvaluator { ) }) } - }; - let stats = Rc::new(PlanNodeWithStats { - node, - children: stat_children, - exec_count: Cell::new(0), - exec_duration: Cell::new(std::time::Duration::from_secs(0)), - }); - if self.run_stats { - let stats = Rc::clone(&stats); - evaluator = Rc::new(move |tuple| { - let start = Timer::now(); - let inner = evaluator(tuple); - stats - .exec_duration - .set(stats.exec_duration.get() + start.elapsed()); - Box::new(StatsIterator { - inner, - stats: Rc::clone(&stats), - }) - }) } - (evaluator, stats) } fn evaluate_service( &self, - service_name: &PatternValue, - graph_pattern: &GraphPattern, + service_name: &TupleSelector, + graph_pattern: &spargebra::algebra::GraphPattern, variables: Rc<[Variable]>, from: &EncodedTuple, ) -> Result<EncodedTuplesIterator, EvaluationError> { - let service_name = get_pattern_value(&service_name.into(), from) - .ok_or_else(|| EvaluationError::msg("The SERVICE name is not bound"))?; + let service_name = service_name + .get_pattern_value(from) + .ok_or(EvaluationError::UnboundService)?; if let QueryResults::Solutions(iter) = self.service_handler.handle( self.dataset.decode_named_node(&service_name)?, Query { inner: spargebra::Query::Select { dataset: None, pattern: graph_pattern.clone(), + #[allow(clippy::useless_asref)] base_iri: self.base_iri.as_ref().map(|iri| iri.as_ref().clone()), }, dataset: QueryDataset::new(), @@ -865,60 +1084,35 @@ impl SimpleEvaluator { )? { Ok(encode_bindings(Rc::clone(&self.dataset), variables, iter)) } else { - Err(EvaluationError::msg( - "The service call has not returned a set of solutions", - )) + Err(EvaluationError::ServiceDoesNotReturnSolutions) } } #[allow(clippy::redundant_closure)] // False positive in 1.60 fn accumulator_builder( dataset: &Rc<DatasetView>, - function: &PlanAggregationFunction, - distinct: bool, + expression: &AggregateExpression, ) -> Box<dyn Fn() -> Box<dyn Accumulator>> { - match function { - PlanAggregationFunction::Count => { - if distinct { - Box::new(|| Box::new(DistinctAccumulator::new(CountAccumulator::default()))) - } else { - Box::new(|| Box::<CountAccumulator>::default()) + let mut accumulator: Box<dyn Fn() -> Box<dyn Accumulator>> = match expression { + AggregateExpression::CountSolutions { .. } => { + Box::new(|| Box::<CountAccumulator>::default()) + } + AggregateExpression::FunctionCall { name, .. } => match name { + AggregateFunction::Count => Box::new(|| Box::<CountAccumulator>::default()), + AggregateFunction::Sum => Box::new(|| Box::<SumAccumulator>::default()), + AggregateFunction::Min => { + let dataset = Rc::clone(dataset); + Box::new(move || Box::new(MinAccumulator::new(Rc::clone(&dataset)))) } - } - PlanAggregationFunction::Sum => { - if distinct { - Box::new(|| Box::new(DistinctAccumulator::new(SumAccumulator::default()))) - } else { - Box::new(|| Box::<SumAccumulator>::default()) - } - } - PlanAggregationFunction::Min => { - let dataset = Rc::clone(dataset); - Box::new(move || Box::new(MinAccumulator::new(Rc::clone(&dataset)))) - } // DISTINCT does not make sense with min - PlanAggregationFunction::Max => { - let dataset = Rc::clone(dataset); - Box::new(move || Box::new(MaxAccumulator::new(Rc::clone(&dataset)))) - } // DISTINCT does not make sense with max - PlanAggregationFunction::Avg => { - if distinct { - Box::new(|| Box::new(DistinctAccumulator::new(AvgAccumulator::default()))) - } else { - Box::new(|| Box::<AvgAccumulator>::default()) + AggregateFunction::Max => { + let dataset = Rc::clone(dataset); + Box::new(move || Box::new(MaxAccumulator::new(Rc::clone(&dataset)))) } - } - PlanAggregationFunction::Sample => Box::new(|| Box::<SampleAccumulator>::default()), // DISTINCT does not make sense with sample - PlanAggregationFunction::GroupConcat { separator } => { - let dataset = Rc::clone(dataset); - let separator = Rc::clone(separator); - if distinct { - Box::new(move || { - Box::new(DistinctAccumulator::new(GroupConcatAccumulator::new( - Rc::clone(&dataset), - Rc::clone(&separator), - ))) - }) - } else { + AggregateFunction::Avg => Box::new(|| Box::<AvgAccumulator>::default()), + AggregateFunction::Sample => Box::new(|| Box::<SampleAccumulator>::default()), + AggregateFunction::GroupConcat { separator } => { + let dataset = Rc::clone(dataset); + let separator = Rc::from(separator.as_deref().unwrap_or(" ")); Box::new(move || { Box::new(GroupConcatAccumulator::new( Rc::clone(&dataset), @@ -926,41 +1120,55 @@ impl SimpleEvaluator { )) }) } - } + AggregateFunction::Custom(_) => Box::new(|| Box::new(FailingAccumulator)), + }, + }; + if matches!( + expression, + AggregateExpression::CountSolutions { distinct: true } + | AggregateExpression::FunctionCall { distinct: true, .. } + ) { + accumulator = Box::new(move || Box::new(Deduplicate::new(accumulator()))); } + accumulator } fn expression_evaluator( &self, - expression: &PlanExpression, - stat_children: &mut Vec<Rc<PlanNodeWithStats>>, + expression: &Expression, + encoded_variables: &mut Vec<Variable>, + stat_children: &mut Vec<Rc<EvalNodeWithStats>>, ) -> Rc<dyn Fn(&EncodedTuple) -> Option<EncodedTerm>> { match expression { - PlanExpression::NamedNode(t) => { - let t = t.encoded.clone(); + Expression::NamedNode(t) => { + let t = self.encode_term(t); Rc::new(move |_| Some(t.clone())) } - PlanExpression::Literal(t) => { - let t = t.encoded.clone(); + Expression::Literal(t) => { + let t = self.encode_term(t); Rc::new(move |_| Some(t.clone())) } - PlanExpression::Variable(v) => { - let v = v.encoded; + Expression::Variable(v) => { + let v = encode_variable(encoded_variables, v); Rc::new(move |tuple| tuple.get(v).cloned()) } - PlanExpression::Exists(plan) => { - let (eval, stats) = self.plan_evaluator(Rc::clone(plan)); + Expression::Bound(v) => { + let v = encode_variable(encoded_variables, v); + Rc::new(move |tuple| Some(tuple.contains(v).into())) + } + Expression::Exists(plan) => { + let (eval, stats) = self.graph_pattern_evaluator(plan, encoded_variables); stat_children.push(stats); Rc::new(move |tuple| Some(eval(tuple.clone()).next().is_some().into())) } - PlanExpression::Or(inner) => { + Expression::Or(inner) => { let children = inner .iter() - .map(|i| self.expression_evaluator(i, stat_children)) + .map(|i| self.expression_evaluator(i, encoded_variables, stat_children)) .collect::<Rc<[_]>>(); Rc::new(move |tuple| { let mut error = false; - for child in children.iter() { + for child in &*children { match child(tuple).and_then(|v| to_bool(&v)) { Some(true) => return Some(true.into()), Some(false) => continue, @@ -974,14 +1182,14 @@ impl SimpleEvaluator { } }) } - PlanExpression::And(inner) => { + Expression::And(inner) => { let children = inner .iter() - .map(|i| self.expression_evaluator(i, stat_children)) + .map(|i| self.expression_evaluator(i, encoded_variables, stat_children)) .collect::<Rc<[_]>>(); Rc::new(move |tuple| { let mut error = false; - for child in children.iter() { + for child in &*children { match child(tuple).and_then(|v| to_bool(&v)) { Some(true) => continue, Some(false) => return Some(false.into()), @@ -995,14 +1203,19 @@ impl SimpleEvaluator { } }) } - PlanExpression::Equal(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Equal(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); Rc::new(move |tuple| equals(&a(tuple)?, &b(tuple)?).map(Into::into)) } - PlanExpression::Greater(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::SameTerm(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); + Rc::new(move |tuple| Some((a(tuple)? == b(tuple)?).into())) + } + Expression::Greater(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); let dataset = Rc::clone(&self.dataset); Rc::new(move |tuple| { Some( @@ -1011,9 +1224,9 @@ impl SimpleEvaluator { ) }) } - PlanExpression::GreaterOrEqual(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::GreaterOrEqual(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); let dataset = Rc::clone(&self.dataset); Rc::new(move |tuple| { Some( @@ -1025,17 +1238,17 @@ impl SimpleEvaluator { ) }) } - PlanExpression::Less(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Less(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); let dataset = Rc::clone(&self.dataset); Rc::new(move |tuple| { Some((partial_cmp(&dataset, &a(tuple)?, &b(tuple)?)? == Ordering::Less).into()) }) } - PlanExpression::LessOrEqual(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::LessOrEqual(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); let dataset = Rc::clone(&self.dataset); Rc::new(move |tuple| { Some( @@ -1047,9 +1260,9 @@ impl SimpleEvaluator { ) }) } - PlanExpression::Add(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Add(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); Rc::new( move |tuple| match NumericBinaryOperands::new(a(tuple)?, b(tuple)?)? { NumericBinaryOperands::Float(v1, v2) => Some((v1 + v2).into()), @@ -1093,24 +1306,18 @@ impl SimpleEvaluator { }, ) } - PlanExpression::Subtract(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Subtract(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); Rc::new(move |tuple| { Some(match NumericBinaryOperands::new(a(tuple)?, b(tuple)?)? { NumericBinaryOperands::Float(v1, v2) => (v1 - v2).into(), NumericBinaryOperands::Double(v1, v2) => (v1 - v2).into(), NumericBinaryOperands::Integer(v1, v2) => v1.checked_sub(v2)?.into(), NumericBinaryOperands::Decimal(v1, v2) => v1.checked_sub(v2)?.into(), - NumericBinaryOperands::DateTime(v1, v2) => { - Duration::from(v1.checked_sub(v2)?).into() - } - NumericBinaryOperands::Date(v1, v2) => { - Duration::from(v1.checked_sub(v2)?).into() - } - NumericBinaryOperands::Time(v1, v2) => { - Duration::from(v1.checked_sub(v2)?).into() - } + NumericBinaryOperands::DateTime(v1, v2) => v1.checked_sub(v2)?.into(), + NumericBinaryOperands::Date(v1, v2) => v1.checked_sub(v2)?.into(), + NumericBinaryOperands::Time(v1, v2) => v1.checked_sub(v2)?.into(), NumericBinaryOperands::Duration(v1, v2) => v1.checked_sub(v2)?.into(), NumericBinaryOperands::YearMonthDuration(v1, v2) => { v1.checked_sub(v2)?.into() @@ -1145,9 +1352,9 @@ impl SimpleEvaluator { }) }) } - PlanExpression::Multiply(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Multiply(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); Rc::new( move |tuple| match NumericBinaryOperands::new(a(tuple)?, b(tuple)?)? { NumericBinaryOperands::Float(v1, v2) => Some((v1 * v2).into()), @@ -1158,9 +1365,9 @@ impl SimpleEvaluator { }, ) } - PlanExpression::Divide(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); + Expression::Divide(a, b) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); Rc::new( move |tuple| match NumericBinaryOperands::new(a(tuple)?, b(tuple)?)? { NumericBinaryOperands::Float(v1, v2) => Some((v1 / v2).into()), @@ -1173,8 +1380,8 @@ impl SimpleEvaluator { }, ) } - PlanExpression::UnaryPlus(e) => { - let e = self.expression_evaluator(e, stat_children); + Expression::UnaryPlus(e) => { + let e = self.expression_evaluator(e, encoded_variables, stat_children); Rc::new(move |tuple| match e(tuple)? { EncodedTerm::FloatLiteral(value) => Some(value.into()), EncodedTerm::DoubleLiteral(value) => Some(value.into()), @@ -1186,8 +1393,8 @@ impl SimpleEvaluator { _ => None, }) } - PlanExpression::UnaryMinus(e) => { - let e = self.expression_evaluator(e, stat_children); + Expression::UnaryMinus(e) => { + let e = self.expression_evaluator(e, encoded_variables, stat_children); Rc::new(move |tuple| match e(tuple)? { EncodedTerm::FloatLiteral(value) => Some((-value).into()), EncodedTerm::DoubleLiteral(value) => Some((-value).into()), @@ -1201,902 +1408,1339 @@ impl SimpleEvaluator { _ => None, }) } - PlanExpression::Not(e) => { - let e = self.expression_evaluator(e, stat_children); + Expression::Not(e) => { + let e = self.expression_evaluator(e, encoded_variables, stat_children); Rc::new(move |tuple| to_bool(&e(tuple)?).map(|v| (!v).into())) } - PlanExpression::Str(e) | PlanExpression::StringCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - Some(build_string_literal_from_id(to_string_id( - &dataset, - &e(tuple)?, - )?)) - }) - } - PlanExpression::Lang(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::SmallSmallLangStringLiteral { language, .. } - | EncodedTerm::BigSmallLangStringLiteral { language, .. } => { - Some(build_string_literal_from_id(language.into())) - } - EncodedTerm::SmallBigLangStringLiteral { language_id, .. } - | EncodedTerm::BigBigLangStringLiteral { language_id, .. } => { - Some(build_string_literal_from_id(language_id.into())) - } - e if e.is_literal() => Some(build_string_literal(&dataset, "")), - _ => None, - }) - } - PlanExpression::LangMatches(language_tag, language_range) => { - let language_tag = self.expression_evaluator(language_tag, stat_children); - let language_range = self.expression_evaluator(language_range, stat_children); - let dataset = Rc::clone(&self.dataset); + Expression::Coalesce(l) => { + let l: Vec<_> = l + .iter() + .map(|e| self.expression_evaluator(e, encoded_variables, stat_children)) + .collect(); Rc::new(move |tuple| { - let mut language_tag = to_simple_string(&dataset, &language_tag(tuple)?)?; - language_tag.make_ascii_lowercase(); - let mut language_range = to_simple_string(&dataset, &language_range(tuple)?)?; - language_range.make_ascii_lowercase(); - Some( - if &*language_range == "*" { - !language_tag.is_empty() - } else { - !ZipLongest::new(language_range.split('-'), language_tag.split('-')) - .any(|parts| match parts { - (Some(range_subtag), Some(language_subtag)) => { - range_subtag != language_subtag - } - (Some(_), None) => true, - (None, _) => false, - }) + for e in &l { + if let Some(result) = e(tuple) { + return Some(result); } - .into(), - ) + } + None }) } - PlanExpression::Datatype(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| datatype(&dataset, &e(tuple)?)) - } - PlanExpression::Bound(v) => { - let v = v.encoded; - Rc::new(move |tuple| Some(tuple.contains(v).into())) - } - PlanExpression::Iri(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - let base_iri = self.base_iri.clone(); + Expression::If(a, b, c) => { + let a = self.expression_evaluator(a, encoded_variables, stat_children); + let b = self.expression_evaluator(b, encoded_variables, stat_children); + let c = self.expression_evaluator(c, encoded_variables, stat_children); Rc::new(move |tuple| { - let e = e(tuple)?; - if e.is_named_node() { - Some(e) + if to_bool(&a(tuple)?)? { + b(tuple) } else { - let iri = to_simple_string(&dataset, &e)?; - Some(build_named_node( - &dataset, - &if let Some(base_iri) = &base_iri { - base_iri.resolve(&iri) - } else { - Iri::parse(iri) - } - .ok()? - .into_inner(), - )) + c(tuple) } }) } - PlanExpression::BNode(id) => match id { - Some(id) => { - let id = self.expression_evaluator(id, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - Some( - dataset.encode_term( - BlankNode::new(to_simple_string(&dataset, &id(tuple)?)?) - .ok()? - .as_ref(), - ), - ) - }) - } - None => Rc::new(|_| { - Some(EncodedTerm::NumericalBlankNode { - id: random::<u128>(), - }) - }), - }, - PlanExpression::Rand => Rc::new(|_| Some(random::<f64>().into())), - PlanExpression::Abs(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::IntegerLiteral(value) => Some(value.abs().into()), - EncodedTerm::DecimalLiteral(value) => Some(value.abs().into()), - EncodedTerm::FloatLiteral(value) => Some(value.abs().into()), - EncodedTerm::DoubleLiteral(value) => Some(value.abs().into()), - _ => None, - }) - } - PlanExpression::Ceil(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::IntegerLiteral(value) => Some(value.into()), - EncodedTerm::DecimalLiteral(value) => Some(value.ceil().into()), - EncodedTerm::FloatLiteral(value) => Some(value.ceil().into()), - EncodedTerm::DoubleLiteral(value) => Some(value.ceil().into()), - _ => None, - }) - } - PlanExpression::Floor(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::IntegerLiteral(value) => Some(value.into()), - EncodedTerm::DecimalLiteral(value) => Some(value.floor().into()), - EncodedTerm::FloatLiteral(value) => Some(value.floor().into()), - EncodedTerm::DoubleLiteral(value) => Some(value.floor().into()), - _ => None, - }) - } - PlanExpression::Round(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::IntegerLiteral(value) => Some(value.into()), - EncodedTerm::DecimalLiteral(value) => Some(value.round().into()), - EncodedTerm::FloatLiteral(value) => Some(value.round().into()), - EncodedTerm::DoubleLiteral(value) => Some(value.round().into()), - _ => None, - }) - } - PlanExpression::Concat(l) => { - let l: Vec<_> = l - .iter() - .map(|e| self.expression_evaluator(e, stat_children)) - .collect(); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let mut result = String::default(); - let mut language = None; - for e in &l { - let (value, e_language) = to_string_and_language(&dataset, &e(tuple)?)?; - if let Some(lang) = language { - if lang != e_language { - language = Some(None) + Expression::FunctionCall(function, parameters) => { + match function { + Function::Str => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + Some(build_string_literal_from_id(to_string_id( + &dataset, + &e(tuple)?, + )?)) + }) + } + Function::Lang => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::SmallSmallLangStringLiteral { language, .. } + | EncodedTerm::BigSmallLangStringLiteral { language, .. } => { + Some(build_string_literal_from_id(language.into())) } - } else { - language = Some(e_language) - } - result += &value + EncodedTerm::SmallBigLangStringLiteral { language_id, .. } + | EncodedTerm::BigBigLangStringLiteral { language_id, .. } => { + Some(build_string_literal_from_id(language_id.into())) + } + e if e.is_literal() => Some(build_string_literal(&dataset, "")), + _ => None, + }) } - Some(build_plain_literal( - &dataset, - &result, - language.and_then(|v| v), - )) - }) - } - PlanExpression::SubStr(source, starting_loc, length) => { - let source = self.expression_evaluator(source, stat_children); - let starting_loc = self.expression_evaluator(starting_loc, stat_children); - let length = length - .as_ref() - .map(|l| self.expression_evaluator(l, stat_children)); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (source, language) = to_string_and_language(&dataset, &source(tuple)?)?; - - let starting_location: usize = - if let EncodedTerm::IntegerLiteral(v) = starting_loc(tuple)? { - i64::from(v).try_into().ok()? - } else { - return None; - }; - let length: Option<usize> = if let Some(length) = &length { - if let EncodedTerm::IntegerLiteral(v) = length(tuple)? { - Some(i64::from(v).try_into().ok()?) - } else { - return None; - } - } else { - None - }; - - // We want to slice on char indices, not byte indices - let mut start_iter = source - .char_indices() - .skip(starting_location.checked_sub(1)?) - .peekable(); - let result = if let Some((start_position, _)) = start_iter.peek().copied() { - if let Some(length) = length { - let mut end_iter = start_iter.skip(length).peekable(); - if let Some((end_position, _)) = end_iter.peek() { - &source[start_position..*end_position] + Function::LangMatches => { + let language_tag = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let language_range = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let mut language_tag = + to_simple_string(&dataset, &language_tag(tuple)?)?; + language_tag.make_ascii_lowercase(); + let mut language_range = + to_simple_string(&dataset, &language_range(tuple)?)?; + language_range.make_ascii_lowercase(); + Some( + if &*language_range == "*" { + !language_tag.is_empty() + } else { + !ZipLongest::new( + language_range.split('-'), + language_tag.split('-'), + ) + .any(|parts| match parts { + (Some(range_subtag), Some(language_subtag)) => { + range_subtag != language_subtag + } + (Some(_), None) => true, + (None, _) => false, + }) + } + .into(), + ) + }) + } + Function::Datatype => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| datatype(&dataset, &e(tuple)?)) + } + Function::Iri => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + let base_iri = self.base_iri.clone(); + Rc::new(move |tuple| { + let e = e(tuple)?; + if e.is_named_node() { + Some(e) } else { - &source[start_position..] + let iri = to_simple_string(&dataset, &e)?; + Some(build_named_node( + &dataset, + &if let Some(base_iri) = &base_iri { + base_iri.resolve(&iri) + } else { + Iri::parse(iri) + } + .ok()? + .into_inner(), + )) } - } else { - &source[start_position..] + }) + } + Function::BNode => match parameters.first() { + Some(id) => { + let id = + self.expression_evaluator(id, encoded_variables, stat_children); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + Some( + dataset.encode_term( + BlankNode::new(to_simple_string(&dataset, &id(tuple)?)?) + .ok()? + .as_ref(), + ), + ) + }) } - } else { - "" - }; - Some(build_plain_literal(&dataset, result, language)) - }) - } - PlanExpression::StrLen(arg) => { - let arg = self.expression_evaluator(arg, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - Some( - i64::try_from(to_string(&dataset, &arg(tuple)?)?.chars().count()) - .ok()? - .into(), - ) - }) - } - PlanExpression::StaticReplace(arg, regex, replacement) => { - let arg = self.expression_evaluator(arg, stat_children); - let regex = regex.clone(); - let replacement = self.expression_evaluator(replacement, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (text, language) = to_string_and_language(&dataset, &arg(tuple)?)?; - let replacement = to_simple_string(&dataset, &replacement(tuple)?)?; - Some(build_plain_literal( - &dataset, - ®ex.replace_all(&text, replacement.as_str()), - language, - )) - }) - } - PlanExpression::DynamicReplace(arg, pattern, replacement, flags) => { - let arg = self.expression_evaluator(arg, stat_children); - let pattern = self.expression_evaluator(pattern, stat_children); - let replacement = self.expression_evaluator(replacement, stat_children); - let flags = flags - .as_ref() - .map(|flags| self.expression_evaluator(flags, stat_children)); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let pattern = to_simple_string(&dataset, &pattern(tuple)?)?; - let options = if let Some(flags) = &flags { - Some(to_simple_string(&dataset, &flags(tuple)?)?) - } else { - None - }; - let regex = compile_pattern(&pattern, options.as_deref())?; - let (text, language) = to_string_and_language(&dataset, &arg(tuple)?)?; - let replacement = to_simple_string(&dataset, &replacement(tuple)?)?; - Some(build_plain_literal( - &dataset, - ®ex.replace_all(&text, replacement.as_str()), - language, - )) - }) - } - PlanExpression::UCase(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (value, language) = to_string_and_language(&dataset, &e(tuple)?)?; - Some(build_plain_literal( - &dataset, - &value.to_uppercase(), - language, - )) - }) - } - PlanExpression::LCase(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (value, language) = to_string_and_language(&dataset, &e(tuple)?)?; - Some(build_plain_literal( - &dataset, - &value.to_lowercase(), - language, - )) - }) - } - PlanExpression::StrStarts(arg1, arg2) => { - let arg1 = self.expression_evaluator(arg1, stat_children); - let arg2 = self.expression_evaluator(arg2, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (arg1, arg2, _) = - to_argument_compatible_strings(&dataset, &arg1(tuple)?, &arg2(tuple)?)?; - Some(arg1.starts_with(arg2.as_str()).into()) - }) - } - PlanExpression::EncodeForUri(ltrl) => { - let ltrl = self.expression_evaluator(ltrl, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let ltlr = to_string(&dataset, <rl(tuple)?)?; - let mut result = Vec::with_capacity(ltlr.len()); - for c in ltlr.bytes() { - match c { - b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { - result.push(c) + None => Rc::new(|_| { + Some(EncodedTerm::NumericalBlankNode { + id: random::<u128>(), + }) + }), + }, + Function::Rand => Rc::new(|_| Some(random::<f64>().into())), + Function::Abs => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::IntegerLiteral(value) => Some(value.checked_abs()?.into()), + EncodedTerm::DecimalLiteral(value) => Some(value.checked_abs()?.into()), + EncodedTerm::FloatLiteral(value) => Some(value.abs().into()), + EncodedTerm::DoubleLiteral(value) => Some(value.abs().into()), + _ => None, + }) + } + Function::Ceil => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::IntegerLiteral(value) => Some(value.into()), + EncodedTerm::DecimalLiteral(value) => { + Some(value.checked_ceil()?.into()) } - _ => { - result.push(b'%'); - let high = c / 16; - let low = c % 16; - result.push(if high < 10 { - b'0' + high - } else { - b'A' + (high - 10) - }); - result.push(if low < 10 { - b'0' + low + EncodedTerm::FloatLiteral(value) => Some(value.ceil().into()), + EncodedTerm::DoubleLiteral(value) => Some(value.ceil().into()), + _ => None, + }) + } + Function::Floor => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::IntegerLiteral(value) => Some(value.into()), + EncodedTerm::DecimalLiteral(value) => { + Some(value.checked_floor()?.into()) + } + EncodedTerm::FloatLiteral(value) => Some(value.floor().into()), + EncodedTerm::DoubleLiteral(value) => Some(value.floor().into()), + _ => None, + }) + } + Function::Round => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::IntegerLiteral(value) => Some(value.into()), + EncodedTerm::DecimalLiteral(value) => { + Some(value.checked_round()?.into()) + } + EncodedTerm::FloatLiteral(value) => Some(value.round().into()), + EncodedTerm::DoubleLiteral(value) => Some(value.round().into()), + _ => None, + }) + } + Function::Concat => { + let l: Vec<_> = parameters + .iter() + .map(|e| self.expression_evaluator(e, encoded_variables, stat_children)) + .collect(); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let mut result = String::default(); + let mut language = None; + for e in &l { + let (value, e_language) = + to_string_and_language(&dataset, &e(tuple)?)?; + if let Some(lang) = language { + if lang != e_language { + language = Some(None) + } } else { - b'A' + (low - 10) - }); + language = Some(e_language) + } + result += &value } + Some(build_plain_literal( + &dataset, + &result, + language.and_then(|v| v), + )) + }) + } + Function::SubStr => { + let source = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let starting_loc = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let length = parameters.get(2).map(|l| { + self.expression_evaluator(l, encoded_variables, stat_children) + }); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (source, language) = + to_string_and_language(&dataset, &source(tuple)?)?; + + let starting_location: usize = + if let EncodedTerm::IntegerLiteral(v) = starting_loc(tuple)? { + i64::from(v).try_into().ok()? + } else { + return None; + }; + let length: Option<usize> = if let Some(length) = &length { + if let EncodedTerm::IntegerLiteral(v) = length(tuple)? { + Some(i64::from(v).try_into().ok()?) + } else { + return None; + } + } else { + None + }; + + // We want to slice on char indices, not byte indices + let mut start_iter = source + .char_indices() + .skip(starting_location.checked_sub(1)?) + .peekable(); + let result = + if let Some((start_position, _)) = start_iter.peek().copied() { + if let Some(length) = length { + let mut end_iter = start_iter.skip(length).peekable(); + if let Some((end_position, _)) = end_iter.peek() { + &source[start_position..*end_position] + } else { + &source[start_position..] + } + } else { + &source[start_position..] + } + } else { + "" + }; + Some(build_plain_literal(&dataset, result, language)) + }) + } + Function::StrLen => { + let arg = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + Some( + i64::try_from(to_string(&dataset, &arg(tuple)?)?.chars().count()) + .ok()? + .into(), + ) + }) + } + Function::Replace => { + let arg = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let replacement = self.expression_evaluator( + ¶meters[2], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + if let Some(regex) = + compile_static_pattern_if_exists(¶meters[1], parameters.get(3)) + { + Rc::new(move |tuple| { + let (text, language) = + to_string_and_language(&dataset, &arg(tuple)?)?; + let replacement = to_simple_string(&dataset, &replacement(tuple)?)?; + Some(build_plain_literal( + &dataset, + ®ex.replace_all(&text, replacement.as_str()), + language, + )) + }) + } else { + let pattern = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let flags = parameters.get(3).map(|flags| { + self.expression_evaluator(flags, encoded_variables, stat_children) + }); + Rc::new(move |tuple| { + let pattern = to_simple_string(&dataset, &pattern(tuple)?)?; + let options = if let Some(flags) = &flags { + Some(to_simple_string(&dataset, &flags(tuple)?)?) + } else { + None + }; + let regex = compile_pattern(&pattern, options.as_deref())?; + let (text, language) = + to_string_and_language(&dataset, &arg(tuple)?)?; + let replacement = to_simple_string(&dataset, &replacement(tuple)?)?; + Some(build_plain_literal( + &dataset, + ®ex.replace_all(&text, replacement.as_str()), + language, + )) + }) } } - Some(build_string_literal( - &dataset, - str::from_utf8(&result).ok()?, - )) - }) - } - PlanExpression::StrEnds(arg1, arg2) => { - let arg1 = self.expression_evaluator(arg1, stat_children); - let arg2 = self.expression_evaluator(arg2, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (arg1, arg2, _) = - to_argument_compatible_strings(&dataset, &arg1(tuple)?, &arg2(tuple)?)?; - Some(arg1.ends_with(arg2.as_str()).into()) - }) - } - PlanExpression::Contains(arg1, arg2) => { - let arg1 = self.expression_evaluator(arg1, stat_children); - let arg2 = self.expression_evaluator(arg2, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (arg1, arg2, _) = - to_argument_compatible_strings(&dataset, &arg1(tuple)?, &arg2(tuple)?)?; - Some(arg1.contains(arg2.as_str()).into()) - }) - } - PlanExpression::StrBefore(arg1, arg2) => { - let arg1 = self.expression_evaluator(arg1, stat_children); - let arg2 = self.expression_evaluator(arg2, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (arg1, arg2, language) = - to_argument_compatible_strings(&dataset, &arg1(tuple)?, &arg2(tuple)?)?; - Some(if let Some(position) = arg1.find(arg2.as_str()) { - build_plain_literal(&dataset, &arg1[..position], language) - } else { - build_string_literal(&dataset, "") - }) - }) - } - PlanExpression::StrAfter(arg1, arg2) => { - let arg1 = self.expression_evaluator(arg1, stat_children); - let arg2 = self.expression_evaluator(arg2, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let (arg1, arg2, language) = - to_argument_compatible_strings(&dataset, &arg1(tuple)?, &arg2(tuple)?)?; - Some(if let Some(position) = arg1.find(arg2.as_str()) { - build_plain_literal(&dataset, &arg1[position + arg2.len()..], language) - } else { - build_string_literal(&dataset, "") - }) - }) - } - PlanExpression::Year(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.year().into()), - EncodedTerm::DateLiteral(date) => Some(date.year().into()), - EncodedTerm::GYearMonthLiteral(year_month) => Some(year_month.year().into()), - EncodedTerm::GYearLiteral(year) => Some(year.year().into()), - _ => None, - }) - } - PlanExpression::Month(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.month().into()), - EncodedTerm::DateLiteral(date) => Some(date.month().into()), - EncodedTerm::GYearMonthLiteral(year_month) => Some(year_month.month().into()), - EncodedTerm::GMonthDayLiteral(month_day) => Some(month_day.month().into()), - EncodedTerm::GMonthLiteral(month) => Some(month.month().into()), - _ => None, - }) - } - PlanExpression::Day(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.day().into()), - EncodedTerm::DateLiteral(date) => Some(date.day().into()), - EncodedTerm::GMonthDayLiteral(month_day) => Some(month_day.day().into()), - EncodedTerm::GDayLiteral(day) => Some(day.day().into()), - _ => None, - }) - } - PlanExpression::Hours(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.hour().into()), - EncodedTerm::TimeLiteral(time) => Some(time.hour().into()), - _ => None, - }) - } - PlanExpression::Minutes(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.minute().into()), - EncodedTerm::TimeLiteral(time) => Some(time.minute().into()), - _ => None, - }) - } - PlanExpression::Seconds(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.second().into()), - EncodedTerm::TimeLiteral(time) => Some(time.second().into()), - _ => None, - }) - } - PlanExpression::Timezone(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| { - Some( - match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => date_time.timezone(), - EncodedTerm::TimeLiteral(time) => time.timezone(), - EncodedTerm::DateLiteral(date) => date.timezone(), - EncodedTerm::GYearMonthLiteral(year_month) => year_month.timezone(), - EncodedTerm::GYearLiteral(year) => year.timezone(), - EncodedTerm::GMonthDayLiteral(month_day) => month_day.timezone(), - EncodedTerm::GDayLiteral(day) => day.timezone(), - EncodedTerm::GMonthLiteral(month) => month.timezone(), + Function::UCase => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (value, language) = to_string_and_language(&dataset, &e(tuple)?)?; + Some(build_plain_literal( + &dataset, + &value.to_uppercase(), + language, + )) + }) + } + Function::LCase => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (value, language) = to_string_and_language(&dataset, &e(tuple)?)?; + Some(build_plain_literal( + &dataset, + &value.to_lowercase(), + language, + )) + }) + } + Function::StrStarts => { + let arg1 = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let arg2 = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (arg1, arg2, _) = to_argument_compatible_strings( + &dataset, + &arg1(tuple)?, + &arg2(tuple)?, + )?; + Some(arg1.starts_with(arg2.as_str()).into()) + }) + } + Function::EncodeForUri => { + let ltrl = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let ltlr = to_string(&dataset, <rl(tuple)?)?; + let mut result = Vec::with_capacity(ltlr.len()); + for c in ltlr.bytes() { + match c { + b'A'..=b'Z' + | b'a'..=b'z' + | b'0'..=b'9' + | b'-' + | b'_' + | b'.' + | b'~' => result.push(c), + _ => { + result.push(b'%'); + let high = c / 16; + let low = c % 16; + result.push(if high < 10 { + b'0' + high + } else { + b'A' + (high - 10) + }); + result.push(if low < 10 { + b'0' + low + } else { + b'A' + (low - 10) + }); + } + } + } + Some(build_string_literal( + &dataset, + str::from_utf8(&result).ok()?, + )) + }) + } + Function::StrEnds => { + let arg1 = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let arg2 = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (arg1, arg2, _) = to_argument_compatible_strings( + &dataset, + &arg1(tuple)?, + &arg2(tuple)?, + )?; + Some(arg1.ends_with(arg2.as_str()).into()) + }) + } + Function::Contains => { + let arg1 = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let arg2 = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (arg1, arg2, _) = to_argument_compatible_strings( + &dataset, + &arg1(tuple)?, + &arg2(tuple)?, + )?; + Some(arg1.contains(arg2.as_str()).into()) + }) + } + Function::StrBefore => { + let arg1 = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let arg2 = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (arg1, arg2, language) = to_argument_compatible_strings( + &dataset, + &arg1(tuple)?, + &arg2(tuple)?, + )?; + Some(if let Some(position) = arg1.find(arg2.as_str()) { + build_plain_literal(&dataset, &arg1[..position], language) + } else { + build_string_literal(&dataset, "") + }) + }) + } + Function::StrAfter => { + let arg1 = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let arg2 = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let (arg1, arg2, language) = to_argument_compatible_strings( + &dataset, + &arg1(tuple)?, + &arg2(tuple)?, + )?; + Some(if let Some(position) = arg1.find(arg2.as_str()) { + build_plain_literal( + &dataset, + &arg1[position + arg2.len()..], + language, + ) + } else { + build_string_literal(&dataset, "") + }) + }) + } + Function::Year => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + Some(date_time.year().into()) + } + EncodedTerm::DateLiteral(date) => Some(date.year().into()), + EncodedTerm::GYearMonthLiteral(year_month) => { + Some(year_month.year().into()) + } + EncodedTerm::GYearLiteral(year) => Some(year.year().into()), _ => None, - }? - .into(), - ) - }) - } - PlanExpression::Tz(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let timezone_offset = match e(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => date_time.timezone_offset(), - EncodedTerm::TimeLiteral(time) => time.timezone_offset(), - EncodedTerm::DateLiteral(date) => date.timezone_offset(), - EncodedTerm::GYearMonthLiteral(year_month) => year_month.timezone_offset(), - EncodedTerm::GYearLiteral(year) => year.timezone_offset(), - EncodedTerm::GMonthDayLiteral(month_day) => month_day.timezone_offset(), - EncodedTerm::GDayLiteral(day) => day.timezone_offset(), - EncodedTerm::GMonthLiteral(month) => month.timezone_offset(), - _ => return None, - }; - Some(match timezone_offset { - Some(timezone_offset) => { - build_string_literal(&dataset, &timezone_offset.to_string()) - } - None => build_string_literal(&dataset, ""), - }) - }) - } - - PlanExpression::Adjust(dt, tz) => { - let dt = self.expression_evaluator(dt, stat_children); - let tz = self.expression_evaluator(tz, stat_children); - Rc::new(move |tuple| { - let timezone_offset = Some( - match tz(tuple)? { - EncodedTerm::DayTimeDurationLiteral(tz) => TimezoneOffset::try_from(tz), - EncodedTerm::DurationLiteral(tz) => TimezoneOffset::try_from(tz), - _ => return None, - } - .ok()?, - ); - Some(match dt(tuple)? { - EncodedTerm::DateTimeLiteral(date_time) => { - date_time.adjust(timezone_offset)?.into() - } - EncodedTerm::TimeLiteral(time) => time.adjust(timezone_offset)?.into(), - EncodedTerm::DateLiteral(date) => date.adjust(timezone_offset)?.into(), - EncodedTerm::GYearMonthLiteral(year_month) => { - year_month.adjust(timezone_offset)?.into() - } - EncodedTerm::GYearLiteral(year) => year.adjust(timezone_offset)?.into(), - EncodedTerm::GMonthDayLiteral(month_day) => { - month_day.adjust(timezone_offset)?.into() - } - EncodedTerm::GDayLiteral(day) => day.adjust(timezone_offset)?.into(), - EncodedTerm::GMonthLiteral(month) => month.adjust(timezone_offset)?.into(), - _ => return None, - }) - }) - } - PlanExpression::Now => { - let now = self.now; - Rc::new(move |_| Some(now.into())) - } - PlanExpression::Uuid => { - let dataset = Rc::clone(&self.dataset); - Rc::new(move |_| { - let mut buffer = String::with_capacity(44); - buffer.push_str("urn:uuid:"); - generate_uuid(&mut buffer); - Some(build_named_node(&dataset, &buffer)) - }) - } - PlanExpression::StrUuid => { - let dataset = Rc::clone(&self.dataset); - Rc::new(move |_| { - let mut buffer = String::with_capacity(36); - generate_uuid(&mut buffer); - Some(build_string_literal(&dataset, &buffer)) - }) - } - PlanExpression::Md5(arg) => self.hash::<Md5>(arg, stat_children), - PlanExpression::Sha1(arg) => self.hash::<Sha1>(arg, stat_children), - PlanExpression::Sha256(arg) => self.hash::<Sha256>(arg, stat_children), - PlanExpression::Sha384(arg) => self.hash::<Sha384>(arg, stat_children), - PlanExpression::Sha512(arg) => self.hash::<Sha512>(arg, stat_children), - PlanExpression::Coalesce(l) => { - let l: Vec<_> = l - .iter() - .map(|e| self.expression_evaluator(e, stat_children)) - .collect(); - Rc::new(move |tuple| { - for e in &l { - if let Some(result) = e(tuple) { - return Some(result); - } + }) + } + Function::Month => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + Some(date_time.month().into()) + } + EncodedTerm::DateLiteral(date) => Some(date.month().into()), + EncodedTerm::GYearMonthLiteral(year_month) => { + Some(year_month.month().into()) + } + EncodedTerm::GMonthDayLiteral(month_day) => { + Some(month_day.month().into()) + } + EncodedTerm::GMonthLiteral(month) => Some(month.month().into()), + _ => None, + }) } - None - }) - } - PlanExpression::If(a, b, c) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); - let c = self.expression_evaluator(c, stat_children); - Rc::new(move |tuple| { - if to_bool(&a(tuple)?)? { - b(tuple) - } else { - c(tuple) + Function::Day => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => Some(date_time.day().into()), + EncodedTerm::DateLiteral(date) => Some(date.day().into()), + EncodedTerm::GMonthDayLiteral(month_day) => { + Some(month_day.day().into()) + } + EncodedTerm::GDayLiteral(day) => Some(day.day().into()), + _ => None, + }) } - }) - } - PlanExpression::StrLang(lexical_form, lang_tag) => { - let lexical_form = self.expression_evaluator(lexical_form, stat_children); - let lang_tag = self.expression_evaluator(lang_tag, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - Some(build_lang_string_literal_from_id( - to_simple_string_id(&lexical_form(tuple)?)?, - build_language_id(&dataset, &lang_tag(tuple)?)?, - )) - }) - } - PlanExpression::StrDt(lexical_form, datatype) => { - let lexical_form = self.expression_evaluator(lexical_form, stat_children); - let datatype = self.expression_evaluator(datatype, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let value = to_simple_string(&dataset, &lexical_form(tuple)?)?; - let datatype = if let EncodedTerm::NamedNode { iri_id, .. } = datatype(tuple)? { - dataset.get_str(&iri_id).ok()? - } else { - None - }?; - Some(dataset.encode_term(LiteralRef::new_typed_literal( - &value, - NamedNodeRef::new_unchecked(&datatype), - ))) - }) - } - PlanExpression::SameTerm(a, b) => { - let a = self.expression_evaluator(a, stat_children); - let b = self.expression_evaluator(b, stat_children); - Rc::new(move |tuple| Some((a(tuple)? == b(tuple)?).into())) - } - PlanExpression::IsIri(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| Some(e(tuple)?.is_named_node().into())) - } - PlanExpression::IsBlank(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| Some(e(tuple)?.is_blank_node().into())) - } - PlanExpression::IsLiteral(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| Some(e(tuple)?.is_literal().into())) - } - PlanExpression::IsNumeric(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| { - Some( - matches!( - e(tuple)?, - EncodedTerm::FloatLiteral(_) - | EncodedTerm::DoubleLiteral(_) - | EncodedTerm::IntegerLiteral(_) - | EncodedTerm::DecimalLiteral(_) - ) - .into(), - ) - }) - } - PlanExpression::StaticRegex(text, regex) => { - let text = self.expression_evaluator(text, stat_children); - let dataset = Rc::clone(&self.dataset); - let regex = regex.clone(); - Rc::new(move |tuple| { - let text = to_string(&dataset, &text(tuple)?)?; - Some(regex.is_match(&text).into()) - }) - } - PlanExpression::DynamicRegex(text, pattern, flags) => { - let text = self.expression_evaluator(text, stat_children); - let pattern = self.expression_evaluator(pattern, stat_children); - let flags = flags - .as_ref() - .map(|flags| self.expression_evaluator(flags, stat_children)); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let pattern = to_simple_string(&dataset, &pattern(tuple)?)?; - let options = if let Some(flags) = &flags { - Some(to_simple_string(&dataset, &flags(tuple)?)?) - } else { - None - }; - let regex = compile_pattern(&pattern, options.as_deref())?; - let text = to_string(&dataset, &text(tuple)?)?; - Some(regex.is_match(&text).into()) - }) - } - PlanExpression::Triple(s, p, o) => { - let s = self.expression_evaluator(s, stat_children); - let p = self.expression_evaluator(p, stat_children); - let o = self.expression_evaluator(o, stat_children); - Rc::new(move |tuple| { - let s = s(tuple)?; - let p = p(tuple)?; - let o = o(tuple)?; - (!s.is_literal() - && !s.is_default_graph() - && p.is_named_node() - && !o.is_default_graph()) - .then(|| EncodedTriple::new(s, p, o).into()) - }) - } - PlanExpression::Subject(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| { - if let EncodedTerm::Triple(t) = e(tuple)? { - Some(t.subject.clone()) - } else { - None + Function::Hours => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + Some(date_time.hour().into()) + } + EncodedTerm::TimeLiteral(time) => Some(time.hour().into()), + _ => None, + }) } - }) - } - PlanExpression::Predicate(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| { - if let EncodedTerm::Triple(t) = e(tuple)? { - Some(t.predicate.clone()) - } else { - None + Function::Minutes => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + Some(date_time.minute().into()) + } + EncodedTerm::TimeLiteral(time) => Some(time.minute().into()), + _ => None, + }) } - }) - } - PlanExpression::Object(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| { - if let EncodedTerm::Triple(t) = e(tuple)? { - Some(t.object.clone()) - } else { - None + Function::Seconds => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + Some(date_time.second().into()) + } + EncodedTerm::TimeLiteral(time) => Some(time.second().into()), + _ => None, + }) } - }) - } - PlanExpression::IsTriple(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| Some(e(tuple)?.is_triple().into())) - } - PlanExpression::BooleanCast(e) => { - let e = self.expression_evaluator(e, stat_children); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::BooleanLiteral(value) => Some(value.into()), - EncodedTerm::FloatLiteral(value) => Some(Boolean::from(value).into()), - EncodedTerm::DoubleLiteral(value) => Some(Boolean::from(value).into()), - EncodedTerm::IntegerLiteral(value) => Some(Boolean::from(value).into()), - EncodedTerm::DecimalLiteral(value) => Some(Boolean::from(value).into()), - EncodedTerm::SmallStringLiteral(value) => parse_boolean_str(&value), - _ => None, - }) - } - PlanExpression::DoubleCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::FloatLiteral(value) => Some(Double::from(value).into()), - EncodedTerm::DoubleLiteral(value) => Some(value.into()), - EncodedTerm::IntegerLiteral(value) => Some(Double::from(value).into()), - EncodedTerm::DecimalLiteral(value) => Some(Double::from(value).into()), - EncodedTerm::BooleanLiteral(value) => Some(Double::from(value).into()), - EncodedTerm::SmallStringLiteral(value) => parse_double_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_double_str(&dataset.get_str(&value_id).ok()??) + Function::Timezone => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + Some( + match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => date_time.timezone(), + EncodedTerm::TimeLiteral(time) => time.timezone(), + EncodedTerm::DateLiteral(date) => date.timezone(), + EncodedTerm::GYearMonthLiteral(year_month) => { + year_month.timezone() + } + EncodedTerm::GYearLiteral(year) => year.timezone(), + EncodedTerm::GMonthDayLiteral(month_day) => { + month_day.timezone() + } + EncodedTerm::GDayLiteral(day) => day.timezone(), + EncodedTerm::GMonthLiteral(month) => month.timezone(), + _ => None, + }? + .into(), + ) + }) } - _ => None, - }) - } - PlanExpression::FloatCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::FloatLiteral(value) => Some(value.into()), - EncodedTerm::DoubleLiteral(value) => Some(Float::from(value).into()), - EncodedTerm::IntegerLiteral(value) => Some(Float::from(value).into()), - EncodedTerm::DecimalLiteral(value) => Some(Float::from(value).into()), - EncodedTerm::BooleanLiteral(value) => Some(Float::from(value).into()), - EncodedTerm::SmallStringLiteral(value) => parse_float_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_float_str(&dataset.get_str(&value_id).ok()??) + Function::Tz => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let timezone_offset = match e(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + date_time.timezone_offset() + } + EncodedTerm::TimeLiteral(time) => time.timezone_offset(), + EncodedTerm::DateLiteral(date) => date.timezone_offset(), + EncodedTerm::GYearMonthLiteral(year_month) => { + year_month.timezone_offset() + } + EncodedTerm::GYearLiteral(year) => year.timezone_offset(), + EncodedTerm::GMonthDayLiteral(month_day) => { + month_day.timezone_offset() + } + EncodedTerm::GDayLiteral(day) => day.timezone_offset(), + EncodedTerm::GMonthLiteral(month) => month.timezone_offset(), + _ => return None, + }; + Some(match timezone_offset { + Some(timezone_offset) => { + build_string_literal(&dataset, &timezone_offset.to_string()) + } + None => build_string_literal(&dataset, ""), + }) + }) } - _ => None, - }) - } - PlanExpression::IntegerCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::FloatLiteral(value) => Some(Integer::try_from(value).ok()?.into()), - EncodedTerm::DoubleLiteral(value) => { - Some(Integer::try_from(value).ok()?.into()) + Function::Adjust => { + let dt = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let tz = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + let timezone_offset = Some( + match tz(tuple)? { + EncodedTerm::DayTimeDurationLiteral(tz) => { + TimezoneOffset::try_from(tz) + } + EncodedTerm::DurationLiteral(tz) => { + TimezoneOffset::try_from(tz) + } + _ => return None, + } + .ok()?, + ); + Some(match dt(tuple)? { + EncodedTerm::DateTimeLiteral(date_time) => { + date_time.adjust(timezone_offset)?.into() + } + EncodedTerm::TimeLiteral(time) => { + time.adjust(timezone_offset)?.into() + } + EncodedTerm::DateLiteral(date) => { + date.adjust(timezone_offset)?.into() + } + EncodedTerm::GYearMonthLiteral(year_month) => { + year_month.adjust(timezone_offset)?.into() + } + EncodedTerm::GYearLiteral(year) => { + year.adjust(timezone_offset)?.into() + } + EncodedTerm::GMonthDayLiteral(month_day) => { + month_day.adjust(timezone_offset)?.into() + } + EncodedTerm::GDayLiteral(day) => { + day.adjust(timezone_offset)?.into() + } + EncodedTerm::GMonthLiteral(month) => { + month.adjust(timezone_offset)?.into() + } + _ => return None, + }) + }) } - EncodedTerm::IntegerLiteral(value) => Some(value.into()), - EncodedTerm::DecimalLiteral(value) => { - Some(Integer::try_from(value).ok()?.into()) + Function::Now => { + let now = self.now; + Rc::new(move |_| Some(now.into())) } - EncodedTerm::BooleanLiteral(value) => Some(Integer::from(value).into()), - EncodedTerm::SmallStringLiteral(value) => parse_integer_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_integer_str(&dataset.get_str(&value_id).ok()??) + Function::Uuid => { + let dataset = Rc::clone(&self.dataset); + Rc::new(move |_| { + let mut buffer = String::with_capacity(44); + buffer.push_str("urn:uuid:"); + generate_uuid(&mut buffer); + Some(build_named_node(&dataset, &buffer)) + }) } - _ => None, - }) - } - PlanExpression::DecimalCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::FloatLiteral(value) => Some(Decimal::try_from(value).ok()?.into()), - EncodedTerm::DoubleLiteral(value) => { - Some(Decimal::try_from(value).ok()?.into()) + Function::StrUuid => { + let dataset = Rc::clone(&self.dataset); + Rc::new(move |_| { + let mut buffer = String::with_capacity(36); + generate_uuid(&mut buffer); + Some(build_string_literal(&dataset, &buffer)) + }) } - EncodedTerm::IntegerLiteral(value) => { - Some(Decimal::try_from(value).ok()?.into()) + Function::Md5 => self.hash::<Md5>(parameters, encoded_variables, stat_children), + Function::Sha1 => { + self.hash::<Sha1>(parameters, encoded_variables, stat_children) } - EncodedTerm::DecimalLiteral(value) => Some(value.into()), - EncodedTerm::BooleanLiteral(value) => Some(Decimal::from(value).into()), - EncodedTerm::SmallStringLiteral(value) => parse_decimal_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_decimal_str(&dataset.get_str(&value_id).ok()??) + Function::Sha256 => { + self.hash::<Sha256>(parameters, encoded_variables, stat_children) } - _ => None, - }) - } - PlanExpression::DateCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateLiteral(value) => Some(value.into()), - EncodedTerm::DateTimeLiteral(value) => Some(Date::try_from(value).ok()?.into()), - EncodedTerm::SmallStringLiteral(value) => parse_date_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_date_str(&dataset.get_str(&value_id).ok()??) + Function::Sha384 => { + self.hash::<Sha384>(parameters, encoded_variables, stat_children) } - _ => None, - }) - } - PlanExpression::TimeCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::TimeLiteral(value) => Some(value.into()), - EncodedTerm::DateTimeLiteral(value) => Some(Time::try_from(value).ok()?.into()), - EncodedTerm::SmallStringLiteral(value) => parse_time_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_time_str(&dataset.get_str(&value_id).ok()??) + Function::Sha512 => { + self.hash::<Sha512>(parameters, encoded_variables, stat_children) } - _ => None, - }) - } - PlanExpression::DateTimeCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DateTimeLiteral(value) => Some(value.into()), - EncodedTerm::DateLiteral(value) => Some(DateTime::try_from(value).ok()?.into()), - EncodedTerm::SmallStringLiteral(value) => parse_date_time_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_date_time_str(&dataset.get_str(&value_id).ok()??) + Function::StrLang => { + let lexical_form = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let lang_tag = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + Some(build_lang_string_literal_from_id( + to_simple_string_id(&lexical_form(tuple)?)?, + build_language_id(&dataset, &lang_tag(tuple)?)?, + )) + }) } - _ => None, - }) - } - PlanExpression::DurationCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DurationLiteral(value) => Some(value.into()), - EncodedTerm::YearMonthDurationLiteral(value) => { - Some(Duration::from(value).into()) + Function::StrDt => { + let lexical_form = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let datatype = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + let value = to_simple_string(&dataset, &lexical_form(tuple)?)?; + let datatype = + if let EncodedTerm::NamedNode { iri_id, value: _ } = datatype(tuple)? { + dataset.get_str(&iri_id).ok()? + } else { + None + }?; + Some(dataset.encode_term(LiteralRef::new_typed_literal( + &value, + NamedNodeRef::new_unchecked(&datatype), + ))) + }) } - EncodedTerm::DayTimeDurationLiteral(value) => { - Some(Duration::from(value).into()) + Function::IsIri => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| Some(e(tuple)?.is_named_node().into())) } - EncodedTerm::SmallStringLiteral(value) => parse_duration_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_duration_str(&dataset.get_str(&value_id).ok()??) + Function::IsBlank => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| Some(e(tuple)?.is_blank_node().into())) } - _ => None, - }) - } - PlanExpression::YearMonthDurationCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DurationLiteral(value) => { - Some(YearMonthDuration::try_from(value).ok()?.into()) + Function::IsLiteral => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| Some(e(tuple)?.is_literal().into())) } - EncodedTerm::YearMonthDurationLiteral(value) => Some(value.into()), - EncodedTerm::SmallStringLiteral(value) => parse_year_month_duration_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_year_month_duration_str(&dataset.get_str(&value_id).ok()??) + Function::IsNumeric => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + Some( + matches!( + e(tuple)?, + EncodedTerm::FloatLiteral(_) + | EncodedTerm::DoubleLiteral(_) + | EncodedTerm::IntegerLiteral(_) + | EncodedTerm::DecimalLiteral(_) + ) + .into(), + ) + }) } - _ => None, - }) - } - PlanExpression::DayTimeDurationCast(e) => { - let e = self.expression_evaluator(e, stat_children); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| match e(tuple)? { - EncodedTerm::DurationLiteral(value) => { - Some(DayTimeDuration::try_from(value).ok()?.into()) + Function::Regex => { + let text = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + if let Some(regex) = + compile_static_pattern_if_exists(¶meters[1], parameters.get(2)) + { + Rc::new(move |tuple| { + let text = to_string(&dataset, &text(tuple)?)?; + Some(regex.is_match(&text).into()) + }) + } else { + let pattern = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let flags = parameters.get(2).map(|flags| { + self.expression_evaluator(flags, encoded_variables, stat_children) + }); + Rc::new(move |tuple| { + let pattern = to_simple_string(&dataset, &pattern(tuple)?)?; + let options = if let Some(flags) = &flags { + Some(to_simple_string(&dataset, &flags(tuple)?)?) + } else { + None + }; + let regex = compile_pattern(&pattern, options.as_deref())?; + let text = to_string(&dataset, &text(tuple)?)?; + Some(regex.is_match(&text).into()) + }) + } } - EncodedTerm::DayTimeDurationLiteral(value) => Some(value.into()), - EncodedTerm::SmallStringLiteral(value) => parse_day_time_duration_str(&value), - EncodedTerm::BigStringLiteral { value_id } => { - parse_day_time_duration_str(&dataset.get_str(&value_id).ok()??) + Function::Triple => { + let s = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let p = self.expression_evaluator( + ¶meters[1], + encoded_variables, + stat_children, + ); + let o = self.expression_evaluator( + ¶meters[2], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + let s = s(tuple)?; + let p = p(tuple)?; + let o = o(tuple)?; + (!s.is_literal() + && !s.is_default_graph() + && p.is_named_node() + && !o.is_default_graph()) + .then(|| EncodedTriple::new(s, p, o).into()) + }) + } + Function::Subject => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + if let EncodedTerm::Triple(t) = e(tuple)? { + Some(t.subject.clone()) + } else { + None + } + }) + } + Function::Predicate => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + if let EncodedTerm::Triple(t) = e(tuple)? { + Some(t.predicate.clone()) + } else { + None + } + }) + } + Function::Object => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| { + if let EncodedTerm::Triple(t) = e(tuple)? { + Some(t.object.clone()) + } else { + None + } + }) + } + Function::IsTriple => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| Some(e(tuple)?.is_triple().into())) + } + Function::Custom(function_name) => { + if let Some(function) = self.custom_functions.get(function_name).cloned() { + let args = parameters + .iter() + .map(|e| { + self.expression_evaluator(e, encoded_variables, stat_children) + }) + .collect::<Vec<_>>(); + let dataset = Rc::clone(&self.dataset); + return Rc::new(move |tuple| { + let args = args + .iter() + .map(|f| dataset.decode_term(&f(tuple)?).ok()) + .collect::<Option<Vec<_>>>()?; + Some(dataset.encode_term(&function(&args)?)) + }); + } + match function_name.as_ref() { + xsd::STRING => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| { + Some(build_string_literal_from_id(to_string_id( + &dataset, + &e(tuple)?, + )?)) + }) + } + xsd::BOOLEAN => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::BooleanLiteral(value) => Some(value.into()), + EncodedTerm::FloatLiteral(value) => { + Some(Boolean::from(value).into()) + } + EncodedTerm::DoubleLiteral(value) => { + Some(Boolean::from(value).into()) + } + EncodedTerm::IntegerLiteral(value) => { + Some(Boolean::from(value).into()) + } + EncodedTerm::DecimalLiteral(value) => { + Some(Boolean::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_boolean_str(&value) + } + _ => None, + }) + } + xsd::DOUBLE => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::FloatLiteral(value) => { + Some(Double::from(value).into()) + } + EncodedTerm::DoubleLiteral(value) => Some(value.into()), + EncodedTerm::IntegerLiteral(value) => { + Some(Double::from(value).into()) + } + EncodedTerm::DecimalLiteral(value) => { + Some(Double::from(value).into()) + } + EncodedTerm::BooleanLiteral(value) => { + Some(Double::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_double_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_double_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::FLOAT => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::FloatLiteral(value) => Some(value.into()), + EncodedTerm::DoubleLiteral(value) => { + Some(Float::from(value).into()) + } + EncodedTerm::IntegerLiteral(value) => { + Some(Float::from(value).into()) + } + EncodedTerm::DecimalLiteral(value) => { + Some(Float::from(value).into()) + } + EncodedTerm::BooleanLiteral(value) => { + Some(Float::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_float_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_float_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::INTEGER => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::FloatLiteral(value) => { + Some(Integer::try_from(value).ok()?.into()) + } + EncodedTerm::DoubleLiteral(value) => { + Some(Integer::try_from(value).ok()?.into()) + } + EncodedTerm::IntegerLiteral(value) => Some(value.into()), + EncodedTerm::DecimalLiteral(value) => { + Some(Integer::try_from(value).ok()?.into()) + } + EncodedTerm::BooleanLiteral(value) => { + Some(Integer::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_integer_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_integer_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::DECIMAL => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::FloatLiteral(value) => { + Some(Decimal::try_from(value).ok()?.into()) + } + EncodedTerm::DoubleLiteral(value) => { + Some(Decimal::try_from(value).ok()?.into()) + } + EncodedTerm::IntegerLiteral(value) => { + Some(Decimal::from(value).into()) + } + EncodedTerm::DecimalLiteral(value) => Some(value.into()), + EncodedTerm::BooleanLiteral(value) => { + Some(Decimal::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_decimal_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_decimal_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::DATE => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateLiteral(value) => Some(value.into()), + EncodedTerm::DateTimeLiteral(value) => { + Some(Date::try_from(value).ok()?.into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_date_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_date_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::TIME => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::TimeLiteral(value) => Some(value.into()), + EncodedTerm::DateTimeLiteral(value) => { + Some(Time::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_time_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_time_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::DATE_TIME => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DateTimeLiteral(value) => Some(value.into()), + EncodedTerm::DateLiteral(value) => { + Some(DateTime::try_from(value).ok()?.into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_date_time_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_date_time_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::DURATION => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DurationLiteral(value) => Some(value.into()), + EncodedTerm::YearMonthDurationLiteral(value) => { + Some(Duration::from(value).into()) + } + EncodedTerm::DayTimeDurationLiteral(value) => { + Some(Duration::from(value).into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_duration_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_duration_str(&dataset.get_str(&value_id).ok()??) + } + _ => None, + }) + } + xsd::YEAR_MONTH_DURATION => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DurationLiteral(value) => { + Some(YearMonthDuration::try_from(value).ok()?.into()) + } + EncodedTerm::YearMonthDurationLiteral(value) => { + Some(value.into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_year_month_duration_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_year_month_duration_str( + &dataset.get_str(&value_id).ok()??, + ) + } + _ => None, + }) + } + xsd::DAY_TIME_DURATION => { + let e = self.expression_evaluator( + ¶meters[0], + encoded_variables, + stat_children, + ); + let dataset = Rc::clone(&self.dataset); + Rc::new(move |tuple| match e(tuple)? { + EncodedTerm::DurationLiteral(value) => { + Some(DayTimeDuration::try_from(value).ok()?.into()) + } + EncodedTerm::DayTimeDurationLiteral(value) => { + Some(value.into()) + } + EncodedTerm::SmallStringLiteral(value) => { + parse_day_time_duration_str(&value) + } + EncodedTerm::BigStringLiteral { value_id } => { + parse_day_time_duration_str( + &dataset.get_str(&value_id).ok()??, + ) + } + _ => None, + }) + } + _ => Rc::new(|_| None), + } } - _ => None, - }) - } - PlanExpression::CustomFunction(function_name, args) => { - if let Some(function) = self.custom_functions.get(function_name).cloned() { - let args = args - .iter() - .map(|e| self.expression_evaluator(e, stat_children)) - .collect::<Vec<_>>(); - let dataset = Rc::clone(&self.dataset); - Rc::new(move |tuple| { - let args = args - .iter() - .map(|f| dataset.decode_term(&f(tuple)?).ok()) - .collect::<Option<Vec<_>>>()?; - Some(dataset.encode_term(&function(&args)?)) - }) - } else { - Rc::new(|_| None) } } } @@ -2104,10 +2748,11 @@ impl SimpleEvaluator { fn hash<H: Digest>( &self, - arg: &PlanExpression, - stat_children: &mut Vec<Rc<PlanNodeWithStats>>, + parameters: &[Expression], + encoded_variables: &mut Vec<Variable>, + stat_children: &mut Vec<Rc<EvalNodeWithStats>>, ) -> Rc<dyn Fn(&EncodedTuple) -> Option<EncodedTerm>> { - let arg = self.expression_evaluator(arg, stat_children); + let arg = self.expression_evaluator(¶meters[0], encoded_variables, stat_children); let dataset = Rc::clone(&self.dataset); Rc::new(move |tuple| { let input = to_simple_string(&dataset, &arg(tuple)?)?; @@ -2115,6 +2760,114 @@ impl SimpleEvaluator { Some(build_string_literal(&dataset, &hash)) }) } + + fn encode_term<'b>(&self, term: impl Into<TermRef<'b>>) -> EncodedTerm { + self.dataset.encode_term(term) + } + + fn encode_triple(&self, triple: &GroundTriple) -> EncodedTerm { + EncodedTriple::new( + match &triple.subject { + GroundSubject::NamedNode(node) => self.encode_term(node), + GroundSubject::Triple(triple) => self.encode_triple(triple), + }, + self.encode_term(&triple.predicate), + match &triple.object { + GroundTerm::NamedNode(node) => self.encode_term(node), + GroundTerm::Literal(literal) => self.encode_term(literal), + GroundTerm::Triple(triple) => self.encode_triple(triple), + }, + ) + .into() + } + + fn encode_property_path(&self, path: &PropertyPathExpression) -> Rc<PropertyPath> { + Rc::new(match path { + PropertyPathExpression::NamedNode(node) => PropertyPath::Path(self.encode_term(node)), + PropertyPathExpression::Reverse(p) => { + PropertyPath::Reverse(self.encode_property_path(p)) + } + PropertyPathExpression::Sequence(a, b) => { + PropertyPath::Sequence(self.encode_property_path(a), self.encode_property_path(b)) + } + PropertyPathExpression::Alternative(a, b) => PropertyPath::Alternative( + self.encode_property_path(a), + self.encode_property_path(b), + ), + PropertyPathExpression::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(self.encode_property_path(p)) + } + PropertyPathExpression::OneOrMore(p) => { + PropertyPath::OneOrMore(self.encode_property_path(p)) + } + PropertyPathExpression::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(self.encode_property_path(p)) + } + PropertyPathExpression::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps.iter().map(|p| self.encode_term(p)).collect()) + } + }) + } + + fn template_value_from_term_or_variable( + &self, + term_or_variable: &TermPattern, + variables: &mut Vec<Variable>, + bnodes: &mut Vec<BlankNode>, + ) -> TripleTemplateValue { + match term_or_variable { + TermPattern::Variable(variable) => { + TripleTemplateValue::Variable(encode_variable(variables, variable)) + } + TermPattern::NamedNode(node) => TripleTemplateValue::Constant(self.encode_term(node)), + TermPattern::BlankNode(bnode) => { + TripleTemplateValue::BlankNode(bnode_key(bnodes, bnode)) + } + TermPattern::Literal(literal) => { + TripleTemplateValue::Constant(self.encode_term(literal)) + } + TermPattern::Triple(triple) => match ( + self.template_value_from_term_or_variable(&triple.subject, variables, bnodes), + self.template_value_from_named_node_or_variable(&triple.predicate, variables), + self.template_value_from_term_or_variable(&triple.object, variables, bnodes), + ) { + ( + TripleTemplateValue::Constant(subject), + TripleTemplateValue::Constant(predicate), + TripleTemplateValue::Constant(object), + ) => TripleTemplateValue::Constant( + EncodedTriple { + subject, + predicate, + object, + } + .into(), + ), + (subject, predicate, object) => { + TripleTemplateValue::Triple(Box::new(TripleTemplate { + subject, + predicate, + object, + })) + } + }, + } + } + + fn template_value_from_named_node_or_variable( + &self, + named_node_or_variable: &NamedNodePattern, + variables: &mut Vec<Variable>, + ) -> TripleTemplateValue { + match named_node_or_variable { + NamedNodePattern::Variable(variable) => { + TripleTemplateValue::Variable(encode_variable(variables, variable)) + } + NamedNodePattern::NamedNode(term) => { + TripleTemplateValue::Constant(self.encode_term(term)) + } + } + } } fn to_bool(term: &EncodedTerm) -> Option<bool> { @@ -2327,7 +3080,32 @@ fn to_argument_compatible_strings( ) -> Option<(String, String, Option<SmallStringOrId>)> { let (value1, language1) = to_string_and_language(dataset, arg1)?; let (value2, language2) = to_string_and_language(dataset, arg2)?; - (language2.is_none() || language1 == language2).then(|| (value1, value2, language1)) + (language2.is_none() || language1 == language2).then_some((value1, value2, language1)) +} + +fn compile_static_pattern_if_exists( + pattern: &Expression, + options: Option<&Expression>, +) -> Option<Regex> { + let static_pattern = if let Expression::Literal(pattern) = pattern { + (pattern.datatype() == xsd::STRING).then(|| pattern.value()) + } else { + None + }; + let static_options = if let Some(options) = options { + if let Expression::Literal(options) = options { + (options.datatype() == xsd::STRING).then(|| Some(options.value())) + } else { + None + } + } else { + Some(None) + }; + if let (Some(static_pattern), Some(static_options)) = (static_pattern, static_options) { + compile_pattern(static_pattern, static_options) + } else { + None + } } pub(super) fn compile_pattern(pattern: &str, flags: Option<&str>) -> Option<Regex> { @@ -2348,18 +3126,17 @@ pub(super) fn compile_pattern(pattern: &str, flags: Option<&str>) -> Option<Rege 'x' => { regex_builder.ignore_whitespace(true); } - _ => (), //TODO: implement q + _ => (), // TODO: implement q } } } regex_builder.build().ok() } -#[allow(clippy::rc_buffer)] fn decode_bindings( dataset: Rc<DatasetView>, iter: EncodedTuplesIterator, - variables: Rc<Vec<Variable>>, + variables: Arc<[Variable]>, ) -> QuerySolutionIter { let tuple_size = variables.len(); QuerySolutionIter::new( @@ -2451,16 +3228,16 @@ fn equals(a: &EncodedTerm, b: &EncodedTerm) -> Option<bool> { EncodedTerm::FloatLiteral(a) => match b { EncodedTerm::FloatLiteral(b) => Some(a == b), EncodedTerm::DoubleLiteral(b) => Some(Double::from(*a) == *b), - EncodedTerm::IntegerLiteral(b) => Some(*a == Float::from(*b)), - EncodedTerm::DecimalLiteral(b) => Some(*a == (*b).try_into().ok()?), + EncodedTerm::IntegerLiteral(b) => Some(*a == (*b).into()), + EncodedTerm::DecimalLiteral(b) => Some(*a == (*b).into()), _ if b.is_unknown_typed_literal() => None, _ => Some(false), }, EncodedTerm::DoubleLiteral(a) => match b { - EncodedTerm::FloatLiteral(b) => Some(*a == Double::from(*b)), + EncodedTerm::FloatLiteral(b) => Some(*a == (*b).into()), EncodedTerm::DoubleLiteral(b) => Some(a == b), - EncodedTerm::IntegerLiteral(b) => Some(*a == Double::from(*b)), - EncodedTerm::DecimalLiteral(b) => Some(*a == (*b).try_into().ok()?), + EncodedTerm::IntegerLiteral(b) => Some(*a == (*b).into()), + EncodedTerm::DecimalLiteral(b) => Some(*a == (*b).into()), _ if b.is_unknown_typed_literal() => None, _ => Some(false), }, @@ -2473,9 +3250,9 @@ fn equals(a: &EncodedTerm, b: &EncodedTerm) -> Option<bool> { _ => Some(false), }, EncodedTerm::DecimalLiteral(a) => match b { - EncodedTerm::FloatLiteral(b) => Some(Float::try_from(*a).ok()? == *b), - EncodedTerm::DoubleLiteral(b) => Some(Double::try_from(*a).ok()? == *b), - EncodedTerm::IntegerLiteral(b) => Some(*a == Decimal::from(*b)), + EncodedTerm::FloatLiteral(b) => Some(Float::from(*a) == *b), + EncodedTerm::DoubleLiteral(b) => Some(Double::from(*a) == *b), + EncodedTerm::IntegerLiteral(b) => Some(*a == (*b).into()), EncodedTerm::DecimalLiteral(b) => Some(a == b), _ if b.is_unknown_typed_literal() => None, _ => Some(false), @@ -2617,10 +3394,10 @@ fn cmp_terms(dataset: &DatasetView, a: Option<&EncodedTerm>, b: Option<&EncodedT } _ => Ordering::Greater, }, - a => match b { + _ => match b { _ if b.is_named_node() || b.is_blank_node() => Ordering::Greater, _ if b.is_triple() => Ordering::Less, - b => { + _ => { if let Some(ord) = partial_cmp_literals(dataset, a, b) { ord } else if let (Ok(Term::Literal(a)), Ok(Term::Literal(b))) = @@ -2739,14 +3516,14 @@ fn partial_cmp_literals( EncodedTerm::FloatLiteral(b) => a.partial_cmp(b), EncodedTerm::DoubleLiteral(b) => Double::from(*a).partial_cmp(b), EncodedTerm::IntegerLiteral(b) => a.partial_cmp(&Float::from(*b)), - EncodedTerm::DecimalLiteral(b) => a.partial_cmp(&(*b).try_into().ok()?), + EncodedTerm::DecimalLiteral(b) => a.partial_cmp(&(*b).into()), _ => None, }, EncodedTerm::DoubleLiteral(a) => match b { EncodedTerm::FloatLiteral(b) => a.partial_cmp(&(*b).into()), EncodedTerm::DoubleLiteral(b) => a.partial_cmp(b), EncodedTerm::IntegerLiteral(b) => a.partial_cmp(&Double::from(*b)), - EncodedTerm::DecimalLiteral(b) => a.partial_cmp(&(*b).try_into().ok()?), + EncodedTerm::DecimalLiteral(b) => a.partial_cmp(&(*b).into()), _ => None, }, EncodedTerm::IntegerLiteral(a) => match b { @@ -2757,8 +3534,8 @@ fn partial_cmp_literals( _ => None, }, EncodedTerm::DecimalLiteral(a) => match b { - EncodedTerm::FloatLiteral(b) => Float::try_from(*a).ok()?.partial_cmp(b), - EncodedTerm::DoubleLiteral(b) => Double::try_from(*a).ok()?.partial_cmp(b), + EncodedTerm::FloatLiteral(b) => Float::from(*a).partial_cmp(b), + EncodedTerm::DoubleLiteral(b) => Double::from(*a).partial_cmp(b), EncodedTerm::IntegerLiteral(b) => a.partial_cmp(&Decimal::from(*b)), EncodedTerm::DecimalLiteral(b) => a.partial_cmp(b), _ => None, @@ -2854,7 +3631,7 @@ fn compare_str_str_id(dataset: &DatasetView, a: &str, b: &StrHash) -> Option<Ord } fn datatype(dataset: &DatasetView, value: &EncodedTerm) -> Option<EncodedTerm> { - //TODO: optimize? + // TODO: optimize? match value { EncodedTerm::NamedNode { .. } | EncodedTerm::SmallBlankNode { .. } @@ -3046,32 +3823,86 @@ enum TupleSelector { TriplePattern(Rc<TripleTupleSelector>), } -impl From<&PatternValue> for TupleSelector { - fn from(value: &PatternValue) -> Self { - match value { - PatternValue::Constant(c) => Self::Constant(c.encoded.clone()), - PatternValue::Variable(v) => Self::Variable(v.encoded), - PatternValue::TriplePattern(p) => Self::TriplePattern(Rc::new(TripleTupleSelector { - subject: (&p.subject).into(), - predicate: (&p.predicate).into(), - object: (&p.object).into(), - })), +impl TupleSelector { + fn from_ground_term_pattern( + term_pattern: &GroundTermPattern, + variables: &mut Vec<Variable>, + dataset: &DatasetView, + ) -> Self { + match term_pattern { + GroundTermPattern::Variable(variable) => { + Self::Variable(encode_variable(variables, variable)) + } + GroundTermPattern::NamedNode(term) => Self::Constant(dataset.encode_term(term)), + GroundTermPattern::Literal(term) => Self::Constant(dataset.encode_term(term)), + GroundTermPattern::Triple(triple) => { + match ( + Self::from_ground_term_pattern(&triple.subject, variables, dataset), + Self::from_named_node_pattern(&triple.predicate, variables, dataset), + Self::from_ground_term_pattern(&triple.object, variables, dataset), + ) { + ( + Self::Constant(subject), + Self::Constant(predicate), + Self::Constant(object), + ) => Self::Constant( + EncodedTriple { + subject, + predicate, + object, + } + .into(), + ), + (subject, predicate, object) => { + Self::TriplePattern(Rc::new(TripleTupleSelector { + subject, + predicate, + object, + })) + } + } + } } } -} -fn get_pattern_value(selector: &TupleSelector, tuple: &EncodedTuple) -> Option<EncodedTerm> { - match selector { - TupleSelector::Constant(c) => Some(c.clone()), - TupleSelector::Variable(v) => tuple.get(*v).cloned(), - TupleSelector::TriplePattern(triple) => Some( - EncodedTriple { - subject: get_pattern_value(&triple.subject, tuple)?, - predicate: get_pattern_value(&triple.predicate, tuple)?, - object: get_pattern_value(&triple.object, tuple)?, + fn from_named_node_pattern( + named_node_pattern: &NamedNodePattern, + variables: &mut Vec<Variable>, + dataset: &DatasetView, + ) -> Self { + match named_node_pattern { + NamedNodePattern::Variable(variable) => { + Self::Variable(encode_variable(variables, variable)) } - .into(), - ), + NamedNodePattern::NamedNode(term) => Self::Constant(dataset.encode_term(term)), + } + } + + fn from_graph_name_pattern( + graph_name_pattern: &Option<NamedNodePattern>, + variables: &mut Vec<Variable>, + dataset: &DatasetView, + ) -> Self { + if let Some(graph_name_pattern) = graph_name_pattern { + Self::from_named_node_pattern(graph_name_pattern, variables, dataset) + } else { + Self::Constant(EncodedTerm::DefaultGraph) + } + } + + fn get_pattern_value(&self, tuple: &EncodedTuple) -> Option<EncodedTerm> { + match self { + Self::Constant(c) => Some(c.clone()), + Self::Variable(v) => tuple.get(*v).cloned(), + Self::TriplePattern(triple) => Some( + EncodedTriple { + subject: triple.subject.get_pattern_value(tuple)?, + predicate: triple.predicate.get_pattern_value(tuple)?, + object: triple.object.get_pattern_value(tuple)?, + } + .into(), + ), + } } } @@ -3087,10 +3918,10 @@ fn put_pattern_value( tuple: &mut EncodedTuple, ) -> Option<()> { match selector { - TupleSelector::Constant(c) => (*c == value).then(|| ()), + TupleSelector::Constant(c) => (*c == value).then_some(()), TupleSelector::Variable(v) => { if let Some(old) = tuple.get(*v) { - (value == *old).then(|| ()) + (value == *old).then_some(()) } else { tuple.set(*v, value); Some(()) @@ -3135,6 +3966,17 @@ pub fn are_compatible_and_not_disjointed(a: &EncodedTuple, b: &EncodedTuple) -> found_intersection } +pub enum PropertyPath { + Path(EncodedTerm), + Reverse(Rc<Self>), + Sequence(Rc<Self>, Rc<Self>), + Alternative(Rc<Self>, Rc<Self>), + ZeroOrMore(Rc<Self>), + OneOrMore(Rc<Self>), + ZeroOrOne(Rc<Self>), + NegatedPropertySet(Rc<[EncodedTerm]>), +} + #[derive(Clone)] struct PathEvaluator { dataset: Rc<DatasetView>, @@ -3143,42 +3985,37 @@ struct PathEvaluator { impl PathEvaluator { fn eval_closed_in_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, start: &EncodedTerm, end: &EncodedTerm, graph_name: &EncodedTerm, ) -> Result<bool, EvaluationError> { Ok(match path { - PlanPropertyPath::Path(p) => self + PropertyPath::Path(p) => self .dataset - .encoded_quads_for_pattern( - Some(start), - Some(&p.encoded), - Some(end), - Some(graph_name), - ) + .encoded_quads_for_pattern(Some(start), Some(p), Some(end), Some(graph_name)) .next() .transpose()? .is_some(), - PlanPropertyPath::Reverse(p) => self.eval_closed_in_graph(p, end, start, graph_name)?, - PlanPropertyPath::Sequence(a, b) => self + PropertyPath::Reverse(p) => self.eval_closed_in_graph(p, end, start, graph_name)?, + PropertyPath::Sequence(a, b) => self .eval_from_in_graph(a, start, graph_name) .find_map(|middle| { middle .and_then(|middle| { Ok(self .eval_closed_in_graph(b, &middle, end, graph_name)? - .then(|| ())) + .then_some(())) }) .transpose() }) .transpose()? .is_some(), - PlanPropertyPath::Alternative(a, b) => { + PropertyPath::Alternative(a, b) => { self.eval_closed_in_graph(a, start, end, graph_name)? || self.eval_closed_in_graph(b, start, end, graph_name)? } - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { if start == end { self.is_subject_or_object_in_graph(start, graph_name)? } else { @@ -3189,24 +4026,24 @@ impl PathEvaluator { )? } } - PlanPropertyPath::OneOrMore(p) => look_in_transitive_closure( + PropertyPath::OneOrMore(p) => look_in_transitive_closure( self.eval_from_in_graph(p, start, graph_name), move |e| self.eval_from_in_graph(p, &e, graph_name), end, )?, - PlanPropertyPath::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(p) => { if start == end { self.is_subject_or_object_in_graph(start, graph_name) } else { self.eval_closed_in_graph(p, start, end, graph_name) }? } - PlanPropertyPath::NegatedPropertySet(ps) => self + PropertyPath::NegatedPropertySet(ps) => self .dataset .encoded_quads_for_pattern(Some(start), None, Some(end), Some(graph_name)) .find_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok(())) @@ -3221,34 +4058,34 @@ impl PathEvaluator { fn eval_closed_in_unknown_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, start: &EncodedTerm, end: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(Some(start), Some(&p.encoded), Some(end), None) + .encoded_quads_for_pattern(Some(start), Some(p), Some(end), None) .map(|t| Ok(t?.graph_name)), ), - PlanPropertyPath::Reverse(p) => self.eval_closed_in_unknown_graph(p, end, start), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Reverse(p) => self.eval_closed_in_unknown_graph(p, end, start), + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let b = Rc::clone(b); let end = end.clone(); Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok( move |(middle, graph_name)| { eval.eval_closed_in_graph(&b, &middle, &end, &graph_name) - .map(|is_found| is_found.then(|| graph_name)) + .map(|is_found| is_found.then_some(graph_name)) .transpose() }, )) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_closed_in_unknown_graph(a, start, end) .chain(self.eval_closed_in_unknown_graph(b, start, end)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { let eval = self.clone(); let start2 = start.clone(); let end = end.clone(); @@ -3259,11 +4096,11 @@ impl PathEvaluator { |e| eval.eval_from_in_graph(&p, &e, &graph_name), &end, ) - .map(|is_found| is_found.then(|| graph_name)) + .map(|is_found| is_found.then_some(graph_name)) .transpose() }) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let end = end.clone(); let p = Rc::clone(p); @@ -3276,13 +4113,13 @@ impl PathEvaluator { |e| eval.eval_from_in_graph(&p, &e, &graph_name), &end, ) - .map(|is_found| is_found.then(|| graph_name)) + .map(|is_found| is_found.then_some(graph_name)) }) .transpose() }), ) } - PlanPropertyPath::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(p) => { if start == end { self.run_if_term_is_a_dataset_node(start, |graph_name| Some(Ok(graph_name))) } else { @@ -3292,19 +4129,19 @@ impl PathEvaluator { let p = Rc::clone(p); self.run_if_term_is_a_dataset_node(start, move |graph_name| { eval.eval_closed_in_graph(&p, &start2, &end, &graph_name) - .map(|is_found| is_found.then(|| graph_name)) + .map(|is_found| is_found.then_some(graph_name)) .transpose() }) } } - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(Some(start), None, Some(end), None) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok(t.graph_name)) @@ -3319,23 +4156,18 @@ impl PathEvaluator { fn eval_from_in_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, start: &EncodedTerm, graph_name: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern( - Some(start), - Some(&p.encoded), - None, - Some(graph_name), - ) + .encoded_quads_for_pattern(Some(start), Some(p), None, Some(graph_name)) .map(|t| Ok(t?.object)), ), - PlanPropertyPath::Reverse(p) => self.eval_to_in_graph(p, start, graph_name), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Reverse(p) => self.eval_to_in_graph(p, start, graph_name), + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let b = Rc::clone(b); let graph_name2 = graph_name.clone(); @@ -3346,11 +4178,11 @@ impl PathEvaluator { }), ) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_from_in_graph(a, start, graph_name) .chain(self.eval_from_in_graph(b, start, graph_name)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { self.run_if_term_is_a_graph_node(start, graph_name, || { let eval = self.clone(); let p = Rc::clone(p); @@ -3360,7 +4192,7 @@ impl PathEvaluator { }) }) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); let graph_name2 = graph_name.clone(); @@ -3369,7 +4201,7 @@ impl PathEvaluator { move |e| eval.eval_from_in_graph(&p, &e, &graph_name2), )) } - PlanPropertyPath::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(p) => { self.run_if_term_is_a_graph_node(start, graph_name, || { hash_deduplicate( once(Ok(start.clone())) @@ -3377,14 +4209,14 @@ impl PathEvaluator { ) }) } - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(Some(start), None, None, Some(graph_name)) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok(t.object)) @@ -3399,20 +4231,20 @@ impl PathEvaluator { fn eval_from_in_unknown_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, start: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm), EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(Some(start), Some(&p.encoded), None, None) + .encoded_quads_for_pattern(Some(start), Some(p), None, None) .map(|t| { let t = t?; Ok((t.object, t.graph_name)) }), ), - PlanPropertyPath::Reverse(p) => self.eval_to_in_unknown_graph(p, start), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Reverse(p) => self.eval_to_in_unknown_graph(p, start), + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let b = Rc::clone(b); Box::new(self.eval_from_in_unknown_graph(a, start).flat_map_ok( @@ -3422,11 +4254,11 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_from_in_unknown_graph(a, start) .chain(self.eval_from_in_unknown_graph(b, start)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { let start2 = start.clone(); let eval = self.clone(); let p = Rc::clone(p); @@ -3440,7 +4272,7 @@ impl PathEvaluator { .map(move |e| Ok((e?, graph_name.clone()))) }) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); Box::new(transitive_closure( @@ -3451,7 +4283,7 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(p) => { let eval = self.clone(); let start2 = start.clone(); let p = Rc::clone(p); @@ -3464,14 +4296,14 @@ impl PathEvaluator { .map(move |e| Ok((e?, graph_name.clone()))) }) } - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(Some(start), None, None, None) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok((t.object, t.graph_name))) @@ -3486,18 +4318,18 @@ impl PathEvaluator { fn eval_to_in_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, end: &EncodedTerm, graph_name: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<EncodedTerm, EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(None, Some(&p.encoded), Some(end), Some(graph_name)) + .encoded_quads_for_pattern(None, Some(p), Some(end), Some(graph_name)) .map(|t| Ok(t?.subject)), ), - PlanPropertyPath::Reverse(p) => self.eval_from_in_graph(p, end, graph_name), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Reverse(p) => self.eval_from_in_graph(p, end, graph_name), + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let a = Rc::clone(a); let graph_name2 = graph_name.clone(); @@ -3508,11 +4340,11 @@ impl PathEvaluator { }), ) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_to_in_graph(a, end, graph_name) .chain(self.eval_to_in_graph(b, end, graph_name)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { self.run_if_term_is_a_graph_node(end, graph_name, || { let eval = self.clone(); let p = Rc::clone(p); @@ -3522,7 +4354,7 @@ impl PathEvaluator { }) }) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); let graph_name2 = graph_name.clone(); @@ -3531,21 +4363,19 @@ impl PathEvaluator { move |e| eval.eval_to_in_graph(&p, &e, &graph_name2), )) } - PlanPropertyPath::ZeroOrOne(p) => { - self.run_if_term_is_a_graph_node(end, graph_name, || { - hash_deduplicate( - once(Ok(end.clone())).chain(self.eval_to_in_graph(p, end, graph_name)), - ) - }) - } - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::ZeroOrOne(p) => self.run_if_term_is_a_graph_node(end, graph_name, || { + hash_deduplicate( + once(Ok(end.clone())).chain(self.eval_to_in_graph(p, end, graph_name)), + ) + }), + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(None, None, Some(end), Some(graph_name)) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok(t.subject)) @@ -3557,22 +4387,23 @@ impl PathEvaluator { } } } + fn eval_to_in_unknown_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, end: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm), EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(None, Some(&p.encoded), Some(end), None) + .encoded_quads_for_pattern(None, Some(p), Some(end), None) .map(|t| { let t = t?; Ok((t.subject, t.graph_name)) }), ), - PlanPropertyPath::Reverse(p) => self.eval_from_in_unknown_graph(p, end), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Reverse(p) => self.eval_from_in_unknown_graph(p, end), + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let a = Rc::clone(a); Box::new(self.eval_to_in_unknown_graph(b, end).flat_map_ok( @@ -3582,11 +4413,11 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_to_in_unknown_graph(a, end) .chain(self.eval_to_in_unknown_graph(b, end)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { let end2 = end.clone(); let eval = self.clone(); let p = Rc::clone(p); @@ -3600,7 +4431,7 @@ impl PathEvaluator { .map(move |e| Ok((e?, graph_name.clone()))) }) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); Box::new(transitive_closure( @@ -3611,7 +4442,7 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::ZeroOrOne(p) => { + PropertyPath::ZeroOrOne(p) => { let eval = self.clone(); let end2 = end.clone(); let p = Rc::clone(p); @@ -3624,14 +4455,14 @@ impl PathEvaluator { .map(move |e| Ok((e?, graph_name.clone()))) }) } - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(Some(end), None, None, None) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok((t.subject, t.graph_name))) @@ -3646,20 +4477,20 @@ impl PathEvaluator { fn eval_open_in_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, graph_name: &EncodedTerm, ) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm), EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(None, Some(&p.encoded), None, Some(graph_name)) + .encoded_quads_for_pattern(None, Some(p), None, Some(graph_name)) .map(|t| t.map(|t| (t.subject, t.object))), ), - PlanPropertyPath::Reverse(p) => Box::new( + PropertyPath::Reverse(p) => Box::new( self.eval_open_in_graph(p, graph_name) .map(|t| t.map(|(s, o)| (o, s))), ), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let b = Rc::clone(b); let graph_name2 = graph_name.clone(); @@ -3670,11 +4501,11 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_open_in_graph(a, graph_name) .chain(self.eval_open_in_graph(b, graph_name)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); let graph_name2 = graph_name.clone(); @@ -3686,7 +4517,7 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); let graph_name2 = graph_name.clone(); @@ -3698,18 +4529,18 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::ZeroOrOne(p) => Box::new(hash_deduplicate( + PropertyPath::ZeroOrOne(p) => Box::new(hash_deduplicate( self.get_subject_or_object_identity_pairs_in_graph(graph_name) .chain(self.eval_open_in_graph(p, graph_name)), )), - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(None, None, None, Some(graph_name)) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok((t.subject, t.object))) @@ -3724,20 +4555,20 @@ impl PathEvaluator { fn eval_open_in_unknown_graph( &self, - path: &PlanPropertyPath, + path: &PropertyPath, ) -> Box<dyn Iterator<Item = Result<(EncodedTerm, EncodedTerm, EncodedTerm), EvaluationError>>> { match path { - PlanPropertyPath::Path(p) => Box::new( + PropertyPath::Path(p) => Box::new( self.dataset - .encoded_quads_for_pattern(None, Some(&p.encoded), None, None) + .encoded_quads_for_pattern(None, Some(p), None, None) .map(|t| t.map(|t| (t.subject, t.object, t.graph_name))), ), - PlanPropertyPath::Reverse(p) => Box::new( + PropertyPath::Reverse(p) => Box::new( self.eval_open_in_unknown_graph(p) .map(|t| t.map(|(s, o, g)| (o, s, g))), ), - PlanPropertyPath::Sequence(a, b) => { + PropertyPath::Sequence(a, b) => { let eval = self.clone(); let b = Rc::clone(b); Box::new(self.eval_open_in_unknown_graph(a).flat_map_ok( @@ -3747,11 +4578,11 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( + PropertyPath::Alternative(a, b) => Box::new(hash_deduplicate( self.eval_open_in_unknown_graph(a) .chain(self.eval_open_in_unknown_graph(b)), )), - PlanPropertyPath::ZeroOrMore(p) => { + PropertyPath::ZeroOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); Box::new(transitive_closure( @@ -3762,7 +4593,7 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::OneOrMore(p) => { + PropertyPath::OneOrMore(p) => { let eval = self.clone(); let p = Rc::clone(p); Box::new(transitive_closure( @@ -3773,18 +4604,18 @@ impl PathEvaluator { }, )) } - PlanPropertyPath::ZeroOrOne(p) => Box::new(hash_deduplicate( + PropertyPath::ZeroOrOne(p) => Box::new(hash_deduplicate( self.get_subject_or_object_identity_pairs_in_dataset() .chain(self.eval_open_in_unknown_graph(p)), )), - PlanPropertyPath::NegatedPropertySet(ps) => { + PropertyPath::NegatedPropertySet(ps) => { let ps = Rc::clone(ps); Box::new( self.dataset .encoded_quads_for_pattern(None, None, None, None) .filter_map(move |t| match t { Ok(t) => { - if ps.iter().any(|p| p.encoded == t.predicate) { + if ps.iter().any(|p| *p == t.predicate) { None } else { Some(Ok((t.subject, t.object, t.graph_name))) @@ -3894,25 +4725,25 @@ impl PathEvaluator { } struct CartesianProductJoinIterator { - left_iter: EncodedTuplesIterator, - right: Vec<EncodedTuple>, + probe_iter: EncodedTuplesIterator, + built: Vec<EncodedTuple>, buffered_results: Vec<Result<EncodedTuple, EvaluationError>>, } impl Iterator for CartesianProductJoinIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(result) = self.buffered_results.pop() { return Some(result); } - let left_tuple = match self.left_iter.next()? { - Ok(left_tuple) => left_tuple, + let probe_tuple = match self.probe_iter.next()? { + Ok(probe_tuple) => probe_tuple, Err(error) => return Some(Err(error)), }; - for right_tuple in &self.right { - if let Some(result_tuple) = left_tuple.combine_with(right_tuple) { + for built_tuple in &self.built { + if let Some(result_tuple) = probe_tuple.combine_with(built_tuple) { self.buffered_results.push(Ok(result_tuple)) } } @@ -3920,37 +4751,37 @@ impl Iterator for CartesianProductJoinIterator { } fn size_hint(&self) -> (usize, Option<usize>) { - let (min, max) = self.left_iter.size_hint(); + let (min, max) = self.probe_iter.size_hint(); ( - min.saturating_mul(self.right.len()), - max.map(|v| v.saturating_mul(self.right.len())), + min.saturating_mul(self.built.len()), + max.map(|v| v.saturating_mul(self.built.len())), ) } } struct HashJoinIterator { - left_iter: EncodedTuplesIterator, - right: EncodedTupleSet, + probe_iter: EncodedTuplesIterator, + built: EncodedTupleSet, buffered_results: Vec<Result<EncodedTuple, EvaluationError>>, } impl Iterator for HashJoinIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(result) = self.buffered_results.pop() { return Some(result); } - let left_tuple = match self.left_iter.next()? { - Ok(left_tuple) => left_tuple, + let probe_tuple = match self.probe_iter.next()? { + Ok(probe_tuple) => probe_tuple, Err(error) => return Some(Err(error)), }; self.buffered_results.extend( - self.right - .get(&left_tuple) + self.built + .get(&probe_tuple) .iter() - .filter_map(|right_tuple| left_tuple.combine_with(right_tuple).map(Ok)), + .filter_map(|built_tuple| probe_tuple.combine_with(built_tuple).map(Ok)), ) } } @@ -3958,10 +4789,10 @@ impl Iterator for HashJoinIterator { fn size_hint(&self) -> (usize, Option<usize>) { ( 0, - self.left_iter + self.probe_iter .size_hint() .1 - .map(|v| v.saturating_mul(self.right.len())), + .map(|v| v.saturating_mul(self.built.len())), ) } } @@ -3976,7 +4807,7 @@ struct HashLeftJoinIterator { impl Iterator for HashLeftJoinIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(result) = self.buffered_results.pop() { return Some(result); @@ -4024,7 +4855,7 @@ struct ForLoopLeftJoinIterator { impl Iterator for ForLoopLeftJoinIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { if let Some(tuple) = self.current_right.next() { return Some(tuple); } @@ -4041,58 +4872,6 @@ impl Iterator for ForLoopLeftJoinIterator { } } -struct BadForLoopLeftJoinIterator { - from_tuple: EncodedTuple, - right_evaluator: Rc<dyn Fn(EncodedTuple) -> EncodedTuplesIterator>, - left_iter: EncodedTuplesIterator, - current_left: EncodedTuple, - current_right: EncodedTuplesIterator, - problem_vars: Rc<[usize]>, -} - -impl Iterator for BadForLoopLeftJoinIterator { - type Item = Result<EncodedTuple, EvaluationError>; - - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { - for right_tuple in &mut self.current_right { - match right_tuple { - Ok(right_tuple) => { - if let Some(combined) = right_tuple.combine_with(&self.current_left) { - return Some(Ok(combined)); - } - } - Err(error) => return Some(Err(error)), - } - } - match self.left_iter.next()? { - Ok(left_tuple) => { - let mut right_input = self.from_tuple.clone(); - for (var, val) in left_tuple.iter().enumerate() { - if let Some(val) = val { - if !self.problem_vars.contains(&var) { - right_input.set(var, val); - } - } - } - self.current_right = (self.right_evaluator)(right_input); - for right_tuple in &mut self.current_right { - match right_tuple { - Ok(right_tuple) => { - if let Some(combined) = right_tuple.combine_with(&left_tuple) { - self.current_left = left_tuple; - return Some(Ok(combined)); - } - } - Err(error) => return Some(Err(error)), - } - } - Some(Ok(left_tuple)) - } - Err(error) => Some(Err(error)), - } - } -} - struct UnionIterator { plans: Vec<Rc<dyn Fn(EncodedTuple) -> EncodedTuplesIterator>>, input: EncodedTuple, @@ -4103,7 +4882,7 @@ struct UnionIterator { impl Iterator for UnionIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(tuple) = self.current_iterator.next() { return Some(tuple); @@ -4125,7 +4904,7 @@ struct ConsecutiveDeduplication { impl Iterator for ConsecutiveDeduplication { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { // Basic idea. We buffer the previous result and we only emit it when we kow the next one or it's the end loop { if let Some(next) = self.inner.next() { @@ -4166,7 +4945,7 @@ struct ConstructIterator { impl Iterator for ConstructIterator { type Item = Result<Triple, EvaluationError>; - fn next(&mut self) -> Option<Result<Triple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(result) = self.buffered_results.pop() { return Some(result); @@ -4190,7 +4969,7 @@ impl Iterator for ConstructIterator { )); } } - self.bnodes.clear(); //We do not reuse old bnodes + self.bnodes.clear(); // We do not reuse old bnodes } } } @@ -4204,19 +4983,32 @@ impl Iterator for ConstructIterator { } } +pub struct TripleTemplate { + pub subject: TripleTemplateValue, + pub predicate: TripleTemplateValue, + pub object: TripleTemplateValue, +} + +pub enum TripleTemplateValue { + Constant(EncodedTerm), + BlankNode(usize), + Variable(usize), + Triple(Box<TripleTemplate>), +} + fn get_triple_template_value<'a>( selector: &'a TripleTemplateValue, tuple: &'a EncodedTuple, bnodes: &'a mut Vec<EncodedTerm>, ) -> Option<EncodedTerm> { match selector { - TripleTemplateValue::Constant(term) => Some(term.encoded.clone()), - TripleTemplateValue::Variable(v) => tuple.get(v.encoded).cloned(), + TripleTemplateValue::Constant(term) => Some(term.clone()), + TripleTemplateValue::Variable(v) => tuple.get(*v).cloned(), TripleTemplateValue::BlankNode(bnode) => { - if bnode.encoded >= bnodes.len() { - bnodes.resize_with(bnode.encoded + 1, new_bnode) + if *bnode >= bnodes.len() { + bnodes.resize_with(*bnode + 1, new_bnode) } - Some(bnodes[bnode.encoded].clone()) + Some(bnodes[*bnode].clone()) } TripleTemplateValue::Triple(triple) => Some( EncodedTriple { @@ -4255,7 +5047,7 @@ struct DescribeIterator { impl Iterator for DescribeIterator { type Item = Result<Triple, EvaluationError>; - fn next(&mut self) -> Option<Result<Triple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(quad) = self.quads.next() { return Some(match quad { @@ -4306,7 +5098,7 @@ impl<T1, T2, I1: Iterator<Item = T1>, I2: Iterator<Item = T2>> Iterator { type Item = (Option<T1>, Option<T2>); - fn next(&mut self) -> Option<(Option<T1>, Option<T2>)> { + fn next(&mut self) -> Option<Self::Item> { match (self.a.next(), self.b.next()) { (None, None) => None, r => Some(r), @@ -4429,7 +5221,7 @@ impl< { type Item = Result<O, EvaluationError>; - fn next(&mut self) -> Option<Result<O, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(current) = &mut self.current { if let Some(next) = current.next() { @@ -4451,14 +5243,13 @@ trait Accumulator { fn state(&self) -> Option<EncodedTerm>; } -#[derive(Default, Debug)] -struct DistinctAccumulator<T: Accumulator> { +struct Deduplicate { seen: HashSet<Option<EncodedTerm>>, - inner: T, + inner: Box<dyn Accumulator>, } -impl<T: Accumulator> DistinctAccumulator<T> { - fn new(inner: T) -> Self { +impl Deduplicate { + fn new(inner: Box<dyn Accumulator>) -> Self { Self { seen: HashSet::default(), inner, @@ -4466,7 +5257,7 @@ impl<T: Accumulator> DistinctAccumulator<T> { } } -impl<T: Accumulator> Accumulator for DistinctAccumulator<T> { +impl Accumulator for Deduplicate { fn add(&mut self, element: Option<EncodedTerm>) { if self.seen.insert(element.clone()) { self.inner.add(element) @@ -4493,7 +5284,6 @@ impl Accumulator for CountAccumulator { } } -#[derive(Debug)] struct SumAccumulator { sum: Option<EncodedTerm>, } @@ -4511,7 +5301,7 @@ impl Accumulator for SumAccumulator { if let Some(sum) = &self.sum { if let Some(operands) = element.and_then(|e| NumericBinaryOperands::new(sum.clone(), e)) { - //TODO: unify with addition? + // TODO: unify with addition? self.sum = match operands { NumericBinaryOperands::Float(v1, v2) => Some((v1 + v2).into()), NumericBinaryOperands::Double(v1, v2) => Some((v1 + v2).into()), @@ -4537,7 +5327,7 @@ impl Accumulator for SumAccumulator { } } -#[derive(Debug, Default)] +#[derive(Default)] struct AvgAccumulator { sum: SumAccumulator, count: i64, @@ -4554,8 +5344,8 @@ impl Accumulator for AvgAccumulator { if self.count == 0 { Some(0.into()) } else { - //TODO: deduplicate? - //TODO: duration? + // TODO: deduplicate? + // TODO: duration? let count = Integer::from(self.count); match sum { EncodedTerm::FloatLiteral(sum) => Some((sum / Float::from(count)).into()), @@ -4626,7 +5416,7 @@ impl Accumulator for MaxAccumulator { } } -#[derive(Debug, Default)] +#[derive(Default)] struct SampleAccumulator { value: Option<EncodedTerm>, } @@ -4688,8 +5478,45 @@ impl Accumulator for GroupConcatAccumulator { } } +struct FailingAccumulator; + +impl Accumulator for FailingAccumulator { + fn add(&mut self, _: Option<EncodedTerm>) {} + + fn state(&self) -> Option<EncodedTerm> { + None + } +} + +fn encode_variable(variables: &mut Vec<Variable>, variable: &Variable) -> usize { + if let Some(key) = slice_key(variables, variable) { + key + } else { + variables.push(variable.clone()); + variables.len() - 1 + } +} + +fn bnode_key(blank_nodes: &mut Vec<BlankNode>, blank_node: &BlankNode) -> usize { + if let Some(key) = slice_key(blank_nodes, blank_node) { + key + } else { + blank_nodes.push(blank_node.clone()); + blank_nodes.len() - 1 + } +} + +fn slice_key<T: Eq>(slice: &[T], element: &T) -> Option<usize> { + for (i, item) in slice.iter().enumerate() { + if item == element { + return Some(i); + } + } + None +} + fn generate_uuid(buffer: &mut String) { - let mut uuid = random::<u128>().to_ne_bytes(); + let mut uuid = random::<u128>().to_le_bytes(); uuid[6] = (uuid[6] & 0x0F) | 0x40; uuid[8] = (uuid[8] & 0x3F) | 0x80; @@ -4758,6 +5585,7 @@ impl EncodedTupleSet { len: 0, } } + fn insert(&mut self, tuple: EncodedTuple) { self.map .entry(self.tuple_key(&tuple)) @@ -4797,18 +5625,21 @@ impl Extend<EncodedTuple> for EncodedTupleSet { struct StatsIterator { inner: EncodedTuplesIterator, - stats: Rc<PlanNodeWithStats>, + stats: Rc<EvalNodeWithStats>, } impl Iterator for StatsIterator { type Item = Result<EncodedTuple, EvaluationError>; - fn next(&mut self) -> Option<Result<EncodedTuple, EvaluationError>> { + fn next(&mut self) -> Option<Self::Item> { let start = Timer::now(); let result = self.inner.next(); - self.stats - .exec_duration - .set(self.stats.exec_duration.get() + start.elapsed()); + self.stats.exec_duration.set( + self.stats + .exec_duration + .get() + .and_then(|stat| stat.checked_add(start.elapsed()?)), + ); if matches!(result, Some(Ok(_))) { self.stats.exec_count.set(self.stats.exec_count.get() + 1); } @@ -4816,50 +5647,226 @@ impl Iterator for StatsIterator { } } -#[cfg(all(target_family = "wasm", target_os = "unknown"))] -pub struct Timer { - timestamp_ms: f64, +pub struct EvalNodeWithStats { + pub label: String, + pub children: Vec<Rc<EvalNodeWithStats>>, + pub exec_count: Cell<usize>, + pub exec_duration: Cell<Option<DayTimeDuration>>, } -#[cfg(all(target_family = "wasm", target_os = "unknown"))] -impl Timer { - pub fn now() -> Self { - Self { - timestamp_ms: js_sys::Date::now(), +impl EvalNodeWithStats { + pub fn json_node( + &self, + writer: &mut ToWriteJsonWriter<impl io::Write>, + with_stats: bool, + ) -> io::Result<()> { + writer.write_event(JsonEvent::StartObject)?; + writer.write_event(JsonEvent::ObjectKey("name".into()))?; + writer.write_event(JsonEvent::String((&self.label).into()))?; + if with_stats { + writer.write_event(JsonEvent::ObjectKey("number of results".into()))?; + writer.write_event(JsonEvent::Number(self.exec_count.get().to_string().into()))?; + if let Some(duration) = self.exec_duration.get() { + writer.write_event(JsonEvent::ObjectKey("duration in seconds".into()))?; + writer.write_event(JsonEvent::Number(duration.as_seconds().to_string().into()))?; + } + } + writer.write_event(JsonEvent::ObjectKey("children".into()))?; + writer.write_event(JsonEvent::StartArray)?; + for child in &self.children { + child.json_node(writer, with_stats)?; } + writer.write_event(JsonEvent::EndArray)?; + writer.write_event(JsonEvent::EndObject) } +} + +impl fmt::Debug for EvalNodeWithStats { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut obj = f.debug_struct("Node"); + obj.field("name", &self.label); + if let Some(exec_duration) = self.exec_duration.get() { + obj.field("number of results", &self.exec_count.get()); + obj.field( + "duration in seconds", + &f32::from(Float::from(exec_duration.as_seconds())), + ); + } + if !self.children.is_empty() { + obj.field("children", &self.children); + } + obj.finish() + } +} - pub fn elapsed(&self) -> StdDuration { - StdDuration::from_secs_f64((js_sys::Date::now() - self.timestamp_ms) / 1000.) +fn eval_node_label(node: &GraphPattern) -> String { + match node { + GraphPattern::Distinct { .. } => "Distinct(Hash)".to_owned(), + GraphPattern::Extend { + expression, + variable, + .. + } => format!( + "Extend({} -> {variable})", + spargebra::algebra::Expression::from(expression) + ), + GraphPattern::Filter { expression, .. } => format!( + "Filter({})", + spargebra::algebra::Expression::from(expression) + ), + GraphPattern::Group { + variables, + aggregates, + .. + } => { + format!( + "Aggregate({})", + format_list(variables.iter().map(ToString::to_string).chain( + aggregates.iter().map(|(v, agg)| format!( + "{} -> {v}", + spargebra::algebra::AggregateExpression::from(agg) + )) + )) + ) + } + GraphPattern::Join { algorithm, .. } => match algorithm { + JoinAlgorithm::HashBuildLeftProbeRight { keys } => format!( + "LeftJoin(HashBuildLeftProbeRight, keys = {})", + format_list(keys) + ), + }, + GraphPattern::Lateral { right, .. } => { + if let GraphPattern::LeftJoin { + left: nested_left, + expression, + .. + } = right.as_ref() + { + if nested_left.is_empty_singleton() { + // We are in a ForLoopLeftJoin + return format!( + "ForLoopLeftJoin(expression = {})", + spargebra::algebra::Expression::from(expression) + ); + } + } + "Lateral".to_owned() + } + GraphPattern::LeftJoin { + algorithm, + expression, + .. + } => match algorithm { + LeftJoinAlgorithm::HashBuildRightProbeLeft { keys } => format!( + "LeftJoin(HashBuildRightProbeLeft, keys = {}, expression = {})", + format_list(keys), + spargebra::algebra::Expression::from(expression) + ), + }, + GraphPattern::Minus { algorithm, .. } => match algorithm { + MinusAlgorithm::HashBuildRightProbeLeft { keys } => format!( + "AntiJoin(HashBuildRightProbeLeft, keys = {})", + format_list(keys) + ), + }, + GraphPattern::OrderBy { expression, .. } => { + format!( + "Sort({})", + format_list( + expression + .iter() + .map(spargebra::algebra::OrderExpression::from) + ) + ) + } + GraphPattern::Path { + subject, + path, + object, + graph_name, + } => { + if let Some(graph_name) = graph_name { + format!("Path({subject} {path} {object} {graph_name})") + } else { + format!("Path({subject} {path} {object})") + } + } + GraphPattern::Project { variables, .. } => { + format!("Project({})", format_list(variables)) + } + GraphPattern::QuadPattern { + subject, + predicate, + object, + graph_name, + } => { + if let Some(graph_name) = graph_name { + format!("QuadPattern({subject} {predicate} {object} {graph_name})") + } else { + format!("QuadPattern({subject} {predicate} {object})") + } + } + GraphPattern::Reduced { .. } => "Reduced".to_owned(), + GraphPattern::Service { name, silent, .. } => { + if *silent { + format!("Service({name}, Silent)") + } else { + format!("Service({name})") + } + } + GraphPattern::Slice { start, length, .. } => { + if let Some(length) = length { + format!("Slice(start = {start}, length = {length})") + } else { + format!("Slice(start = {start})") + } + } + GraphPattern::Union { .. } => "Union".to_owned(), + GraphPattern::Values { variables, .. } => { + format!("StaticBindings({})", format_list(variables)) + } } } -#[cfg(not(all(target_family = "wasm", target_os = "unknown")))] +fn format_list<T: ToString>(values: impl IntoIterator<Item = T>) -> String { + values + .into_iter() + .map(|v| v.to_string()) + .collect::<Vec<_>>() + .join(", ") +} + pub struct Timer { - instant: Instant, + start: DateTime, } -#[cfg(not(all(target_family = "wasm", target_os = "unknown")))] impl Timer { pub fn now() -> Self { Self { - instant: Instant::now(), + start: DateTime::now(), } } - pub fn elapsed(&self) -> StdDuration { - self.instant.elapsed() + pub fn elapsed(&self) -> Option<DayTimeDuration> { + DateTime::now().checked_sub(self.start) } } -#[test] -fn uuid() { - let mut buffer = String::default(); - generate_uuid(&mut buffer); - assert!( - Regex::new("^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$") - .unwrap() - .is_match(&buffer), - "{buffer} is not a valid UUID" - ); +#[cfg(test)] +mod tests { + #![allow(clippy::panic_in_result_fn)] + + use super::*; + + #[test] + fn uuid() { + let mut buffer = String::default(); + generate_uuid(&mut buffer); + assert!( + Regex::new("^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$") + .unwrap() + .is_match(&buffer), + "{buffer} is not a valid UUID" + ); + } } diff --git a/lib/src/sparql/http/dummy.rs b/lib/oxigraph/src/sparql/http/dummy.rs similarity index 76% rename from lib/src/sparql/http/dummy.rs rename to lib/oxigraph/src/sparql/http/dummy.rs index 0517456b..7b3a551f 100644 --- a/lib/src/sparql/http/dummy.rs +++ b/lib/oxigraph/src/sparql/http/dummy.rs @@ -3,18 +3,18 @@ use std::io::{Empty, Error, ErrorKind, Result}; use std::time::Duration; -pub struct Client {} +pub struct Client; impl Client { pub fn new(_timeout: Option<Duration>, _redirection_limit: usize) -> Self { - Self {} + Self } #[allow(clippy::unused_self)] - pub fn get(&self, _url: &str, _accept: &str) -> Result<(String, Empty)> { + pub fn get(&self, _url: &str, _accept: &'static str) -> Result<(String, Empty)> { Err(Error::new( ErrorKind::Unsupported, - "HTTP client is not available. Enable the feature 'http_client'", + "HTTP client is not available. Enable the feature 'http-client'", )) } @@ -23,12 +23,12 @@ impl Client { &self, _url: &str, _payload: Vec<u8>, - _content_type: &str, - _accept: &str, + _content_type: &'static str, + _accept: &'static str, ) -> Result<(String, Empty)> { Err(Error::new( ErrorKind::Unsupported, - "HTTP client is not available. Enable the feature 'http_client'", + "HTTP client is not available. Enable the feature 'http-client'", )) } } diff --git a/lib/oxigraph/src/sparql/http/mod.rs b/lib/oxigraph/src/sparql/http/mod.rs new file mode 100644 index 00000000..b309cf55 --- /dev/null +++ b/lib/oxigraph/src/sparql/http/mod.rs @@ -0,0 +1,9 @@ +#[cfg(not(feature = "http-client"))] +mod dummy; +#[cfg(feature = "http-client")] +mod simple; + +#[cfg(not(feature = "http-client"))] +pub use dummy::Client; +#[cfg(feature = "http-client")] +pub use simple::Client; diff --git a/lib/src/sparql/http/simple.rs b/lib/oxigraph/src/sparql/http/simple.rs similarity index 88% rename from lib/src/sparql/http/simple.rs rename to lib/oxigraph/src/sparql/http/simple.rs index 57b9e540..bd81d7ce 100644 --- a/lib/src/sparql/http/simple.rs +++ b/lib/oxigraph/src/sparql/http/simple.rs @@ -8,18 +8,17 @@ pub struct Client { impl Client { pub fn new(timeout: Option<Duration>, redirection_limit: usize) -> Self { - let mut client = oxhttp::Client::new(); + let mut client = oxhttp::Client::new() + .with_redirection_limit(redirection_limit) + .with_user_agent(concat!("Oxigraph/", env!("CARGO_PKG_VERSION"))) + .unwrap(); if let Some(timeout) = timeout { - client.set_global_timeout(timeout); + client = client.with_global_timeout(timeout); } - client.set_redirection_limit(redirection_limit); - client - .set_user_agent(concat!("Oxigraph/", env!("CARGO_PKG_VERSION"))) - .unwrap(); Self { client } } - pub fn get(&self, url: &str, accept: &str) -> Result<(String, Body)> { + pub fn get(&self, url: &str, accept: &'static str) -> Result<(String, Body)> { let request = Request::builder(Method::GET, url.parse().map_err(invalid_input_error)?) .with_header(HeaderName::ACCEPT, accept) .map_err(invalid_input_error)? @@ -50,8 +49,8 @@ impl Client { &self, url: &str, payload: Vec<u8>, - content_type: &str, - accept: &str, + content_type: &'static str, + accept: &'static str, ) -> Result<(String, Body)> { let request = Request::builder(Method::POST, url.parse().map_err(invalid_input_error)?) .with_header(HeaderName::ACCEPT, accept) diff --git a/lib/src/sparql/mod.rs b/lib/oxigraph/src/sparql/mod.rs similarity index 63% rename from lib/src/sparql/mod.rs rename to lib/oxigraph/src/sparql/mod.rs index 93fda294..089f84be 100644 --- a/lib/src/sparql/mod.rs +++ b/lib/oxigraph/src/sparql/mod.rs @@ -8,29 +8,29 @@ mod error; mod eval; mod http; mod model; -mod plan; -mod plan_builder; +pub mod results; mod service; mod update; use crate::model::{NamedNode, Term}; pub use crate::sparql::algebra::{Query, QueryDataset, Update}; use crate::sparql::dataset::DatasetView; -pub use crate::sparql::error::{EvaluationError, QueryError}; -use crate::sparql::eval::{SimpleEvaluator, Timer}; +pub use crate::sparql::error::EvaluationError; +use crate::sparql::eval::{EvalNodeWithStats, SimpleEvaluator, Timer}; pub use crate::sparql::model::{QueryResults, QuerySolution, QuerySolutionIter, QueryTripleIter}; -use crate::sparql::plan::PlanNodeWithStats; -use crate::sparql::plan_builder::PlanBuilder; pub use crate::sparql::service::ServiceHandler; use crate::sparql::service::{EmptyServiceHandler, ErrorConversionServiceHandler}; pub(crate) use crate::sparql::update::evaluate_update; use crate::storage::StorageReader; -use json_event_parser::{JsonEvent, JsonWriter}; +use json_event_parser::{JsonEvent, ToWriteJsonWriter}; pub use oxrdf::{Variable, VariableNameParseError}; -pub use sparesults::QueryResultsFormat; -pub use spargebra::ParseError; +use oxsdatatypes::{DayTimeDuration, Float}; +pub use spargebra::SparqlSyntaxError; +use sparopt::algebra::GraphPattern; +use sparopt::Optimizer; use std::collections::HashMap; use std::rc::Rc; +use std::sync::Arc; use std::time::Duration; use std::{fmt, io}; @@ -48,43 +48,39 @@ pub(crate) fn evaluate_query( spargebra::Query::Select { pattern, base_iri, .. } => { - let (plan, variables) = PlanBuilder::build( - &dataset, - &pattern, - true, - &options.custom_functions, - options.without_optimizations, - )?; + let mut pattern = GraphPattern::from(&pattern); + if !options.without_optimizations { + pattern = Optimizer::optimize_graph_pattern(pattern); + } let planning_duration = start_planning.elapsed(); let (results, explanation) = SimpleEvaluator::new( Rc::new(dataset), base_iri.map(Rc::new), options.service_handler(), - Rc::new(options.custom_functions), + Arc::new(options.custom_functions), run_stats, ) - .evaluate_select_plan(Rc::new(plan), Rc::new(variables)); + .evaluate_select(&pattern); (Ok(results), explanation, planning_duration) } spargebra::Query::Ask { pattern, base_iri, .. } => { - let (plan, _) = PlanBuilder::build( - &dataset, - &pattern, - false, - &options.custom_functions, - options.without_optimizations, - )?; + let mut pattern = GraphPattern::from(&pattern); + if !options.without_optimizations { + pattern = Optimizer::optimize_graph_pattern(GraphPattern::Reduced { + inner: Box::new(pattern), + }); + } let planning_duration = start_planning.elapsed(); let (results, explanation) = SimpleEvaluator::new( Rc::new(dataset), base_iri.map(Rc::new), options.service_handler(), - Rc::new(options.custom_functions), + Arc::new(options.custom_functions), run_stats, ) - .evaluate_ask_plan(Rc::new(plan)); + .evaluate_ask(&pattern); (results, explanation, planning_duration) } spargebra::Query::Construct { @@ -93,50 +89,41 @@ pub(crate) fn evaluate_query( base_iri, .. } => { - let (plan, variables) = PlanBuilder::build( - &dataset, - &pattern, - false, - &options.custom_functions, - options.without_optimizations, - )?; - let construct = PlanBuilder::build_graph_template( - &dataset, - &template, - variables, - &options.custom_functions, - options.without_optimizations, - ); + let mut pattern = GraphPattern::from(&pattern); + if !options.without_optimizations { + pattern = Optimizer::optimize_graph_pattern(GraphPattern::Reduced { + inner: Box::new(pattern), + }); + } let planning_duration = start_planning.elapsed(); let (results, explanation) = SimpleEvaluator::new( Rc::new(dataset), base_iri.map(Rc::new), options.service_handler(), - Rc::new(options.custom_functions), + Arc::new(options.custom_functions), run_stats, ) - .evaluate_construct_plan(Rc::new(plan), construct); + .evaluate_construct(&pattern, &template); (Ok(results), explanation, planning_duration) } spargebra::Query::Describe { pattern, base_iri, .. } => { - let (plan, _) = PlanBuilder::build( - &dataset, - &pattern, - false, - &options.custom_functions, - options.without_optimizations, - )?; + let mut pattern = GraphPattern::from(&pattern); + if !options.without_optimizations { + pattern = Optimizer::optimize_graph_pattern(GraphPattern::Reduced { + inner: Box::new(pattern), + }); + } let planning_duration = start_planning.elapsed(); let (results, explanation) = SimpleEvaluator::new( Rc::new(dataset), base_iri.map(Rc::new), options.service_handler(), - Rc::new(options.custom_functions), + Arc::new(options.custom_functions), run_stats, ) - .evaluate_describe_plan(Rc::new(plan)); + .evaluate_describe(&pattern); (Ok(results), explanation, planning_duration) } }; @@ -152,36 +139,39 @@ pub(crate) fn evaluate_query( /// Options for SPARQL query evaluation. /// /// -/// If the `"http_client"` optional feature is enabled, +/// If the `"http-client"` optional feature is enabled, /// a simple HTTP 1.1 client is used to execute [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/) SERVICE calls. /// /// Usage example disabling the federated query support: /// ``` -/// use oxigraph::store::Store; /// use oxigraph::sparql::QueryOptions; +/// use oxigraph::store::Store; /// /// let store = Store::new()?; /// store.query_opt( /// "SELECT * WHERE { SERVICE <https://query.wikidata.org/sparql> {} }", -/// QueryOptions::default().without_service_handler() +/// QueryOptions::default().without_service_handler(), /// )?; /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// ``` #[derive(Clone, Default)] pub struct QueryOptions { - service_handler: Option<Rc<dyn ServiceHandler<Error = EvaluationError>>>, - custom_functions: HashMap<NamedNode, Rc<dyn Fn(&[Term]) -> Option<Term>>>, + service_handler: Option<Arc<dyn ServiceHandler<Error = EvaluationError>>>, + custom_functions: CustomFunctionRegistry, http_timeout: Option<Duration>, http_redirection_limit: usize, without_optimizations: bool, } +pub(crate) type CustomFunctionRegistry = + HashMap<NamedNode, Arc<dyn (Fn(&[Term]) -> Option<Term>) + Send + Sync>>; + impl QueryOptions { /// Use a given [`ServiceHandler`] to execute [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/) SERVICE calls. #[inline] #[must_use] pub fn with_service_handler(mut self, service_handler: impl ServiceHandler + 'static) -> Self { - self.service_handler = Some(Rc::new(ErrorConversionServiceHandler::wrap( + self.service_handler = Some(Arc::new(ErrorConversionServiceHandler::wrap( service_handler, ))); self @@ -191,12 +181,12 @@ impl QueryOptions { #[inline] #[must_use] pub fn without_service_handler(mut self) -> Self { - self.service_handler = Some(Rc::new(EmptyServiceHandler)); + self.service_handler = Some(Arc::new(EmptyServiceHandler)); self } /// Sets a timeout for HTTP requests done during SPARQL evaluation. - #[cfg(feature = "http_client")] + #[cfg(feature = "http-client")] #[inline] #[must_use] pub fn with_http_timeout(mut self, timeout: Duration) -> Self { @@ -207,7 +197,7 @@ impl QueryOptions { /// Sets an upper bound of the number of HTTP redirection followed per HTTP request done during SPARQL evaluation. /// /// By default this value is `0`. - #[cfg(feature = "http_client")] + #[cfg(feature = "http-client")] #[inline] #[must_use] pub fn with_http_redirection_limit(mut self, redirection_limit: usize) -> Self { @@ -219,9 +209,9 @@ impl QueryOptions { /// /// Example with a function serializing terms to N-Triples: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::{QueryOptions, QueryResults}; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// @@ -229,10 +219,13 @@ impl QueryOptions { /// "SELECT (<http://www.w3.org/ns/formats/N-Triples>(1) AS ?nt) WHERE {}", /// QueryOptions::default().with_custom_function( /// NamedNode::new("http://www.w3.org/ns/formats/N-Triples")?, - /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()) - /// ) + /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()), + /// ), /// )? { - /// assert_eq!(solutions.next().unwrap()?.get("nt"), Some(&Literal::from("\"1\"^^<http://www.w3.org/2001/XMLSchema#integer>").into())); + /// assert_eq!( + /// solutions.next().unwrap()?.get("nt"), + /// Some(&Literal::from("\"1\"^^<http://www.w3.org/2001/XMLSchema#integer>").into()) + /// ); /// } /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -241,21 +234,21 @@ impl QueryOptions { pub fn with_custom_function( mut self, name: NamedNode, - evaluator: impl Fn(&[Term]) -> Option<Term> + 'static, + evaluator: impl Fn(&[Term]) -> Option<Term> + Send + Sync + 'static, ) -> Self { - self.custom_functions.insert(name, Rc::new(evaluator)); + self.custom_functions.insert(name, Arc::new(evaluator)); self } - fn service_handler(&self) -> Rc<dyn ServiceHandler<Error = EvaluationError>> { + fn service_handler(&self) -> Arc<dyn ServiceHandler<Error = EvaluationError>> { self.service_handler.clone().unwrap_or_else(|| { - if cfg!(feature = "http_client") { - Rc::new(service::SimpleServiceHandler::new( + if cfg!(feature = "http-client") { + Arc::new(service::SimpleServiceHandler::new( self.http_timeout, self.http_redirection_limit, )) } else { - Rc::new(EmptyServiceHandler) + Arc::new(EmptyServiceHandler) } }) } @@ -285,28 +278,30 @@ impl From<QueryOptions> for UpdateOptions { /// The explanation of a query. #[derive(Clone)] pub struct QueryExplanation { - inner: Rc<PlanNodeWithStats>, + inner: Rc<EvalNodeWithStats>, with_stats: bool, - parsing_duration: Option<Duration>, - planning_duration: Duration, + parsing_duration: Option<DayTimeDuration>, + planning_duration: Option<DayTimeDuration>, } impl QueryExplanation { /// Writes the explanation as JSON. - pub fn write_in_json(&self, output: impl io::Write) -> io::Result<()> { - let mut writer = JsonWriter::from_writer(output); + pub fn write_in_json(&self, write: impl io::Write) -> io::Result<()> { + let mut writer = ToWriteJsonWriter::new(write); writer.write_event(JsonEvent::StartObject)?; if let Some(parsing_duration) = self.parsing_duration { - writer.write_event(JsonEvent::ObjectKey("parsing duration in seconds"))?; + writer.write_event(JsonEvent::ObjectKey("parsing duration in seconds".into()))?; writer.write_event(JsonEvent::Number( - &parsing_duration.as_secs_f32().to_string(), + parsing_duration.as_seconds().to_string().into(), ))?; } - writer.write_event(JsonEvent::ObjectKey("planning duration in seconds"))?; - writer.write_event(JsonEvent::Number( - &self.planning_duration.as_secs_f32().to_string(), - ))?; - writer.write_event(JsonEvent::ObjectKey("plan"))?; + if let Some(planning_duration) = self.planning_duration { + writer.write_event(JsonEvent::ObjectKey("planning duration in seconds".into()))?; + writer.write_event(JsonEvent::Number( + planning_duration.as_seconds().to_string().into(), + ))?; + } + writer.write_event(JsonEvent::ObjectKey("plan".into()))?; self.inner.json_node(&mut writer, self.with_stats)?; writer.write_event(JsonEvent::EndObject) } @@ -314,6 +309,20 @@ impl QueryExplanation { impl fmt::Debug for QueryExplanation { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self.inner) + let mut obj = f.debug_struct("QueryExplanation"); + if let Some(parsing_duration) = self.parsing_duration { + obj.field( + "parsing duration in seconds", + &f32::from(Float::from(parsing_duration.as_seconds())), + ); + } + if let Some(planning_duration) = self.planning_duration { + obj.field( + "planning duration in seconds", + &f32::from(Float::from(planning_duration.as_seconds())), + ); + } + obj.field("tree", &self.inner); + obj.finish_non_exhaustive() } } diff --git a/lib/oxigraph/src/sparql/model.rs b/lib/oxigraph/src/sparql/model.rs new file mode 100644 index 00000000..f3624ad5 --- /dev/null +++ b/lib/oxigraph/src/sparql/model.rs @@ -0,0 +1,373 @@ +use crate::io::{RdfFormat, RdfSerializer}; +use crate::model::*; +use crate::sparql::error::EvaluationError; +use crate::sparql::results::{ + FromReadQueryResultsReader, FromReadSolutionsReader, QueryResultsFormat, + QueryResultsParseError, QueryResultsParser, QueryResultsSerializer, +}; +use oxrdf::{Variable, VariableRef}; +pub use sparesults::QuerySolution; +use std::io::{Read, Write}; +use std::sync::Arc; + +/// Results of a [SPARQL query](https://www.w3.org/TR/sparql11-query/). +pub enum QueryResults { + /// Results of a [SELECT](https://www.w3.org/TR/sparql11-query/#select) query. + Solutions(QuerySolutionIter), + /// Result of a [ASK](https://www.w3.org/TR/sparql11-query/#ask) query. + Boolean(bool), + /// Results of a [CONSTRUCT](https://www.w3.org/TR/sparql11-query/#construct) or [DESCRIBE](https://www.w3.org/TR/sparql11-query/#describe) query. + Graph(QueryTripleIter), +} + +impl QueryResults { + /// Reads a SPARQL query results serialization. + pub fn read( + read: impl Read + 'static, + format: QueryResultsFormat, + ) -> Result<Self, QueryResultsParseError> { + Ok(QueryResultsParser::from_format(format) + .parse_read(read)? + .into()) + } + + /// Writes the query results (solutions or boolean). + /// + /// This method fails if it is called on the `Graph` results. + /// + /// ``` + /// use oxigraph::store::Store; + /// use oxigraph::model::*; + /// use oxigraph::sparql::results::QueryResultsFormat; + /// + /// let store = Store::new()?; + /// let ex = NamedNodeRef::new("http://example.com")?; + /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; + /// + /// let results = store.query("SELECT ?s WHERE { ?s ?p ?o }")?; + /// assert_eq!( + /// results.write(Vec::new(), QueryResultsFormat::Json)?, + /// r#"{"head":{"vars":["s"]},"results":{"bindings":[{"s":{"type":"uri","value":"http://example.com"}}]}}"#.as_bytes() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn write<W: Write>( + self, + write: W, + format: QueryResultsFormat, + ) -> Result<W, EvaluationError> { + let serializer = QueryResultsSerializer::from_format(format); + match self { + Self::Boolean(value) => serializer.serialize_boolean_to_write(write, value), + Self::Solutions(solutions) => { + let mut writer = serializer + .serialize_solutions_to_write(write, solutions.variables().to_vec()) + .map_err(EvaluationError::ResultsSerialization)?; + for solution in solutions { + writer + .write(&solution?) + .map_err(EvaluationError::ResultsSerialization)?; + } + writer.finish() + } + Self::Graph(triples) => { + let s = VariableRef::new_unchecked("subject"); + let p = VariableRef::new_unchecked("predicate"); + let o = VariableRef::new_unchecked("object"); + let mut writer = serializer + .serialize_solutions_to_write( + write, + vec![s.into_owned(), p.into_owned(), o.into_owned()], + ) + .map_err(EvaluationError::ResultsSerialization)?; + for triple in triples { + let triple = triple?; + writer + .write([ + (s, &triple.subject.into()), + (p, &triple.predicate.into()), + (o, &triple.object), + ]) + .map_err(EvaluationError::ResultsSerialization)?; + } + writer.finish() + } + } + .map_err(EvaluationError::ResultsSerialization) + } + + /// Writes the graph query results. + /// + /// This method fails if it is called on the `Solution` or `Boolean` results. + /// + /// ``` + /// use oxigraph::io::RdfFormat; + /// use oxigraph::model::*; + /// use oxigraph::store::Store; + /// + /// let graph = "<http://example.com> <http://example.com> <http://example.com> .\n"; + /// + /// let store = Store::new()?; + /// store.load_graph( + /// graph.as_bytes(), + /// RdfFormat::NTriples, + /// GraphName::DefaultGraph, + /// None, + /// )?; + /// + /// let results = store.query("CONSTRUCT WHERE { ?s ?p ?o }")?; + /// assert_eq!( + /// results.write_graph(Vec::new(), RdfFormat::NTriples)?, + /// graph.as_bytes() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn write_graph<W: Write>( + self, + write: W, + format: impl Into<RdfFormat>, + ) -> Result<W, EvaluationError> { + if let Self::Graph(triples) = self { + let mut writer = RdfSerializer::from_format(format.into()).serialize_to_write(write); + for triple in triples { + writer + .write_triple(&triple?) + .map_err(EvaluationError::ResultsSerialization)?; + } + writer + .finish() + .map_err(EvaluationError::ResultsSerialization) + } else { + Err(EvaluationError::NotAGraph) + } + } +} + +impl From<QuerySolutionIter> for QueryResults { + #[inline] + fn from(value: QuerySolutionIter) -> Self { + Self::Solutions(value) + } +} + +impl<R: Read + 'static> From<FromReadQueryResultsReader<R>> for QueryResults { + fn from(reader: FromReadQueryResultsReader<R>) -> Self { + match reader { + FromReadQueryResultsReader::Solutions(s) => Self::Solutions(s.into()), + FromReadQueryResultsReader::Boolean(v) => Self::Boolean(v), + } + } +} + +/// An iterator over [`QuerySolution`]s. +/// +/// ``` +/// use oxigraph::sparql::QueryResults; +/// use oxigraph::store::Store; +/// +/// let store = Store::new()?; +/// if let QueryResults::Solutions(solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }")? { +/// for solution in solutions { +/// println!("{:?}", solution?.get("s")); +/// } +/// } +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct QuerySolutionIter { + variables: Arc<[Variable]>, + iter: Box<dyn Iterator<Item = Result<QuerySolution, EvaluationError>>>, +} + +impl QuerySolutionIter { + /// Construct a new iterator of solution from an ordered list of solution variables and an iterator of solution tuples + /// (each tuple using the same ordering as the variable list such that tuple element 0 is the value for the variable 0...) + pub fn new( + variables: Arc<[Variable]>, + iter: impl Iterator<Item = Result<Vec<Option<Term>>, EvaluationError>> + 'static, + ) -> Self { + Self { + variables: Arc::clone(&variables), + iter: Box::new( + iter.map(move |t| t.map(|values| (Arc::clone(&variables), values).into())), + ), + } + } + + /// The variables used in the solutions. + /// + /// ``` + /// use oxigraph::sparql::{QueryResults, Variable}; + /// use oxigraph::store::Store; + /// + /// let store = Store::new()?; + /// if let QueryResults::Solutions(solutions) = store.query("SELECT ?s ?o WHERE { ?s ?p ?o }")? { + /// assert_eq!( + /// solutions.variables(), + /// &[Variable::new("s")?, Variable::new("o")?] + /// ); + /// } + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn variables(&self) -> &[Variable] { + &self.variables + } +} + +impl<R: Read + 'static> From<FromReadSolutionsReader<R>> for QuerySolutionIter { + fn from(reader: FromReadSolutionsReader<R>) -> Self { + Self { + variables: reader.variables().into(), + iter: Box::new(reader.map(|t| t.map_err(EvaluationError::from))), + } + } +} + +impl Iterator for QuerySolutionIter { + type Item = Result<QuerySolution, EvaluationError>; + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + self.iter.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } +} + +/// An iterator over the triples that compose a graph solution. +/// +/// ``` +/// use oxigraph::sparql::QueryResults; +/// use oxigraph::store::Store; +/// +/// let store = Store::new()?; +/// if let QueryResults::Graph(triples) = store.query("CONSTRUCT WHERE { ?s ?p ?o }")? { +/// for triple in triples { +/// println!("{}", triple?); +/// } +/// } +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct QueryTripleIter { + pub(crate) iter: Box<dyn Iterator<Item = Result<Triple, EvaluationError>>>, +} + +impl Iterator for QueryTripleIter { + type Item = Result<Triple, EvaluationError>; + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + self.iter.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } + + #[inline] + fn fold<Acc, G>(self, init: Acc, g: G) -> Acc + where + G: FnMut(Acc, Self::Item) -> Acc, + { + self.iter.fold(init, g) + } +} + +#[cfg(test)] +mod tests { + #![allow(clippy::panic_in_result_fn)] + + use super::*; + use std::io::Cursor; + + #[test] + fn test_serialization_roundtrip() -> Result<(), EvaluationError> { + use std::str; + + for format in [ + QueryResultsFormat::Json, + QueryResultsFormat::Xml, + QueryResultsFormat::Tsv, + ] { + let results = vec![ + QueryResults::Boolean(true), + QueryResults::Boolean(false), + QueryResults::Solutions(QuerySolutionIter::new( + [ + Variable::new_unchecked("foo"), + Variable::new_unchecked("bar"), + ] + .as_ref() + .into(), + Box::new( + vec![ + Ok(vec![None, None]), + Ok(vec![ + Some(NamedNode::new_unchecked("http://example.com").into()), + None, + ]), + Ok(vec![ + None, + Some(NamedNode::new_unchecked("http://example.com").into()), + ]), + Ok(vec![ + Some(BlankNode::new_unchecked("foo").into()), + Some(BlankNode::new_unchecked("bar").into()), + ]), + Ok(vec![Some(Literal::new_simple_literal("foo").into()), None]), + Ok(vec![ + Some( + Literal::new_language_tagged_literal_unchecked("foo", "fr") + .into(), + ), + None, + ]), + Ok(vec![ + Some(Literal::from(1).into()), + Some(Literal::from(true).into()), + ]), + Ok(vec![ + Some(Literal::from(1.33).into()), + Some(Literal::from(false).into()), + ]), + Ok(vec![ + Some( + Triple::new( + NamedNode::new_unchecked("http://example.com/s"), + NamedNode::new_unchecked("http://example.com/p"), + Triple::new( + NamedNode::new_unchecked("http://example.com/os"), + NamedNode::new_unchecked("http://example.com/op"), + NamedNode::new_unchecked("http://example.com/oo"), + ), + ) + .into(), + ), + None, + ]), + ] + .into_iter(), + ), + )), + ]; + + for ex in results { + let mut buffer = Vec::new(); + ex.write(&mut buffer, format)?; + let ex2 = QueryResults::read(Cursor::new(buffer.clone()), format)?; + let mut buffer2 = Vec::new(); + ex2.write(&mut buffer2, format)?; + assert_eq!( + str::from_utf8(&buffer).unwrap(), + str::from_utf8(&buffer2).unwrap() + ); + } + } + + Ok(()) + } +} diff --git a/lib/oxigraph/src/sparql/results.rs b/lib/oxigraph/src/sparql/results.rs new file mode 100644 index 00000000..00f8cc3d --- /dev/null +++ b/lib/oxigraph/src/sparql/results.rs @@ -0,0 +1,44 @@ +//! Utilities to read and write RDF results formats using [sparesults](https://crates.io/crates/sparesults). +//! +//! It supports [SPARQL Query Results XML Format (Second Edition)](https://www.w3.org/TR/rdf-sparql-XMLres/), [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) and [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/). +//! +//! Usage example converting a JSON result file into a TSV result file: +//! +//! ``` +//! use oxigraph::sparql::results::{QueryResultsFormat, QueryResultsParser, FromReadQueryResultsReader, QueryResultsSerializer}; +//! use std::io::Result; +//! +//! fn convert_json_to_tsv(json_file: &[u8]) -> Result<Vec<u8>> { +//! let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); +//! let tsv_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Tsv); +//! // We start to read the JSON file and see which kind of results it is +//! match json_parser.parse_read(json_file)? { +//! FromReadQueryResultsReader::Boolean(value) => { +//! // it's a boolean result, we copy it in TSV to the output buffer +//! tsv_serializer.serialize_boolean_to_write(Vec::new(), value) +//! } +//! FromReadQueryResultsReader::Solutions(solutions_reader) => { +//! // it's a set of solutions, we create a writer and we write to it while reading in streaming from the JSON file +//! let mut serialize_solutions_to_write = tsv_serializer.serialize_solutions_to_write(Vec::new(), solutions_reader.variables().to_vec())?; +//! for solution in solutions_reader { +//! serialize_solutions_to_write.write(&solution?)?; +//! } +//! serialize_solutions_to_write.finish() +//! } +//! } +//! } +//! +//! // Let's test with a boolean +//! assert_eq!( +//! convert_json_to_tsv(br#"{"boolean":true}"#.as_slice()).unwrap(), +//! b"true" +//! ); +//! +//! // And with a set of solutions +//! assert_eq!( +//! convert_json_to_tsv(br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#.as_slice()).unwrap(), +//! b"?foo\t?bar\n\"test\"\t\n" +//! ); +//! ``` + +pub use sparesults::*; diff --git a/lib/src/sparql/service.rs b/lib/oxigraph/src/sparql/service.rs similarity index 62% rename from lib/src/sparql/service.rs rename to lib/oxigraph/src/sparql/service.rs index 3d6576e2..e3dd5602 100644 --- a/lib/src/sparql/service.rs +++ b/lib/oxigraph/src/sparql/service.rs @@ -3,9 +3,8 @@ use crate::sparql::algebra::Query; use crate::sparql::error::EvaluationError; use crate::sparql::http::Client; use crate::sparql::model::QueryResults; -use crate::sparql::QueryResultsFormat; +use crate::sparql::results::QueryResultsFormat; use std::error::Error; -use std::io::BufReader; use std::time::Duration; /// Handler for [SPARQL 1.1 Federated Query](https://www.w3.org/TR/sparql11-federated-query/) SERVICE. @@ -14,18 +13,22 @@ use std::time::Duration; /// before evaluating a SPARQL query that uses SERVICE calls. /// /// ``` -/// use oxigraph::store::Store; /// use oxigraph::model::*; -/// use oxigraph::sparql::{QueryOptions, QueryResults, ServiceHandler, Query, EvaluationError}; +/// use oxigraph::sparql::{EvaluationError, Query, QueryOptions, QueryResults, ServiceHandler}; +/// use oxigraph::store::Store; /// /// struct TestServiceHandler { -/// store: Store +/// store: Store, /// } /// /// impl ServiceHandler for TestServiceHandler { /// type Error = EvaluationError; /// -/// fn handle(&self,service_name: NamedNode, query: Query) -> Result<QueryResults,EvaluationError> { +/// fn handle( +/// &self, +/// service_name: NamedNode, +/// query: Query, +/// ) -> Result<QueryResults, Self::Error> { /// if service_name == "http://example.com/service" { /// self.store.query(query) /// } else { @@ -36,20 +39,23 @@ use std::time::Duration; /// /// let store = Store::new()?; /// let service = TestServiceHandler { -/// store: Store::new()? +/// store: Store::new()?, /// }; /// let ex = NamedNodeRef::new("http://example.com")?; -/// service.store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; +/// service +/// .store +/// .insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; /// /// if let QueryResults::Solutions(mut solutions) = store.query_opt( /// "SELECT ?s WHERE { SERVICE <http://example.com/service> { ?s ?p ?o } }", -/// QueryOptions::default().with_service_handler(service) +/// QueryOptions::default().with_service_handler(service), /// )? { /// assert_eq!(solutions.next().unwrap()?.get("s"), Some(&ex.into())); /// } /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// ``` -pub trait ServiceHandler { +pub trait ServiceHandler: Send + Sync { + /// The service evaluation error. type Error: Error + Send + Sync + 'static; /// Evaluates a [`Query`] against a given service identified by a [`NamedNode`]. @@ -61,10 +67,8 @@ pub struct EmptyServiceHandler; impl ServiceHandler for EmptyServiceHandler { type Error = EvaluationError; - fn handle(&self, _: NamedNode, _: Query) -> Result<QueryResults, EvaluationError> { - Err(EvaluationError::msg( - "The SERVICE feature is not implemented", - )) + fn handle(&self, name: NamedNode, _: Query) -> Result<QueryResults, Self::Error> { + Err(EvaluationError::UnsupportedService(name)) } } @@ -81,14 +85,10 @@ impl<S: ServiceHandler> ErrorConversionServiceHandler<S> { impl<S: ServiceHandler> ServiceHandler for ErrorConversionServiceHandler<S> { type Error = EvaluationError; - fn handle( - &self, - service_name: NamedNode, - query: Query, - ) -> Result<QueryResults, EvaluationError> { + fn handle(&self, service_name: NamedNode, query: Query) -> Result<QueryResults, Self::Error> { self.handler .handle(service_name, query) - .map_err(EvaluationError::wrap) + .map_err(|e| EvaluationError::Service(Box::new(e))) } } @@ -107,22 +107,18 @@ impl SimpleServiceHandler { impl ServiceHandler for SimpleServiceHandler { type Error = EvaluationError; - fn handle( - &self, - service_name: NamedNode, - query: Query, - ) -> Result<QueryResults, EvaluationError> { - let (content_type, body) = self.client.post( - service_name.as_str(), - query.to_string().into_bytes(), - "application/sparql-query", - "application/sparql-results+json, application/sparql-results+xml", - )?; - let format = QueryResultsFormat::from_media_type(&content_type).ok_or_else(|| { - EvaluationError::msg(format!( - "Unsupported Content-Type returned by {service_name}: {content_type}" - )) - })?; - Ok(QueryResults::read(BufReader::new(body), format)?) + fn handle(&self, service_name: NamedNode, query: Query) -> Result<QueryResults, Self::Error> { + let (content_type, body) = self + .client + .post( + service_name.as_str(), + query.to_string().into_bytes(), + "application/sparql-query", + "application/sparql-results+json, application/sparql-results+xml", + ) + .map_err(|e| EvaluationError::Service(Box::new(e)))?; + let format = QueryResultsFormat::from_media_type(&content_type) + .ok_or_else(|| EvaluationError::UnsupportedContentType(content_type))?; + Ok(QueryResults::read(body, format)?) } } diff --git a/lib/src/sparql/update.rs b/lib/oxigraph/src/sparql/update.rs similarity index 90% rename from lib/src/sparql/update.rs rename to lib/oxigraph/src/sparql/update.rs index 2da5d08c..967de822 100644 --- a/lib/src/sparql/update.rs +++ b/lib/oxigraph/src/sparql/update.rs @@ -1,12 +1,9 @@ -use crate::io::read::ParseError; -use crate::io::{GraphFormat, GraphParser}; +use crate::io::{RdfFormat, RdfParser}; use crate::model::{GraphName as OxGraphName, GraphNameRef, Quad as OxQuad}; use crate::sparql::algebra::QueryDataset; use crate::sparql::dataset::DatasetView; -use crate::sparql::eval::SimpleEvaluator; +use crate::sparql::eval::{EncodedTuple, SimpleEvaluator}; use crate::sparql::http::Client; -use crate::sparql::plan::EncodedTuple; -use crate::sparql::plan_builder::PlanBuilder; use crate::sparql::{EvaluationError, Update, UpdateOptions}; use crate::storage::numeric_encoder::{Decoder, EncodedTerm}; use crate::storage::StorageWriter; @@ -18,9 +15,11 @@ use spargebra::term::{ Quad, QuadPattern, Subject, Term, TermPattern, Triple, TriplePattern, Variable, }; use spargebra::GraphUpdateOperation; +use sparopt::Optimizer; use std::collections::HashMap; -use std::io::BufReader; +use std::io; use std::rc::Rc; +use std::sync::Arc; pub fn evaluate_update<'a, 'b: 'a>( transaction: &'a mut StorageWriter<'b>, @@ -74,9 +73,7 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { } => self.eval_delete_insert( delete, insert, - using_dataset - .as_ref() - .ok_or_else(|| EvaluationError::msg("No dataset"))?, + using_dataset.as_ref().unwrap_or(&QueryDataset::new()), pattern, ), GraphUpdateOperation::Load { @@ -125,24 +122,24 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { algebra: &GraphPattern, ) -> Result<(), EvaluationError> { let dataset = Rc::new(DatasetView::new(self.transaction.reader(), using)); - let (plan, variables) = PlanBuilder::build( - &dataset, - algebra, - false, - &self.options.query_options.custom_functions, - !self.options.query_options.without_optimizations, - )?; + let mut pattern = sparopt::algebra::GraphPattern::from(algebra); + if !self.options.query_options.without_optimizations { + pattern = Optimizer::optimize_graph_pattern(sparopt::algebra::GraphPattern::Reduced { + inner: Box::new(pattern), + }); + } let evaluator = SimpleEvaluator::new( Rc::clone(&dataset), self.base_iri.clone(), self.options.query_options.service_handler(), - Rc::new(self.options.query_options.custom_functions.clone()), + Arc::new(self.options.query_options.custom_functions.clone()), false, ); + let mut variables = Vec::new(); let mut bnodes = HashMap::new(); - let (eval, _) = evaluator.plan_evaluator(Rc::new(plan)); + let (eval, _) = evaluator.graph_pattern_evaluator(&pattern, &mut variables); let tuples = - eval(EncodedTuple::with_capacity(variables.len())).collect::<Result<Vec<_>, _>>()?; //TODO: would be much better to stream + eval(EncodedTuple::with_capacity(variables.len())).collect::<Result<Vec<_>, _>>()?; // TODO: would be much better to stream for tuple in tuples { for quad in delete { if let Some(quad) = @@ -164,28 +161,31 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { } fn eval_load(&mut self, from: &NamedNode, to: &GraphName) -> Result<(), EvaluationError> { - let (content_type, body) = self.client.get( - from.as_str(), - "application/n-triples, text/turtle, application/rdf+xml", - )?; - let format = GraphFormat::from_media_type(&content_type).ok_or_else(|| { - EvaluationError::msg(format!( - "Unsupported Content-Type returned by {from}: {content_type}" - )) - })?; + let (content_type, body) = self + .client + .get( + from.as_str(), + "application/n-triples, text/turtle, application/rdf+xml", + ) + .map_err(|e| EvaluationError::Service(Box::new(e)))?; + let format = RdfFormat::from_media_type(&content_type) + .ok_or_else(|| EvaluationError::UnsupportedContentType(content_type))?; let to_graph_name = match to { GraphName::NamedNode(graph_name) => graph_name.into(), GraphName::DefaultGraph => GraphNameRef::DefaultGraph, }; - let mut parser = GraphParser::from_format(format); - if let Some(base_iri) = &self.base_iri { - parser = parser - .with_base_iri(base_iri.as_str()) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; - } - for t in parser.read_triples(BufReader::new(body))? { - self.transaction - .insert(t?.as_ref().in_graph(to_graph_name))?; + let mut parser = RdfParser::from_format(format) + .rename_blank_nodes() + .without_named_graphs() + .with_default_graph(to_graph_name); + parser = parser.with_base_iri(from.as_str()).map_err(|e| { + EvaluationError::Service(Box::new(io::Error::new( + io::ErrorKind::InvalidInput, + format!("Invalid URL: {from}: {e}"), + ))) + })?; + for q in parser.parse_read(body) { + self.transaction.insert(q?.as_ref())?; } Ok(()) } @@ -194,9 +194,7 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { if self.transaction.insert_named_graph(graph_name.into())? || silent { Ok(()) } else { - Err(EvaluationError::msg(format!( - "The graph {graph_name} already exists" - ))) + Err(EvaluationError::GraphAlreadyExists(graph_name.clone())) } } @@ -212,9 +210,7 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { } else if silent { Ok(()) } else { - Err(EvaluationError::msg(format!( - "The graph {graph} does not exists" - ))) + Err(EvaluationError::GraphDoesNotExist(graph_name.clone())) } } GraphTarget::DefaultGraph => { @@ -232,9 +228,7 @@ impl<'a, 'b: 'a> SimpleUpdateEvaluator<'a, 'b> { if self.transaction.remove_named_graph(graph_name.into())? || silent { Ok(()) } else { - Err(EvaluationError::msg(format!( - "The graph {graph_name} does not exists" - ))) + Err(EvaluationError::GraphDoesNotExist(graph_name.clone())) } } GraphTarget::DefaultGraph => { diff --git a/lib/src/storage/backend/fallback.rs b/lib/oxigraph/src/storage/backend/fallback.rs similarity index 86% rename from lib/src/storage/backend/fallback.rs rename to lib/oxigraph/src/storage/backend/fallback.rs index 6000863b..7214851e 100644 --- a/lib/src/storage/backend/fallback.rs +++ b/lib/oxigraph/src/storage/backend/fallback.rs @@ -1,6 +1,7 @@ //! TODO: This storage is dramatically naive. use crate::storage::StorageError; +use crate::store::CorruptionError; use std::cell::RefCell; use std::collections::{BTreeMap, HashMap}; use std::error::Error; @@ -30,9 +31,13 @@ impl Db { } #[allow(clippy::unwrap_in_result)] - pub fn column_family(&self, name: &'static str) -> Option<ColumnFamily> { - let name = ColumnFamily(name); - (self.0.read().unwrap().contains_key(&name)).then(|| name) + pub fn column_family(&self, name: &'static str) -> Result<ColumnFamily, StorageError> { + let column_family = ColumnFamily(name); + if self.0.read().unwrap().contains_key(&column_family) { + Ok(column_family) + } else { + Err(CorruptionError::from_missing_column_family_name(name).into()) + } } #[must_use] @@ -116,6 +121,7 @@ impl Reader { } } + #[allow(clippy::iter_not_returning_iterator)] pub fn iter(&self, column_family: &ColumnFamily) -> Result<Iter, StorageError> { self.scan_prefix(column_family, &[]) } @@ -129,9 +135,7 @@ impl Reader { let data: Vec<_> = match &self.0 { InnerReader::Simple(reader) => { let trees = reader.read().unwrap(); - let tree = if let Some(tree) = trees.get(column_family) { - tree - } else { + let Some(tree) = trees.get(column_family) else { return Ok(Iter { iter: Vec::new().into_iter(), current: None, @@ -147,28 +151,25 @@ impl Reader { } } InnerReader::Transaction(reader) => { - if let Some(reader) = reader.upgrade() { - let trees = (*reader).borrow(); - let tree = if let Some(tree) = trees.get(column_family) { - tree - } else { - return Ok(Iter { - iter: Vec::new().into_iter(), - current: None, - }); - }; - if prefix.is_empty() { - tree.iter().map(|(k, v)| (k.clone(), v.clone())).collect() - } else { - tree.range(prefix.to_vec()..) - .take_while(|(k, _)| k.starts_with(prefix)) - .map(|(k, v)| (k.clone(), v.clone())) - .collect() - } - } else { + let Some(reader) = reader.upgrade() else { return Err(StorageError::Other( "The transaction is already ended".into(), )); + }; + let trees = (*reader).borrow(); + let Some(tree) = trees.get(column_family) else { + return Ok(Iter { + iter: Vec::new().into_iter(), + current: None, + }); + }; + if prefix.is_empty() { + tree.iter().map(|(k, v)| (k.clone(), v.clone())).collect() + } else { + tree.range(prefix.to_vec()..) + .take_while(|(k, _)| k.starts_with(prefix)) + .map(|(k, v)| (k.clone(), v.clone())) + .collect() } } }; @@ -231,7 +232,7 @@ pub struct Transaction<'a>( impl Transaction<'_> { #[allow(unsafe_code, clippy::useless_transmute)] pub fn reader(&self) -> Reader { - // This transmute is safe because we take a weak reference and the only Rc reference used is guarded by the lifetime. + // SAFETY: This transmute is safe because we take a weak reference and the only Rc reference used is guarded by the lifetime. Reader(InnerReader::Transaction(Rc::downgrade(unsafe { transmute(&self.0) }))) diff --git a/lib/src/storage/backend/mod.rs b/lib/oxigraph/src/storage/backend/mod.rs similarity index 74% rename from lib/src/storage/backend/mod.rs rename to lib/oxigraph/src/storage/backend/mod.rs index 0fea9616..9261fd56 100644 --- a/lib/src/storage/backend/mod.rs +++ b/lib/oxigraph/src/storage/backend/mod.rs @@ -4,9 +4,7 @@ #[cfg(target_family = "wasm")] pub use fallback::{ColumnFamily, ColumnFamilyDefinition, Db, Iter, Reader, Transaction}; #[cfg(not(target_family = "wasm"))] -pub use rocksdb::{ - ColumnFamily, ColumnFamilyDefinition, Db, Iter, Reader, SstFileWriter, Transaction, -}; +pub use rocksdb::{ColumnFamily, ColumnFamilyDefinition, Db, Iter, Reader, Transaction}; #[cfg(target_family = "wasm")] mod fallback; diff --git a/lib/src/storage/backend/rocksdb.rs b/lib/oxigraph/src/storage/backend/rocksdb.rs similarity index 92% rename from lib/src/storage/backend/rocksdb.rs rename to lib/oxigraph/src/storage/backend/rocksdb.rs index fc8f4da2..6f5561f4 100644 --- a/lib/src/storage/backend/rocksdb.rs +++ b/lib/oxigraph/src/storage/backend/rocksdb.rs @@ -1,48 +1,42 @@ //! Code inspired by [Rust RocksDB](https://github.com/rust-rocksdb/rust-rocksdb) under Apache License 2.0. -#![allow(unsafe_code, trivial_casts)] +#![allow( + unsafe_code, + trivial_casts, + clippy::undocumented_unsafe_blocks, + clippy::panic_in_result_fn, + clippy::unwrap_in_result +)] use crate::storage::error::{CorruptionError, StorageError}; -use lazy_static::lazy_static; -use libc::{self, c_void, free}; +use libc::{self, c_void}; use oxrocksdb_sys::*; use rand::random; use std::borrow::Borrow; +#[cfg(unix)] use std::cmp::min; use std::collections::HashMap; use std::env::temp_dir; use std::error::Error; use std::ffi::{CStr, CString}; -use std::fmt; use std::fs::remove_dir_all; -use std::io; use std::marker::PhantomData; use std::ops::Deref; use std::path::{Path, PathBuf}; use std::rc::{Rc, Weak}; -use std::sync::Arc; +use std::sync::{Arc, OnceLock}; use std::thread::{available_parallelism, yield_now}; -use std::{ptr, slice}; +use std::{fmt, io, ptr, slice}; macro_rules! ffi_result { - ( $($function:ident)::*() ) => { - ffi_result_impl!($($function)::*()) - }; - - ( $($function:ident)::*( $arg1:expr $(, $arg:expr)* $(,)? ) ) => { - ffi_result_impl!($($function)::*($arg1 $(, $arg)* ,)) - }; -} - -macro_rules! ffi_result_impl { - ( $($function:ident)::*( $($arg:expr,)*) ) => {{ + ( $($function:ident)::*( $arg1:expr $(, $arg:expr)* $(,)? ) ) => {{ let mut status = rocksdb_status_t { code: rocksdb_status_code_t_rocksdb_status_code_ok, subcode: rocksdb_status_subcode_t_rocksdb_status_subcode_none, severity: rocksdb_status_severity_t_rocksdb_status_severity_none, string: ptr::null() }; - let result = $($function)::*($($arg,)* &mut status); + let result = $($function)::*($arg1 $(, $arg)* , &mut status); if status.code == rocksdb_status_code_t_rocksdb_status_code_ok { Ok(result) } else { @@ -51,23 +45,6 @@ macro_rules! ffi_result_impl { }} } -lazy_static! { - static ref ROCKSDB_ENV: UnsafeEnv = { - unsafe { - let env = rocksdb_create_default_env(); - assert!(!env.is_null(), "rocksdb_create_default_env returned null"); - UnsafeEnv(env) - } - }; - static ref ROCKSDB_MEM_ENV: UnsafeEnv = { - unsafe { - let env = rocksdb_create_mem_env(); - assert!(!env.is_null(), "rocksdb_create_mem_env returned null"); - UnsafeEnv(env) - } - }; -} - pub struct ColumnFamilyDefinition { pub name: &'static str, pub use_iter: bool, @@ -131,8 +108,7 @@ impl Drop for RwDbHandler { rocksdb_block_based_options_destroy(self.block_based_table_options); } if self.in_memory { - #[allow(clippy::let_underscore_must_use)] - let _ = remove_dir_all(&self.path); + drop(remove_dir_all(&self.path)); } } } @@ -166,8 +142,7 @@ impl Drop for RoDbHandler { rocksdb_options_destroy(self.options); } if let Some(path) = &self.path_to_remove { - #[allow(clippy::let_underscore_must_use)] - let _ = remove_dir_all(path); + drop(remove_dir_all(path)); } } } @@ -212,7 +187,7 @@ impl Db { 16, ); rocksdb_options_set_block_based_table_factory(options, block_based_table_options); - #[cfg(feature = "rocksdb_debug")] + #[cfg(feature = "rocksdb-debug")] { rocksdb_options_set_info_log_level(options, 0); rocksdb_options_enable_statistics(options); @@ -393,7 +368,7 @@ impl Db { cf_handles, cf_options, is_secondary: true, - path_to_remove: in_memory.then(|| secondary_path), + path_to_remove: in_memory.then_some(secondary_path), })), }) } @@ -466,6 +441,9 @@ impl Db { limit_max_open_files: bool, in_memory: bool, ) -> Result<*mut rocksdb_options_t, StorageError> { + static ROCKSDB_ENV: OnceLock<UnsafeEnv> = OnceLock::new(); + static ROCKSDB_MEM_ENV: OnceLock<UnsafeEnv> = OnceLock::new(); + unsafe { let options = rocksdb_options_create(); assert!(!options.is_null(), "rocksdb_options_create returned null"); @@ -502,10 +480,19 @@ impl Db { rocksdb_options_set_env( options, if in_memory { - ROCKSDB_MEM_ENV.0 + ROCKSDB_MEM_ENV.get_or_init(|| { + let env = rocksdb_create_mem_env(); + assert!(!env.is_null(), "rocksdb_create_mem_env returned null"); + UnsafeEnv(env) + }) } else { - ROCKSDB_ENV.0 - }, + ROCKSDB_ENV.get_or_init(|| { + let env = rocksdb_create_default_env(); + assert!(!env.is_null(), "rocksdb_create_default_env returned null"); + UnsafeEnv(env) + }) + } + .0, ); Ok(options) } @@ -551,17 +538,17 @@ impl Db { (column_family_names, c_column_family_names, cf_options) } - pub fn column_family(&self, name: &'static str) -> Option<ColumnFamily> { + pub fn column_family(&self, name: &'static str) -> Result<ColumnFamily, StorageError> { let (column_family_names, cf_handles) = match &self.inner { DbKind::ReadOnly(db) => (&db.column_family_names, &db.cf_handles), DbKind::ReadWrite(db) => (&db.column_family_names, &db.cf_handles), }; for (cf, cf_handle) in column_family_names.iter().zip(cf_handles) { if *cf == name { - return Some(ColumnFamily(*cf_handle)); + return Ok(ColumnFamily(*cf_handle)); } } - None + Err(CorruptionError::from_missing_column_family_name(name).into()) } #[must_use] @@ -571,8 +558,9 @@ impl Db { DbKind::ReadOnly(db) => { if db.is_secondary { // We try to refresh (and ignore the errors) - #[allow(clippy::let_underscore_must_use)] - let _ = ffi_result!(rocksdb_try_catch_up_with_primary_with_status(db.db)); + drop(ffi_result!(rocksdb_try_catch_up_with_primary_with_status( + db.db + ))); } let options = rocksdb_readoptions_create_copy(db.read_options); Reader { @@ -637,7 +625,7 @@ impl Db { ffi_result!(rocksdb_transaction_commit_with_status(transaction)); rocksdb_transaction_destroy(transaction); rocksdb_readoptions_destroy(read_options); - free(snapshot as *mut c_void); + rocksdb_free(snapshot as *mut c_void); r.map_err(StorageError::from)?; // We make sure to also run destructors if the commit fails } return Ok(result); @@ -648,7 +636,7 @@ impl Db { ffi_result!(rocksdb_transaction_rollback_with_status(transaction)); rocksdb_transaction_destroy(transaction); rocksdb_readoptions_destroy(read_options); - free(snapshot as *mut c_void); + rocksdb_free(snapshot as *mut c_void); r.map_err(StorageError::from)?; // We make sure to also run destructors if the commit fails } // We look for the root error @@ -721,7 +709,7 @@ impl Db { column_family: &ColumnFamily, key: &[u8], ) -> Result<bool, StorageError> { - Ok(self.get(column_family, key)?.is_some()) //TODO: optimize + Ok(self.get(column_family, key)?.is_some()) // TODO: optimize } pub fn insert( @@ -750,13 +738,14 @@ impl Db { } } - pub fn flush(&self, column_family: &ColumnFamily) -> Result<(), StorageError> { + pub fn flush(&self) -> Result<(), StorageError> { if let DbKind::ReadWrite(db) = &self.inner { unsafe { - ffi_result!(rocksdb_transactiondb_flush_cf_with_status( + ffi_result!(rocksdb_transactiondb_flush_cfs_with_status( db.db, db.flush_options, - column_family.0, + db.cf_handles.as_ptr().cast_mut(), + db.cf_handles.len().try_into().unwrap() )) }?; Ok(()) @@ -814,6 +803,9 @@ impl Db { &self, ssts_for_cf: &[(&ColumnFamily, PathBuf)], ) -> Result<(), StorageError> { + if ssts_for_cf.is_empty() { + return Ok(()); // Rocksdb does not support empty lists + } if let DbKind::ReadWrite(db) = &self.inner { let mut paths_by_cf = HashMap::<_, Vec<_>>::new(); for (cf, path) in ssts_for_cf { @@ -941,19 +933,18 @@ impl Reader { )) } InnerReader::Transaction(inner) => { - if let Some(inner) = inner.upgrade() { - ffi_result!(rocksdb_transaction_get_pinned_cf_with_status( - *inner, - self.options, - column_family.0, - key.as_ptr().cast(), - key.len() - )) - } else { + let Some(inner) = inner.upgrade() else { return Err(StorageError::Other( "The transaction is already ended".into(), )); - } + }; + ffi_result!(rocksdb_transaction_get_pinned_cf_with_status( + *inner, + self.options, + column_family.0, + key.as_ptr().cast(), + key.len() + )) } InnerReader::PlainDb(inner) => { ffi_result!(rocksdb_get_pinned_cf_with_status( @@ -978,9 +969,10 @@ impl Reader { column_family: &ColumnFamily, key: &[u8], ) -> Result<bool, StorageError> { - Ok(self.get(column_family, key)?.is_some()) //TODO: optimize + Ok(self.get(column_family, key)?.is_some()) // TODO: optimize } + #[allow(clippy::iter_not_returning_iterator)] pub fn iter(&self, column_family: &ColumnFamily) -> Result<Iter, StorageError> { self.scan_prefix(column_family, &[]) } @@ -990,7 +982,7 @@ impl Reader { column_family: &ColumnFamily, prefix: &[u8], ) -> Result<Iter, StorageError> { - //We generate the upper bound + // We generate the upper bound let upper_bound = { let mut bound = prefix.to_vec(); let mut found = false; @@ -1001,7 +993,7 @@ impl Reader { break; } } - found.then(|| bound) + found.then_some(bound) }; unsafe { @@ -1022,13 +1014,12 @@ impl Reader { rocksdb_transactiondb_create_iterator_cf(inner.db.db, options, column_family.0) } InnerReader::Transaction(inner) => { - if let Some(inner) = inner.upgrade() { - rocksdb_transaction_create_iterator_cf(*inner, options, column_family.0) - } else { + let Some(inner) = inner.upgrade() else { return Err(StorageError::Other( "The transaction is already ended".into(), )); - } + }; + rocksdb_transaction_create_iterator_cf(*inner, options, column_family.0) } InnerReader::PlainDb(inner) => { rocksdb_create_iterator_cf(inner.db, options, column_family.0) @@ -1109,7 +1100,7 @@ impl Transaction<'_> { column_family: &ColumnFamily, key: &[u8], ) -> Result<bool, StorageError> { - Ok(self.get_for_update(column_family, key)?.is_some()) //TODO: optimize + Ok(self.get_for_update(column_family, key)?.is_some()) // TODO: optimize } pub fn insert( @@ -1165,7 +1156,7 @@ impl Drop for PinnableSlice { impl Deref for PinnableSlice { type Target = [u8]; - fn deref(&self) -> &[u8] { + fn deref(&self) -> &Self::Target { unsafe { let mut len = 0; let val = rocksdb_pinnableslice_value(self.0, &mut len); @@ -1200,7 +1191,7 @@ pub struct Buffer { impl Drop for Buffer { fn drop(&mut self) { unsafe { - free(self.base.cast()); + rocksdb_free(self.base.cast()); } } } @@ -1208,7 +1199,7 @@ impl Drop for Buffer { impl Deref for Buffer { type Target = [u8]; - fn deref(&self) -> &[u8] { + fn deref(&self) -> &Self::Target { unsafe { slice::from_raw_parts(self.base, self.len) } } } @@ -1236,7 +1227,7 @@ pub struct Iter { is_currently_valid: bool, _upper_bound: Option<Vec<u8>>, _reader: Reader, // needed to ensure that DB still lives while iter is used - options: *mut rocksdb_readoptions_t, // needed to ensure that options still lives while iter is used + options: *mut rocksdb_readoptions_t, /* needed to ensure that options still lives while iter is used */ } impl Drop for Iter { @@ -1324,6 +1315,8 @@ impl SstFileWriter { } } +#[derive(thiserror::Error)] +#[error("{}", self.message())] struct ErrorStatus(rocksdb_status_t); unsafe impl Send for ErrorStatus {} @@ -1333,7 +1326,7 @@ impl Drop for ErrorStatus { fn drop(&mut self) { if !self.0.string.is_null() { unsafe { - free(self.0.string as *mut c_void); + rocksdb_free(self.0.string as *mut c_void); } } } @@ -1362,14 +1355,6 @@ impl fmt::Debug for ErrorStatus { } } -impl fmt::Display for ErrorStatus { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.message()) - } -} - -impl Error for ErrorStatus {} - impl From<ErrorStatus> for StorageError { fn from(status: ErrorStatus) -> Self { if status.0.code == rocksdb_status_code_t_rocksdb_status_code_io_error { @@ -1394,7 +1379,8 @@ impl From<ErrorStatus> for StorageError { struct UnsafeEnv(*mut rocksdb_env_t); -// Hack for lazy_static. OK because only written in lazy static and used in a thread-safe way by RocksDB +// Hack for OnceCell. OK because only written in OnceCell and used in a thread-safe way by RocksDB +unsafe impl Send for UnsafeEnv {} unsafe impl Sync for UnsafeEnv {} fn path_to_cstring(path: &Path) -> Result<CString, StorageError> { @@ -1413,7 +1399,7 @@ fn path_to_cstring(path: &Path) -> Result<CString, StorageError> { } #[cfg(unix)] -fn available_file_descriptors() -> io::Result<Option<u64>> { +fn available_file_descriptors() -> io::Result<Option<libc::rlim_t>> { let mut rlimit = libc::rlimit { rlim_cur: 0, rlim_max: 0, @@ -1426,12 +1412,12 @@ fn available_file_descriptors() -> io::Result<Option<u64>> { } #[cfg(windows)] -fn available_file_descriptors() -> io::Result<Option<u64>> { +fn available_file_descriptors() -> io::Result<Option<libc::c_int>> { Ok(Some(512)) // https://docs.microsoft.com/en-us/cpp/c-runtime-library/file-handling } #[cfg(not(any(unix, windows)))] -fn available_file_descriptors() -> io::Result<Option<u64>> { +fn available_file_descriptors() -> io::Result<Option<libc::c_int>> { Ok(None) } diff --git a/lib/src/storage/binary_encoder.rs b/lib/oxigraph/src/storage/binary_encoder.rs similarity index 96% rename from lib/src/storage/binary_encoder.rs rename to lib/oxigraph/src/storage/binary_encoder.rs index 3bd72896..c0dbb775 100644 --- a/lib/src/storage/binary_encoder.rs +++ b/lib/oxigraph/src/storage/binary_encoder.rs @@ -2,7 +2,7 @@ use crate::storage::error::{CorruptionError, StorageError}; use crate::storage::numeric_encoder::{EncodedQuad, EncodedTerm, EncodedTriple, StrHash}; use crate::storage::small_string::SmallString; use oxsdatatypes::*; -use std::io::{Cursor, Read}; +use std::io::Read; use std::mem::size_of; #[cfg(not(target_family = "wasm"))] @@ -62,24 +62,23 @@ pub enum QuadEncoding { } impl QuadEncoding { - pub fn decode(self, buffer: &[u8]) -> Result<EncodedQuad, StorageError> { - let mut cursor = Cursor::new(&buffer); + pub fn decode(self, mut buffer: &[u8]) -> Result<EncodedQuad, StorageError> { match self { - Self::Spog => cursor.read_spog_quad(), - Self::Posg => cursor.read_posg_quad(), - Self::Ospg => cursor.read_ospg_quad(), - Self::Gspo => cursor.read_gspo_quad(), - Self::Gpos => cursor.read_gpos_quad(), - Self::Gosp => cursor.read_gosp_quad(), - Self::Dspo => cursor.read_dspo_quad(), - Self::Dpos => cursor.read_dpos_quad(), - Self::Dosp => cursor.read_dosp_quad(), + Self::Spog => buffer.read_spog_quad(), + Self::Posg => buffer.read_posg_quad(), + Self::Ospg => buffer.read_ospg_quad(), + Self::Gspo => buffer.read_gspo_quad(), + Self::Gpos => buffer.read_gpos_quad(), + Self::Gosp => buffer.read_gosp_quad(), + Self::Dspo => buffer.read_dspo_quad(), + Self::Dpos => buffer.read_dpos_quad(), + Self::Dosp => buffer.read_dosp_quad(), } } } -pub fn decode_term(buffer: &[u8]) -> Result<EncodedTerm, StorageError> { - Cursor::new(&buffer).read_term() +pub fn decode_term(mut buffer: &[u8]) -> Result<EncodedTerm, StorageError> { + buffer.read_term() } pub trait TermReader { @@ -635,6 +634,8 @@ pub fn write_term(sink: &mut Vec<u8>, term: &EncodedTerm) { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; use crate::model::TermRef; use crate::storage::numeric_encoder::*; @@ -650,10 +651,6 @@ mod tests { fn get_str(&self, key: &StrHash) -> Result<Option<String>, StorageError> { Ok(self.id2str.borrow().get(key).cloned()) } - - fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError> { - Ok(self.id2str.borrow().contains_key(key)) - } } impl MemoryStrStore { @@ -741,7 +738,7 @@ mod tests { let mut buffer = Vec::new(); write_term(&mut buffer, &encoded); - assert_eq!(encoded, Cursor::new(&buffer).read_term().unwrap()); + assert_eq!(encoded, buffer.as_slice().read_term().unwrap()); } } } diff --git a/lib/oxigraph/src/storage/error.rs b/lib/oxigraph/src/storage/error.rs new file mode 100644 index 00000000..d58d0316 --- /dev/null +++ b/lib/oxigraph/src/storage/error.rs @@ -0,0 +1,139 @@ +use crate::io::{RdfFormat, RdfParseError}; +use crate::storage::numeric_encoder::EncodedTerm; +use oxiri::IriParseError; +use oxrdf::TermRef; +use std::error::Error; +use std::io; + +/// An error related to storage operations (reads, writes...). +#[derive(Debug, thiserror::Error)] +#[non_exhaustive] +pub enum StorageError { + /// Error from the OS I/O layer. + #[error(transparent)] + Io(#[from] io::Error), + /// Error related to data corruption. + #[error(transparent)] + Corruption(#[from] CorruptionError), + #[doc(hidden)] + #[error("{0}")] + Other(#[source] Box<dyn Error + Send + Sync + 'static>), +} + +impl From<StorageError> for io::Error { + #[inline] + fn from(error: StorageError) -> Self { + match error { + StorageError::Io(error) => error, + StorageError::Corruption(error) => error.into(), + StorageError::Other(error) => Self::new(io::ErrorKind::Other, error), + } + } +} + +/// An error return if some content in the database is corrupted. +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct CorruptionError(#[from] CorruptionErrorKind); + +/// An error return if some content in the database is corrupted. +#[derive(Debug, thiserror::Error)] +enum CorruptionErrorKind { + #[error("{0}")] + Msg(String), + #[error("{0}")] + Other(#[source] Box<dyn Error + Send + Sync + 'static>), +} + +impl CorruptionError { + /// Builds an error from a printable error message. + #[inline] + pub(crate) fn new(error: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self { + Self(CorruptionErrorKind::Other(error.into())) + } + + #[inline] + pub(crate) fn from_encoded_term(encoded: &EncodedTerm, term: &TermRef<'_>) -> Self { + // TODO: eventually use a dedicated error enum value + Self::msg(format!("Invalid term encoding {encoded:?} for {term}")) + } + + #[inline] + pub(crate) fn from_missing_column_family_name(name: &'static str) -> Self { + // TODO: eventually use a dedicated error enum value + Self::msg(format!("Column family {name} does not exist")) + } + + /// Builds an error from a printable error message. + #[inline] + pub(crate) fn msg(msg: impl Into<String>) -> Self { + Self(CorruptionErrorKind::Msg(msg.into())) + } +} + +impl From<CorruptionError> for io::Error { + #[inline] + fn from(error: CorruptionError) -> Self { + Self::new(io::ErrorKind::InvalidData, error) + } +} + +/// An error raised while loading a file into a [`Store`](crate::store::Store). +#[derive(Debug, thiserror::Error)] +pub enum LoaderError { + /// An error raised while reading the file. + #[error(transparent)] + Parsing(#[from] RdfParseError), + /// An error raised during the insertion in the store. + #[error(transparent)] + Storage(#[from] StorageError), + /// The base IRI is invalid. + #[error("Invalid base IRI '{iri}': {error}")] + InvalidBaseIri { + /// The IRI itself. + iri: String, + /// The parsing error. + #[source] + error: IriParseError, + }, +} + +impl From<LoaderError> for io::Error { + #[inline] + fn from(error: LoaderError) -> Self { + match error { + LoaderError::Storage(error) => error.into(), + LoaderError::Parsing(error) => error.into(), + LoaderError::InvalidBaseIri { .. } => { + Self::new(io::ErrorKind::InvalidInput, error.to_string()) + } + } + } +} + +/// An error raised while writing a file from a [`Store`](crate::store::Store). +#[derive(Debug, thiserror::Error)] +pub enum SerializerError { + /// An error raised while writing the content. + #[error(transparent)] + Io(#[from] io::Error), + /// An error raised during the lookup in the store. + #[error(transparent)] + Storage(#[from] StorageError), + /// A format compatible with [RDF dataset](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset) is required. + #[error("A RDF format supporting datasets was expected, {0} found")] + DatasetFormatExpected(RdfFormat), +} + +impl From<SerializerError> for io::Error { + #[inline] + fn from(error: SerializerError) -> Self { + match error { + SerializerError::Storage(error) => error.into(), + SerializerError::Io(error) => error, + SerializerError::DatasetFormatExpected(_) => { + Self::new(io::ErrorKind::InvalidInput, error.to_string()) + } + } + } +} diff --git a/lib/src/storage/mod.rs b/lib/oxigraph/src/storage/mod.rs similarity index 89% rename from lib/src/storage/mod.rs rename to lib/oxigraph/src/storage/mod.rs index d0f272f4..1dc6e62f 100644 --- a/lib/src/storage/mod.rs +++ b/lib/oxigraph/src/storage/mod.rs @@ -22,13 +22,9 @@ use std::mem::swap; #[cfg(not(target_family = "wasm"))] use std::path::Path; #[cfg(not(target_family = "wasm"))] -use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::Mutex; #[cfg(not(target_family = "wasm"))] -use std::sync::Arc; -#[cfg(not(target_family = "wasm"))] -use std::thread::spawn; -#[cfg(not(target_family = "wasm"))] -use std::thread::JoinHandle; +use std::{io, thread}; use self::storage_generator::StorageGenerator; @@ -240,6 +236,13 @@ impl StorageReader { pub fn validate(&self) -> Result<(), StorageError> { Ok(()) } + + /// Validates that all the storage invariants held in the data + #[cfg(target_family = "wasm")] + #[allow(clippy::unused_self, clippy::unnecessary_wraps)] + pub fn validate(&self) -> Result<(), StorageError> { + Ok(()) // TODO + } } pub struct ChainedDecodingQuadIterator { @@ -266,7 +269,7 @@ impl ChainedDecodingQuadIterator { impl Iterator for ChainedDecodingQuadIterator { type Item = Result<EncodedQuad, StorageError>; - fn next(&mut self) -> Option<Result<EncodedQuad, StorageError>> { + fn next(&mut self) -> Option<Self::Item> { if let Some(result) = self.first.next() { Some(result) } else if let Some(second) = self.second.as_mut() { @@ -316,10 +319,6 @@ impl StrLookup for StorageReader { fn get_str(&self, key: &StrHash) -> Result<Option<String>, StorageError> { self.get_str(key) } - - fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError> { - self.contains_str(key) - } } pub struct StorageWriter<'a> { @@ -646,6 +645,7 @@ impl<'a> StorageWriter<'a> { } #[cfg(not(target_family = "wasm"))] +#[must_use] pub struct StorageBulkLoader { storage: Storage, hooks: Vec<Box<dyn Fn(u64)>>, @@ -664,12 +664,12 @@ impl StorageBulkLoader { } } - pub fn set_num_threads(mut self, num_threads: usize) -> Self { + pub fn with_num_threads(mut self, num_threads: usize) -> Self { self.num_threads = Some(num_threads); self } - pub fn set_max_memory_size_in_megabytes(mut self, max_memory_size: usize) -> Self { + pub fn with_max_memory_size_in_megabytes(mut self, max_memory_size: usize) -> Self { self.max_memory_size = Some(max_memory_size); self } @@ -701,81 +701,92 @@ impl StorageBulkLoader { ) .into()); } - let mut threads = VecDeque::with_capacity(num_threads - 1); - let mut buffer = Vec::with_capacity(batch_size); - let done_counter = Arc::new(AtomicU64::new(0)); + let done_counter = Mutex::new(0); let mut done_and_displayed_counter = 0; - for quad in quads { - let quad = quad?; - buffer.push(quad); - if buffer.len() >= batch_size { - self.spawn_load_thread( - &mut buffer, - &mut threads, - &done_counter, - &mut done_and_displayed_counter, - num_threads, - batch_size, - )?; + thread::scope(|thread_scope| { + let mut threads = VecDeque::with_capacity(num_threads - 1); + let mut buffer = Vec::with_capacity(batch_size); + for quad in quads { + let quad = quad?; + buffer.push(quad); + if buffer.len() >= batch_size { + self.spawn_load_thread( + &mut buffer, + &mut threads, + thread_scope, + &done_counter, + &mut done_and_displayed_counter, + num_threads, + batch_size, + )?; + } } - } - self.spawn_load_thread( - &mut buffer, - &mut threads, - &done_counter, - &mut done_and_displayed_counter, - num_threads, - batch_size, - )?; - for thread in threads { - thread.join().unwrap()?; - self.on_possible_progress(&done_counter, &mut done_and_displayed_counter); - } - Ok(()) + self.spawn_load_thread( + &mut buffer, + &mut threads, + thread_scope, + &done_counter, + &mut done_and_displayed_counter, + num_threads, + batch_size, + )?; + for thread in threads { + map_thread_result(thread.join()).map_err(StorageError::Io)??; + self.on_possible_progress(&done_counter, &mut done_and_displayed_counter)?; + } + Ok(()) + }) } - fn spawn_load_thread( - &self, + fn spawn_load_thread<'scope>( + &'scope self, buffer: &mut Vec<Quad>, - threads: &mut VecDeque<JoinHandle<Result<(), StorageError>>>, - done_counter: &Arc<AtomicU64>, + threads: &mut VecDeque<thread::ScopedJoinHandle<'scope, Result<(), StorageError>>>, + thread_scope: &'scope thread::Scope<'scope, '_>, + done_counter: &'scope Mutex<u64>, done_and_displayed_counter: &mut u64, num_threads: usize, batch_size: usize, ) -> Result<(), StorageError> { - self.on_possible_progress(done_counter, done_and_displayed_counter); + self.on_possible_progress(done_counter, done_and_displayed_counter)?; // We avoid to have too many threads if threads.len() >= num_threads { if let Some(thread) = threads.pop_front() { - thread.join().unwrap()?; - self.on_possible_progress(done_counter, done_and_displayed_counter); + map_thread_result(thread.join()).map_err(StorageError::Io)??; + self.on_possible_progress(done_counter, done_and_displayed_counter)?; } } let mut buffer_to_load = Vec::with_capacity(batch_size); swap(buffer, &mut buffer_to_load); - let storage = self.storage.clone(); - let done_counter_clone = Arc::clone(done_counter); - threads.push_back(spawn(move || { - FileBulkLoader::new(storage, batch_size).load(buffer_to_load, &done_counter_clone) + let storage = &self.storage; + threads.push_back(thread_scope.spawn(move || { + FileBulkLoader::new(storage, batch_size).load(buffer_to_load, done_counter) })); Ok(()) } - fn on_possible_progress(&self, done: &AtomicU64, done_and_displayed: &mut u64) { - let new_counter = done.load(Ordering::Relaxed); - let display_step = u64::try_from(DEFAULT_BULK_LOAD_BATCH_SIZE).unwrap(); + fn on_possible_progress( + &self, + done: &Mutex<u64>, + done_and_displayed: &mut u64, + ) -> Result<(), StorageError> { + let new_counter = *done + .lock() + .map_err(|_| io::Error::new(io::ErrorKind::Other, "Mutex poisoned"))?; + let display_step = DEFAULT_BULK_LOAD_BATCH_SIZE as u64; if new_counter / display_step > *done_and_displayed / display_step { for hook in &self.hooks { hook(new_counter); } } *done_and_displayed = new_counter; + Ok(()) } } #[cfg(not(target_family = "wasm"))] -struct FileBulkLoader { - storage: Storage, +struct FileBulkLoader<'a> { + storage: &'a Storage, id2str: HashMap<StrHash, Box<str>>, quads: HashSet<EncodedQuad>, triples: HashSet<EncodedQuad>, @@ -783,8 +794,8 @@ struct FileBulkLoader { } #[cfg(not(target_family = "wasm"))] -impl FileBulkLoader { - fn new(storage: Storage, batch_size: usize) -> Self { +impl<'a> FileBulkLoader<'a> { + fn new(storage: &'a Storage, batch_size: usize) -> Self { Self { storage, id2str: HashMap::with_capacity(3 * batch_size), @@ -794,11 +805,14 @@ impl FileBulkLoader { } } - fn load(&mut self, quads: Vec<Quad>, counter: &AtomicU64) -> Result<(), StorageError> { + fn load(&mut self, quads: Vec<Quad>, counter: &Mutex<u64>) -> Result<(), StorageError> { self.encode(quads)?; let size = self.triples.len() + self.quads.len(); - // self.save()?; - counter.fetch_add(size.try_into().unwrap(), Ordering::Relaxed); + //self.save()?; + *counter + .lock() + .map_err(|_| io::Error::new(io::ErrorKind::Other, "Mutex poisoned"))? += + size.try_into().unwrap_or(u64::MAX); Ok(()) } @@ -821,7 +835,12 @@ impl FileBulkLoader { match quad.graph_name.as_ref() { GraphNameRef::NamedNode(n) => n.into(), GraphNameRef::BlankNode(n) => n.into(), - GraphNameRef::DefaultGraph => unreachable!(), + GraphNameRef::DefaultGraph => { + return Err(CorruptionError::new( + "Default graph this not the default graph", + ) + .into()) + } }, &encoded.graph_name, )?; @@ -979,3 +998,17 @@ impl FileBulkLoader { // sst.finish() // } } + +#[cfg(not(target_family = "wasm"))] +fn map_thread_result<R>(result: thread::Result<R>) -> io::Result<R> { + result.map_err(|e| { + io::Error::new( + io::ErrorKind::Other, + if let Ok(e) = e.downcast::<&dyn std::fmt::Display>() { + format!("A loader processed crashed with {e}") + } else { + "A loader processed crashed with and unknown error".into() + }, + ) + }) +} diff --git a/lib/src/storage/numeric_encoder.rs b/lib/oxigraph/src/storage/numeric_encoder.rs similarity index 96% rename from lib/src/storage/numeric_encoder.rs rename to lib/oxigraph/src/storage/numeric_encoder.rs index d7ce6848..85bf161a 100644 --- a/lib/src/storage/numeric_encoder.rs +++ b/lib/oxigraph/src/storage/numeric_encoder.rs @@ -6,10 +6,9 @@ use crate::storage::small_string::SmallString; use oxsdatatypes::*; use siphasher::sip128::{Hasher128, SipHasher24}; use std::fmt::Debug; -use std::hash::Hash; -use std::hash::Hasher; -use std::rc::Rc; +use std::hash::{Hash, Hasher}; use std::str; +use std::sync::Arc; #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] #[repr(transparent)] @@ -97,7 +96,7 @@ pub enum EncodedTerm { DurationLiteral(Duration), YearMonthDurationLiteral(YearMonthDuration), DayTimeDurationLiteral(DayTimeDuration), - Triple(Rc<EncodedTriple>), + Triple(Arc<EncodedTriple>), } impl PartialEq for EncodedTerm { @@ -191,24 +190,24 @@ impl PartialEq for EncodedTerm { }, ) => value_id_a == value_id_b && datatype_id_a == datatype_id_b, (Self::BooleanLiteral(a), Self::BooleanLiteral(b)) => a == b, - (Self::FloatLiteral(a), Self::FloatLiteral(b)) => a.is_identical_with(b), - (Self::DoubleLiteral(a), Self::DoubleLiteral(b)) => a.is_identical_with(b), - (Self::IntegerLiteral(a), Self::IntegerLiteral(b)) => a.is_identical_with(b), - (Self::DecimalLiteral(a), Self::DecimalLiteral(b)) => a.is_identical_with(b), - (Self::DateTimeLiteral(a), Self::DateTimeLiteral(b)) => a.is_identical_with(b), - (Self::TimeLiteral(a), Self::TimeLiteral(b)) => a.is_identical_with(b), - (Self::DateLiteral(a), Self::DateLiteral(b)) => a.is_identical_with(b), - (Self::GYearMonthLiteral(a), Self::GYearMonthLiteral(b)) => a.is_identical_with(b), - (Self::GYearLiteral(a), Self::GYearLiteral(b)) => a.is_identical_with(b), - (Self::GMonthDayLiteral(a), Self::GMonthDayLiteral(b)) => a.is_identical_with(b), - (Self::GMonthLiteral(a), Self::GMonthLiteral(b)) => a.is_identical_with(b), - (Self::GDayLiteral(a), Self::GDayLiteral(b)) => a.is_identical_with(b), - (Self::DurationLiteral(a), Self::DurationLiteral(b)) => a.is_identical_with(b), + (Self::FloatLiteral(a), Self::FloatLiteral(b)) => a.is_identical_with(*b), + (Self::DoubleLiteral(a), Self::DoubleLiteral(b)) => a.is_identical_with(*b), + (Self::IntegerLiteral(a), Self::IntegerLiteral(b)) => a.is_identical_with(*b), + (Self::DecimalLiteral(a), Self::DecimalLiteral(b)) => a.is_identical_with(*b), + (Self::DateTimeLiteral(a), Self::DateTimeLiteral(b)) => a.is_identical_with(*b), + (Self::TimeLiteral(a), Self::TimeLiteral(b)) => a.is_identical_with(*b), + (Self::DateLiteral(a), Self::DateLiteral(b)) => a.is_identical_with(*b), + (Self::GYearMonthLiteral(a), Self::GYearMonthLiteral(b)) => a.is_identical_with(*b), + (Self::GYearLiteral(a), Self::GYearLiteral(b)) => a.is_identical_with(*b), + (Self::GMonthDayLiteral(a), Self::GMonthDayLiteral(b)) => a.is_identical_with(*b), + (Self::GMonthLiteral(a), Self::GMonthLiteral(b)) => a.is_identical_with(*b), + (Self::GDayLiteral(a), Self::GDayLiteral(b)) => a.is_identical_with(*b), + (Self::DurationLiteral(a), Self::DurationLiteral(b)) => a.is_identical_with(*b), (Self::YearMonthDurationLiteral(a), Self::YearMonthDurationLiteral(b)) => { - a.is_identical_with(b) + a.is_identical_with(*b) } (Self::DayTimeDurationLiteral(a), Self::DayTimeDurationLiteral(b)) => { - a.is_identical_with(b) + a.is_identical_with(*b) } (Self::Triple(a), Self::Triple(b)) => a == b, (_, _) => false, @@ -486,7 +485,7 @@ impl From<DayTimeDuration> for EncodedTerm { impl From<EncodedTriple> for EncodedTerm { fn from(value: EncodedTriple) -> Self { - Self::Triple(Rc::new(value)) + Self::Triple(Arc::new(value)) } } @@ -650,7 +649,7 @@ impl From<GraphNameRef<'_>> for EncodedTerm { impl From<TripleRef<'_>> for EncodedTerm { fn from(triple: TripleRef<'_>) -> Self { - Self::Triple(Rc::new(triple.into())) + Self::Triple(Arc::new(triple.into())) } } @@ -718,8 +717,6 @@ impl From<QuadRef<'_>> for EncodedQuad { pub trait StrLookup { fn get_str(&self, key: &StrHash) -> Result<Option<String>, StorageError>; - - fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError>; } pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( @@ -732,13 +729,13 @@ pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( if let EncodedTerm::NamedNode { iri_id, value } = encoded { insert_str(iri_id, node.as_str()) } else { - unreachable!("Invalid term encoding {:?} for {}", encoded, term) + Err(CorruptionError::from_encoded_term(encoded, &term).into()) } } TermRef::BlankNode(node) => match encoded { EncodedTerm::BigBlankNode { id_id } => insert_str(id_id, node.as_str()), EncodedTerm::SmallBlankNode(..) | EncodedTerm::NumericalBlankNode { .. } => Ok(()), - _ => unreachable!("Invalid term encoding {:?} for {}", encoded, term), + _ => Err(CorruptionError::from_encoded_term(encoded, &term).into()), }, TermRef::Literal(literal) => match encoded { EncodedTerm::BigStringLiteral { value_id } @@ -749,7 +746,7 @@ pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( if let Some(language) = literal.language() { insert_str(language_id, language) } else { - unreachable!("Invalid term encoding {:?} for {}", encoded, term) + Err(CorruptionError::from_encoded_term(encoded, &term).into()) } } EncodedTerm::BigBigLangStringLiteral { @@ -760,7 +757,7 @@ pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( if let Some(language) = literal.language() { insert_str(language_id, language) } else { - unreachable!("Invalid term encoding {:?} for {}", encoded, term) + Err(CorruptionError::from_encoded_term(encoded, &term).into()) } } EncodedTerm::SmallTypedLiteral { datatype_id, .. } => { @@ -791,7 +788,7 @@ pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( | EncodedTerm::DurationLiteral(..) | EncodedTerm::YearMonthDurationLiteral(..) | EncodedTerm::DayTimeDurationLiteral(..) => Ok(()), - _ => unreachable!("Invalid term encoding {:?} for {}", encoded, term), + _ => Err(CorruptionError::from_encoded_term(encoded, &term).into()), }, TermRef::Triple(triple) => { if let EncodedTerm::Triple(encoded) = encoded { @@ -803,7 +800,7 @@ pub fn insert_term<F: FnMut(&StrHash, &str) -> Result<(), StorageError>>( )?; insert_term(triple.object.as_ref(), &encoded.object, insert_str) } else { - unreachable!("Invalid term encoding {:?} for {}", encoded, term) + Err(CorruptionError::from_encoded_term(encoded, &term).into()) } } } diff --git a/lib/src/storage/small_string.rs b/lib/oxigraph/src/storage/small_string.rs similarity index 73% rename from lib/src/storage/small_string.rs rename to lib/oxigraph/src/storage/small_string.rs index a7134bd6..355606da 100644 --- a/lib/src/storage/small_string.rs +++ b/lib/oxigraph/src/storage/small_string.rs @@ -1,11 +1,9 @@ use std::borrow::Borrow; use std::cmp::Ordering; -use std::error::Error; -use std::fmt; use std::hash::{Hash, Hasher}; use std::ops::Deref; -use std::str; use std::str::{FromStr, Utf8Error}; +use std::{fmt, str}; /// A small inline string #[derive(Clone, Copy, Default)] @@ -46,10 +44,8 @@ impl SmallString { #[inline] #[allow(unsafe_code)] pub fn as_str(&self) -> &str { - unsafe { - // safe because we ensured it in constructors - str::from_utf8_unchecked(self.as_bytes()) - } + // SAFETY: safe because we ensured it in constructors + unsafe { str::from_utf8_unchecked(self.as_bytes()) } } #[inline] @@ -67,7 +63,7 @@ impl Deref for SmallString { type Target = str; #[inline] - fn deref(&self) -> &str { + fn deref(&self) -> &Self::Target { self.as_str() } } @@ -103,7 +99,7 @@ impl fmt::Display for SmallString { impl PartialEq for SmallString { #[inline] fn eq(&self, other: &Self) -> bool { - self.as_str().eq(&**other) + self.as_str() == other.as_str() } } @@ -148,17 +144,17 @@ impl FromStr for SmallString { type Err = BadSmallStringError; #[inline] - fn from_str(value: &str) -> Result<Self, BadSmallStringError> { + fn from_str(value: &str) -> Result<Self, Self::Err> { if value.len() <= 15 { let mut inner = [0; 16]; inner[..value.len()].copy_from_slice(value.as_bytes()); inner[15] = value .len() .try_into() - .map_err(|_| BadSmallStringError::TooLong(value.len()))?; + .map_err(|_| Self::Err::TooLong(value.len()))?; Ok(Self { inner }) } else { - Err(BadSmallStringError::TooLong(value.len())) + Err(Self::Err::TooLong(value.len())) } } } @@ -167,36 +163,15 @@ impl<'a> TryFrom<&'a str> for SmallString { type Error = BadSmallStringError; #[inline] - fn try_from(value: &'a str) -> Result<Self, BadSmallStringError> { + fn try_from(value: &'a str) -> Result<Self, Self::Error> { Self::from_str(value) } } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, thiserror::Error)] pub enum BadSmallStringError { + #[error("small strings could only contain at most 15 characters, found {0}")] TooLong(usize), - BadUtf8(Utf8Error), -} - -impl fmt::Display for BadSmallStringError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::TooLong(v) => write!( - f, - "small strings could only contain at most 15 characters, found {v}" - ), - Self::BadUtf8(e) => e.fmt(f), - } - } -} - -impl Error for BadSmallStringError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::TooLong(_) => None, - Self::BadUtf8(e) => Some(e), - } - } + #[error(transparent)] + BadUtf8(#[from] Utf8Error), } diff --git a/lib/src/storage/storage_generator.rs b/lib/oxigraph/src/storage/storage_generator.rs similarity index 99% rename from lib/src/storage/storage_generator.rs rename to lib/oxigraph/src/storage/storage_generator.rs index e68caf6c..ca211268 100644 --- a/lib/src/storage/storage_generator.rs +++ b/lib/oxigraph/src/storage/storage_generator.rs @@ -668,9 +668,9 @@ impl StrLookup for StorageGenerator { self.get_str(key) } - fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError> { - self.contains_str(key) - } + //fn contains_str(&self, key: &StrHash) -> Result<bool, StorageError> { + // self.contains_str(key) + //} } #[cfg(test)] diff --git a/lib/src/storage/vg_vocab.rs b/lib/oxigraph/src/storage/vg_vocab.rs similarity index 100% rename from lib/src/storage/vg_vocab.rs rename to lib/oxigraph/src/storage/vg_vocab.rs diff --git a/lib/src/store.rs b/lib/oxigraph/src/store.rs similarity index 63% rename from lib/src/store.rs rename to lib/oxigraph/src/store.rs index 9a0bcb9c..adf30899 100644 --- a/lib/src/store.rs +++ b/lib/oxigraph/src/store.rs @@ -1,10 +1,12 @@ //! API to access an on-disk [RDF dataset](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset). //! +//! The entry point of the module is the [`Store`] struct. +//! //! Usage example: //! ``` -//! use oxigraph::store::Store; -//! use oxigraph::sparql::QueryResults; //! use oxigraph::model::*; +//! use oxigraph::sparql::QueryResults; +//! use oxigraph::store::Store; //! //! let store = Store::new()?; //! @@ -14,7 +16,7 @@ //! store.insert(&quad)?; //! //! // quad filter -//! let results: Result<Vec<Quad>,_> = store.quads_for_pattern(None, None, None, None).collect(); +//! let results: Result<Vec<Quad>, _> = store.quads_for_pattern(None, None, None, None).collect(); //! assert_eq!(vec![quad], results?); //! //! // SPARQL query @@ -23,10 +25,9 @@ //! }; //! # Result::<_, Box<dyn std::error::Error>>::Ok(()) //! ``` -use crate::io::read::ParseError; -use crate::io::{ - DatasetFormat, DatasetParser, DatasetSerializer, GraphFormat, GraphParser, GraphSerializer, -}; +#[cfg(not(target_family = "wasm"))] +use crate::io::RdfParseError; +use crate::io::{RdfFormat, RdfParser, RdfSerializer}; use crate::model::*; use crate::sparql::{ evaluate_query, evaluate_update, EvaluationError, Query, QueryExplanation, QueryOptions, @@ -40,7 +41,7 @@ use crate::storage::{ }; pub use crate::storage::{CorruptionError, LoaderError, SerializerError, StorageError}; use std::error::Error; -use std::io::{BufRead, Write}; +use std::io::{Read, Write}; #[cfg(not(target_family = "wasm"))] use std::path::Path; use std::{fmt, str}; @@ -55,9 +56,9 @@ use std::{fmt, str}; /// /// Usage example: /// ``` -/// use oxigraph::store::Store; -/// use oxigraph::sparql::QueryResults; /// use oxigraph::model::*; +/// use oxigraph::sparql::QueryResults; +/// use oxigraph::store::Store; /// # use std::fs::remove_dir_all; /// /// # { @@ -69,7 +70,7 @@ use std::{fmt, str}; /// store.insert(&quad)?; /// /// // quad filter -/// let results: Result<Vec<Quad>,_> = store.quads_for_pattern(None, None, None, None).collect(); +/// let results: Result<Vec<Quad>, _> = store.quads_for_pattern(None, None, None, None).collect(); /// assert_eq!(vec![quad], results?); /// /// // SPARQL query @@ -159,9 +160,9 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::QueryResults; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// @@ -170,8 +171,11 @@ impl Store { /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; /// /// // SPARQL query - /// if let QueryResults::Solutions(mut solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }")? { - /// assert_eq!(solutions.next().unwrap()?.get("s"), Some(&ex.into_owned().into())); + /// if let QueryResults::Solutions(mut solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }")? { + /// assert_eq!( + /// solutions.next().unwrap()?.get("s"), + /// Some(&ex.into_owned().into()) + /// ); /// } /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -186,19 +190,22 @@ impl Store { /// /// Usage example with a custom function serializing terms to N-Triples: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::{QueryOptions, QueryResults}; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// if let QueryResults::Solutions(mut solutions) = store.query_opt( /// "SELECT (<http://www.w3.org/ns/formats/N-Triples>(1) AS ?nt) WHERE {}", /// QueryOptions::default().with_custom_function( /// NamedNode::new("http://www.w3.org/ns/formats/N-Triples")?, - /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()) - /// ) + /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()), + /// ), /// )? { - /// assert_eq!(solutions.next().unwrap()?.get("nt"), Some(&Literal::from("\"1\"^^<http://www.w3.org/2001/XMLSchema#integer>").into())); + /// assert_eq!( + /// solutions.next().unwrap()?.get("nt"), + /// Some(&Literal::from("\"1\"^^<http://www.w3.org/2001/XMLSchema#integer>").into()) + /// ); /// } /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -214,18 +221,21 @@ impl Store { /// Executes a [SPARQL 1.1 query](https://www.w3.org/TR/sparql11-query/) with some options and /// returns a query explanation with some statistics (if enabled with the `with_stats` parameter). /// - /// Beware: if you want to compute statistics you need to exhaust the results iterator before having a look at them. + /// <div class="warning">If you want to compute statistics you need to exhaust the results iterator before having a look at them.</div> /// /// Usage example serialising the explanation with statistics in JSON: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::sparql::{QueryOptions, QueryResults}; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; - /// if let (Ok(QueryResults::Solutions(solutions)), explanation) = store.explain_query_opt("SELECT ?s WHERE { VALUES ?s { 1 2 3 } }", QueryOptions::default(), true)? { + /// if let (Ok(QueryResults::Solutions(solutions)), explanation) = store.explain_query_opt( + /// "SELECT ?s WHERE { VALUES ?s { 1 2 3 } }", + /// QueryOptions::default(), + /// true, + /// )? { /// // We make sure to have read all the solutions - /// for _ in solutions { - /// } + /// for _ in solutions {} /// let mut buf = Vec::new(); /// explanation.write_in_json(&mut buf)?; /// } @@ -244,8 +254,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// @@ -255,7 +265,9 @@ impl Store { /// store.insert(&quad)?; /// /// // quad filter by object - /// let results = store.quads_for_pattern(None, None, Some((&ex).into()), None).collect::<Result<Vec<_>,_>>()?; + /// let results = store + /// .quads_for_pattern(None, None, Some((&ex).into()), None) + /// .collect::<Result<Vec<_>, _>>()?; /// assert_eq!(vec![quad], results); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -282,8 +294,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// @@ -293,7 +305,7 @@ impl Store { /// store.insert(&quad)?; /// /// // quad filter by object - /// let results = store.iter().collect::<Result<Vec<_>,_>>()?; + /// let results = store.iter().collect::<Result<Vec<_>, _>>()?; /// assert_eq!(vec![quad], results); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -305,8 +317,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let quad = QuadRef::new(ex, ex, ex, ex); @@ -325,17 +337,17 @@ impl Store { /// Returns the number of quads in the store. /// - /// Warning: this function executes a full scan. + /// <div class="warning">This function executes a full scan.</div> /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let store = Store::new()?; /// store.insert(QuadRef::new(ex, ex, ex, ex))?; - /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; + /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; /// assert_eq!(2, store.len()?); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` @@ -347,8 +359,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// assert!(store.is_empty()?); @@ -370,8 +382,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::{StorageError, Store}; /// use oxigraph::model::*; + /// use oxigraph::store::{StorageError, Store}; /// /// let store = Store::new()?; /// let a = NamedNodeRef::new("http://example.com/a")?; @@ -398,13 +410,14 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion - /// store.update("INSERT DATA { <http://example.com> <http://example.com> <http://example.com> }")?; + /// store + /// .update("INSERT DATA { <http://example.com> <http://example.com> <http://example.com> }")?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; @@ -447,44 +460,106 @@ impl Store { Ok(()) } - /// Loads a graph file (i.e. triples) into the store. + /// Loads a RDF file under into the store. /// /// This function is atomic, quite slow and memory hungry. To get much better performances you might want to use the [`bulk_loader`](Store::bulk_loader). /// /// Usage example: /// ``` /// use oxigraph::store::Store; - /// use oxigraph::io::GraphFormat; + /// use oxigraph::io::RdfFormat; + /// use oxigraph::model::*; + /// use oxrdfio::RdfParser; + /// + /// let store = Store::new()?; + /// + /// // insert a dataset file (former load_dataset method) + /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com/g> ."; + /// store.load_from_read(RdfFormat::NQuads, file.as_ref())?; + /// + /// // insert a graph file (former load_graph method) + /// let file = b"<> <> <> ."; + /// store.load_from_read( + /// RdfParser::from_format(RdfFormat::Turtle) + /// .with_base_iri("http://example.com")? + /// .without_named_graphs() // No named graphs allowed in the input + /// .with_default_graph(NamedNodeRef::new("http://example.com/g2")?), // we put the file default graph inside of a named graph + /// file.as_ref() + /// )?; + /// + /// // we inspect the store contents + /// let ex = NamedNodeRef::new("http://example.com")?; + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g")?))?); + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g2")?))?); + /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn load_from_read( + &self, + parser: impl Into<RdfParser>, + read: impl Read, + ) -> Result<(), LoaderError> { + let quads = parser + .into() + .rename_blank_nodes() + .parse_read(read) + .collect::<Result<Vec<_>, _>>()?; + // self.storage.transaction(move |mut t| { + // for quad in &quads { + // t.insert(quad.as_ref())?; + // } + Ok(()) + // }) + } + + /// Loads a graph file (i.e. triples) into the store. + /// + /// This function is atomic, quite slow and memory hungry. To get much better performances you might want to use the [`bulk_loader`](Store::bulk_loader). + /// + /// Usage example: + /// ``` + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion /// let file = b"<http://example.com> <http://example.com> <http://example.com> ."; - /// store.load_graph(file.as_ref(), GraphFormat::NTriples, GraphNameRef::DefaultGraph, None)?; + /// store.load_graph( + /// file.as_ref(), + /// RdfFormat::NTriples, + /// GraphName::DefaultGraph, + /// None, + /// )?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; /// assert!(store.contains(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` - pub fn load_graph<'a>( + #[deprecated(note = "use Store.load_from_read instead", since = "0.4.0")] + pub fn load_graph( &self, - reader: impl BufRead, - format: GraphFormat, - to_graph_name: impl Into<GraphNameRef<'a>>, + read: impl Read, + format: impl Into<RdfFormat>, + to_graph_name: impl Into<GraphName>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = GraphParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()) + .without_named_graphs() + .with_default_graph(to_graph_name); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - let quads = parser - .read_triples(reader)? - .collect::<Result<Vec<_>, _>>()?; - let to_graph_name = to_graph_name.into(); + // let quads = parser + // .read_triples(reader)? + // .collect::<Result<Vec<_>, _>>()?; + // let to_graph_name = to_graph_name.into(); // self.storage.transaction(move |mut t| { // for quad in &quads { // t.insert(quad.as_ref().in_graph(to_graph_name))?; @@ -499,34 +574,39 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::DatasetFormat; + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion - /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; - /// store.load_dataset(file.as_ref(), DatasetFormat::NQuads, None)?; + /// let file = + /// b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; + /// store.load_dataset(file.as_ref(), RdfFormat::NQuads, None)?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; /// assert!(store.contains(QuadRef::new(ex, ex, ex, ex))?); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` + #[deprecated(note = "use Store.load_from_read instead", since = "0.4.0")] pub fn load_dataset( &self, - reader: impl BufRead, - format: DatasetFormat, + read: impl Read, + format: impl Into<RdfFormat>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = DatasetParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - let quads = parser.read_quads(reader)?.collect::<Result<Vec<_>, _>>()?; + // let quads = parser.read_quads(reader)?.collect::<Result<Vec<_>, _>>()?; // self.storage.transaction(move |mut t| { // for quad in &quads { // t.insert(quad.into())?; @@ -541,8 +621,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let quad = QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph); @@ -562,7 +642,9 @@ impl Store { /// Adds atomically a set of quads to this store. /// - /// Warning: This operation uses a memory heavy transaction internally, use the [`bulk_loader`](Store::bulk_loader) if you plan to add ten of millions of triples. + /// <div class="warning"> + /// + /// This operation uses a memory heavy transaction internally, use the [`bulk_loader`](Store::bulk_loader) if you plan to add ten of millions of triples.</div> pub fn extend( &self, quads: impl IntoIterator<Item = impl Into<Quad>>, @@ -578,8 +660,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let quad = QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph); @@ -598,79 +680,139 @@ impl Store { Ok(true) } + /// Dumps the store into a file. + /// + /// ``` + /// use oxigraph::io::RdfFormat; + /// use oxigraph::store::Store; + /// + /// let file = + /// "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n" + /// .as_bytes(); + /// + /// let store = Store::new()?; + /// store.load_from_read(RdfFormat::NQuads, file)?; + /// + /// let buffer = store.dump_to_write(RdfFormat::NQuads, Vec::new())?; + /// assert_eq!(file, buffer.as_slice()); + /// # std::io::Result::Ok(()) + /// ``` + pub fn dump_to_write<W: Write>( + &self, + serializer: impl Into<RdfSerializer>, + write: W, + ) -> Result<W, SerializerError> { + let serializer = serializer.into(); + if !serializer.format().supports_datasets() { + return Err(SerializerError::DatasetFormatExpected(serializer.format())); + } + let mut writer = serializer.serialize_to_write(write); + for quad in self.iter() { + writer.write_quad(&quad?)?; + } + Ok(writer.finish()?) + } + /// Dumps a store graph into a file. /// /// Usage example: /// ``` + /// use oxigraph::io::RdfFormat; + /// use oxigraph::model::*; /// use oxigraph::store::Store; - /// use oxigraph::io::GraphFormat; - /// use oxigraph::model::GraphNameRef; /// /// let file = "<http://example.com> <http://example.com> <http://example.com> .\n".as_bytes(); /// /// let store = Store::new()?; - /// store.load_graph(file, GraphFormat::NTriples, GraphNameRef::DefaultGraph, None)?; + /// store.load_graph(file, RdfFormat::NTriples, GraphName::DefaultGraph, None)?; /// /// let mut buffer = Vec::new(); - /// store.dump_graph(&mut buffer, GraphFormat::NTriples, GraphNameRef::DefaultGraph)?; + /// store.dump_graph_to_write(GraphNameRef::DefaultGraph, RdfFormat::NTriples, &mut buffer)?; /// assert_eq!(file, buffer.as_slice()); /// # std::io::Result::Ok(()) /// ``` - pub fn dump_graph<'a>( + pub fn dump_graph_to_write<'a, W: Write>( &self, - writer: impl Write, - format: GraphFormat, from_graph_name: impl Into<GraphNameRef<'a>>, - ) -> Result<(), SerializerError> { - let mut writer = GraphSerializer::from_format(format).triple_writer(writer)?; + serializer: impl Into<RdfSerializer>, + write: W, + ) -> Result<W, SerializerError> { + let mut writer = serializer.into().serialize_to_write(write); for quad in self.quads_for_pattern(None, None, None, Some(from_graph_name.into())) { - writer.write(quad?.as_ref())?; + writer.write_triple(quad?.as_ref())?; } - writer.finish()?; - Ok(()) + Ok(writer.finish()?) } - /// Dumps the store into a file. + /// Dumps a store graph into a file. /// + /// Usage example: /// ``` + /// use oxigraph::io::RdfFormat; + /// use oxigraph::model::*; /// use oxigraph::store::Store; - /// use oxigraph::io::DatasetFormat; /// - /// let file = "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n".as_bytes(); + /// let file = "<http://example.com> <http://example.com> <http://example.com> .\n".as_bytes(); /// /// let store = Store::new()?; - /// store.load_dataset(file, DatasetFormat::NQuads, None)?; + /// store.load_graph(file, RdfFormat::NTriples, GraphName::DefaultGraph, None)?; /// /// let mut buffer = Vec::new(); - /// store.dump_dataset(&mut buffer, DatasetFormat::NQuads)?; + /// store.dump_graph(&mut buffer, RdfFormat::NTriples, GraphNameRef::DefaultGraph)?; /// assert_eq!(file, buffer.as_slice()); /// # std::io::Result::Ok(()) /// ``` - pub fn dump_dataset( + #[deprecated(note = "use Store.dump_graph_to_write instead", since = "0.4.0")] + pub fn dump_graph<'a, W: Write>( &self, - writer: impl Write, - format: DatasetFormat, - ) -> Result<(), SerializerError> { - let mut writer = DatasetSerializer::from_format(format).quad_writer(writer)?; - for quad in self.iter() { - writer.write(&quad?)?; - } - writer.finish()?; - Ok(()) + write: W, + format: impl Into<RdfFormat>, + from_graph_name: impl Into<GraphNameRef<'a>>, + ) -> Result<W, SerializerError> { + self.dump_graph_to_write(from_graph_name, format.into(), write) + } + + /// Dumps the store into a file. + /// + /// ``` + /// use oxigraph::io::RdfFormat; + /// use oxigraph::store::Store; + /// + /// let file = + /// "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n" + /// .as_bytes(); + /// + /// let store = Store::new()?; + /// store.load_from_read(RdfFormat::NQuads, file)?; + /// + /// let buffer = store.dump_dataset(Vec::new(), RdfFormat::NQuads)?; + /// assert_eq!(file, buffer.as_slice()); + /// # std::io::Result::Ok(()) + /// ``` + #[deprecated(note = "use Store.dump_to_write instead", since = "0.4.0")] + pub fn dump_dataset<W: Write>( + &self, + write: W, + format: impl Into<RdfFormat>, + ) -> Result<W, SerializerError> { + self.dump_to_write(format.into(), write) } /// Returns all the store named graphs. /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNode::new("http://example.com")?; /// let store = Store::new()?; /// store.insert(QuadRef::new(&ex, &ex, &ex, &ex))?; /// store.insert(QuadRef::new(&ex, &ex, &ex, GraphNameRef::DefaultGraph))?; - /// assert_eq!(vec![NamedOrBlankNode::from(ex)], store.named_graphs().collect::<Result<Vec<_>,_>>()?); + /// assert_eq!( + /// vec![NamedOrBlankNode::from(ex)], + /// store.named_graphs().collect::<Result<Vec<_>, _>>()? + /// ); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` pub fn named_graphs(&self) -> GraphNameIter { @@ -685,8 +827,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::{NamedNode, QuadRef}; + /// use oxigraph::store::Store; /// /// let ex = NamedNode::new("http://example.com")?; /// let store = Store::new()?; @@ -708,14 +850,17 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::NamedNodeRef; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let store = Store::new()?; /// store.insert_named_graph(ex)?; /// - /// assert_eq!(store.named_graphs().collect::<Result<Vec<_>,_>>()?, vec![ex.into_owned().into()]); + /// assert_eq!( + /// store.named_graphs().collect::<Result<Vec<_>, _>>()?, + /// vec![ex.into_owned().into()] + /// ); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` pub fn insert_named_graph<'a>( @@ -731,8 +876,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::{NamedNodeRef, QuadRef}; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let quad = QuadRef::new(ex, ex, ex, ex); @@ -760,8 +905,8 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::{NamedNodeRef, QuadRef}; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let quad = QuadRef::new(ex, ex, ex, ex); @@ -787,13 +932,13 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new("http://example.com")?; /// let store = Store::new()?; /// store.insert(QuadRef::new(ex, ex, ex, ex))?; - /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; + /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; /// assert_eq!(2, store.len()?); /// /// store.clear()?; @@ -817,7 +962,7 @@ impl Store { /// /// Useful to call after a batch upload or another similar operation. /// - /// Warning: Can take hours on huge databases. + /// <div class="warning">Can take hours on huge databases.</div> #[cfg(not(target_family = "wasm"))] pub fn optimize(&self) -> Result<(), StorageError> { self.storage.compact() @@ -828,17 +973,19 @@ impl Store { /// After its creation, the backup is usable using [`Store::open`] /// like a regular Oxigraph database and operates independently from the original database. /// - /// Warning: Backups are only possible for on-disk databases created using [`Store::open`]. + /// <div class="warning"> + /// + /// Backups are only possible for on-disk databases created using [`Store::open`].</div> /// Temporary in-memory databases created using [`Store::new`] are not compatible with RocksDB backup system. /// - /// Warning: An error is raised if the `target_directory` already exists. + /// <div class="warning">An error is raised if the `target_directory` already exists.</div> /// /// If the target directory is in the same file system as the current database, /// the database content will not be fully copied /// but hard links will be used to point to the original database immutable snapshots. /// This allows cheap regular backups. /// - /// If you want to move your data to another RDF storage system, you should have a look at the [`Store::dump_dataset`] function instead. + /// If you want to move your data to another RDF storage system, you should have a look at the [`Store::dump_to_write`] function instead. #[cfg(not(target_family = "wasm"))] pub fn backup(&self, target_directory: impl AsRef<Path>) -> Result<(), StorageError> { self.storage.backup(target_directory.as_ref()) @@ -848,15 +995,18 @@ impl Store { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::DatasetFormat; + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // quads file insertion - /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; - /// store.bulk_loader().load_dataset(file.as_ref(), DatasetFormat::NQuads, None)?; + /// let file = + /// b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; + /// store + /// .bulk_loader() + /// .load_from_read(RdfFormat::NQuads, file.as_ref())?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; @@ -899,16 +1049,23 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::{EvaluationError, QueryResults}; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// store.transaction(|mut transaction| { - /// if let QueryResults::Solutions(solutions) = transaction.query("SELECT ?s WHERE { ?s ?p ?o }")? { + /// if let QueryResults::Solutions(solutions) = + /// transaction.query("SELECT ?s WHERE { ?s ?p ?o }")? + /// { /// for solution in solutions { - /// if let Some(Term::NamedNode(s)) = solution?.get("s") { - /// transaction.insert(QuadRef::new(s, vocab::rdf::TYPE, NamedNodeRef::new_unchecked("http://example.com"), GraphNameRef::DefaultGraph))?; + /// if let Some(Term::NamedNode(s)) = solution?.get("s") { + /// transaction.insert(QuadRef::new( + /// s, + /// vocab::rdf::TYPE, + /// NamedNodeRef::new_unchecked("http://example.com"), + /// GraphNameRef::DefaultGraph, + /// ))?; /// } /// } /// } @@ -927,9 +1084,9 @@ impl<'a> Transaction<'a> { /// /// Usage example with a custom function serializing terms to N-Triples: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::{EvaluationError, QueryOptions, QueryResults}; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// store.transaction(|mut transaction| { @@ -937,13 +1094,20 @@ impl<'a> Transaction<'a> { /// "SELECT ?s (<http://www.w3.org/ns/formats/N-Triples>(?s) AS ?nt) WHERE { ?s ?p ?o }", /// QueryOptions::default().with_custom_function( /// NamedNode::new_unchecked("http://www.w3.org/ns/formats/N-Triples"), - /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()) - /// ) + /// |args| args.get(0).map(|t| Literal::from(t.to_string()).into()), + /// ), /// )? { /// for solution in solutions { /// let solution = solution?; - /// if let (Some(Term::NamedNode(s)), Some(nt)) = (solution.get("s"), solution.get("nt")) { - /// transaction.insert(QuadRef::new(s, NamedNodeRef::new_unchecked("http://example.com/n-triples-representation"), nt, GraphNameRef::DefaultGraph))?; + /// if let (Some(Term::NamedNode(s)), Some(nt)) = + /// (solution.get("s"), solution.get("nt")) + /// { + /// transaction.insert(QuadRef::new( + /// s, + /// NamedNodeRef::new_unchecked("http://example.com/n-triples-representation"), + /// nt, + /// GraphNameRef::DefaultGraph, + /// ))?; /// } /// } /// } @@ -963,10 +1127,9 @@ impl<'a> Transaction<'a> { /// Retrieves quads with a filter on each quad component. /// /// Usage example: - /// Usage example: /// ``` - /// use oxigraph::store::{StorageError, Store}; /// use oxigraph::model::*; + /// use oxigraph::store::{StorageError, Store}; /// /// let store = Store::new()?; /// let a = NamedNodeRef::new("http://example.com/a")?; @@ -1014,7 +1177,7 @@ impl<'a> Transaction<'a> { /// Returns the number of quads in the store. /// - /// Warning: this function executes a full scan. + /// <div class="warning">this function executes a full scan.</div> pub fn len(&self) -> Result<usize, StorageError> { self.writer.reader().len() } @@ -1028,14 +1191,16 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; /// use oxigraph::sparql::EvaluationError; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// store.transaction(|mut transaction| { /// // insertion - /// transaction.update("INSERT DATA { <http://example.com> <http://example.com> <http://example.com> }")?; + /// transaction.update( + /// "INSERT DATA { <http://example.com> <http://example.com> <http://example.com> }", + /// )?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new_unchecked("http://example.com"); @@ -1064,20 +1229,72 @@ impl<'a> Transaction<'a> { ) } - /// Loads a graph file (i.e. triples) into the store. + /// Loads a RDF file into the store. + /// + /// This function is atomic, quite slow and memory hungry. To get much better performances you might want to use the [`bulk_loader`](Store::bulk_loader). /// /// Usage example: /// ``` /// use oxigraph::store::Store; - /// use oxigraph::io::GraphFormat; + /// use oxigraph::io::RdfFormat; + /// use oxigraph::model::*; + /// use oxrdfio::RdfParser; + /// + /// let store = Store::new()?; + /// + /// // insert a dataset file (former load_dataset method) + /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com/g> ."; + /// store.transaction(|mut t| t.load_from_read(RdfFormat::NQuads, file.as_ref()))?; + /// + /// // insert a graph file (former load_graph method) + /// let file = b"<> <> <> ."; + /// store.transaction(|mut t| + /// t.load_from_read( + /// RdfParser::from_format(RdfFormat::Turtle) + /// .with_base_iri("http://example.com") + /// .unwrap() + /// .without_named_graphs() // No named graphs allowed in the input + /// .with_default_graph(NamedNodeRef::new("http://example.com/g2").unwrap()), // we put the file default graph inside of a named graph + /// file.as_ref() + /// ) + /// )?; + /// + /// // we inspect the store contents + /// let ex = NamedNodeRef::new("http://example.com")?; + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g")?))?); + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g2")?))?); + /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn load_from_read( + &mut self, + parser: impl Into<RdfParser>, + read: impl Read, + ) -> Result<(), LoaderError> { + for quad in parser.into().rename_blank_nodes().parse_read(read) { + self.insert(quad?.as_ref())?; + } + Ok(()) + } + + /// Loads a graph file (i.e. triples) into the store. + /// + /// Usage example: + /// ``` + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion /// let file = b"<http://example.com> <http://example.com> <http://example.com> ."; /// store.transaction(|mut transaction| { - /// transaction.load_graph(file.as_ref(), GraphFormat::NTriples, GraphNameRef::DefaultGraph, None) + /// transaction.load_graph( + /// file.as_ref(), + /// RdfFormat::NTriples, + /// GraphName::DefaultGraph, + /// None, + /// ) /// })?; /// /// // we inspect the store contents @@ -1085,41 +1302,43 @@ impl<'a> Transaction<'a> { /// assert!(store.contains(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?); /// # Result::<_,oxigraph::store::LoaderError>::Ok(()) /// ``` - pub fn load_graph<'b>( + #[deprecated(note = "use Transaction.load_from_read instead", since = "0.4.0")] + pub fn load_graph( &mut self, - reader: impl BufRead, - format: GraphFormat, - to_graph_name: impl Into<GraphNameRef<'b>>, + read: impl Read, + format: impl Into<RdfFormat>, + to_graph_name: impl Into<GraphName>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = GraphParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()) + .without_named_graphs() + .with_default_graph(to_graph_name); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - let to_graph_name = to_graph_name.into(); - for triple in parser.read_triples(reader)? { - self.writer - .insert(triple?.as_ref().in_graph(to_graph_name))?; - } - Ok(()) + self.load_from_read(parser, read) } /// Loads a dataset file (i.e. quads) into the store. /// /// Usage example: /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::DatasetFormat; + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion - /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; + /// let file = + /// b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; /// store.transaction(|mut transaction| { - /// transaction.load_dataset(file.as_ref(), DatasetFormat::NQuads, None) + /// transaction.load_dataset(file.as_ref(), RdfFormat::NQuads, None) /// })?; /// /// // we inspect the store contents @@ -1127,22 +1346,23 @@ impl<'a> Transaction<'a> { /// assert!(store.contains(QuadRef::new(ex, ex, ex, ex))?); /// # Result::<_,oxigraph::store::LoaderError>::Ok(()) /// ``` + #[deprecated(note = "use Transaction.load_from_read instead", since = "0.4.0")] pub fn load_dataset( &mut self, - reader: impl BufRead, - format: DatasetFormat, + read: impl Read, + format: impl Into<RdfFormat>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = DatasetParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - for quad in parser.read_quads(reader)? { - self.writer.insert(quad?.as_ref())?; - } - Ok(()) + self.load_from_read(parser, read) } /// Adds a quad to this store. @@ -1151,16 +1371,14 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let quad = QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph); /// /// let store = Store::new()?; - /// store.transaction(|mut transaction| { - /// transaction.insert(quad) - /// })?; + /// store.transaction(|mut transaction| transaction.insert(quad))?; /// assert!(store.contains(quad)?); /// # Result::<_,oxigraph::store::StorageError>::Ok(()) /// ``` @@ -1185,8 +1403,8 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let quad = QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph); @@ -1227,15 +1445,16 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::NamedNodeRef; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let store = Store::new()?; - /// store.transaction(|mut transaction| { - /// transaction.insert_named_graph(ex) - /// })?; - /// assert_eq!(store.named_graphs().collect::<Result<Vec<_>,_>>()?, vec![ex.into_owned().into()]); + /// store.transaction(|mut transaction| transaction.insert_named_graph(ex))?; + /// assert_eq!( + /// store.named_graphs().collect::<Result<Vec<_>, _>>()?, + /// vec![ex.into_owned().into()] + /// ); /// # Result::<_,oxigraph::store::StorageError>::Ok(()) /// ``` pub fn insert_named_graph<'b>( @@ -1249,8 +1468,8 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::{NamedNodeRef, QuadRef}; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let quad = QuadRef::new(ex, ex, ex, ex); @@ -1276,8 +1495,8 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::{NamedNodeRef, QuadRef}; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let quad = QuadRef::new(ex, ex, ex, ex); @@ -1301,8 +1520,8 @@ impl<'a> Transaction<'a> { /// /// Usage example: /// ``` - /// use oxigraph::store::Store; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let ex = NamedNodeRef::new_unchecked("http://example.com"); /// let store = Store::new()?; @@ -1327,7 +1546,7 @@ pub struct QuadIter { impl Iterator for QuadIter { type Item = Result<Quad, StorageError>; - fn next(&mut self) -> Option<Result<Quad, StorageError>> { + fn next(&mut self) -> Option<Self::Item> { Some(match self.iter.next()? { Ok(quad) => self.reader.decode_quad(&quad), Err(error) => Err(error), @@ -1344,7 +1563,7 @@ pub struct GraphNameIter { impl Iterator for GraphNameIter { type Item = Result<NamedOrBlankNode, StorageError>; - fn next(&mut self) -> Option<Result<NamedOrBlankNode, StorageError>> { + fn next(&mut self) -> Option<Self::Item> { Some( self.iter .next()? @@ -1359,28 +1578,33 @@ impl Iterator for GraphNameIter { /// A bulk loader allowing to load at lot of data quickly into the store. /// -/// Warning: The operations provided here are not atomic. +/// <div class="warning">The operations provided here are not atomic. /// If the operation fails in the middle, only a part of the data may be written to the store. -/// Results might get weird if you delete data during the loading process. +/// Results might get weird if you delete data during the loading process.</div> /// -/// Warning: It is optimized for speed. -/// Memory usage is configurable using [`BulkLoader::set_max_memory_size_in_megabytes`] -/// and the number of used threads with [`BulkLoader::set_num_threads`]. +/// <div class="warning"> +/// +/// It is optimized for speed.</div> +/// Memory usage is configurable using [`with_max_memory_size_in_megabytes`](Self::with_max_memory_size_in_megabytes) +/// and the number of used threads with [`with_num_threads`](Self::with_num_threads). /// By default the memory consumption target (excluding the system and RocksDB internal consumption) /// is around 2GB per thread and 2 threads. /// These targets are considered per loaded file. /// /// Usage example with loading a dataset: /// ``` -/// use oxigraph::store::Store; -/// use oxigraph::io::DatasetFormat; +/// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; +/// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // quads file insertion -/// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; -/// store.bulk_loader().load_dataset(file.as_ref(), DatasetFormat::NQuads, None)?; +/// let file = +/// b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; +/// store +/// .bulk_loader() +/// .load_from_read(RdfFormat::NQuads, file.as_ref())?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; @@ -1388,9 +1612,10 @@ impl Iterator for GraphNameIter { /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` #[cfg(not(target_family = "wasm"))] +#[must_use] pub struct BulkLoader { storage: StorageBulkLoader, - on_parse_error: Option<Box<dyn Fn(ParseError) -> Result<(), ParseError>>>, + on_parse_error: Option<Box<dyn Fn(RdfParseError) -> Result<(), RdfParseError>>>, } #[cfg(not(target_family = "wasm"))] @@ -1400,11 +1625,17 @@ impl BulkLoader { /// This number must be at last 2 (one for parsing and one for loading). /// /// The default value is 2. - pub fn set_num_threads(mut self, num_threads: usize) -> Self { - self.storage = self.storage.set_num_threads(num_threads); + pub fn with_num_threads(mut self, num_threads: usize) -> Self { + self.storage = self.storage.with_num_threads(num_threads); self } + #[doc(hidden)] + #[deprecated(note = "Use with_num_threads", since = "0.4.0")] + pub fn set_num_threads(self, num_threads: usize) -> Self { + self.with_num_threads(num_threads) + } + /// Sets a rough idea of the maximal amount of memory to be used by this operation. /// /// This number must be at last a few megabytes per thread. @@ -1414,13 +1645,19 @@ impl BulkLoader { /// (for example if the data contains very long IRIs or literals). /// /// By default, a target 2GB per used thread is used. - pub fn set_max_memory_size_in_megabytes(mut self, max_memory_size: usize) -> Self { + pub fn with_max_memory_size_in_megabytes(mut self, max_memory_size: usize) -> Self { self.storage = self .storage - .set_max_memory_size_in_megabytes(max_memory_size); + .with_max_memory_size_in_megabytes(max_memory_size); self } + #[doc(hidden)] + #[deprecated(note = "Use with_max_memory_size_in_megabytes", since = "0.4.0")] + pub fn set_max_memory_size_in_megabytes(self, max_memory_size: usize) -> Self { + self.with_max_memory_size_in_megabytes(max_memory_size) + } + /// Adds a `callback` evaluated from time to time with the number of loaded triples. pub fn on_progress(mut self, callback: impl Fn(u64) + 'static) -> Self { self.storage = self.storage.on_progress(callback); @@ -1433,52 +1670,133 @@ impl BulkLoader { /// By default the parsing fails. pub fn on_parse_error( mut self, - callback: impl Fn(ParseError) -> Result<(), ParseError> + 'static, + callback: impl Fn(RdfParseError) -> Result<(), RdfParseError> + 'static, ) -> Self { self.on_parse_error = Some(Box::new(callback)); self } + /// Loads a file using the bulk loader. + /// + /// This function is optimized for large dataset loading speed. For small files, [`Store::load_from_read`] might be more convenient. + /// + /// <div class="warning">This method is not atomic. + /// If the parsing fails in the middle of the file, only a part of it may be written to the store. + /// Results might get weird if you delete data during the loading process.</div> + /// + /// <div class="warning"> + /// + /// This method is optimized for speed. See [the struct](Self) documentation for more details.</div> + /// + /// To get better speed on valid datasets, consider enabling [`RdfParser::unchecked`] option to skip some validations. + /// + /// Usage example: + /// ``` + /// use oxigraph::store::Store; + /// use oxigraph::io::{RdfParser, RdfFormat}; + /// use oxigraph::model::*; + /// + /// let store = Store::new()?; + /// + /// // insert a dataset file (former load_dataset method) + /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com/g> ."; + /// store.bulk_loader().load_from_read( + /// RdfParser::from_format(RdfFormat::NQuads).unchecked(), // we inject a custom parser with options + /// file.as_ref() + /// )?; + /// + /// // insert a graph file (former load_graph method) + /// let file = b"<> <> <> ."; + /// store.bulk_loader().load_from_read( + /// RdfParser::from_format(RdfFormat::Turtle) + /// .with_base_iri("http://example.com")? + /// .without_named_graphs() // No named graphs allowed in the input + /// .with_default_graph(NamedNodeRef::new("http://example.com/g2")?), // we put the file default graph inside of a named graph + /// file.as_ref() + /// )?; + /// + /// // we inspect the store contents + /// let ex = NamedNodeRef::new("http://example.com")?; + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g")?))?); + /// assert!(store.contains(QuadRef::new(ex, ex, ex, NamedNodeRef::new("http://example.com/g2")?))?); + /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn load_from_read( + &self, + parser: impl Into<RdfParser>, + read: impl Read, + ) -> Result<(), LoaderError> { + self.load_ok_quads( + parser + .into() + .rename_blank_nodes() + .parse_read(read) + .filter_map(|r| match r { + Ok(q) => Some(Ok(q)), + Err(e) => { + if let Some(callback) = &self.on_parse_error { + if let Err(e) = callback(e) { + Some(Err(e)) + } else { + None + } + } else { + Some(Err(e)) + } + } + }), + ) + } + /// Loads a dataset file using the bulk loader. /// /// This function is optimized for large dataset loading speed. For small files, [`Store::load_dataset`] might be more convenient. /// - /// Warning: This method is not atomic. + /// <div class="warning">This method is not atomic. /// If the parsing fails in the middle of the file, only a part of it may be written to the store. - /// Results might get weird if you delete data during the loading process. + /// Results might get weird if you delete data during the loading process.</div> + /// + /// <div class="warning"> /// - /// Warning: This method is optimized for speed. See [the struct](BulkLoader) documentation for more details. + /// This method is optimized for speed. See [the struct](Self) documentation for more details.</div> /// /// Usage example: /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::DatasetFormat; + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion - /// let file = b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; - /// store.bulk_loader().load_dataset(file.as_ref(), DatasetFormat::NQuads, None)?; + /// let file = + /// b"<http://example.com> <http://example.com> <http://example.com> <http://example.com> ."; + /// store + /// .bulk_loader() + /// .load_dataset(file.as_ref(), RdfFormat::NQuads, None)?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; /// assert!(store.contains(QuadRef::new(ex, ex, ex, ex))?); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` + #[deprecated(note = "use BulkLoader.load_from_read instead", since = "0.4.0")] pub fn load_dataset( &self, - reader: impl BufRead, - format: DatasetFormat, + read: impl Read, + format: impl Into<RdfFormat>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = DatasetParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()).rename_blank_nodes(); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - self.load_ok_quads(parser.read_quads(reader)?.filter_map(|r| match r { + self.load_ok_quads(parser.parse_read(read).filter_map(|r| match r { Ok(q) => Some(Ok(q)), Err(e) => { if let Some(callback) = &self.on_parse_error { @@ -1498,45 +1816,58 @@ impl BulkLoader { /// /// This function is optimized for large graph loading speed. For small files, [`Store::load_graph`] might be more convenient. /// - /// Warning: This method is not atomic. + /// <div class="warning">This method is not atomic. /// If the parsing fails in the middle of the file, only a part of it may be written to the store. - /// Results might get weird if you delete data during the loading process. + /// Results might get weird if you delete data during the loading process.</div> /// - /// Warning: This method is optimized for speed. See [the struct](BulkLoader) documentation for more details. + /// <div class="warning"> + /// + /// This method is optimized for speed. See [the struct](Self) documentation for more details.</div> /// /// Usage example: /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::GraphFormat; + /// use oxigraph::io::RdfFormat; /// use oxigraph::model::*; + /// use oxigraph::store::Store; /// /// let store = Store::new()?; /// /// // insertion /// let file = b"<http://example.com> <http://example.com> <http://example.com> ."; - /// store.bulk_loader().load_graph(file.as_ref(), GraphFormat::NTriples, GraphNameRef::DefaultGraph, None)?; + /// store.bulk_loader().load_graph( + /// file.as_ref(), + /// RdfFormat::NTriples, + /// GraphName::DefaultGraph, + /// None, + /// )?; /// /// // we inspect the store contents /// let ex = NamedNodeRef::new("http://example.com")?; /// assert!(store.contains(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?); /// # Result::<_, Box<dyn std::error::Error>>::Ok(()) /// ``` - pub fn load_graph<'a>( + #[deprecated(note = "use BulkLoader.load_from_read instead", since = "0.4.0")] + pub fn load_graph( &self, - reader: impl BufRead, - format: GraphFormat, - to_graph_name: impl Into<GraphNameRef<'a>>, + read: impl Read, + format: impl Into<RdfFormat>, + to_graph_name: impl Into<GraphName>, base_iri: Option<&str>, ) -> Result<(), LoaderError> { - let mut parser = GraphParser::from_format(format); + let mut parser = RdfParser::from_format(format.into()) + .without_named_graphs() + .with_default_graph(to_graph_name) + .rename_blank_nodes(); if let Some(base_iri) = base_iri { parser = parser .with_base_iri(base_iri) - .map_err(|e| ParseError::invalid_base_iri(base_iri, e))?; + .map_err(|e| LoaderError::InvalidBaseIri { + iri: base_iri.into(), + error: e, + })?; } - let to_graph_name = to_graph_name.into(); - self.load_ok_quads(parser.read_triples(reader)?.filter_map(|r| match r { - Ok(q) => Some(Ok(q.in_graph(to_graph_name.into_owned()))), + self.load_ok_quads(parser.parse_read(read).filter_map(|r| match r { + Ok(q) => Some(Ok(q)), Err(e) => { if let Some(callback) = &self.on_parse_error { if let Err(e) = callback(e) { @@ -1553,11 +1884,13 @@ impl BulkLoader { /// Adds a set of quads using the bulk loader. /// - /// Warning: This method is not atomic. + /// <div class="warning">This method is not atomic. /// If the process fails in the middle of the file, only a part of the data may be written to the store. - /// Results might get weird if you delete data during the loading process. + /// Results might get weird if you delete data during the loading process.</div> + /// + /// <div class="warning"> /// - /// Warning: This method is optimized for speed. See [the struct](BulkLoader) documentation for more details. + /// This method is optimized for speed. See [the struct](Self) documentation for more details.</div> pub fn load_quads( &self, quads: impl IntoIterator<Item = impl Into<Quad>>, @@ -1567,11 +1900,13 @@ impl BulkLoader { /// Adds a set of quads using the bulk loader while breaking in the middle of the process in case of error. /// - /// Warning: This method is not atomic. + /// <div class="warning">This method is not atomic. /// If the process fails in the middle of the file, only a part of the data may be written to the store. - /// Results might get weird if you delete data during the loading process. + /// Results might get weird if you delete data during the loading process.</div> /// - /// Warning: This method is optimized for speed. See [the struct](BulkLoader) documentation for more details. + /// <div class="warning"> + /// + /// This method is optimized for speed. See [the struct](Self) documentation for more details.</div> pub fn load_ok_quads<EI, EO: From<StorageError> + From<EI>>( &self, quads: impl IntoIterator<Item = Result<impl Into<Quad>, EI>>, @@ -1581,216 +1916,223 @@ impl BulkLoader { } } -#[ignore] -#[test] -fn store() -> Result<(), StorageError> { - use crate::model::*; - - let main_s = Subject::from(BlankNode::default()); - let main_p = NamedNode::new("http://example.com").unwrap(); - let main_o = Term::from(Literal::from(1)); - let main_g = GraphName::from(BlankNode::default()); - - let default_quad = Quad::new( - main_s.clone(), - main_p.clone(), - main_o.clone(), - GraphName::DefaultGraph, - ); - let named_quad = Quad::new( - main_s.clone(), - main_p.clone(), - main_o.clone(), - main_g.clone(), - ); - let default_quads = vec![ - Quad::new( - main_s.clone(), - main_p.clone(), - Literal::from(0), - GraphName::DefaultGraph, - ), - default_quad.clone(), - Quad::new( - main_s.clone(), - main_p.clone(), - Literal::from(200_000_000), - GraphName::DefaultGraph, - ), - ]; - let all_quads = vec![ - Quad::new( +#[cfg(test)] +mod tests { + #![allow(clippy::panic_in_result_fn)] + + use super::*; + + #[ignore] + #[test] + fn store() -> Result<(), StorageError> { + use crate::model::*; + + let main_s = Subject::from(BlankNode::default()); + let main_p = NamedNode::new("http://example.com").unwrap(); + let main_o = Term::from(Literal::from(1)); + let main_g = GraphName::from(BlankNode::default()); + + let default_quad = Quad::new( main_s.clone(), main_p.clone(), - Literal::from(0), + main_o.clone(), GraphName::DefaultGraph, - ), - default_quad.clone(), - Quad::new( + ); + let named_quad = Quad::new( main_s.clone(), main_p.clone(), - Literal::from(200_000_000), - GraphName::DefaultGraph, - ), - named_quad.clone(), - ]; - - let store = Store::new()?; - for t in &default_quads { - assert!(store.insert(t)?); - } - assert!(!store.insert(&default_quad)?); - - assert!(store.remove(&default_quad)?); - assert!(!store.remove(&default_quad)?); - assert!(store.insert(&named_quad)?); - assert!(!store.insert(&named_quad)?); - assert!(store.insert(&default_quad)?); - assert!(!store.insert(&default_quad)?); - - assert_eq!(store.len()?, 4); - assert_eq!(store.iter().collect::<Result<Vec<_>, _>>()?, all_quads); - assert_eq!( - store - .quads_for_pattern(Some(main_s.as_ref()), None, None, None) - .collect::<Result<Vec<_>, _>>()?, - all_quads - ); - assert_eq!( - store - .quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None) - .collect::<Result<Vec<_>, _>>()?, - all_quads - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - Some(main_p.as_ref()), - Some(main_o.as_ref()), - None - ) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone(), named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - Some(main_p.as_ref()), - Some(main_o.as_ref()), - Some(GraphNameRef::DefaultGraph) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - Some(main_p.as_ref()), - Some(main_o.as_ref()), - Some(main_g.as_ref()) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - Some(main_p.as_ref()), - None, - Some(GraphNameRef::DefaultGraph) - ) - .collect::<Result<Vec<_>, _>>()?, - default_quads - ); - assert_eq!( - store - .quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone(), named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - None, - Some(main_o.as_ref()), - Some(GraphNameRef::DefaultGraph) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - None, - Some(main_o.as_ref()), - Some(main_g.as_ref()) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern( - Some(main_s.as_ref()), - None, - None, - Some(GraphNameRef::DefaultGraph) - ) - .collect::<Result<Vec<_>, _>>()?, - default_quads - ); - assert_eq!( - store - .quads_for_pattern(None, Some(main_p.as_ref()), None, None) - .collect::<Result<Vec<_>, _>>()?, - all_quads - ); - assert_eq!( - store - .quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone(), named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern(None, None, Some(main_o.as_ref()), None) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad.clone(), named_quad.clone()] - ); - assert_eq!( - store - .quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph)) - .collect::<Result<Vec<_>, _>>()?, - default_quads - ); - assert_eq!( - store - .quads_for_pattern( - None, - Some(main_p.as_ref()), - Some(main_o.as_ref()), - Some(GraphNameRef::DefaultGraph) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![default_quad] - ); - assert_eq!( - store - .quads_for_pattern( - None, - Some(main_p.as_ref()), - Some(main_o.as_ref()), - Some(main_g.as_ref()) - ) - .collect::<Result<Vec<_>, _>>()?, - vec![named_quad] - ); - - Ok(()) + main_o.clone(), + main_g.clone(), + ); + let default_quads = vec![ + Quad::new( + main_s.clone(), + main_p.clone(), + Literal::from(0), + GraphName::DefaultGraph, + ), + default_quad.clone(), + Quad::new( + main_s.clone(), + main_p.clone(), + Literal::from(200_000_000), + GraphName::DefaultGraph, + ), + ]; + let all_quads = vec![ + Quad::new( + main_s.clone(), + main_p.clone(), + Literal::from(0), + GraphName::DefaultGraph, + ), + default_quad.clone(), + Quad::new( + main_s.clone(), + main_p.clone(), + Literal::from(200_000_000), + GraphName::DefaultGraph, + ), + named_quad.clone(), + ]; + + let store = Store::new()?; + for t in &default_quads { + assert!(store.insert(t)?); + } + assert!(!store.insert(&default_quad)?); + + assert!(store.remove(&default_quad)?); + assert!(!store.remove(&default_quad)?); + assert!(store.insert(&named_quad)?); + assert!(!store.insert(&named_quad)?); + assert!(store.insert(&default_quad)?); + assert!(!store.insert(&default_quad)?); + + assert_eq!(store.len()?, 4); + assert_eq!(store.iter().collect::<Result<Vec<_>, _>>()?, all_quads); + assert_eq!( + store + .quads_for_pattern(Some(main_s.as_ref()), None, None, None) + .collect::<Result<Vec<_>, _>>()?, + all_quads + ); + assert_eq!( + store + .quads_for_pattern(Some(main_s.as_ref()), Some(main_p.as_ref()), None, None) + .collect::<Result<Vec<_>, _>>()?, + all_quads + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + Some(main_p.as_ref()), + Some(main_o.as_ref()), + None + ) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone(), named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + Some(main_p.as_ref()), + Some(main_o.as_ref()), + Some(GraphNameRef::DefaultGraph) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + Some(main_p.as_ref()), + Some(main_o.as_ref()), + Some(main_g.as_ref()) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + Some(main_p.as_ref()), + None, + Some(GraphNameRef::DefaultGraph) + ) + .collect::<Result<Vec<_>, _>>()?, + default_quads + ); + assert_eq!( + store + .quads_for_pattern(Some(main_s.as_ref()), None, Some(main_o.as_ref()), None) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone(), named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + None, + Some(main_o.as_ref()), + Some(GraphNameRef::DefaultGraph) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + None, + Some(main_o.as_ref()), + Some(main_g.as_ref()) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern( + Some(main_s.as_ref()), + None, + None, + Some(GraphNameRef::DefaultGraph) + ) + .collect::<Result<Vec<_>, _>>()?, + default_quads + ); + assert_eq!( + store + .quads_for_pattern(None, Some(main_p.as_ref()), None, None) + .collect::<Result<Vec<_>, _>>()?, + all_quads + ); + assert_eq!( + store + .quads_for_pattern(None, Some(main_p.as_ref()), Some(main_o.as_ref()), None) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone(), named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern(None, None, Some(main_o.as_ref()), None) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad.clone(), named_quad.clone()] + ); + assert_eq!( + store + .quads_for_pattern(None, None, None, Some(GraphNameRef::DefaultGraph)) + .collect::<Result<Vec<_>, _>>()?, + default_quads + ); + assert_eq!( + store + .quads_for_pattern( + None, + Some(main_p.as_ref()), + Some(main_o.as_ref()), + Some(GraphNameRef::DefaultGraph) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![default_quad] + ); + assert_eq!( + store + .quads_for_pattern( + None, + Some(main_p.as_ref()), + Some(main_o.as_ref()), + Some(main_g.as_ref()) + ) + .collect::<Result<Vec<_>, _>>()?, + vec![named_quad] + ); + + Ok(()) + } } diff --git a/lib/tests/rocksdb_bc_data/000003.log b/lib/oxigraph/tests/rocksdb_bc_data/000003.log similarity index 100% rename from lib/tests/rocksdb_bc_data/000003.log rename to lib/oxigraph/tests/rocksdb_bc_data/000003.log diff --git a/lib/tests/rocksdb_bc_data/CURRENT b/lib/oxigraph/tests/rocksdb_bc_data/CURRENT similarity index 100% rename from lib/tests/rocksdb_bc_data/CURRENT rename to lib/oxigraph/tests/rocksdb_bc_data/CURRENT diff --git a/lib/tests/rocksdb_bc_data/IDENTITY b/lib/oxigraph/tests/rocksdb_bc_data/IDENTITY similarity index 100% rename from lib/tests/rocksdb_bc_data/IDENTITY rename to lib/oxigraph/tests/rocksdb_bc_data/IDENTITY diff --git a/lib/tests/rocksdb_bc_data/LOCK b/lib/oxigraph/tests/rocksdb_bc_data/LOCK similarity index 100% rename from lib/tests/rocksdb_bc_data/LOCK rename to lib/oxigraph/tests/rocksdb_bc_data/LOCK diff --git a/lib/tests/rocksdb_bc_data/MANIFEST-000004 b/lib/oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 similarity index 100% rename from lib/tests/rocksdb_bc_data/MANIFEST-000004 rename to lib/oxigraph/tests/rocksdb_bc_data/MANIFEST-000004 diff --git a/lib/tests/rocksdb_bc_data/OPTIONS-000026 b/lib/oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 similarity index 100% rename from lib/tests/rocksdb_bc_data/OPTIONS-000026 rename to lib/oxigraph/tests/rocksdb_bc_data/OPTIONS-000026 diff --git a/lib/tests/store.rs b/lib/oxigraph/tests/store.rs similarity index 88% rename from lib/tests/store.rs rename to lib/oxigraph/tests/store.rs index 92939bb8..c9ea95d2 100644 --- a/lib/tests/store.rs +++ b/lib/oxigraph/tests/store.rs @@ -1,4 +1,7 @@ -use oxigraph::io::{DatasetFormat, GraphFormat}; +#![cfg(test)] +#![allow(clippy::panic_in_result_fn)] + +use oxigraph::io::RdfFormat; use oxigraph::model::vocab::{rdf, xsd}; use oxigraph::model::*; use oxigraph::store::Store; @@ -8,10 +11,11 @@ use rand::random; use std::env::temp_dir; use std::error::Error; #[cfg(not(target_family = "wasm"))] -use std::fs::{create_dir, remove_dir_all, File}; -use std::io::Cursor; +use std::fs::{create_dir_all, remove_dir_all, File}; #[cfg(not(target_family = "wasm"))] use std::io::Write; +#[cfg(not(target_family = "wasm"))] +use std::iter::empty; #[cfg(target_os = "linux")] use std::iter::once; #[cfg(not(target_family = "wasm"))] @@ -74,7 +78,7 @@ fn quads(graph_name: impl Into<GraphNameRef<'static>>) -> Vec<QuadRef<'static>> QuadRef::new( paris, name, - LiteralRef::new_language_tagged_literal_unchecked("la ville lumi\u{e8}re", "fr"), + LiteralRef::new_language_tagged_literal_unchecked("la ville lumi\u{E8}re", "fr"), graph_name, ), QuadRef::new(paris, country, france, graph_name), @@ -108,12 +112,7 @@ fn quads(graph_name: impl Into<GraphNameRef<'static>>) -> Vec<QuadRef<'static>> #[test] fn test_load_graph() -> Result<(), Box<dyn Error>> { let store = Store::new()?; - store.load_graph( - Cursor::new(DATA), - GraphFormat::Turtle, - GraphNameRef::DefaultGraph, - None, - )?; + store.load_from_read(RdfFormat::Turtle, DATA.as_bytes())?; for q in quads(GraphNameRef::DefaultGraph) { assert!(store.contains(q)?); } @@ -125,12 +124,9 @@ fn test_load_graph() -> Result<(), Box<dyn Error>> { #[cfg(not(target_family = "wasm"))] fn test_bulk_load_graph() -> Result<(), Box<dyn Error>> { let store = Store::new()?; - store.bulk_loader().load_graph( - Cursor::new(DATA), - GraphFormat::Turtle, - GraphNameRef::DefaultGraph, - None, - )?; + store + .bulk_loader() + .load_from_read(RdfFormat::Turtle, DATA.as_bytes())?; for q in quads(GraphNameRef::DefaultGraph) { assert!(store.contains(q)?); } @@ -143,11 +139,9 @@ fn test_bulk_load_graph() -> Result<(), Box<dyn Error>> { #[cfg(not(target_family = "wasm"))] fn test_bulk_load_graph_lenient() -> Result<(), Box<dyn Error>> { let store = Store::new()?; - store.bulk_loader().on_parse_error(|_| Ok(())).load_graph( - Cursor::new(b"<http://example.com> <http://example.com> <http://example.com##> .\n<http://example.com> <http://example.com> <http://example.com> ."), - GraphFormat::NTriples, - GraphNameRef::DefaultGraph, - None, + store.bulk_loader().on_parse_error(|_| Ok(())).load_from_read( + RdfFormat::NTriples, + b"<http://example.com> <http://example.com> <http://example.com##> .\n<http://example.com> <http://example.com> <http://example.com> .".as_slice(), )?; assert_eq!(store.len()?, 1); assert!(store.contains(QuadRef::new( @@ -160,10 +154,20 @@ fn test_bulk_load_graph_lenient() -> Result<(), Box<dyn Error>> { Ok(()) } +#[test] +#[cfg(not(target_family = "wasm"))] +fn test_bulk_load_empty() -> Result<(), Box<dyn Error>> { + let store = Store::new()?; + store.bulk_loader().load_quads(empty::<Quad>())?; + assert!(store.is_empty()?); + store.validate()?; + Ok(()) +} + #[test] fn test_load_dataset() -> Result<(), Box<dyn Error>> { let store = Store::new()?; - store.load_dataset(Cursor::new(GRAPH_DATA), DatasetFormat::TriG, None)?; + store.load_from_read(RdfFormat::TriG, GRAPH_DATA.as_bytes())?; for q in quads(NamedNodeRef::new_unchecked( "http://www.wikidata.org/wiki/Special:EntityData/Q90", )) { @@ -179,7 +183,7 @@ fn test_bulk_load_dataset() -> Result<(), Box<dyn Error>> { let store = Store::new()?; store .bulk_loader() - .load_dataset(Cursor::new(GRAPH_DATA), DatasetFormat::TriG, None)?; + .load_from_read(RdfFormat::TriG, GRAPH_DATA.as_bytes())?; let graph_name = NamedNodeRef::new_unchecked("http://www.wikidata.org/wiki/Special:EntityData/Q90"); for q in quads(graph_name) { @@ -195,11 +199,9 @@ fn test_bulk_load_dataset() -> Result<(), Box<dyn Error>> { fn test_load_graph_generates_new_blank_nodes() -> Result<(), Box<dyn Error>> { let store = Store::new()?; for _ in 0..2 { - store.load_graph( - Cursor::new("_:a <http://example.com/p> <http://example.com/p> ."), - GraphFormat::NTriples, - GraphNameRef::DefaultGraph, - None, + store.load_from_read( + RdfFormat::NTriples, + "_:a <http://example.com/p> <http://example.com/p> .".as_bytes(), )?; } assert_eq!(store.len()?, 2); @@ -215,11 +217,7 @@ fn test_dump_graph() -> Result<(), Box<dyn Error>> { } let mut buffer = Vec::new(); - store.dump_graph( - &mut buffer, - GraphFormat::NTriples, - GraphNameRef::DefaultGraph, - )?; + store.dump_graph_to_write(GraphNameRef::DefaultGraph, RdfFormat::NTriples, &mut buffer)?; assert_eq!( buffer.into_iter().filter(|c| *c == b'\n').count(), NUMBER_OF_TRIPLES @@ -235,8 +233,7 @@ fn test_dump_dataset() -> Result<(), Box<dyn Error>> { store.insert(q)?; } - let mut buffer = Vec::new(); - store.dump_dataset(&mut buffer, DatasetFormat::NQuads)?; + let buffer = store.dump_to_write(RdfFormat::NQuads, Vec::new())?; assert_eq!( buffer.into_iter().filter(|c| *c == b'\n').count(), NUMBER_OF_TRIPLES @@ -248,10 +245,10 @@ fn test_dump_dataset() -> Result<(), Box<dyn Error>> { #[test] fn test_snapshot_isolation_iterator() -> Result<(), Box<dyn Error>> { let quad = QuadRef::new( - NamedNodeRef::new_unchecked("http://example.com/s"), - NamedNodeRef::new_unchecked("http://example.com/p"), - NamedNodeRef::new_unchecked("http://example.com/o"), - NamedNodeRef::new_unchecked("http://www.wikidata.org/wiki/Special:EntityData/Q90"), + NamedNodeRef::new("http://example.com/s")?, + NamedNodeRef::new("http://example.com/p")?, + NamedNodeRef::new("http://example.com/o")?, + NamedNodeRef::new("http://www.wikidata.org/wiki/Special:EntityData/Q90")?, ); let store = Store::new()?; store.insert(quad)?; @@ -286,7 +283,7 @@ fn test_bulk_load_on_existing_delete_overrides_the_delete() -> Result<(), Box<dy #[cfg(not(target_family = "wasm"))] fn test_open_bad_dir() -> Result<(), Box<dyn Error>> { let dir = TempDir::default(); - create_dir(&dir.0)?; + create_dir_all(&dir.0)?; { File::create(dir.0.join("CURRENT"))?.write_all(b"foo")?; } @@ -301,15 +298,15 @@ fn test_bad_stt_open() -> Result<(), Box<dyn Error>> { let dir = TempDir::default(); let store = Store::open(&dir.0)?; remove_dir_all(&dir.0)?; - assert!(store + store .bulk_loader() .load_quads(once(Quad::new( NamedNode::new_unchecked("http://example.com/s"), NamedNode::new_unchecked("http://example.com/p"), NamedNode::new_unchecked("http://example.com/o"), - GraphName::DefaultGraph + GraphName::DefaultGraph, ))) - .is_err()); + .unwrap_err(); Ok(()) } @@ -361,8 +358,8 @@ fn test_bad_backup() -> Result<(), Box<dyn Error>> { let store_dir = TempDir::default(); let backup_dir = TempDir::default(); - create_dir(&backup_dir.0)?; - assert!(Store::open(&store_dir)?.backup(&backup_dir.0).is_err()); + create_dir_all(&backup_dir.0)?; + Store::open(&store_dir)?.backup(&backup_dir.0).unwrap_err(); Ok(()) } @@ -371,7 +368,7 @@ fn test_bad_backup() -> Result<(), Box<dyn Error>> { #[cfg(not(target_family = "wasm"))] fn test_backup_on_in_memory() -> Result<(), Box<dyn Error>> { let backup_dir = TempDir::default(); - assert!(Store::new()?.backup(&backup_dir).is_err()); + Store::new()?.backup(&backup_dir).unwrap_err(); Ok(()) } @@ -448,7 +445,7 @@ fn test_secondary() -> Result<(), Box<dyn Error>> { #[cfg(not(target_family = "wasm"))] fn test_open_secondary_bad_dir() -> Result<(), Box<dyn Error>> { let primary_dir = TempDir::default(); - create_dir(&primary_dir.0)?; + create_dir_all(&primary_dir.0)?; { File::create(primary_dir.0.join("CURRENT"))?.write_all(b"foo")?; } @@ -510,7 +507,7 @@ fn test_read_only() -> Result<(), Box<dyn Error>> { #[cfg(not(target_family = "wasm"))] fn test_open_read_only_bad_dir() -> Result<(), Box<dyn Error>> { let dir = TempDir::default(); - create_dir(&dir.0)?; + create_dir_all(&dir.0)?; { File::create(dir.0.join("CURRENT"))?.write_all(b"foo")?; } diff --git a/lib/oxrdf/Cargo.toml b/lib/oxrdf/Cargo.toml index f9b38af7..6fec2123 100644 --- a/lib/oxrdf/Cargo.toml +++ b/lib/oxrdf/Cargo.toml @@ -1,28 +1,32 @@ [package] name = "oxrdf" -version = "0.1.7" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +version = "0.2.0-alpha.2" +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["RDF"] repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/oxrdf" -homepage = "https://oxigraph.org/" description = """ A library providing basic data structures related to RDF """ documentation = "https://docs.rs/oxrdf" -edition = "2021" -rust-version = "1.60" +edition.workspace = true +rust-version.workspace = true [features] default = [] rdf-star = [] [dependencies] -rand = "0.8" -oxilangtag = "0.1" -oxiri = "0.2" -oxsdatatypes = { version = "0.1.3", path="../oxsdatatypes", optional = true } +oxilangtag.workspace = true +oxiri.workspace = true +oxsdatatypes = { workspace = true, optional = true } +rand.workspace = true +thiserror.workspace = true + +[lints] +workspace = true [package.metadata.docs.rs] all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/oxrdf/README.md b/lib/oxrdf/README.md index 5993a746..88ffa621 100644 --- a/lib/oxrdf/README.md +++ b/lib/oxrdf/README.md @@ -5,7 +5,7 @@ OxRDF [](https://docs.rs/oxrdf) [](https://crates.io/crates/oxrdf) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) OxRDF is a simple library providing datastructures encoding [RDF 1.1 concepts](https://www.w3.org/TR/rdf11-concepts/). @@ -15,6 +15,8 @@ Support for [RDF-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html) i OxRDF is inspired by [RDF/JS](https://rdf.js.org/data-model-spec/) and [Apache Commons RDF](http://commons.apache.org/proper/commons-rdf/). +Use [`oxrdfio`](https://crates.io/crates/oxrdfio) if you need to read or write RDF files. + Usage example: ```rust diff --git a/lib/oxrdf/src/blank_node.rs b/lib/oxrdf/src/blank_node.rs index 938461e9..6d565fda 100644 --- a/lib/oxrdf/src/blank_node.rs +++ b/lib/oxrdf/src/blank_node.rs @@ -1,8 +1,6 @@ use rand::random; -use std::error::Error; -use std::fmt; use std::io::Write; -use std::str; +use std::{fmt, str}; /// An owned RDF [blank node](https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node). /// @@ -15,10 +13,7 @@ use std::str; /// ``` /// use oxrdf::BlankNode; /// -/// assert_eq!( -/// "_:a122", -/// BlankNode::new("a122")?.to_string() -/// ); +/// assert_eq!("_:a122", BlankNode::new("a122")?.to_string()); /// # Result::<_,oxrdf::BlankNodeIdParseError>::Ok(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Hash)] @@ -36,7 +31,7 @@ impl BlankNode { /// The blank node identifier must be valid according to N-Triples, Turtle, and SPARQL grammars. /// /// In most cases, it is much more convenient to create a blank node using [`BlankNode::default()`] - ///that creates a random ID that could be easily inlined by Oxigraph stores. + /// that creates a random ID that could be easily inlined by Oxigraph stores. pub fn new(id: impl Into<String>) -> Result<Self, BlankNodeIdParseError> { let id = id.into(); validate_blank_node_identifier(&id)?; @@ -111,7 +106,14 @@ impl Default for BlankNode { /// Builds a new RDF [blank node](https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node) with a unique id. #[inline] fn default() -> Self { - Self::new_from_unique_id(random::<u128>()) + // We ensure the ID does not start with a number to be also valid with RDF/XML + loop { + let id = random(); + let str = IdStr::new(id); + if matches!(str.as_str().as_bytes().first(), Some(b'a'..=b'f')) { + return Self(BlankNodeContent::Anonymous { id, str }); + } + } } } @@ -126,10 +128,7 @@ impl Default for BlankNode { /// ``` /// use oxrdf::BlankNodeRef; /// -/// assert_eq!( -/// "_:a122", -/// BlankNodeRef::new("a122")?.to_string() -/// ); +/// assert_eq!("_:a122", BlankNodeRef::new("a122")?.to_string()); /// # Result::<_,oxrdf::BlankNodeIdParseError>::Ok(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] @@ -173,7 +172,7 @@ impl<'a> BlankNodeRef<'a> { /// Returns the underlying ID of this blank node. #[inline] - pub fn as_str(self) -> &'a str { + pub const fn as_str(self) -> &'a str { match self.0 { BlankNodeRefContent::Named(id) => id, BlankNodeRefContent::Anonymous { str, .. } => str, @@ -185,12 +184,15 @@ impl<'a> BlankNodeRef<'a> { /// ``` /// use oxrdf::BlankNode; /// - /// assert_eq!(BlankNode::new_from_unique_id(128).as_ref().unique_id(), Some(128)); + /// assert_eq!( + /// BlankNode::new_from_unique_id(128).as_ref().unique_id(), + /// Some(128) + /// ); /// assert_eq!(BlankNode::new("foo")?.as_ref().unique_id(), None); /// # Result::<_,oxrdf::BlankNodeIdParseError>::Ok(()) /// ``` #[inline] - pub fn unique_id(&self) -> Option<u128> { + pub const fn unique_id(&self) -> Option<u128> { match self.0 { BlankNodeRefContent::Named(_) => None, BlankNodeRefContent::Anonymous { id, .. } => Some(id), @@ -264,7 +266,7 @@ impl IdStr { fn validate_blank_node_identifier(id: &str) -> Result<(), BlankNodeIdParseError> { let mut chars = id.chars(); - let front = chars.next().ok_or(BlankNodeIdParseError {})?; + let front = chars.next().ok_or(BlankNodeIdParseError)?; match front { '0'..='9' | '_' @@ -283,7 +285,7 @@ fn validate_blank_node_identifier(id: &str) -> Result<(), BlankNodeIdParseError> | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}' | '\u{10000}'..='\u{EFFFF}' => (), - _ => return Err(BlankNodeIdParseError {}), + _ => return Err(BlankNodeIdParseError), } for c in chars { match c { @@ -309,13 +311,13 @@ fn validate_blank_node_identifier(id: &str) -> Result<(), BlankNodeIdParseError> | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}' | '\u{10000}'..='\u{EFFFF}' => (), - _ => return Err(BlankNodeIdParseError {}), + _ => return Err(BlankNodeIdParseError), } } // Could not end with a dot if id.ends_with('.') { - Err(BlankNodeIdParseError {}) + Err(BlankNodeIdParseError) } else { Ok(()) } @@ -342,20 +344,14 @@ fn to_integer_id(id: &str) -> Option<u128> { } /// An error raised during [`BlankNode`] IDs validation. -#[derive(Debug)] -pub struct BlankNodeIdParseError {} - -impl fmt::Display for BlankNodeIdParseError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "The blank node identifier is invalid") - } -} - -impl Error for BlankNodeIdParseError {} +#[derive(Debug, thiserror::Error)] +#[error("The blank node identifier is invalid")] +pub struct BlankNodeIdParseError; #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] @@ -372,13 +368,13 @@ mod tests { #[test] fn new_validation() { - assert!(BlankNode::new("").is_err()); - assert!(BlankNode::new("a").is_ok()); - assert!(BlankNode::new("-").is_err()); - assert!(BlankNode::new("a-").is_ok()); - assert!(BlankNode::new(".").is_err()); - assert!(BlankNode::new("a.").is_err()); - assert!(BlankNode::new("a.a").is_ok()); + BlankNode::new("").unwrap_err(); + BlankNode::new("a").unwrap(); + BlankNode::new("-").unwrap_err(); + BlankNode::new("a-").unwrap(); + BlankNode::new(".").unwrap_err(); + BlankNode::new("a.").unwrap_err(); + BlankNode::new("a.a").unwrap(); } #[test] diff --git a/lib/oxrdf/src/dataset.rs b/lib/oxrdf/src/dataset.rs index 05ccbb56..ed6249a4 100644 --- a/lib/oxrdf/src/dataset.rs +++ b/lib/oxrdf/src/dataset.rs @@ -20,26 +20,29 @@ //! assert_eq!(vec![TripleRef::new(ex, ex, ex)], results); //! //! // Print -//! assert_eq!(dataset.to_string(), "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n"); +//! assert_eq!( +//! dataset.to_string(), +//! "<http://example.com> <http://example.com> <http://example.com> <http://example.com> .\n" +//! ); //! # Result::<_,Box<dyn std::error::Error>>::Ok(()) //! ``` //! //! See also [`Graph`] if you only care about plain triples. use crate::interning::*; -use crate::SubjectRef; use crate::*; +use std::cmp::min; use std::collections::hash_map::DefaultHasher; -use std::collections::BTreeSet; -use std::collections::{HashMap, HashSet}; +use std::collections::{BTreeSet, HashMap, HashSet}; use std::fmt; use std::hash::{Hash, Hasher}; /// An in-memory [RDF dataset](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset). /// /// It can accommodate a fairly large number of quads (in the few millions). -/// Beware: it interns the string and does not do any garbage collection yet: -/// if you insert and remove a lot of different terms, memory will grow without any reduction. +/// +/// <div class="warning">It interns the strings and does not do any garbage collection yet: +/// if you insert and remove a lot of different terms, memory will grow without any reduction.</div> /// /// Usage example: /// ``` @@ -61,7 +64,7 @@ use std::hash::{Hash, Hasher}; /// assert_eq!(vec![TripleRef::new(ex, ex, ex)], results); /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// ``` -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct Dataset { interner: Interner, gspo: BTreeSet<( @@ -183,6 +186,7 @@ impl Dataset { .map(move |q| self.decode_spog(q)) } + #[allow(clippy::map_identity)] fn interned_quads_for_subject( &self, subject: &InternedSubject, @@ -293,6 +297,18 @@ impl Dataset { .map(|(o, s, p, g)| (s, p, o, g)) } + pub fn quads_for_graph_name<'a, 'b>( + &'a self, + graph_name: impl Into<GraphNameRef<'b>>, + ) -> impl Iterator<Item = QuadRef<'a>> + 'a { + let graph_name = self + .encoded_graph_name(graph_name) + .unwrap_or_else(InternedGraphName::impossible); + + self.interned_quads_for_graph_name(&graph_name) + .map(move |q| self.decode_spog(q)) + } + fn interned_quads_for_graph_name( &self, graph_name: &InternedGraphName, @@ -525,9 +541,12 @@ impl Dataset { /// Warning 3: This implementation worst-case complexity is in *O(b!)* with *b* the number of blank nodes in the input dataset. pub fn canonicalize(&mut self) { let bnodes = self.blank_nodes(); - let (hash, partition) = - self.hash_bnodes(bnodes.into_iter().map(|bnode| (bnode, 0)).collect()); - let new_quads = self.distinguish(&hash, &partition); + let quads_per_blank_node = self.quads_per_blank_nodes(); + let (hash, partition) = self.hash_bnodes( + bnodes.into_iter().map(|bnode| (bnode, 0)).collect(), + &quads_per_blank_node, + ); + let new_quads = self.distinguish(&hash, &partition, &quads_per_blank_node); self.clear(); for quad in new_quads { self.insert_encoded(quad); @@ -572,107 +591,172 @@ impl Dataset { } } + fn quads_per_blank_nodes(&self) -> QuadsPerBlankNode { + let mut map: HashMap<_, Vec<_>> = HashMap::new(); + for quad in &self.spog { + if let InternedSubject::BlankNode(bnode) = &quad.0 { + map.entry(*bnode).or_default().push(quad.clone()); + } + #[cfg(feature = "rdf-star")] + if let InternedSubject::Triple(t) = &quad.0 { + Self::add_quad_with_quoted_triple_to_quad_per_blank_nodes_map(quad, t, &mut map); + } + if let InternedTerm::BlankNode(bnode) = &quad.2 { + map.entry(*bnode).or_default().push(quad.clone()); + } + #[cfg(feature = "rdf-star")] + if let InternedTerm::Triple(t) = &quad.2 { + Self::add_quad_with_quoted_triple_to_quad_per_blank_nodes_map(quad, t, &mut map); + } + if let InternedGraphName::BlankNode(bnode) = &quad.3 { + map.entry(*bnode).or_default().push(quad.clone()); + } + } + map + } + + #[cfg(feature = "rdf-star")] + fn add_quad_with_quoted_triple_to_quad_per_blank_nodes_map( + quad: &( + InternedSubject, + InternedNamedNode, + InternedTerm, + InternedGraphName, + ), + triple: &InternedTriple, + map: &mut QuadsPerBlankNode, + ) { + if let InternedSubject::BlankNode(bnode) = &triple.subject { + map.entry(*bnode).or_default().push(quad.clone()); + } + if let InternedSubject::Triple(t) = &triple.subject { + Self::add_quad_with_quoted_triple_to_quad_per_blank_nodes_map(quad, t, map); + } + if let InternedTerm::BlankNode(bnode) = &triple.object { + map.entry(*bnode).or_default().push(quad.clone()); + } + if let InternedTerm::Triple(t) = &triple.object { + Self::add_quad_with_quoted_triple_to_quad_per_blank_nodes_map(quad, t, map); + } + } + fn hash_bnodes( &self, mut hashes: HashMap<InternedBlankNode, u64>, + quads_per_blank_node: &QuadsPerBlankNode, ) -> ( HashMap<InternedBlankNode, u64>, Vec<(u64, Vec<InternedBlankNode>)>, ) { let mut to_hash = Vec::new(); - let mut partition: HashMap<u64, Vec<InternedBlankNode>> = HashMap::new(); - let mut partition_len = 0; - loop { - //TODO: improve termination - let mut new_hashes = HashMap::new(); - for (bnode, old_hash) in &hashes { - for (_, p, o, g) in - self.interned_quads_for_subject(&InternedSubject::BlankNode(*bnode)) - { - to_hash.push(( - self.hash_named_node(*p), - self.hash_term(o, &hashes), - self.hash_graph_name(g, &hashes), - 0, - )); - } - for (s, p, _, g) in self.interned_quads_for_object(&InternedTerm::BlankNode(*bnode)) - { - to_hash.push(( - self.hash_subject(s, &hashes), - self.hash_named_node(*p), - self.hash_graph_name(g, &hashes), - 1, - )); - } - for (s, p, o, _) in - self.interned_quads_for_graph_name(&InternedGraphName::BlankNode(*bnode)) - { - to_hash.push(( - self.hash_subject(s, &hashes), - self.hash_named_node(*p), - self.hash_term(o, &hashes), - 2, - )); - } - to_hash.sort_unstable(); - let hash = Self::hash_tuple((old_hash, &to_hash)); - to_hash.clear(); - new_hashes.insert(*bnode, hash); + let mut to_do = hashes + .keys() + .map(|bnode| (*bnode, true)) + .collect::<HashMap<_, _>>(); + let mut partition = HashMap::<_, Vec<_>>::with_capacity(hashes.len()); + let mut old_partition_count = usize::MAX; + while old_partition_count != partition.len() { + old_partition_count = partition.len(); + partition.clear(); + let mut new_hashes = hashes.clone(); + for bnode in hashes.keys() { + let hash = if to_do.contains_key(bnode) { + for (s, p, o, g) in &quads_per_blank_node[bnode] { + to_hash.push(( + self.hash_subject(s, *bnode, &hashes), + self.hash_named_node(*p), + self.hash_term(o, *bnode, &hashes), + self.hash_graph_name(g, *bnode, &hashes), + )); + } + to_hash.sort_unstable(); + let hash = Self::hash_tuple((&to_hash, hashes[bnode])); + to_hash.clear(); + if hash == hashes[bnode] { + to_do.insert(*bnode, false); + } else { + new_hashes.insert(*bnode, hash); + } + hash + } else { + hashes[bnode] + }; partition.entry(hash).or_default().push(*bnode); } - if partition.len() == partition_len { - let mut partition: Vec<_> = partition.into_iter().collect(); - partition.sort_by(|(h1, b1), (h2, b2)| (b1.len(), h1).cmp(&(b2.len(), h2))); - return (hashes, partition); - } hashes = new_hashes; - partition_len = partition.len(); - partition.clear(); } + let mut partition: Vec<_> = partition.into_iter().collect(); + partition.sort_unstable_by(|(h1, b1), (h2, b2)| (b1.len(), h1).cmp(&(b2.len(), h2))); + (hashes, partition) } fn hash_named_node(&self, node: InternedNamedNode) -> u64 { Self::hash_tuple(node.decode_from(&self.interner)) } + fn hash_blank_node( + node: InternedBlankNode, + current_blank_node: InternedBlankNode, + bnodes_hash: &HashMap<InternedBlankNode, u64>, + ) -> u64 { + if node == current_blank_node { + u64::MAX + } else { + bnodes_hash[&node] + } + } + fn hash_subject( &self, node: &InternedSubject, + current_blank_node: InternedBlankNode, bnodes_hash: &HashMap<InternedBlankNode, u64>, ) -> u64 { - #[cfg(feature = "rdf-star")] - if let InternedSubject::Triple(triple) = node { - return self.hash_triple(triple, bnodes_hash); - } - if let InternedSubject::BlankNode(bnode) = node { - bnodes_hash[bnode] - } else { - Self::hash_tuple(node.decode_from(&self.interner)) + match node { + InternedSubject::NamedNode(node) => Self::hash_tuple(node.decode_from(&self.interner)), + InternedSubject::BlankNode(bnode) => { + Self::hash_blank_node(*bnode, current_blank_node, bnodes_hash) + } + #[cfg(feature = "rdf-star")] + InternedSubject::Triple(triple) => { + self.hash_triple(triple, current_blank_node, bnodes_hash) + } } } - fn hash_term(&self, term: &InternedTerm, bnodes_hash: &HashMap<InternedBlankNode, u64>) -> u64 { - #[cfg(feature = "rdf-star")] - if let InternedTerm::Triple(triple) = term { - return self.hash_triple(triple, bnodes_hash); - } - if let InternedTerm::BlankNode(bnode) = term { - bnodes_hash[bnode] - } else { - Self::hash_tuple(term.decode_from(&self.interner)) + fn hash_term( + &self, + term: &InternedTerm, + current_blank_node: InternedBlankNode, + bnodes_hash: &HashMap<InternedBlankNode, u64>, + ) -> u64 { + match term { + InternedTerm::NamedNode(node) => Self::hash_tuple(node.decode_from(&self.interner)), + InternedTerm::BlankNode(bnode) => { + Self::hash_blank_node(*bnode, current_blank_node, bnodes_hash) + } + InternedTerm::Literal(literal) => Self::hash_tuple(literal.decode_from(&self.interner)), + #[cfg(feature = "rdf-star")] + InternedTerm::Triple(triple) => { + self.hash_triple(triple, current_blank_node, bnodes_hash) + } } } fn hash_graph_name( &self, graph_name: &InternedGraphName, + current_blank_node: InternedBlankNode, bnodes_hash: &HashMap<InternedBlankNode, u64>, ) -> u64 { - if let InternedGraphName::BlankNode(bnode) = graph_name { - bnodes_hash[bnode] - } else { - Self::hash_tuple(graph_name.decode_from(&self.interner)) + match graph_name { + InternedGraphName::NamedNode(node) => { + Self::hash_tuple(node.decode_from(&self.interner)) + } + InternedGraphName::BlankNode(bnode) => { + Self::hash_blank_node(*bnode, current_blank_node, bnodes_hash) + } + InternedGraphName::DefaultGraph => 0, } } @@ -680,12 +764,13 @@ impl Dataset { fn hash_triple( &self, triple: &InternedTriple, + current_blank_node: InternedBlankNode, bnodes_hash: &HashMap<InternedBlankNode, u64>, ) -> u64 { Self::hash_tuple(( - self.hash_subject(&triple.subject, bnodes_hash), + self.hash_subject(&triple.subject, current_blank_node, bnodes_hash), self.hash_named_node(triple.predicate), - self.hash_term(&triple.object, bnodes_hash), + self.hash_term(&triple.object, current_blank_node, bnodes_hash), )) } @@ -699,33 +784,25 @@ impl Dataset { &mut self, hash: &HashMap<InternedBlankNode, u64>, partition: &[(u64, Vec<InternedBlankNode>)], + quads_per_blank_node: &QuadsPerBlankNode, ) -> Vec<( InternedSubject, InternedNamedNode, InternedTerm, InternedGraphName, )> { - let b_prime = partition.iter().find_map(|(_, b)| (b.len() > 1).then(|| b)); + let b_prime = partition.iter().map(|(_, b)| b).find(|b| b.len() > 1); if let Some(b_prime) = b_prime { b_prime .iter() .map(|b| { let mut hash_prime = hash.clone(); hash_prime.insert(*b, Self::hash_tuple((hash_prime[b], 22))); - let (hash_prime_prime, partition_prime) = self.hash_bnodes(hash_prime); - self.distinguish(&hash_prime_prime, &partition_prime) - }) - .fold(None, |a, b| { - Some(if let Some(a) = a { - if a <= b { - a - } else { - b - } - } else { - b - }) + let (hash_prime_prime, partition_prime) = + self.hash_bnodes(hash_prime, quads_per_blank_node); + self.distinguish(&hash_prime_prime, &partition_prime, quads_per_blank_node) }) + .reduce(min) .unwrap_or_default() } else { self.label(hash) @@ -747,54 +824,43 @@ impl Dataset { .into_iter() .map(|(s, p, o, g)| { ( - if let InternedSubject::BlankNode(bnode) = s { - InternedSubject::BlankNode(self.map_bnode(bnode, hashes)) - } else { - #[cfg(feature = "rdf-star")] - { - if let InternedSubject::Triple(triple) = s { - InternedSubject::Triple(Box::new(InternedTriple::encoded_into( - self.label_triple(&triple, hashes).as_ref(), - &mut self.interner, - ))) - } else { - s - } + match s { + InternedSubject::NamedNode(_) => s, + InternedSubject::BlankNode(bnode) => { + InternedSubject::BlankNode(self.map_bnode(bnode, hashes)) } - #[cfg(not(feature = "rdf-star"))] - { - s + #[cfg(feature = "rdf-star")] + InternedSubject::Triple(triple) => { + InternedSubject::Triple(Box::new(InternedTriple::encoded_into( + self.label_triple(&triple, hashes).as_ref(), + &mut self.interner, + ))) } }, p, - if let InternedTerm::BlankNode(bnode) = o { - InternedTerm::BlankNode(self.map_bnode(bnode, hashes)) - } else { - #[cfg(feature = "rdf-star")] - { - if let InternedTerm::Triple(triple) = o { - InternedTerm::Triple(Box::new(InternedTriple::encoded_into( - self.label_triple(&triple, hashes).as_ref(), - &mut self.interner, - ))) - } else { - o - } + match o { + InternedTerm::NamedNode(_) | InternedTerm::Literal(_) => o, + InternedTerm::BlankNode(bnode) => { + InternedTerm::BlankNode(self.map_bnode(bnode, hashes)) } - #[cfg(not(feature = "rdf-star"))] - { - o + #[cfg(feature = "rdf-star")] + InternedTerm::Triple(triple) => { + InternedTerm::Triple(Box::new(InternedTriple::encoded_into( + self.label_triple(&triple, hashes).as_ref(), + &mut self.interner, + ))) } }, - if let InternedGraphName::BlankNode(bnode) = g { - InternedGraphName::BlankNode(self.map_bnode(bnode, hashes)) - } else { - g + match g { + InternedGraphName::NamedNode(_) | InternedGraphName::DefaultGraph => g, + InternedGraphName::BlankNode(bnode) => { + InternedGraphName::BlankNode(self.map_bnode(bnode, hashes)) + } }, ) }) .collect(); - quads.sort(); + quads.sort_unstable(); quads } @@ -862,7 +928,7 @@ impl<'a> IntoIterator for &'a Dataset { type Item = QuadRef<'a>; type IntoIter = Iter<'a>; - fn into_iter(self) -> Iter<'a> { + fn into_iter(self) -> Self::IntoIter { self.iter() } } @@ -1220,7 +1286,7 @@ impl<'a> IntoIterator for GraphView<'a> { type Item = TripleRef<'a>; type IntoIter = GraphViewIter<'a>; - fn into_iter(self) -> GraphViewIter<'a> { + fn into_iter(self) -> Self::IntoIter { self.iter() } } @@ -1229,7 +1295,7 @@ impl<'a, 'b> IntoIterator for &'b GraphView<'a> { type Item = TripleRef<'a>; type IntoIter = GraphViewIter<'a>; - fn into_iter(self) -> GraphViewIter<'a> { + fn into_iter(self) -> Self::IntoIter { self.iter() } } @@ -1431,7 +1497,7 @@ impl<'a> IntoIterator for &'a GraphViewMut<'a> { type Item = TripleRef<'a>; type IntoIter = GraphViewIter<'a>; - fn into_iter(self) -> GraphViewIter<'a> { + fn into_iter(self) -> Self::IntoIter { self.iter() } } @@ -1462,7 +1528,7 @@ pub struct Iter<'a> { impl<'a> Iterator for Iter<'a> { type Item = QuadRef<'a>; - fn next(&mut self) -> Option<QuadRef<'a>> { + fn next(&mut self) -> Option<Self::Item> { self.inner .next() .map(|(s, p, o, g)| self.dataset.decode_spog((s, p, o, g))) @@ -1486,9 +1552,57 @@ pub struct GraphViewIter<'a> { impl<'a> Iterator for GraphViewIter<'a> { type Item = TripleRef<'a>; - fn next(&mut self) -> Option<TripleRef<'a>> { + fn next(&mut self) -> Option<Self::Item> { self.inner .next() .map(|(_, s, p, o)| self.dataset.decode_spo((s, p, o))) } } + +type QuadsPerBlankNode = HashMap< + InternedBlankNode, + Vec<( + InternedSubject, + InternedNamedNode, + InternedTerm, + InternedGraphName, + )>, +>; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_canon() { + let mut dataset = Dataset::new(); + dataset.insert(QuadRef::new( + BlankNode::default().as_ref(), + NamedNodeRef::new_unchecked("http://ex"), + BlankNode::default().as_ref(), + GraphNameRef::DefaultGraph, + )); + dataset.insert(QuadRef::new( + BlankNode::default().as_ref(), + NamedNodeRef::new_unchecked("http://ex"), + BlankNode::default().as_ref(), + GraphNameRef::DefaultGraph, + )); + dataset.canonicalize(); + let mut dataset2 = Dataset::new(); + dataset2.insert(QuadRef::new( + BlankNode::default().as_ref(), + NamedNodeRef::new_unchecked("http://ex"), + BlankNode::default().as_ref(), + GraphNameRef::DefaultGraph, + )); + dataset2.insert(QuadRef::new( + BlankNode::default().as_ref(), + NamedNodeRef::new_unchecked("http://ex"), + BlankNode::default().as_ref(), + GraphNameRef::DefaultGraph, + )); + dataset2.canonicalize(); + assert_eq!(dataset, dataset2); + } +} diff --git a/lib/oxrdf/src/graph.rs b/lib/oxrdf/src/graph.rs index 4298684c..5459b65c 100644 --- a/lib/oxrdf/src/graph.rs +++ b/lib/oxrdf/src/graph.rs @@ -16,7 +16,10 @@ //! assert_eq!(vec![triple], results); //! //! // Print -//! assert_eq!(graph.to_string(), "<http://example.com> <http://example.com> <http://example.com> .\n"); +//! assert_eq!( +//! graph.to_string(), +//! "<http://example.com> <http://example.com> <http://example.com> .\n" +//! ); //! # Result::<_,Box<dyn std::error::Error>>::Ok(()) //! ``` //! @@ -29,8 +32,9 @@ use std::fmt; /// An in-memory [RDF graph](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph). /// /// It can accommodate a fairly large number of triples (in the few millions). -/// Beware: it interns the string and does not do any garbage collection yet: -/// if you insert and remove a lot of different terms, memory will grow without any reduction. +/// +/// <div class="warning">It interns the string and does not do any garbage collection yet: +/// if you insert and remove a lot of different terms, memory will grow without any reduction.</div> /// /// Usage example: /// ``` @@ -48,7 +52,7 @@ use std::fmt; /// assert_eq!(vec![triple], results); /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// ``` -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct Graph { dataset: Dataset, } @@ -228,7 +232,7 @@ impl<'a> IntoIterator for &'a Graph { type Item = TripleRef<'a>; type IntoIter = Iter<'a>; - fn into_iter(self) -> Iter<'a> { + fn into_iter(self) -> Self::IntoIter { self.iter() } } @@ -275,7 +279,7 @@ pub struct Iter<'a> { impl<'a> Iterator for Iter<'a> { type Item = TripleRef<'a>; - fn next(&mut self) -> Option<TripleRef<'a>> { + fn next(&mut self) -> Option<Self::Item> { self.inner.next() } } diff --git a/lib/oxrdf/src/interning.rs b/lib/oxrdf/src/interning.rs index 2e3d62f2..45152b67 100644 --- a/lib/oxrdf/src/interning.rs +++ b/lib/oxrdf/src/interning.rs @@ -4,10 +4,11 @@ use crate::*; use std::collections::hash_map::{Entry, HashMap, RandomState}; use std::hash::{BuildHasher, Hasher}; -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct Interner { hasher: RandomState, string_for_hash: HashMap<u64, String, IdentityHasherBuilder>, + string_for_blank_node_id: HashMap<u128, String>, #[cfg(feature = "rdf-star")] triples: HashMap<InternedTriple, Triple>, } @@ -100,7 +101,7 @@ impl InternedNamedNode { }) } - pub fn decode_from(self, interner: &Interner) -> NamedNodeRef { + pub fn decode_from(self, interner: &Interner) -> NamedNodeRef<'_> { NamedNodeRef::new_unchecked(interner.resolve(self.id)) } @@ -120,29 +121,53 @@ impl InternedNamedNode { } #[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Copy, Hash)] -pub struct InternedBlankNode { - id: Key, +pub enum InternedBlankNode { + Number { id: u128 }, + Other { id: Key }, } impl InternedBlankNode { pub fn encoded_into(blank_node: BlankNodeRef<'_>, interner: &mut Interner) -> Self { - Self { - id: interner.get_or_intern(blank_node.as_str()), + if let Some(id) = blank_node.unique_id() { + interner + .string_for_blank_node_id + .entry(id) + .or_insert_with(|| blank_node.as_str().into()); + Self::Number { id } + } else { + Self::Other { + id: interner.get_or_intern(blank_node.as_str()), + } } } pub fn encoded_from(blank_node: BlankNodeRef<'_>, interner: &Interner) -> Option<Self> { - Some(Self { - id: interner.get(blank_node.as_str())?, - }) + if let Some(id) = blank_node.unique_id() { + interner + .string_for_blank_node_id + .contains_key(&id) + .then_some(Self::Number { id }) + } else { + Some(Self::Other { + id: interner.get(blank_node.as_str())?, + }) + } } - pub fn decode_from(self, interner: &Interner) -> BlankNodeRef { - BlankNodeRef::new_unchecked(interner.resolve(self.id)) + pub fn decode_from(self, interner: &Interner) -> BlankNodeRef<'_> { + BlankNodeRef::new_unchecked(match self { + Self::Number { id } => &interner.string_for_blank_node_id[&id], + Self::Other { id } => interner.resolve(id), + }) } pub fn next(self) -> Self { - Self { id: self.id.next() } + match self { + Self::Number { id } => Self::Number { + id: id.saturating_add(1), + }, + Self::Other { id } => Self::Other { id: id.next() }, + } } } @@ -467,7 +492,7 @@ impl InternedTriple { interner .triples .contains_key(&interned_triple) - .then(|| interned_triple) + .then_some(interned_triple) } pub fn next(&self) -> Self { @@ -479,14 +504,14 @@ impl InternedTriple { } } -#[derive(Default)] -struct IdentityHasherBuilder {} +#[derive(Default, Clone)] +struct IdentityHasherBuilder; impl BuildHasher for IdentityHasherBuilder { type Hasher = IdentityHasher; - fn build_hasher(&self) -> IdentityHasher { - IdentityHasher::default() + fn build_hasher(&self) -> Self::Hasher { + Self::Hasher::default() } } diff --git a/lib/oxrdf/src/literal.rs b/lib/oxrdf/src/literal.rs index 6891ba15..13ab07fe 100644 --- a/lib/oxrdf/src/literal.rs +++ b/lib/oxrdf/src/literal.rs @@ -1,6 +1,5 @@ use crate::named_node::NamedNode; -use crate::vocab::rdf; -use crate::vocab::xsd; +use crate::vocab::{rdf, xsd}; use crate::NamedNodeRef; use oxilangtag::{LanguageTag, LanguageTagParseError}; #[cfg(feature = "oxsdatatypes")] @@ -15,8 +14,8 @@ use std::option::Option; /// The default string formatter is returning an N-Triples, Turtle, and SPARQL compatible representation: /// ``` /// # use oxilangtag::LanguageTagParseError; -/// use oxrdf::Literal; /// use oxrdf::vocab::xsd; +/// use oxrdf::Literal; /// /// assert_eq!( /// "\"foo\\nbar\"", @@ -24,12 +23,12 @@ use std::option::Option; /// ); /// /// assert_eq!( -/// "\"1999-01-01\"^^<http://www.w3.org/2001/XMLSchema#date>", +/// r#""1999-01-01"^^<http://www.w3.org/2001/XMLSchema#date>"#, /// Literal::new_typed_literal("1999-01-01", xsd::DATE).to_string() /// ); /// /// assert_eq!( -/// "\"foo\"@en", +/// r#""foo"@en"#, /// Literal::new_language_tagged_literal("foo", "en")?.to_string() /// ); /// # Result::<(), LanguageTagParseError>::Ok(()) @@ -427,8 +426,8 @@ impl From<DayTimeDuration> for Literal { /// /// The default string formatter is returning an N-Triples, Turtle, and SPARQL compatible representation: /// ``` -/// use oxrdf::LiteralRef; /// use oxrdf::vocab::xsd; +/// use oxrdf::LiteralRef; /// /// assert_eq!( /// "\"foo\\nbar\"", @@ -436,7 +435,7 @@ impl From<DayTimeDuration> for Literal { /// ); /// /// assert_eq!( -/// "\"1999-01-01\"^^<http://www.w3.org/2001/XMLSchema#date>", +/// r#""1999-01-01"^^<http://www.w3.org/2001/XMLSchema#date>"#, /// LiteralRef::new_typed_literal("1999-01-01", xsd::DATE).to_string() /// ); /// ``` @@ -459,7 +458,7 @@ enum LiteralRefContent<'a> { impl<'a> LiteralRef<'a> { /// Builds an RDF [simple literal](https://www.w3.org/TR/rdf11-concepts/#dfn-simple-literal). #[inline] - pub fn new_simple_literal(value: &'a str) -> Self { + pub const fn new_simple_literal(value: &'a str) -> Self { LiteralRef(LiteralRefContent::String(value)) } @@ -482,13 +481,13 @@ impl<'a> LiteralRef<'a> { /// /// [`Literal::new_language_tagged_literal()`] is a safe version of this constructor and should be used for untrusted data. #[inline] - pub fn new_language_tagged_literal_unchecked(value: &'a str, language: &'a str) -> Self { + pub const fn new_language_tagged_literal_unchecked(value: &'a str, language: &'a str) -> Self { LiteralRef(LiteralRefContent::LanguageTaggedString { value, language }) } /// The literal [lexical form](https://www.w3.org/TR/rdf11-concepts/#dfn-lexical-form) #[inline] - pub fn value(self) -> &'a str { + pub const fn value(self) -> &'a str { match self.0 { LiteralRefContent::String(value) | LiteralRefContent::LanguageTaggedString { value, .. } @@ -501,7 +500,7 @@ impl<'a> LiteralRef<'a> { /// Language tags are defined by the [BCP47](https://tools.ietf.org/html/bcp47). /// They are normalized to lowercase by this implementation. #[inline] - pub fn language(self) -> Option<&'a str> { + pub const fn language(self) -> Option<&'a str> { match self.0 { LiteralRefContent::LanguageTaggedString { language, .. } => Some(language), _ => None, @@ -513,7 +512,7 @@ impl<'a> LiteralRef<'a> { /// The datatype of [language-tagged string](https://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string) is always [rdf:langString](https://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string). /// The datatype of [simple literals](https://www.w3.org/TR/rdf11-concepts/#dfn-simple-literal) is [xsd:string](https://www.w3.org/TR/xmlschema11-2/#string). #[inline] - pub fn datatype(self) -> NamedNodeRef<'a> { + pub const fn datatype(self) -> NamedNodeRef<'a> { match self.0 { LiteralRefContent::String(_) => xsd::STRING, LiteralRefContent::LanguageTaggedString { .. } => rdf::LANG_STRING, @@ -526,7 +525,7 @@ impl<'a> LiteralRef<'a> { /// It returns true if the literal is a [language-tagged string](https://www.w3.org/TR/rdf11-concepts/#dfn-language-tagged-string) /// or has the datatype [xsd:string](https://www.w3.org/TR/xmlschema11-2/#string). #[inline] - pub fn is_plain(self) -> bool { + pub const fn is_plain(self) -> bool { matches!( self.0, LiteralRefContent::String(_) | LiteralRefContent::LanguageTaggedString { .. } @@ -552,7 +551,7 @@ impl<'a> LiteralRef<'a> { /// Extract components from this literal #[inline] - pub fn destruct(self) -> (&'a str, Option<NamedNodeRef<'a>>, Option<&'a str>) { + pub const fn destruct(self) -> (&'a str, Option<NamedNodeRef<'a>>, Option<&'a str>) { match self.0 { LiteralRefContent::String(s) => (s, None, None), LiteralRefContent::LanguageTaggedString { value, language } => { @@ -620,11 +619,15 @@ pub fn print_quoted_str(string: &str, f: &mut impl Write) -> fmt::Result { f.write_char('"')?; for c in string.chars() { match c { + '\u{08}' => f.write_str("\\b"), + '\t' => f.write_str("\\t"), '\n' => f.write_str("\\n"), + '\u{0C}' => f.write_str("\\f"), '\r' => f.write_str("\\r"), '"' => f.write_str("\\\""), '\\' => f.write_str("\\\\"), - c => f.write_char(c), + '\0'..='\u{1F}' | '\u{7F}' => write!(f, "\\u{:04X}", u32::from(c)), + _ => f.write_char(c), }?; } f.write_char('"') @@ -632,6 +635,8 @@ pub fn print_quoted_str(string: &str, f: &mut impl Write) -> fmt::Result { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] diff --git a/lib/oxrdf/src/named_node.rs b/lib/oxrdf/src/named_node.rs index 23a156d6..9b545bcc 100644 --- a/lib/oxrdf/src/named_node.rs +++ b/lib/oxrdf/src/named_node.rs @@ -216,3 +216,21 @@ impl PartialOrd<NamedNodeRef<'_>> for NamedNode { self.as_ref().partial_cmp(other) } } + +impl From<Iri<String>> for NamedNode { + #[inline] + fn from(iri: Iri<String>) -> Self { + Self { + iri: iri.into_inner(), + } + } +} + +impl<'a> From<Iri<&'a str>> for NamedNodeRef<'a> { + #[inline] + fn from(iri: Iri<&'a str>) -> Self { + Self { + iri: iri.into_inner(), + } + } +} diff --git a/lib/oxrdf/src/parser.rs b/lib/oxrdf/src/parser.rs index e06128d3..bcadd1ad 100644 --- a/lib/oxrdf/src/parser.rs +++ b/lib/oxrdf/src/parser.rs @@ -6,8 +6,6 @@ use crate::{ #[cfg(feature = "rdf-star")] use crate::{Subject, Triple}; use std::char; -use std::error::Error; -use std::fmt; use std::str::{Chars, FromStr}; /// This limit is set in order to avoid stack overflow error when parsing nested triples due to too many recursive calls. @@ -23,12 +21,15 @@ impl FromStr for NamedNode { /// use oxrdf::NamedNode; /// use std::str::FromStr; /// - /// assert_eq!(NamedNode::from_str("<http://example.com>").unwrap(), NamedNode::new("http://example.com").unwrap()) + /// assert_eq!( + /// NamedNode::from_str("<http://example.com>").unwrap(), + /// NamedNode::new("http://example.com").unwrap() + /// ) /// ``` - fn from_str(s: &str) -> Result<Self, TermParseError> { + fn from_str(s: &str) -> Result<Self, Self::Err> { let (term, left) = read_named_node(s)?; if !left.is_empty() { - return Err(TermParseError::msg( + return Err(Self::Err::msg( "Named node serialization should end with a >", )); } @@ -45,12 +46,15 @@ impl FromStr for BlankNode { /// use oxrdf::BlankNode; /// use std::str::FromStr; /// - /// assert_eq!(BlankNode::from_str("_:ex").unwrap(), BlankNode::new("ex").unwrap()) + /// assert_eq!( + /// BlankNode::from_str("_:ex").unwrap(), + /// BlankNode::new("ex").unwrap() + /// ) /// ``` - fn from_str(s: &str) -> Result<Self, TermParseError> { + fn from_str(s: &str) -> Result<Self, Self::Err> { let (term, left) = read_blank_node(s)?; if !left.is_empty() { - return Err(TermParseError::msg( + return Err(Self::Err::msg( "Blank node serialization should not contain whitespaces", )); } @@ -64,21 +68,46 @@ impl FromStr for Literal { /// Parses a literal from its NTriples or Turtle serialization /// /// ``` - /// use oxrdf::{Literal, NamedNode, vocab::xsd}; + /// use oxrdf::vocab::xsd; + /// use oxrdf::{Literal, NamedNode}; /// use std::str::FromStr; /// - /// assert_eq!(Literal::from_str("\"ex\\n\"").unwrap(), Literal::new_simple_literal("ex\n")); - /// assert_eq!(Literal::from_str("\"ex\"@en").unwrap(), Literal::new_language_tagged_literal("ex", "en").unwrap()); - /// assert_eq!(Literal::from_str("\"2020\"^^<http://www.w3.org/2001/XMLSchema#gYear>").unwrap(), Literal::new_typed_literal("2020", NamedNode::new("http://www.w3.org/2001/XMLSchema#gYear").unwrap())); - /// assert_eq!(Literal::from_str("true").unwrap(), Literal::new_typed_literal("true", xsd::BOOLEAN)); - /// assert_eq!(Literal::from_str("+122").unwrap(), Literal::new_typed_literal("+122", xsd::INTEGER)); - /// assert_eq!(Literal::from_str("-122.23").unwrap(), Literal::new_typed_literal("-122.23", xsd::DECIMAL)); - /// assert_eq!(Literal::from_str("-122e+1").unwrap(), Literal::new_typed_literal("-122e+1", xsd::DOUBLE)); + /// assert_eq!( + /// Literal::from_str("\"ex\\n\"").unwrap(), + /// Literal::new_simple_literal("ex\n") + /// ); + /// assert_eq!( + /// Literal::from_str("\"ex\"@en").unwrap(), + /// Literal::new_language_tagged_literal("ex", "en").unwrap() + /// ); + /// assert_eq!( + /// Literal::from_str("\"2020\"^^<http://www.w3.org/2001/XMLSchema#gYear>").unwrap(), + /// Literal::new_typed_literal( + /// "2020", + /// NamedNode::new("http://www.w3.org/2001/XMLSchema#gYear").unwrap() + /// ) + /// ); + /// assert_eq!( + /// Literal::from_str("true").unwrap(), + /// Literal::new_typed_literal("true", xsd::BOOLEAN) + /// ); + /// assert_eq!( + /// Literal::from_str("+122").unwrap(), + /// Literal::new_typed_literal("+122", xsd::INTEGER) + /// ); + /// assert_eq!( + /// Literal::from_str("-122.23").unwrap(), + /// Literal::new_typed_literal("-122.23", xsd::DECIMAL) + /// ); + /// assert_eq!( + /// Literal::from_str("-122e+1").unwrap(), + /// Literal::new_typed_literal("-122e+1", xsd::DOUBLE) + /// ); /// ``` - fn from_str(s: &str) -> Result<Self, TermParseError> { + fn from_str(s: &str) -> Result<Self, Self::Err> { let (term, left) = read_literal(s)?; if !left.is_empty() { - return Err(TermParseError::msg("Invalid literal serialization")); + return Err(Self::Err::msg("Invalid literal serialization")); } Ok(term) } @@ -93,17 +122,24 @@ impl FromStr for Term { /// use oxrdf::*; /// use std::str::FromStr; /// - /// assert_eq!(Term::from_str("\"ex\"").unwrap(), Literal::new_simple_literal("ex").into()); - /// assert_eq!(Term::from_str("<< _:s <http://example.com/p> \"o\" >>").unwrap(), Triple::new( - /// BlankNode::new("s").unwrap(), - /// NamedNode::new("http://example.com/p").unwrap(), - /// Literal::new_simple_literal("o") - /// ).into()); + /// assert_eq!( + /// Term::from_str("\"ex\"").unwrap(), + /// Literal::new_simple_literal("ex").into() + /// ); + /// assert_eq!( + /// Term::from_str("<< _:s <http://example.com/p> \"o\" >>").unwrap(), + /// Triple::new( + /// BlankNode::new("s").unwrap(), + /// NamedNode::new("http://example.com/p").unwrap(), + /// Literal::new_simple_literal("o") + /// ) + /// .into() + /// ); /// ``` - fn from_str(s: &str) -> Result<Self, TermParseError> { + fn from_str(s: &str) -> Result<Self, Self::Err> { let (term, left) = read_term(s, 0)?; if !left.is_empty() { - return Err(TermParseError::msg("Invalid term serialization")); + return Err(Self::Err::msg("Invalid term serialization")); } Ok(term) } @@ -118,19 +154,22 @@ impl FromStr for Variable { /// use oxrdf::Variable; /// use std::str::FromStr; /// - /// assert_eq!(Variable::from_str("$foo").unwrap(), Variable::new("foo").unwrap()) + /// assert_eq!( + /// Variable::from_str("$foo").unwrap(), + /// Variable::new("foo").unwrap() + /// ) /// ``` - fn from_str(s: &str) -> Result<Self, TermParseError> { + fn from_str(s: &str) -> Result<Self, Self::Err> { if !s.starts_with('?') && !s.starts_with('$') { - return Err(TermParseError::msg( + return Err(Self::Err::msg( "Variable serialization should start with ? or $", )); } - Self::new(&s[1..]).map_err(|error| TermParseError { - kind: TermParseErrorKind::Variable { + Self::new(&s[1..]).map_err(|error| { + TermParseError(TermParseErrorKind::Variable { value: s.to_owned(), error, - }, + }) }) } } @@ -143,11 +182,11 @@ fn read_named_node(s: &str) -> Result<(NamedNode, &str), TermParseError> { .ok_or_else(|| TermParseError::msg("Named node serialization should end with a >"))?; let (value, remain) = remain.split_at(end); let remain = &remain[1..]; - let term = NamedNode::new(value).map_err(|error| TermParseError { - kind: TermParseErrorKind::Iri { + let term = NamedNode::new(value).map_err(|error| { + TermParseError(TermParseErrorKind::Iri { value: value.to_owned(), error, - }, + }) })?; Ok((term, remain)) } else { @@ -167,11 +206,11 @@ fn read_blank_node(s: &str) -> Result<(BlankNode, &str), TermParseError> { }) .unwrap_or(remain.len()); let (value, remain) = remain.split_at(end); - let term = BlankNode::new(value).map_err(|error| TermParseError { - kind: TermParseErrorKind::BlankNode { + let term = BlankNode::new(value).map_err(|error| { + TermParseError(TermParseErrorKind::BlankNode { value: value.to_owned(), error, - }, + }) })?; Ok((term, remain)) } else { @@ -197,11 +236,11 @@ fn read_literal(s: &str) -> Result<(Literal, &str), TermParseError> { let (language, remain) = remain.split_at(end); Ok(( Literal::new_language_tagged_literal(value, language).map_err( - |error| TermParseError { - kind: TermParseErrorKind::LanguageTag { + |error| { + TermParseError(TermParseErrorKind::LanguageTag { value: language.to_owned(), error, - }, + }) }, )?, remain, @@ -217,10 +256,10 @@ fn read_literal(s: &str) -> Result<(Literal, &str), TermParseError> { if let Some(c) = chars.next() { value.push(match c { 't' => '\t', - 'b' => '\u{8}', + 'b' => '\u{08}', 'n' => '\n', 'r' => '\r', - 'f' => '\u{C}', + 'f' => '\u{0C}', '"' => '"', '\'' => '\'', '\\' => '\\', @@ -232,7 +271,7 @@ fn read_literal(s: &str) -> Result<(Literal, &str), TermParseError> { return Err(TermParseError::msg("Unexpected literal end")); } } - c => value.push(c), + _ => value.push(c), } } Err(TermParseError::msg("Unexpected literal end")) @@ -381,61 +420,36 @@ fn read_hexa_char(input: &mut Chars<'_>, len: usize) -> Result<char, TermParseEr } /// An error raised during term serialization parsing using the [`FromStr`] trait. -#[derive(Debug)] -pub struct TermParseError { - kind: TermParseErrorKind, -} +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct TermParseError(#[from] TermParseErrorKind); -#[derive(Debug)] +/// An internal error raised during term serialization parsing using the [`FromStr`] trait. +#[derive(Debug, thiserror::Error)] enum TermParseErrorKind { - Iri { - error: IriParseError, - value: String, - }, + #[error("Error while parsing the named node '{value}': {error}")] + Iri { error: IriParseError, value: String }, + #[error("Error while parsing the blank node '{value}': {error}")] BlankNode { error: BlankNodeIdParseError, value: String, }, + #[error("Error while parsing the language tag '{value}': {error}")] LanguageTag { error: LanguageTagParseError, value: String, }, + #[error("Error while parsing the variable '{value}': {error}")] Variable { error: VariableNameParseError, value: String, }, - Msg { - msg: &'static str, - }, + #[error("{0}")] + Msg(&'static str), } -impl fmt::Display for TermParseError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.kind { - TermParseErrorKind::Iri { error, value } => { - write!(f, "Error while parsing the named node '{value}': {error}") - } - TermParseErrorKind::BlankNode { error, value } => { - write!(f, "Error while parsing the blank node '{value}': {error}") - } - TermParseErrorKind::LanguageTag { error, value } => { - write!(f, "Error while parsing the language tag '{value}': {error}") - } - TermParseErrorKind::Variable { error, value } => { - write!(f, "Error while parsing the variable '{value}': {error}") - } - TermParseErrorKind::Msg { msg } => f.write_str(msg), - } - } -} - -impl Error for TermParseError {} - impl TermParseError { pub(crate) fn msg(msg: &'static str) -> Self { - Self { - kind: TermParseErrorKind::Msg { msg }, - } + Self(TermParseErrorKind::Msg(msg)) } } diff --git a/lib/oxrdf/src/triple.rs b/lib/oxrdf/src/triple.rs index c0328f46..76039644 100644 --- a/lib/oxrdf/src/triple.rs +++ b/lib/oxrdf/src/triple.rs @@ -698,7 +698,7 @@ impl<'a> From<TermRef<'a>> for Term { /// /// The default string formatter is returning an N-Triples, Turtle, and SPARQL compatible representation: /// ``` -/// use oxrdf::{Triple, NamedNode}; +/// use oxrdf::{NamedNode, Triple}; /// /// assert_eq!( /// "<http://example.com/s> <http://example.com/p> <http://example.com/o>", @@ -706,7 +706,8 @@ impl<'a> From<TermRef<'a>> for Term { /// subject: NamedNode::new("http://example.com/s")?.into(), /// predicate: NamedNode::new("http://example.com/p")?, /// object: NamedNode::new("http://example.com/o")?.into(), -/// }.to_string() +/// } +/// .to_string() /// ); /// # Result::<_,oxrdf::IriParseError>::Ok(()) /// ``` @@ -769,7 +770,7 @@ impl fmt::Display for Triple { /// /// The default string formatter is returning an N-Triples, Turtle, and SPARQL compatible representation: /// ``` -/// use oxrdf::{TripleRef, NamedNodeRef}; +/// use oxrdf::{NamedNodeRef, TripleRef}; /// /// assert_eq!( /// "<http://example.com/s> <http://example.com/p> <http://example.com/o>", @@ -777,7 +778,8 @@ impl fmt::Display for Triple { /// subject: NamedNodeRef::new("http://example.com/s")?.into(), /// predicate: NamedNodeRef::new("http://example.com/p")?, /// object: NamedNodeRef::new("http://example.com/o")?.into(), -/// }.to_string() +/// } +/// .to_string() /// ); /// # Result::<_,oxrdf::IriParseError>::Ok(()) /// ``` @@ -853,10 +855,11 @@ impl<'a> From<TripleRef<'a>> for Triple { /// A possible owned graph name. /// It is the union of [IRIs](https://www.w3.org/TR/rdf11-concepts/#dfn-iri), [blank nodes](https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node), and the [default graph name](https://www.w3.org/TR/rdf11-concepts/#dfn-default-graph). -#[derive(Eq, PartialEq, Debug, Clone, Hash)] +#[derive(Eq, PartialEq, Debug, Clone, Hash, Default)] pub enum GraphName { NamedNode(NamedNode), BlankNode(BlankNode), + #[default] DefaultGraph, } @@ -940,10 +943,11 @@ impl From<NamedOrBlankNodeRef<'_>> for GraphName { /// A possible borrowed graph name. /// It is the union of [IRIs](https://www.w3.org/TR/rdf11-concepts/#dfn-iri), [blank nodes](https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node), and the [default graph name](https://www.w3.org/TR/rdf11-concepts/#dfn-default-graph). -#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] +#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash, Default)] pub enum GraphNameRef<'a> { NamedNode(NamedNodeRef<'a>), BlankNode(BlankNodeRef<'a>), + #[default] DefaultGraph, } @@ -979,7 +983,7 @@ impl fmt::Display for GraphNameRef<'_> { match self { Self::NamedNode(node) => node.fmt(f), Self::BlankNode(node) => node.fmt(f), - Self::DefaultGraph => write!(f, "DEFAULT"), + Self::DefaultGraph => f.write_str("DEFAULT"), } } } diff --git a/lib/oxrdf/src/variable.rs b/lib/oxrdf/src/variable.rs index e1c0d3af..c2d89ca9 100644 --- a/lib/oxrdf/src/variable.rs +++ b/lib/oxrdf/src/variable.rs @@ -1,5 +1,4 @@ use std::cmp::Ordering; -use std::error::Error; use std::fmt; /// A [SPARQL query](https://www.w3.org/TR/sparql11-query/) owned variable. @@ -8,10 +7,7 @@ use std::fmt; /// ``` /// use oxrdf::{Variable, VariableNameParseError}; /// -/// assert_eq!( -/// "?foo", -/// Variable::new("foo")?.to_string() -/// ); +/// assert_eq!("?foo", Variable::new("foo")?.to_string()); /// # Result::<_,VariableNameParseError>::Ok(()) /// ``` #[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Hash)] @@ -67,12 +63,9 @@ impl fmt::Display for Variable { /// /// The default string formatter is returning a SPARQL compatible representation: /// ``` -/// use oxrdf::{VariableRef, VariableNameParseError}; +/// use oxrdf::{VariableNameParseError, VariableRef}; /// -/// assert_eq!( -/// "?foo", -/// VariableRef::new("foo")?.to_string() -/// ); +/// assert_eq!("?foo", VariableRef::new("foo")?.to_string()); /// # Result::<_,VariableNameParseError>::Ok(()) /// ``` #[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Copy, Hash)] @@ -96,12 +89,12 @@ impl<'a> VariableRef<'a> { /// /// [`Variable::new()`] is a safe version of this constructor and should be used for untrusted data. #[inline] - pub fn new_unchecked(name: &'a str) -> Self { + pub const fn new_unchecked(name: &'a str) -> Self { Self { name } } #[inline] - pub fn as_str(&self) -> &str { + pub const fn as_str(self) -> &'a str { self.name } @@ -169,7 +162,7 @@ impl PartialOrd<VariableRef<'_>> for Variable { fn validate_variable_identifier(id: &str) -> Result<(), VariableNameParseError> { let mut chars = id.chars(); - let front = chars.next().ok_or(VariableNameParseError {})?; + let front = chars.next().ok_or(VariableNameParseError)?; match front { '0'..='9' | '_' @@ -188,13 +181,13 @@ fn validate_variable_identifier(id: &str) -> Result<(), VariableNameParseError> | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}' | '\u{10000}'..='\u{EFFFF}' => (), - _ => return Err(VariableNameParseError {}), + _ => return Err(VariableNameParseError), } for c in chars { match c { '0'..='9' | '\u{00B7}' - | '\u{00300}'..='\u{036F}' + | '\u{0300}'..='\u{036F}' | '\u{203F}'..='\u{2040}' | '_' | 'A'..='Z' @@ -211,21 +204,13 @@ fn validate_variable_identifier(id: &str) -> Result<(), VariableNameParseError> | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}' | '\u{10000}'..='\u{EFFFF}' => (), - _ => return Err(VariableNameParseError {}), + _ => return Err(VariableNameParseError), } } Ok(()) } /// An error raised during [`Variable`] name validation. -#[derive(Debug)] -pub struct VariableNameParseError {} - -impl fmt::Display for VariableNameParseError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "The variable name is invalid") - } -} - -impl Error for VariableNameParseError {} +#[derive(Debug, thiserror::Error)] +#[error("The variable name is invalid")] +pub struct VariableNameParseError; diff --git a/lib/oxrdf/src/vocab.rs b/lib/oxrdf/src/vocab.rs index a0c3bd5c..56110c4a 100644 --- a/lib/oxrdf/src/vocab.rs +++ b/lib/oxrdf/src/vocab.rs @@ -231,3 +231,12 @@ pub mod xsd { pub const YEAR_MONTH_DURATION: NamedNodeRef<'_> = NamedNodeRef::new_unchecked("http://www.w3.org/2001/XMLSchema#yearMonthDuration"); } + +pub mod geosparql { + //! [GeoSpatial](https://opengeospatial.github.io/ogc-geosparql/) vocabulary. + use crate::named_node::NamedNodeRef; + + /// Geospatial datatype like `"Point({longitude} {latitude})"^^geo:wktLiteral` + pub const WKT_LITERAL: NamedNodeRef<'_> = + NamedNodeRef::new_unchecked("http://www.opengis.net/ont/geosparql#wktLiteral"); +} diff --git a/lib/oxrdfio/Cargo.toml b/lib/oxrdfio/Cargo.toml new file mode 100644 index 00000000..427fa559 --- /dev/null +++ b/lib/oxrdfio/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "oxrdfio" +version = "0.1.0-alpha.3-dev" +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["RDF"] +repository = "https://github.com/oxigraph/oxigraph/tree/master/lib/oxrdfxml" +documentation = "https://docs.rs/oxrdfio" +description = """ +Parser and serializer for various RDF formats +""" +edition.workspace = true +rust-version.workspace = true + +[features] +default = [] +async-tokio = ["dep:tokio", "oxrdfxml/async-tokio", "oxttl/async-tokio"] +rdf-star = ["oxrdf/rdf-star", "oxttl/rdf-star"] + +[dependencies] +oxrdf.workspace = true +oxrdfxml.workspace = true +oxttl.workspace = true +thiserror.workspace = true +tokio = { workspace = true, optional = true, features = ["io-util"] } + +[dev-dependencies] +tokio = { workspace = true, features = ["rt", "macros"] } + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/oxrdfio/README.md b/lib/oxrdfio/README.md new file mode 100644 index 00000000..72238f86 --- /dev/null +++ b/lib/oxrdfio/README.md @@ -0,0 +1,67 @@ +OxRDF I/O +========= + +[](https://crates.io/crates/oxrdfio) +[](https://docs.rs/oxrdfio) +[](https://crates.io/crates/oxrdfio) +[](https://github.com/oxigraph/oxigraph/actions) +[](https://gitter.im/oxigraph/community) + +OxRDF I/O is a set of parsers and serializers for RDF. + +It supports: +* [N3](https://w3c.github.io/N3/spec/) using [`oxttl`](https://crates.io/crates/oxttl) +* [N-Quads](https://www.w3.org/TR/n-quads/) using [`oxttl`](https://crates.io/crates/oxttl) +* [N-Triples](https://www.w3.org/TR/n-triples/) using [`oxttl`](https://crates.io/crates/oxttl) +* [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) using [`oxrdfxml`](https://crates.io/crates/oxrdfxml) +* [TriG](https://www.w3.org/TR/trig/) using [`oxttl`](https://crates.io/crates/oxttl) +* [Turtle](https://www.w3.org/TR/turtle/) using [`oxttl`](https://crates.io/crates/oxttl) + +Support for [SPARQL-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html) is also available behind the `rdf-star`feature for [Turtle-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#turtle-star), [TriG-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#trig-star), [N-Triples-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-triples-star) and [N-Quads-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-quads-star). + +It is designed as a low level parser compatible with both synchronous and asynchronous I/O (behind the `async-tokio` feature). + +The entry points of this library are the two [`RdfParser`] and [`RdfSerializer`] structs. + +Usage example converting a Turtle file to a N-Triples file: +```rust +use oxrdfio::{RdfFormat, RdfParser, RdfSerializer}; + +let turtle_file = b"@base <http://example.com/> . +@prefix schema: <http://schema.org/> . +<foo> a schema:Person ; + schema:name \"Foo\" . +<bar> a schema:Person ; + schema:name \"Bar\" ."; + +let ntriples_file = b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +<http://example.com/foo> <http://schema.org/name> \"Foo\" . +<http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +<http://example.com/bar> <http://schema.org/name> \"Bar\" . +"; + +let mut writer = RdfSerializer::from_format(RdfFormat::NTriples).serialize_to_write(Vec::new()); +for quad in RdfParser::from_format(RdfFormat::Turtle).parse_read(turtle_file.as_ref()) { + writer.write_quad(&quad.unwrap()).unwrap(); +} +assert_eq!(writer.finish().unwrap(), ntriples_file); +``` + +Parsers for other RDF formats exists in Rust like [graph-rdfa-processor](https://github.com/nbittich/graph-rdfa-processor) for RDFa and [json-ld](https://github.com/timothee-haudebourg/json-ld) for JSON-LD. + + +## License + +This project is licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or + `<http://www.apache.org/licenses/LICENSE-2.0>`) +* MIT license ([LICENSE-MIT](../LICENSE-MIT) or + `<http://opensource.org/licenses/MIT>`) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/lib/oxrdfio/src/error.rs b/lib/oxrdfio/src/error.rs new file mode 100644 index 00000000..a2d14845 --- /dev/null +++ b/lib/oxrdfio/src/error.rs @@ -0,0 +1,122 @@ +use std::io; +use std::ops::Range; + +/// Error returned during RDF format parsing. +#[derive(Debug, thiserror::Error)] +pub enum RdfParseError { + /// I/O error during parsing (file not found...). + #[error(transparent)] + Io(#[from] io::Error), + /// An error in the file syntax. + #[error(transparent)] + Syntax(#[from] RdfSyntaxError), +} + +impl RdfParseError { + pub(crate) fn msg(msg: &'static str) -> Self { + Self::Syntax(RdfSyntaxError(SyntaxErrorKind::Msg(msg))) + } +} + +impl From<oxttl::TurtleSyntaxError> for RdfSyntaxError { + #[inline] + fn from(error: oxttl::TurtleSyntaxError) -> Self { + Self(SyntaxErrorKind::Turtle(error)) + } +} + +impl From<oxttl::TurtleParseError> for RdfParseError { + #[inline] + fn from(error: oxttl::TurtleParseError) -> Self { + match error { + oxttl::TurtleParseError::Syntax(e) => Self::Syntax(e.into()), + oxttl::TurtleParseError::Io(e) => Self::Io(e), + } + } +} + +impl From<oxrdfxml::RdfXmlSyntaxError> for RdfSyntaxError { + #[inline] + fn from(error: oxrdfxml::RdfXmlSyntaxError) -> Self { + Self(SyntaxErrorKind::RdfXml(error)) + } +} + +impl From<oxrdfxml::RdfXmlParseError> for RdfParseError { + #[inline] + fn from(error: oxrdfxml::RdfXmlParseError) -> Self { + match error { + oxrdfxml::RdfXmlParseError::Syntax(e) => Self::Syntax(e.into()), + oxrdfxml::RdfXmlParseError::Io(e) => Self::Io(e), + } + } +} + +impl From<RdfParseError> for io::Error { + #[inline] + fn from(error: RdfParseError) -> Self { + match error { + RdfParseError::Io(error) => error, + RdfParseError::Syntax(error) => error.into(), + } + } +} + +/// An error in the syntax of the parsed file. +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct RdfSyntaxError(#[from] SyntaxErrorKind); + +/// An error in the syntax of the parsed file. +#[derive(Debug, thiserror::Error)] +enum SyntaxErrorKind { + #[error(transparent)] + Turtle(#[from] oxttl::TurtleSyntaxError), + #[error(transparent)] + RdfXml(#[from] oxrdfxml::RdfXmlSyntaxError), + #[error("{0}")] + Msg(&'static str), +} + +impl RdfSyntaxError { + /// The location of the error inside of the file. + #[inline] + pub fn location(&self) -> Option<Range<TextPosition>> { + match &self.0 { + SyntaxErrorKind::Turtle(e) => { + let location = e.location(); + Some( + TextPosition { + line: location.start.line, + column: location.start.column, + offset: location.start.offset, + }..TextPosition { + line: location.end.line, + column: location.end.column, + offset: location.end.offset, + }, + ) + } + SyntaxErrorKind::RdfXml(_) | SyntaxErrorKind::Msg(_) => None, + } + } +} + +impl From<RdfSyntaxError> for io::Error { + #[inline] + fn from(error: RdfSyntaxError) -> Self { + match error.0 { + SyntaxErrorKind::Turtle(error) => error.into(), + SyntaxErrorKind::RdfXml(error) => error.into(), + SyntaxErrorKind::Msg(msg) => Self::new(io::ErrorKind::InvalidData, msg), + } + } +} + +/// A position in a text i.e. a `line` number starting from 0, a `column` number starting from 0 (in number of code points) and a global file `offset` starting from 0 (in number of bytes). +#[derive(Eq, PartialEq, Debug, Clone, Copy)] +pub struct TextPosition { + pub line: u64, + pub column: u64, + pub offset: u64, +} diff --git a/lib/oxrdfio/src/format.rs b/lib/oxrdfio/src/format.rs new file mode 100644 index 00000000..1cc6aa12 --- /dev/null +++ b/lib/oxrdfio/src/format.rs @@ -0,0 +1,216 @@ +use std::fmt; + +/// RDF serialization formats. +/// +/// This enumeration is non exhaustive. New formats like JSON-LD might be added in the future. +#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] +#[non_exhaustive] +pub enum RdfFormat { + /// [N3](https://w3c.github.io/N3/spec/) + N3, + /// [N-Quads](https://www.w3.org/TR/n-quads/) + NQuads, + /// [N-Triples](https://www.w3.org/TR/n-triples/) + NTriples, + /// [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) + RdfXml, + /// [TriG](https://www.w3.org/TR/trig/) + TriG, + /// [Turtle](https://www.w3.org/TR/turtle/) + Turtle, +} + +impl RdfFormat { + /// The format canonical IRI according to the [Unique URIs for file formats registry](https://www.w3.org/ns/formats/). + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!( + /// RdfFormat::NTriples.iri(), + /// "http://www.w3.org/ns/formats/N-Triples" + /// ) + /// ``` + #[inline] + pub const fn iri(self) -> &'static str { + match self { + Self::N3 => "http://www.w3.org/ns/formats/N3", + Self::NQuads => "http://www.w3.org/ns/formats/N-Quads", + Self::NTriples => "http://www.w3.org/ns/formats/N-Triples", + Self::RdfXml => "http://www.w3.org/ns/formats/RDF_XML", + Self::TriG => "http://www.w3.org/ns/formats/TriG", + Self::Turtle => "http://www.w3.org/ns/formats/Turtle", + } + } + + /// The format [IANA media type](https://tools.ietf.org/html/rfc2046). + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::NTriples.media_type(), "application/n-triples") + /// ``` + #[inline] + pub const fn media_type(self) -> &'static str { + match self { + Self::N3 => "text/n3", + Self::NQuads => "application/n-quads", + Self::NTriples => "application/n-triples", + Self::RdfXml => "application/rdf+xml", + Self::TriG => "application/trig", + Self::Turtle => "text/turtle", + } + } + + /// The format [IANA-registered](https://tools.ietf.org/html/rfc2046) file extension. + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::NTriples.file_extension(), "nt") + /// ``` + #[inline] + pub const fn file_extension(self) -> &'static str { + match self { + Self::N3 => "n3", + Self::NQuads => "nq", + Self::NTriples => "nt", + Self::RdfXml => "rdf", + Self::TriG => "trig", + Self::Turtle => "ttl", + } + } + + /// The format name. + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::NTriples.name(), "N-Triples") + /// ``` + #[inline] + pub const fn name(self) -> &'static str { + match self { + Self::N3 => "N3", + Self::NQuads => "N-Quads", + Self::NTriples => "N-Triples", + Self::RdfXml => "RDF/XML", + Self::TriG => "TriG", + Self::Turtle => "Turtle", + } + } + + /// Checks if the formats supports [RDF datasets](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset) and not only [RDF graphs](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph). + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::NTriples.supports_datasets(), false); + /// assert_eq!(RdfFormat::NQuads.supports_datasets(), true); + /// ``` + #[inline] + pub const fn supports_datasets(self) -> bool { + matches!(self, Self::NQuads | Self::TriG) + } + + /// Checks if the formats supports [RDF-star quoted triples](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#dfn-quoted). + /// + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::NTriples.supports_rdf_star(), true); + /// assert_eq!(RdfFormat::RdfXml.supports_rdf_star(), false); + /// ``` + #[inline] + #[cfg(feature = "rdf-star")] + pub const fn supports_rdf_star(self) -> bool { + matches!( + self, + Self::NTriples | Self::NQuads | Self::Turtle | Self::TriG + ) + } + + /// Looks for a known format from a media type. + /// + /// It supports some media type aliases. + /// For example, "application/xml" is going to return `RdfFormat::RdfXml` even if it is not its canonical media type. + /// + /// Example: + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!( + /// RdfFormat::from_media_type("text/turtle; charset=utf-8"), + /// Some(RdfFormat::Turtle) + /// ) + /// ``` + #[inline] + pub fn from_media_type(media_type: &str) -> Option<Self> { + const MEDIA_SUBTYPES: [(&str, RdfFormat); 10] = [ + ("n-quads", RdfFormat::NQuads), + ("n-triples", RdfFormat::NTriples), + ("n3", RdfFormat::N3), + ("nquads", RdfFormat::NQuads), + ("ntriples", RdfFormat::NTriples), + ("plain", RdfFormat::NTriples), + ("rdf+xml", RdfFormat::RdfXml), + ("trig", RdfFormat::TriG), + ("turtle", RdfFormat::Turtle), + ("xml", RdfFormat::RdfXml), + ]; + + let (r#type, subtype) = media_type + .split_once(';') + .unwrap_or((media_type, "")) + .0 + .split_once('/')?; + let r#type = r#type.trim(); + if !r#type.eq_ignore_ascii_case("application") && !r#type.eq_ignore_ascii_case("text") { + return None; + } + let subtype = subtype.trim(); + let subtype = subtype.strip_prefix("x-").unwrap_or(subtype); + for (candidate_subtype, candidate_id) in MEDIA_SUBTYPES { + if candidate_subtype.eq_ignore_ascii_case(subtype) { + return Some(candidate_id); + } + } + None + } + + /// Looks for a known format from an extension. + /// + /// It supports some aliases. + /// + /// Example: + /// ``` + /// use oxrdfio::RdfFormat; + /// + /// assert_eq!(RdfFormat::from_extension("nt"), Some(RdfFormat::NTriples)) + /// ``` + #[inline] + pub fn from_extension(extension: &str) -> Option<Self> { + const MEDIA_TYPES: [(&str, RdfFormat); 8] = [ + ("n3", RdfFormat::N3), + ("nq", RdfFormat::NQuads), + ("nt", RdfFormat::NTriples), + ("rdf", RdfFormat::RdfXml), + ("trig", RdfFormat::TriG), + ("ttl", RdfFormat::Turtle), + ("txt", RdfFormat::NTriples), + ("xml", RdfFormat::RdfXml), + ]; + for (candidate_extension, candidate_id) in MEDIA_TYPES { + if candidate_extension.eq_ignore_ascii_case(extension) { + return Some(candidate_id); + } + } + None + } +} + +impl fmt::Display for RdfFormat { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.name()) + } +} diff --git a/lib/oxrdfio/src/lib.rs b/lib/oxrdfio/src/lib.rs new file mode 100644 index 00000000..b0873f79 --- /dev/null +++ b/lib/oxrdfio/src/lib.rs @@ -0,0 +1,19 @@ +#![doc = include_str!("../README.md")] +#![doc(test(attr(deny(warnings))))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] + +mod error; +mod format; +mod parser; +mod serializer; + +pub use error::{RdfParseError, RdfSyntaxError, TextPosition}; +pub use format::RdfFormat; +#[cfg(feature = "async-tokio")] +pub use parser::FromTokioAsyncReadQuadReader; +pub use parser::{FromReadQuadReader, RdfParser}; +#[cfg(feature = "async-tokio")] +pub use serializer::ToTokioAsyncWriteQuadWriter; +pub use serializer::{RdfSerializer, ToWriteQuadWriter}; diff --git a/lib/oxrdfio/src/parser.rs b/lib/oxrdfio/src/parser.rs new file mode 100644 index 00000000..5e8f1b8d --- /dev/null +++ b/lib/oxrdfio/src/parser.rs @@ -0,0 +1,807 @@ +//! Utilities to read RDF graphs and datasets. + +pub use crate::error::RdfParseError; +use crate::format::RdfFormat; +use oxrdf::{BlankNode, GraphName, IriParseError, Quad, Subject, Term, Triple}; +#[cfg(feature = "async-tokio")] +use oxrdfxml::FromTokioAsyncReadRdfXmlReader; +use oxrdfxml::{FromReadRdfXmlReader, RdfXmlParser}; +#[cfg(feature = "async-tokio")] +use oxttl::n3::FromTokioAsyncReadN3Reader; +use oxttl::n3::{FromReadN3Reader, N3Parser, N3PrefixesIter, N3Quad, N3Term}; +#[cfg(feature = "async-tokio")] +use oxttl::nquads::FromTokioAsyncReadNQuadsReader; +use oxttl::nquads::{FromReadNQuadsReader, NQuadsParser}; +#[cfg(feature = "async-tokio")] +use oxttl::ntriples::FromTokioAsyncReadNTriplesReader; +use oxttl::ntriples::{FromReadNTriplesReader, NTriplesParser}; +#[cfg(feature = "async-tokio")] +use oxttl::trig::FromTokioAsyncReadTriGReader; +use oxttl::trig::{FromReadTriGReader, TriGParser, TriGPrefixesIter}; +#[cfg(feature = "async-tokio")] +use oxttl::turtle::FromTokioAsyncReadTurtleReader; +use oxttl::turtle::{FromReadTurtleReader, TurtleParser, TurtlePrefixesIter}; +use std::collections::HashMap; +use std::io::Read; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncRead; + +/// Parsers for RDF serialization formats. +/// +/// It currently supports the following formats: +/// * [N3](https://w3c.github.io/N3/spec/) ([`RdfFormat::N3`]) +/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`RdfFormat::NQuads`]) +/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`RdfFormat::NTriples`]) +/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`RdfFormat::RdfXml`]) +/// * [TriG](https://www.w3.org/TR/trig/) ([`RdfFormat::TriG`]) +/// * [Turtle](https://www.w3.org/TR/turtle/) ([`RdfFormat::Turtle`]) +/// +/// Note the useful options: +/// - [`with_base_iri`](Self::with_base_iri) to resolve the relative IRIs. +/// - [`rename_blank_nodes`](Self::rename_blank_nodes) to rename the blank nodes to auto-generated numbers to avoid conflicts when merging RDF graphs together. +/// - [`without_named_graphs`](Self::without_named_graphs) to parse a single graph. +/// - [`unchecked`](Self::unchecked) to skip some validations if the file is already known to be valid. +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; +/// +/// let parser = RdfParser::from_format(RdfFormat::NTriples); +/// let quads = parser +/// .parse_read(file.as_bytes()) +/// .collect::<Result<Vec<_>, _>>()?; +/// +/// assert_eq!(quads.len(), 1); +/// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[must_use] +pub struct RdfParser { + inner: RdfParserKind, + default_graph: GraphName, + without_named_graphs: bool, + rename_blank_nodes: bool, +} + +enum RdfParserKind { + N3(N3Parser), + NQuads(NQuadsParser), + NTriples(NTriplesParser), + RdfXml(RdfXmlParser), + TriG(TriGParser), + Turtle(TurtleParser), +} + +impl RdfParser { + /// Builds a parser for the given format. + #[inline] + pub fn from_format(format: RdfFormat) -> Self { + Self { + inner: match format { + RdfFormat::N3 => RdfParserKind::N3(N3Parser::new()), + RdfFormat::NQuads => RdfParserKind::NQuads({ + #[cfg(feature = "rdf-star")] + { + NQuadsParser::new().with_quoted_triples() + } + #[cfg(not(feature = "rdf-star"))] + { + NQuadsParser::new() + } + }), + RdfFormat::NTriples => RdfParserKind::NTriples({ + #[cfg(feature = "rdf-star")] + { + NTriplesParser::new().with_quoted_triples() + } + #[cfg(not(feature = "rdf-star"))] + { + NTriplesParser::new() + } + }), + RdfFormat::RdfXml => RdfParserKind::RdfXml(RdfXmlParser::new()), + RdfFormat::TriG => RdfParserKind::TriG({ + #[cfg(feature = "rdf-star")] + { + TriGParser::new().with_quoted_triples() + } + #[cfg(not(feature = "rdf-star"))] + { + TriGParser::new() + } + }), + RdfFormat::Turtle => RdfParserKind::Turtle({ + #[cfg(feature = "rdf-star")] + { + TurtleParser::new().with_quoted_triples() + } + #[cfg(not(feature = "rdf-star"))] + { + TurtleParser::new() + } + }), + }, + default_graph: GraphName::DefaultGraph, + without_named_graphs: false, + rename_blank_nodes: false, + } + } + + /// The format the parser uses. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// assert_eq!( + /// RdfParser::from_format(RdfFormat::Turtle).format(), + /// RdfFormat::Turtle + /// ); + /// ``` + pub fn format(&self) -> RdfFormat { + match &self.inner { + RdfParserKind::N3(_) => RdfFormat::N3, + RdfParserKind::NQuads(_) => RdfFormat::NQuads, + RdfParserKind::NTriples(_) => RdfFormat::NTriples, + RdfParserKind::RdfXml(_) => RdfFormat::RdfXml, + RdfParserKind::TriG(_) => RdfFormat::TriG, + RdfParserKind::Turtle(_) => RdfFormat::Turtle, + } + } + + /// Provides an IRI that could be used to resolve the file relative IRIs. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = "</s> </p> </o> ."; + /// + /// let parser = RdfParser::from_format(RdfFormat::Turtle).with_base_iri("http://example.com")?; + /// let quads = parser + /// .parse_read(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// + /// assert_eq!(quads.len(), 1); + /// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + self.inner = match self.inner { + RdfParserKind::N3(p) => RdfParserKind::N3(p), + RdfParserKind::NTriples(p) => RdfParserKind::NTriples(p), + RdfParserKind::NQuads(p) => RdfParserKind::NQuads(p), + RdfParserKind::RdfXml(p) => RdfParserKind::RdfXml(p.with_base_iri(base_iri)?), + RdfParserKind::TriG(p) => RdfParserKind::TriG(p.with_base_iri(base_iri)?), + RdfParserKind::Turtle(p) => RdfParserKind::Turtle(p.with_base_iri(base_iri)?), + }; + Ok(self) + } + + /// Provides the name graph name that should replace the default graph in the returned quads. + /// + /// ``` + /// use oxrdf::NamedNode; + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; + /// + /// let parser = RdfParser::from_format(RdfFormat::Turtle) + /// .with_default_graph(NamedNode::new("http://example.com/g")?); + /// let quads = parser + /// .parse_read(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// + /// assert_eq!(quads.len(), 1); + /// assert_eq!(quads[0].graph_name.to_string(), "<http://example.com/g>"); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn with_default_graph(mut self, default_graph: impl Into<GraphName>) -> Self { + self.default_graph = default_graph.into(); + self + } + + /// Sets that the parser must fail if parsing a named graph. + /// + /// This function restricts the parser to only parse a single [RDF graph](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph) and not an [RDF dataset](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset). + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> ."; + /// + /// let parser = RdfParser::from_format(RdfFormat::NQuads).without_named_graphs(); + /// assert!(parser.parse_read(file.as_bytes()).next().unwrap().is_err()); + /// ``` + #[inline] + pub fn without_named_graphs(mut self) -> Self { + self.without_named_graphs = true; + self + } + + /// Renames the blank nodes ids from the ones set in the serialization to random ids. + /// + /// This allows to avoid id conflicts when merging graphs together. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = "_:a <http://example.com/p> <http://example.com/o> ."; + /// + /// let result1 = RdfParser::from_format(RdfFormat::NQuads) + /// .rename_blank_nodes() + /// .parse_read(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// let result2 = RdfParser::from_format(RdfFormat::NQuads) + /// .rename_blank_nodes() + /// .parse_read(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// assert_ne!(result1, result2); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn rename_blank_nodes(mut self) -> Self { + self.rename_blank_nodes = true; + self + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.inner = match self.inner { + RdfParserKind::N3(p) => RdfParserKind::N3(p.unchecked()), + RdfParserKind::NTriples(p) => RdfParserKind::NTriples(p.unchecked()), + RdfParserKind::NQuads(p) => RdfParserKind::NQuads(p.unchecked()), + RdfParserKind::RdfXml(p) => RdfParserKind::RdfXml(p.unchecked()), + RdfParserKind::TriG(p) => RdfParserKind::TriG(p.unchecked()), + RdfParserKind::Turtle(p) => RdfParserKind::Turtle(p.unchecked()), + }; + self + } + + /// Parses from a [`Read`] implementation and returns an iterator of quads. + /// + /// Reads are buffered. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; + /// + /// let parser = RdfParser::from_format(RdfFormat::NTriples); + /// let quads = parser + /// .parse_read(file.as_bytes()) + /// .collect::<Result<Vec<_>, _>>()?; + /// + /// assert_eq!(quads.len(), 1); + /// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); + /// # std::io::Result::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, reader: R) -> FromReadQuadReader<R> { + FromReadQuadReader { + parser: match self.inner { + RdfParserKind::N3(p) => FromReadQuadReaderKind::N3(p.parse_read(reader)), + RdfParserKind::NQuads(p) => FromReadQuadReaderKind::NQuads(p.parse_read(reader)), + RdfParserKind::NTriples(p) => { + FromReadQuadReaderKind::NTriples(p.parse_read(reader)) + } + RdfParserKind::RdfXml(p) => FromReadQuadReaderKind::RdfXml(p.parse_read(reader)), + RdfParserKind::TriG(p) => FromReadQuadReaderKind::TriG(p.parse_read(reader)), + RdfParserKind::Turtle(p) => FromReadQuadReaderKind::Turtle(p.parse_read(reader)), + }, + mapper: QuadMapper { + default_graph: self.default_graph.clone(), + without_named_graphs: self.without_named_graphs, + blank_node_map: self.rename_blank_nodes.then(HashMap::new), + }, + } + } + + /// Parses from a Tokio [`AsyncRead`] implementation and returns an async iterator of quads. + /// + /// Reads are buffered. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxrdfio::RdfParseError> { + /// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; + /// + /// let parser = RdfParser::from_format(RdfFormat::NTriples); + /// let mut reader = parser.parse_tokio_async_read(file.as_bytes()); + /// if let Some(quad) = reader.next().await { + /// assert_eq!(quad?.subject.to_string(), "<http://example.com/s>"); + /// } + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + reader: R, + ) -> FromTokioAsyncReadQuadReader<R> { + FromTokioAsyncReadQuadReader { + parser: match self.inner { + RdfParserKind::N3(p) => { + FromTokioAsyncReadQuadReaderKind::N3(p.parse_tokio_async_read(reader)) + } + RdfParserKind::NQuads(p) => { + FromTokioAsyncReadQuadReaderKind::NQuads(p.parse_tokio_async_read(reader)) + } + RdfParserKind::NTriples(p) => { + FromTokioAsyncReadQuadReaderKind::NTriples(p.parse_tokio_async_read(reader)) + } + RdfParserKind::RdfXml(p) => { + FromTokioAsyncReadQuadReaderKind::RdfXml(p.parse_tokio_async_read(reader)) + } + RdfParserKind::TriG(p) => { + FromTokioAsyncReadQuadReaderKind::TriG(p.parse_tokio_async_read(reader)) + } + RdfParserKind::Turtle(p) => { + FromTokioAsyncReadQuadReaderKind::Turtle(p.parse_tokio_async_read(reader)) + } + }, + mapper: QuadMapper { + default_graph: self.default_graph.clone(), + without_named_graphs: self.without_named_graphs, + blank_node_map: self.rename_blank_nodes.then(HashMap::new), + }, + } + } +} + +impl From<RdfFormat> for RdfParser { + fn from(format: RdfFormat) -> Self { + Self::from_format(format) + } +} + +/// Parses a RDF file from a [`Read`] implementation. Can be built using [`RdfParser::parse_read`]. +/// +/// Reads are buffered. +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfParser}; +/// +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; +/// +/// let parser = RdfParser::from_format(RdfFormat::NTriples); +/// let quads = parser +/// .parse_read(file.as_bytes()) +/// .collect::<Result<Vec<_>, _>>()?; +/// +/// assert_eq!(quads.len(), 1); +/// assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); +/// # std::io::Result::Ok(()) +/// ``` +#[must_use] +pub struct FromReadQuadReader<R: Read> { + parser: FromReadQuadReaderKind<R>, + mapper: QuadMapper, +} + +enum FromReadQuadReaderKind<R: Read> { + N3(FromReadN3Reader<R>), + NQuads(FromReadNQuadsReader<R>), + NTriples(FromReadNTriplesReader<R>), + RdfXml(FromReadRdfXmlReader<R>), + TriG(FromReadTriGReader<R>), + Turtle(FromReadTurtleReader<R>), +} + +impl<R: Read> Iterator for FromReadQuadReader<R> { + type Item = Result<Quad, RdfParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some(match &mut self.parser { + FromReadQuadReaderKind::N3(parser) => match parser.next()? { + Ok(quad) => self.mapper.map_n3_quad(quad), + Err(e) => Err(e.into()), + }, + FromReadQuadReaderKind::NQuads(parser) => match parser.next()? { + Ok(quad) => self.mapper.map_quad(quad), + Err(e) => Err(e.into()), + }, + FromReadQuadReaderKind::NTriples(parser) => match parser.next()? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + FromReadQuadReaderKind::RdfXml(parser) => match parser.next()? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + FromReadQuadReaderKind::TriG(parser) => match parser.next()? { + Ok(quad) => self.mapper.map_quad(quad), + Err(e) => Err(e.into()), + }, + FromReadQuadReaderKind::Turtle(parser) => match parser.next()? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + }) + } +} + +impl<R: Read> FromReadQuadReader<R> { + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// An empty iterator is return if the format does not support prefixes. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = RdfParser::from_format(RdfFormat::Turtle).parse_read(file.as_slice()); + /// assert!(reader.prefixes().collect::<Vec<_>>().is_empty()); // No prefix at the beginning + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> PrefixesIter<'_> { + PrefixesIter { + inner: match &self.parser { + FromReadQuadReaderKind::N3(p) => PrefixesIterKind::N3(p.prefixes()), + FromReadQuadReaderKind::TriG(p) => PrefixesIterKind::TriG(p.prefixes()), + FromReadQuadReaderKind::Turtle(p) => PrefixesIterKind::Turtle(p.prefixes()), + FromReadQuadReaderKind::NQuads(_) + | FromReadQuadReaderKind::NTriples(_) + | FromReadQuadReaderKind::RdfXml(_) => PrefixesIterKind::None, /* TODO: implement for RDF/XML */ + }, + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// `None` is returned if no base IRI is set or the format does not support base IRIs. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = RdfParser::from_format(RdfFormat::Turtle).parse_read(file.as_slice()); + /// assert!(reader.base_iri().is_none()); // No base at the beginning because none has been given to the parser. + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI. + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + match &self.parser { + FromReadQuadReaderKind::N3(p) => p.base_iri(), + FromReadQuadReaderKind::TriG(p) => p.base_iri(), + FromReadQuadReaderKind::Turtle(p) => p.base_iri(), + FromReadQuadReaderKind::NQuads(_) + | FromReadQuadReaderKind::NTriples(_) + | FromReadQuadReaderKind::RdfXml(_) => None, // TODO: implement for RDF/XML + } + } +} + +/// Parses a RDF file from a Tokio [`AsyncRead`] implementation. Can be built using [`RdfParser::parse_tokio_async_read`]. +/// +/// Reads are buffered. +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfParser}; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxrdfio::RdfParseError> { +/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; +/// +/// let parser = RdfParser::from_format(RdfFormat::NTriples); +/// let mut reader = parser.parse_tokio_async_read(file.as_bytes()); +/// if let Some(quad) = reader.next().await { +/// assert_eq!(quad?.subject.to_string(), "<http://example.com/s>"); +/// } +/// # Ok(()) +/// # } +/// ``` +#[must_use] +#[cfg(feature = "async-tokio")] +pub struct FromTokioAsyncReadQuadReader<R: AsyncRead + Unpin> { + parser: FromTokioAsyncReadQuadReaderKind<R>, + mapper: QuadMapper, +} + +#[cfg(feature = "async-tokio")] +enum FromTokioAsyncReadQuadReaderKind<R: AsyncRead + Unpin> { + N3(FromTokioAsyncReadN3Reader<R>), + NQuads(FromTokioAsyncReadNQuadsReader<R>), + NTriples(FromTokioAsyncReadNTriplesReader<R>), + RdfXml(FromTokioAsyncReadRdfXmlReader<R>), + TriG(FromTokioAsyncReadTriGReader<R>), + Turtle(FromTokioAsyncReadTurtleReader<R>), +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadQuadReader<R> { + pub async fn next(&mut self) -> Option<Result<Quad, RdfParseError>> { + Some(match &mut self.parser { + FromTokioAsyncReadQuadReaderKind::N3(parser) => match parser.next().await? { + Ok(quad) => self.mapper.map_n3_quad(quad), + Err(e) => Err(e.into()), + }, + FromTokioAsyncReadQuadReaderKind::NQuads(parser) => match parser.next().await? { + Ok(quad) => self.mapper.map_quad(quad), + Err(e) => Err(e.into()), + }, + FromTokioAsyncReadQuadReaderKind::NTriples(parser) => match parser.next().await? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + FromTokioAsyncReadQuadReaderKind::RdfXml(parser) => match parser.next().await? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + FromTokioAsyncReadQuadReaderKind::TriG(parser) => match parser.next().await? { + Ok(quad) => self.mapper.map_quad(quad), + Err(e) => Err(e.into()), + }, + FromTokioAsyncReadQuadReaderKind::Turtle(parser) => match parser.next().await? { + Ok(triple) => Ok(self.mapper.map_triple_to_quad(triple)), + Err(e) => Err(e.into()), + }, + }) + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// An empty iterator is return if the format does not support prefixes. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = RdfParser::from_format(RdfFormat::Turtle).parse_read(file.as_slice()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Ok(()) + /// # } + /// ``` + pub fn prefixes(&self) -> PrefixesIter<'_> { + PrefixesIter { + inner: match &self.parser { + FromTokioAsyncReadQuadReaderKind::N3(p) => PrefixesIterKind::N3(p.prefixes()), + FromTokioAsyncReadQuadReaderKind::TriG(p) => PrefixesIterKind::TriG(p.prefixes()), + FromTokioAsyncReadQuadReaderKind::Turtle(p) => { + PrefixesIterKind::Turtle(p.prefixes()) + } + FromTokioAsyncReadQuadReaderKind::NQuads(_) + | FromTokioAsyncReadQuadReaderKind::NTriples(_) + | FromTokioAsyncReadQuadReaderKind::RdfXml(_) => PrefixesIterKind::None, /* TODO: implement for RDF/XML */ + }, + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// `None` is returned if no base IRI is set or the format does not support base IRIs. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfParser}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = + /// RdfParser::from_format(RdfFormat::Turtle).parse_tokio_async_read(file.as_slice()); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Ok(()) + /// # } + /// ``` + pub fn base_iri(&self) -> Option<&str> { + match &self.parser { + FromTokioAsyncReadQuadReaderKind::N3(p) => p.base_iri(), + FromTokioAsyncReadQuadReaderKind::TriG(p) => p.base_iri(), + FromTokioAsyncReadQuadReaderKind::Turtle(p) => p.base_iri(), + FromTokioAsyncReadQuadReaderKind::NQuads(_) + | FromTokioAsyncReadQuadReaderKind::NTriples(_) + | FromTokioAsyncReadQuadReaderKind::RdfXml(_) => None, // TODO: implement for RDF/XML + } + } +} + +/// Iterator on the file prefixes. +/// +/// See [`FromReadQuadReader::prefixes`]. +pub struct PrefixesIter<'a> { + inner: PrefixesIterKind<'a>, +} + +enum PrefixesIterKind<'a> { + Turtle(TurtlePrefixesIter<'a>), + TriG(TriGPrefixesIter<'a>), + N3(N3PrefixesIter<'a>), + None, +} + +impl<'a> Iterator for PrefixesIter<'a> { + type Item = (&'a str, &'a str); + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + match &mut self.inner { + PrefixesIterKind::Turtle(iter) => iter.next(), + PrefixesIterKind::TriG(iter) => iter.next(), + PrefixesIterKind::N3(iter) => iter.next(), + PrefixesIterKind::None => None, + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + match &self.inner { + PrefixesIterKind::Turtle(iter) => iter.size_hint(), + PrefixesIterKind::TriG(iter) => iter.size_hint(), + PrefixesIterKind::N3(iter) => iter.size_hint(), + PrefixesIterKind::None => (0, Some(0)), + } + } +} + +struct QuadMapper { + default_graph: GraphName, + without_named_graphs: bool, + blank_node_map: Option<HashMap<BlankNode, BlankNode>>, +} + +impl QuadMapper { + fn map_blank_node(&mut self, node: BlankNode) -> BlankNode { + if let Some(blank_node_map) = &mut self.blank_node_map { + blank_node_map + .entry(node) + .or_insert_with(BlankNode::default) + .clone() + } else { + node + } + } + + fn map_subject(&mut self, node: Subject) -> Subject { + match node { + Subject::NamedNode(node) => node.into(), + Subject::BlankNode(node) => self.map_blank_node(node).into(), + #[cfg(feature = "rdf-star")] + Subject::Triple(triple) => self.map_triple(*triple).into(), + } + } + + fn map_term(&mut self, node: Term) -> Term { + match node { + Term::NamedNode(node) => node.into(), + Term::BlankNode(node) => self.map_blank_node(node).into(), + Term::Literal(literal) => literal.into(), + #[cfg(feature = "rdf-star")] + Term::Triple(triple) => self.map_triple(*triple).into(), + } + } + + fn map_triple(&mut self, triple: Triple) -> Triple { + Triple { + subject: self.map_subject(triple.subject), + predicate: triple.predicate, + object: self.map_term(triple.object), + } + } + + fn map_graph_name(&mut self, graph_name: GraphName) -> Result<GraphName, RdfParseError> { + match graph_name { + GraphName::NamedNode(node) => { + if self.without_named_graphs { + Err(RdfParseError::msg("Named graphs are not allowed")) + } else { + Ok(node.into()) + } + } + GraphName::BlankNode(node) => { + if self.without_named_graphs { + Err(RdfParseError::msg("Named graphs are not allowed")) + } else { + Ok(self.map_blank_node(node).into()) + } + } + GraphName::DefaultGraph => Ok(self.default_graph.clone()), + } + } + + fn map_quad(&mut self, quad: Quad) -> Result<Quad, RdfParseError> { + Ok(Quad { + subject: self.map_subject(quad.subject), + predicate: quad.predicate, + object: self.map_term(quad.object), + graph_name: self.map_graph_name(quad.graph_name)?, + }) + } + + fn map_triple_to_quad(&mut self, triple: Triple) -> Quad { + self.map_triple(triple).in_graph(self.default_graph.clone()) + } + + fn map_n3_quad(&mut self, quad: N3Quad) -> Result<Quad, RdfParseError> { + Ok(Quad { + subject: match quad.subject { + N3Term::NamedNode(s) => Ok(s.into()), + N3Term::BlankNode(s) => Ok(self.map_blank_node(s).into()), + N3Term::Literal(_) => Err(RdfParseError::msg( + "literals are not allowed in regular RDF subjects", + )), + #[cfg(feature = "rdf-star")] + N3Term::Triple(s) => Ok(self.map_triple(*s).into()), + N3Term::Variable(_) => Err(RdfParseError::msg( + "variables are not allowed in regular RDF subjects", + )), + }?, + predicate: match quad.predicate { + N3Term::NamedNode(p) => Ok(p), + N3Term::BlankNode(_) => Err(RdfParseError::msg( + "blank nodes are not allowed in regular RDF predicates", + )), + N3Term::Literal(_) => Err(RdfParseError::msg( + "literals are not allowed in regular RDF predicates", + )), + #[cfg(feature = "rdf-star")] + N3Term::Triple(_) => Err(RdfParseError::msg( + "quoted triples are not allowed in regular RDF predicates", + )), + N3Term::Variable(_) => Err(RdfParseError::msg( + "variables are not allowed in regular RDF predicates", + )), + }?, + object: match quad.object { + N3Term::NamedNode(o) => Ok(o.into()), + N3Term::BlankNode(o) => Ok(self.map_blank_node(o).into()), + N3Term::Literal(o) => Ok(o.into()), + #[cfg(feature = "rdf-star")] + N3Term::Triple(o) => Ok(self.map_triple(*o).into()), + N3Term::Variable(_) => Err(RdfParseError::msg( + "variables are not allowed in regular RDF objects", + )), + }?, + graph_name: self.map_graph_name(quad.graph_name)?, + }) + } +} diff --git a/lib/oxrdfio/src/serializer.rs b/lib/oxrdfio/src/serializer.rs new file mode 100644 index 00000000..3b32dc32 --- /dev/null +++ b/lib/oxrdfio/src/serializer.rs @@ -0,0 +1,410 @@ +//! Utilities to write RDF graphs and datasets. + +use crate::format::RdfFormat; +use oxrdf::{GraphNameRef, IriParseError, QuadRef, TripleRef}; +#[cfg(feature = "async-tokio")] +use oxrdfxml::ToTokioAsyncWriteRdfXmlWriter; +use oxrdfxml::{RdfXmlSerializer, ToWriteRdfXmlWriter}; +#[cfg(feature = "async-tokio")] +use oxttl::nquads::ToTokioAsyncWriteNQuadsWriter; +use oxttl::nquads::{NQuadsSerializer, ToWriteNQuadsWriter}; +#[cfg(feature = "async-tokio")] +use oxttl::ntriples::ToTokioAsyncWriteNTriplesWriter; +use oxttl::ntriples::{NTriplesSerializer, ToWriteNTriplesWriter}; +#[cfg(feature = "async-tokio")] +use oxttl::trig::ToTokioAsyncWriteTriGWriter; +use oxttl::trig::{ToWriteTriGWriter, TriGSerializer}; +#[cfg(feature = "async-tokio")] +use oxttl::turtle::ToTokioAsyncWriteTurtleWriter; +use oxttl::turtle::{ToWriteTurtleWriter, TurtleSerializer}; +use std::io::{self, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncWrite; + +/// A serializer for RDF serialization formats. +/// +/// It currently supports the following formats: +/// * [N3](https://w3c.github.io/N3/spec/) ([`RdfFormat::N3`]) +/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`RdfFormat::NQuads`]) +/// * [canonical](https://www.w3.org/TR/n-triples/#canonical-ntriples) [N-Triples](https://www.w3.org/TR/n-triples/) ([`RdfFormat::NTriples`]) +/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`RdfFormat::RdfXml`]) +/// * [TriG](https://www.w3.org/TR/trig/) ([`RdfFormat::TriG`]) +/// * [Turtle](https://www.w3.org/TR/turtle/) ([`RdfFormat::Turtle`]) +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfSerializer}; +/// use oxrdf::{Quad, NamedNode}; +/// +/// let mut writer = RdfSerializer::from_format(RdfFormat::NQuads).serialize_to_write(Vec::new()); +/// writer.write_quad(&Quad { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// graph_name: NamedNode::new("http://example.com/g")?.into() +/// })?; +/// assert_eq!(writer.finish()?, b"<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n"); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct RdfSerializer { + inner: RdfSerializerKind, +} + +enum RdfSerializerKind { + NQuads(NQuadsSerializer), + NTriples(NTriplesSerializer), + RdfXml(RdfXmlSerializer), + TriG(TriGSerializer), + Turtle(TurtleSerializer), +} + +impl RdfSerializer { + /// Builds a serializer for the given format + #[inline] + pub fn from_format(format: RdfFormat) -> Self { + Self { + inner: match format { + RdfFormat::NQuads => RdfSerializerKind::NQuads(NQuadsSerializer::new()), + RdfFormat::NTriples => RdfSerializerKind::NTriples(NTriplesSerializer::new()), + RdfFormat::RdfXml => RdfSerializerKind::RdfXml(RdfXmlSerializer::new()), + RdfFormat::TriG => RdfSerializerKind::TriG(TriGSerializer::new()), + RdfFormat::Turtle | RdfFormat::N3 => { + RdfSerializerKind::Turtle(TurtleSerializer::new()) + } + }, + } + } + + /// The format the serializer serializes to. + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfSerializer}; + /// + /// assert_eq!( + /// RdfSerializer::from_format(RdfFormat::Turtle).format(), + /// RdfFormat::Turtle + /// ); + /// ``` + pub fn format(&self) -> RdfFormat { + match &self.inner { + RdfSerializerKind::NQuads(_) => RdfFormat::NQuads, + RdfSerializerKind::NTriples(_) => RdfFormat::NTriples, + RdfSerializerKind::RdfXml(_) => RdfFormat::RdfXml, + RdfSerializerKind::TriG(_) => RdfFormat::TriG, + RdfSerializerKind::Turtle(_) => RdfFormat::Turtle, + } + } + + /// If the format supports it, sets a prefix. + /// + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxrdfio::{RdfFormat, RdfSerializer}; + /// + /// let mut writer = RdfSerializer::from_format(RdfFormat::Turtle) + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize_to_write(Vec::new()); + /// writer.write_triple(TripleRef { + /// subject: NamedNodeRef::new("http://example.com/s")?.into(), + /// predicate: rdf::TYPE.into(), + /// object: NamedNodeRef::new("http://schema.org/Person")?.into(), + /// })?; + /// assert_eq!( + /// writer.finish()?, + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com/s> a schema:Person .\n" + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.inner = match self.inner { + RdfSerializerKind::NQuads(s) => RdfSerializerKind::NQuads(s), + RdfSerializerKind::NTriples(s) => RdfSerializerKind::NTriples(s), + RdfSerializerKind::RdfXml(s) => { + RdfSerializerKind::RdfXml(s.with_prefix(prefix_name, prefix_iri)?) + } + RdfSerializerKind::TriG(s) => { + RdfSerializerKind::TriG(s.with_prefix(prefix_name, prefix_iri)?) + } + RdfSerializerKind::Turtle(s) => { + RdfSerializerKind::Turtle(s.with_prefix(prefix_name, prefix_iri)?) + } + }; + Ok(self) + } + + /// Writes to a [`Write`] implementation. + /// + /// <div class="warning"> + /// + /// Do not forget to run the [`finish`](ToWriteQuadWriter::finish()) method to properly write the last bytes of the file.</div> + /// + /// <div class="warning"> + /// + /// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfSerializer}; + /// use oxrdf::{Quad, NamedNode}; + /// + /// let mut writer = RdfSerializer::from_format(RdfFormat::NQuads).serialize_to_write(Vec::new()); + /// writer.write_quad(&Quad { + /// subject: NamedNode::new("http://example.com/s")?.into(), + /// predicate: NamedNode::new("http://example.com/p")?, + /// object: NamedNode::new("http://example.com/o")?.into(), + /// graph_name: NamedNode::new("http://example.com/g")?.into() + /// })?; + /// assert_eq!(writer.finish()?, b"<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n"); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteQuadWriter<W> { + ToWriteQuadWriter { + formatter: match self.inner { + RdfSerializerKind::NQuads(s) => { + ToWriteQuadWriterKind::NQuads(s.serialize_to_write(write)) + } + RdfSerializerKind::NTriples(s) => { + ToWriteQuadWriterKind::NTriples(s.serialize_to_write(write)) + } + RdfSerializerKind::RdfXml(s) => { + ToWriteQuadWriterKind::RdfXml(s.serialize_to_write(write)) + } + RdfSerializerKind::TriG(s) => { + ToWriteQuadWriterKind::TriG(s.serialize_to_write(write)) + } + RdfSerializerKind::Turtle(s) => { + ToWriteQuadWriterKind::Turtle(s.serialize_to_write(write)) + } + }, + } + } + + /// Writes to a Tokio [`AsyncWrite`] implementation. + /// + /// <div class="warning"> + /// + /// Do not forget to run the [`finish`](ToTokioAsyncWriteQuadWriter::finish()) method to properly write the last bytes of the file.</div> + /// + /// <div class="warning"> + /// + /// This writer does unbuffered writes. You might want to use [`BufWriter`](tokio::io::BufWriter) to avoid that.</div> + /// + /// ``` + /// use oxrdfio::{RdfFormat, RdfSerializer}; + /// use oxrdf::{Quad, NamedNode}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let mut writer = RdfSerializer::from_format(RdfFormat::NQuads).serialize_to_tokio_async_write(Vec::new()); + /// writer.write_quad(&Quad { + /// subject: NamedNode::new_unchecked("http://example.com/s").into(), + /// predicate: NamedNode::new_unchecked("http://example.com/p"), + /// object: NamedNode::new_unchecked("http://example.com/o").into(), + /// graph_name: NamedNode::new_unchecked("http://example.com/g").into() + /// }).await?; + /// assert_eq!(writer.finish().await?, "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n"); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteQuadWriter<W> { + ToTokioAsyncWriteQuadWriter { + formatter: match self.inner { + RdfSerializerKind::NQuads(s) => { + ToTokioAsyncWriteQuadWriterKind::NQuads(s.serialize_to_tokio_async_write(write)) + } + RdfSerializerKind::NTriples(s) => ToTokioAsyncWriteQuadWriterKind::NTriples( + s.serialize_to_tokio_async_write(write), + ), + RdfSerializerKind::RdfXml(s) => { + ToTokioAsyncWriteQuadWriterKind::RdfXml(s.serialize_to_tokio_async_write(write)) + } + RdfSerializerKind::TriG(s) => { + ToTokioAsyncWriteQuadWriterKind::TriG(s.serialize_to_tokio_async_write(write)) + } + RdfSerializerKind::Turtle(s) => { + ToTokioAsyncWriteQuadWriterKind::Turtle(s.serialize_to_tokio_async_write(write)) + } + }, + } + } +} + +impl From<RdfFormat> for RdfSerializer { + fn from(format: RdfFormat) -> Self { + Self::from_format(format) + } +} + +/// Writes quads or triples to a [`Write`] implementation. +/// +/// Can be built using [`RdfSerializer::serialize_to_write`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](ToWriteQuadWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// <div class="warning"> +/// +/// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfSerializer}; +/// use oxrdf::{Quad, NamedNode}; +/// +/// let mut writer = RdfSerializer::from_format(RdfFormat::NQuads).serialize_to_write(Vec::new()); +/// writer.write_quad(&Quad { +/// subject: NamedNode::new("http://example.com/s")?.into(), +/// predicate: NamedNode::new("http://example.com/p")?, +/// object: NamedNode::new("http://example.com/o")?.into(), +/// graph_name: NamedNode::new("http://example.com/g")?.into(), +/// })?; +/// assert_eq!(writer.finish()?, b"<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n"); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteQuadWriter<W: Write> { + formatter: ToWriteQuadWriterKind<W>, +} + +enum ToWriteQuadWriterKind<W: Write> { + NQuads(ToWriteNQuadsWriter<W>), + NTriples(ToWriteNTriplesWriter<W>), + RdfXml(ToWriteRdfXmlWriter<W>), + TriG(ToWriteTriGWriter<W>), + Turtle(ToWriteTurtleWriter<W>), +} + +impl<W: Write> ToWriteQuadWriter<W> { + /// Writes a [`QuadRef`] + pub fn write_quad<'a>(&mut self, quad: impl Into<QuadRef<'a>>) -> io::Result<()> { + match &mut self.formatter { + ToWriteQuadWriterKind::NQuads(writer) => writer.write_quad(quad), + ToWriteQuadWriterKind::NTriples(writer) => writer.write_triple(to_triple(quad)?), + ToWriteQuadWriterKind::RdfXml(writer) => writer.write_triple(to_triple(quad)?), + ToWriteQuadWriterKind::TriG(writer) => writer.write_quad(quad), + ToWriteQuadWriterKind::Turtle(writer) => writer.write_triple(to_triple(quad)?), + } + } + + /// Writes a [`TripleRef`] + pub fn write_triple<'a>(&mut self, triple: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.write_quad(triple.into().in_graph(GraphNameRef::DefaultGraph)) + } + + /// Writes the last bytes of the file + /// + /// Note that this function does not flush the writer. You need to do that if you are using a [`BufWriter`](io::BufWriter). + pub fn finish(self) -> io::Result<W> { + Ok(match self.formatter { + ToWriteQuadWriterKind::NQuads(writer) => writer.finish(), + ToWriteQuadWriterKind::NTriples(writer) => writer.finish(), + ToWriteQuadWriterKind::RdfXml(writer) => writer.finish()?, + ToWriteQuadWriterKind::TriG(writer) => writer.finish()?, + ToWriteQuadWriterKind::Turtle(writer) => writer.finish()?, + }) + } +} + +/// Writes quads or triples to a [`Write`] implementation. +/// +/// Can be built using [`RdfSerializer::serialize_to_write`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](ToWriteQuadWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// <div class="warning"> +/// +/// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> +/// +/// ``` +/// use oxrdfio::{RdfFormat, RdfSerializer}; +/// use oxrdf::{Quad, NamedNode}; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> std::io::Result<()> { +/// let mut writer = RdfSerializer::from_format(RdfFormat::NQuads).serialize_to_tokio_async_write(Vec::new()); +/// writer.write_quad(&Quad { +/// subject: NamedNode::new_unchecked("http://example.com/s").into(), +/// predicate: NamedNode::new_unchecked("http://example.com/p"), +/// object: NamedNode::new_unchecked("http://example.com/o").into(), +/// graph_name: NamedNode::new_unchecked("http://example.com/g").into() +/// }).await?; +/// assert_eq!(writer.finish().await?, "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n"); +/// # Ok(()) +/// # } +/// ``` +#[must_use] +#[cfg(feature = "async-tokio")] +pub struct ToTokioAsyncWriteQuadWriter<W: AsyncWrite + Unpin> { + formatter: ToTokioAsyncWriteQuadWriterKind<W>, +} + +#[cfg(feature = "async-tokio")] +enum ToTokioAsyncWriteQuadWriterKind<W: AsyncWrite + Unpin> { + NQuads(ToTokioAsyncWriteNQuadsWriter<W>), + NTriples(ToTokioAsyncWriteNTriplesWriter<W>), + RdfXml(ToTokioAsyncWriteRdfXmlWriter<W>), + TriG(ToTokioAsyncWriteTriGWriter<W>), + Turtle(ToTokioAsyncWriteTurtleWriter<W>), +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteQuadWriter<W> { + /// Writes a [`QuadRef`] + pub async fn write_quad<'a>(&mut self, quad: impl Into<QuadRef<'a>>) -> io::Result<()> { + match &mut self.formatter { + ToTokioAsyncWriteQuadWriterKind::NQuads(writer) => writer.write_quad(quad).await, + ToTokioAsyncWriteQuadWriterKind::NTriples(writer) => { + writer.write_triple(to_triple(quad)?).await + } + ToTokioAsyncWriteQuadWriterKind::RdfXml(writer) => { + writer.write_triple(to_triple(quad)?).await + } + ToTokioAsyncWriteQuadWriterKind::TriG(writer) => writer.write_quad(quad).await, + ToTokioAsyncWriteQuadWriterKind::Turtle(writer) => { + writer.write_triple(to_triple(quad)?).await + } + } + } + + /// Writes a [`TripleRef`] + pub async fn write_triple<'a>(&mut self, triple: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.write_quad(triple.into().in_graph(GraphNameRef::DefaultGraph)) + .await + } + + /// Writes the last bytes of the file + /// + /// Note that this function does not flush the writer. You need to do that if you are using a [`BufWriter`](io::BufWriter). + pub async fn finish(self) -> io::Result<W> { + Ok(match self.formatter { + ToTokioAsyncWriteQuadWriterKind::NQuads(writer) => writer.finish(), + ToTokioAsyncWriteQuadWriterKind::NTriples(writer) => writer.finish(), + ToTokioAsyncWriteQuadWriterKind::RdfXml(writer) => writer.finish().await?, + ToTokioAsyncWriteQuadWriterKind::TriG(writer) => writer.finish().await?, + ToTokioAsyncWriteQuadWriterKind::Turtle(writer) => writer.finish().await?, + }) + } +} + +fn to_triple<'a>(quad: impl Into<QuadRef<'a>>) -> io::Result<TripleRef<'a>> { + let quad = quad.into(); + if quad.graph_name.is_default_graph() { + Ok(quad.into()) + } else { + Err(io::Error::new( + io::ErrorKind::InvalidInput, + "Only quads in the default graph can be serialized to a RDF graph format", + )) + } +} diff --git a/lib/oxrdfxml/Cargo.toml b/lib/oxrdfxml/Cargo.toml new file mode 100644 index 00000000..97dcee82 --- /dev/null +++ b/lib/oxrdfxml/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "oxrdfxml" +version = "0.1.0-alpha.3-dev" +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["RDFXML", "XML", "RDF"] +repository = "https://github.com/oxigraph/oxigraph/tree/master/lib/oxrdfxml" +description = """ +Parser and serializer for the RDF/XML format +""" +documentation = "https://docs.rs/oxrdfxml" +edition.workspace = true +rust-version.workspace = true + +[features] +default = [] +async-tokio = ["dep:tokio", "quick-xml/async-tokio"] + +[dependencies] +oxilangtag.workspace = true +oxiri.workspace = true +oxrdf.workspace = true +quick-xml.workspace = true +thiserror.workspace = true +tokio = { workspace = true, optional = true, features = ["io-util"] } + +[dev-dependencies] +tokio = { workspace = true, features = ["rt", "macros"] } + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/oxrdfxml/README.md b/lib/oxrdfxml/README.md new file mode 100644 index 00000000..29ebb4cf --- /dev/null +++ b/lib/oxrdfxml/README.md @@ -0,0 +1,56 @@ +OxRDF/XML +========= + +[](https://crates.io/crates/oxrdfxml) +[](https://docs.rs/oxrdfxml) +[](https://crates.io/crates/oxrdfxml) +[](https://github.com/oxigraph/oxigraph/actions) +[](https://gitter.im/oxigraph/community) + +OxRdfXml is a parser and serializer for [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/). + +The entry points of this library are the two [`RdfXmlParser`] and [`RdfXmlSerializer`] structs. + +Usage example counting the number of people in a RDF/XML file: + +```rust +use oxrdf::{NamedNodeRef, vocab::rdf}; +use oxrdfxml::RdfXmlParser; + +fn main() { + let file = br#"<?xml version="1.0"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> + <rdf:Description rdf:about="http://example.com/foo"> + <rdf:type rdf:resource="http://schema.org/Person" /> + <schema:name>Foo</schema:name> + </rdf:Description> + <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> +</rdf:RDF>"#; + + let schema_person = NamedNodeRef::new("http://schema.org/Person").unwrap(); + let mut count = 0; + for triple in RdfXmlParser::new().parse_read(file.as_ref()) { + let triple = triple.unwrap(); + if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + count += 1; + } + } + assert_eq!(2, count); +} +``` + +## License + +This project is licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or + `<http://www.apache.org/licenses/LICENSE-2.0>`) +* MIT license ([LICENSE-MIT](../LICENSE-MIT) or + `<http://opensource.org/licenses/MIT>`) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/lib/oxrdfxml/src/error.rs b/lib/oxrdfxml/src/error.rs new file mode 100644 index 00000000..9a59a766 --- /dev/null +++ b/lib/oxrdfxml/src/error.rs @@ -0,0 +1,89 @@ +use oxilangtag::LanguageTagParseError; +use oxiri::IriParseError; +use std::io; +use std::sync::Arc; + +/// Error returned during RDF/XML parsing. +#[derive(Debug, thiserror::Error)] +pub enum RdfXmlParseError { + /// I/O error during parsing (file not found...). + #[error(transparent)] + Io(#[from] io::Error), + /// An error in the file syntax. + #[error(transparent)] + Syntax(#[from] RdfXmlSyntaxError), +} + +impl From<RdfXmlParseError> for io::Error { + #[inline] + fn from(error: RdfXmlParseError) -> Self { + match error { + RdfXmlParseError::Io(error) => error, + RdfXmlParseError::Syntax(error) => error.into(), + } + } +} + +impl From<quick_xml::Error> for RdfXmlParseError { + #[inline] + fn from(error: quick_xml::Error) -> Self { + match error { + quick_xml::Error::Io(error) => { + Self::Io(Arc::try_unwrap(error).unwrap_or_else(|e| io::Error::new(e.kind(), e))) + } + _ => Self::Syntax(RdfXmlSyntaxError(SyntaxErrorKind::Xml(error))), + } + } +} + +/// An error in the syntax of the parsed file. +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct RdfXmlSyntaxError(#[from] pub(crate) SyntaxErrorKind); + +#[derive(Debug, thiserror::Error)] +pub enum SyntaxErrorKind { + #[error(transparent)] + Xml(#[from] quick_xml::Error), + #[error("error while parsing IRI '{iri}': {error}")] + InvalidIri { + iri: String, + #[source] + error: IriParseError, + }, + #[error("error while parsing language tag '{tag}': {error}")] + InvalidLanguageTag { + tag: String, + #[source] + error: LanguageTagParseError, + }, + #[error("{0}")] + Msg(String), +} + +impl RdfXmlSyntaxError { + /// Builds an error from a printable error message. + #[inline] + pub(crate) fn msg(msg: impl Into<String>) -> Self { + Self(SyntaxErrorKind::Msg(msg.into())) + } +} + +impl From<RdfXmlSyntaxError> for io::Error { + #[inline] + fn from(error: RdfXmlSyntaxError) -> Self { + match error.0 { + SyntaxErrorKind::Xml(error) => match error { + quick_xml::Error::Io(error) => { + Arc::try_unwrap(error).unwrap_or_else(|e| Self::new(e.kind(), e)) + } + quick_xml::Error::UnexpectedEof(error) => { + Self::new(io::ErrorKind::UnexpectedEof, error) + } + _ => Self::new(io::ErrorKind::InvalidData, error), + }, + SyntaxErrorKind::Msg(msg) => Self::new(io::ErrorKind::InvalidData, msg), + _ => Self::new(io::ErrorKind::InvalidData, error), + } + } +} diff --git a/lib/oxrdfxml/src/lib.rs b/lib/oxrdfxml/src/lib.rs new file mode 100644 index 00000000..2354101a --- /dev/null +++ b/lib/oxrdfxml/src/lib.rs @@ -0,0 +1,18 @@ +#![doc = include_str!("../README.md")] +#![doc(test(attr(deny(warnings))))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] + +mod error; +mod parser; +mod serializer; +mod utils; + +pub use error::{RdfXmlParseError, RdfXmlSyntaxError}; +#[cfg(feature = "async-tokio")] +pub use parser::FromTokioAsyncReadRdfXmlReader; +pub use parser::{FromReadRdfXmlReader, RdfXmlParser}; +#[cfg(feature = "async-tokio")] +pub use serializer::ToTokioAsyncWriteRdfXmlWriter; +pub use serializer::{RdfXmlSerializer, ToWriteRdfXmlWriter}; diff --git a/lib/oxrdfxml/src/parser.rs b/lib/oxrdfxml/src/parser.rs new file mode 100644 index 00000000..d11a1f99 --- /dev/null +++ b/lib/oxrdfxml/src/parser.rs @@ -0,0 +1,1241 @@ +use crate::error::{RdfXmlParseError, RdfXmlSyntaxError, SyntaxErrorKind}; +use crate::utils::*; +use oxilangtag::LanguageTag; +use oxiri::{Iri, IriParseError}; +use oxrdf::vocab::rdf; +use oxrdf::{BlankNode, Literal, NamedNode, Subject, Term, Triple}; +use quick_xml::escape::unescape_with; +use quick_xml::events::attributes::Attribute; +use quick_xml::events::*; +use quick_xml::name::{LocalName, QName, ResolveResult}; +use quick_xml::{Error, NsReader, Writer}; +use std::collections::{HashMap, HashSet}; +use std::io::{BufReader, Read}; +use std::str; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, BufReader as AsyncBufReader}; + +/// A [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) streaming parser. +/// +/// It reads the file in streaming. +/// It does not keep data in memory except a stack for handling nested XML tags, and a set of all +/// seen `rdf:ID`s to detect duplicate ids and fail according to the specification. +/// +/// Its performances are not optimized yet and hopefully could be significantly enhanced by reducing the +/// number of allocations and copies done by the parser. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxrdfxml::RdfXmlParser; +/// +/// let file = br#"<?xml version="1.0"?> +/// <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> +/// <rdf:Description rdf:about="http://example.com/foo"> +/// <rdf:type rdf:resource="http://schema.org/Person" /> +/// <schema:name>Foo</schema:name> +/// </rdf:Description> +/// <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> +/// </rdf:RDF>"#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in RdfXmlParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct RdfXmlParser { + unchecked: bool, + base: Option<Iri<String>>, +} + +impl RdfXmlParser { + /// Builds a new [`RdfXmlParser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + #[inline] + pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + self.base = Some(Iri::parse(base_iri.into())?); + Ok(self) + } + + /// Parses a RDF/XML file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxrdfxml::RdfXmlParser; + /// + /// let file = br#"<?xml version="1.0"?> + /// <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> + /// <rdf:Description rdf:about="http://example.com/foo"> + /// <rdf:type rdf:resource="http://schema.org/Person" /> + /// <schema:name>Foo</schema:name> + /// </rdf:Description> + /// <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> + /// </rdf:RDF>"#; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// for triple in RdfXmlParser::new().parse_read(file.as_ref()) { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadRdfXmlReader<R> { + FromReadRdfXmlReader { + results: Vec::new(), + reader: self.parse(BufReader::new(read)), + reader_buffer: Vec::default(), + } + } + + /// Parses a RDF/XML file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxrdfxml::RdfXmlParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxrdfxml::RdfXmlParseError> { + /// let file = br#"<?xml version="1.0"?> + /// <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> + /// <rdf:Description rdf:about="http://example.com/foo"> + /// <rdf:type rdf:resource="http://schema.org/Person" /> + /// <schema:name>Foo</schema:name> + /// </rdf:Description> + /// <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> + /// </rdf:RDF>"#; + /// + /// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); + /// let mut count = 0; + /// let mut parser = RdfXmlParser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadRdfXmlReader<R> { + FromTokioAsyncReadRdfXmlReader { + results: Vec::new(), + reader: self.parse(AsyncBufReader::new(read)), + reader_buffer: Vec::default(), + } + } + + fn parse<T>(&self, reader: T) -> RdfXmlReader<T> { + let mut reader = NsReader::from_reader(reader); + reader.expand_empty_elements(true); + RdfXmlReader { + reader, + state: vec![RdfXmlState::Doc { + base_iri: self.base.clone(), + }], + custom_entities: HashMap::default(), + in_literal_depth: 0, + known_rdf_id: HashSet::default(), + is_end: false, + unchecked: self.unchecked, + } + } +} + +/// Parses a RDF/XML file from a [`Read`] implementation. Can be built using [`RdfXmlParser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxrdfxml::RdfXmlParser; +/// +/// let file = br#"<?xml version="1.0"?> +/// <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> +/// <rdf:Description rdf:about="http://example.com/foo"> +/// <rdf:type rdf:resource="http://schema.org/Person" /> +/// <schema:name>Foo</schema:name> +/// </rdf:Description> +/// <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> +/// </rdf:RDF>"#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in RdfXmlParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadRdfXmlReader<R: Read> { + results: Vec<Triple>, + reader: RdfXmlReader<BufReader<R>>, + reader_buffer: Vec<u8>, +} + +impl<R: Read> Iterator for FromReadRdfXmlReader<R> { + type Item = Result<Triple, RdfXmlParseError>; + + fn next(&mut self) -> Option<Self::Item> { + loop { + if let Some(triple) = self.results.pop() { + return Some(Ok(triple)); + } else if self.reader.is_end { + return None; + } + if let Err(e) = self.parse_step() { + return Some(Err(e)); + } + } + } +} + +impl<R: Read> FromReadRdfXmlReader<R> { + /// The current byte position in the input data. + pub fn buffer_position(&self) -> usize { + self.reader.reader.buffer_position() + } + + fn parse_step(&mut self) -> Result<(), RdfXmlParseError> { + self.reader_buffer.clear(); + let event = self + .reader + .reader + .read_event_into(&mut self.reader_buffer)?; + self.reader.parse_event(event, &mut self.results) + } +} + +/// Parses a RDF/XML file from a [`AsyncRead`] implementation. Can be built using [`RdfXmlParser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxrdfxml::RdfXmlParser; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxrdfxml::RdfXmlParseError> { +/// let file = br#"<?xml version="1.0"?> +/// <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:schema="http://schema.org/"> +/// <rdf:Description rdf:about="http://example.com/foo"> +/// <rdf:type rdf:resource="http://schema.org/Person" /> +/// <schema:name>Foo</schema:name> +/// </rdf:Description> +/// <schema:Person rdf:about="http://example.com/bar" schema:name="Bar" /> +/// </rdf:RDF>"#; +/// +/// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); +/// let mut count = 0; +/// let mut parser = RdfXmlParser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadRdfXmlReader<R: AsyncRead + Unpin> { + results: Vec<Triple>, + reader: RdfXmlReader<AsyncBufReader<R>>, + reader_buffer: Vec<u8>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadRdfXmlReader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<Triple, RdfXmlParseError>> { + loop { + if let Some(triple) = self.results.pop() { + return Some(Ok(triple)); + } else if self.reader.is_end { + return None; + } + if let Err(e) = self.parse_step().await { + return Some(Err(e)); + } + } + } + + /// The current byte position in the input data. + pub fn buffer_position(&self) -> usize { + self.reader.reader.buffer_position() + } + + async fn parse_step(&mut self) -> Result<(), RdfXmlParseError> { + self.reader_buffer.clear(); + let event = self + .reader + .reader + .read_event_into_async(&mut self.reader_buffer) + .await?; + self.reader.parse_event(event, &mut self.results) + } +} + +const RDF_ABOUT: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#about"; +const RDF_ABOUT_EACH: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#aboutEach"; +const RDF_ABOUT_EACH_PREFIX: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#aboutEachPrefix"; +const RDF_BAG_ID: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#bagID"; +const RDF_DATATYPE: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#datatype"; +const RDF_DESCRIPTION: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#Description"; +const RDF_ID: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#ID"; +const RDF_LI: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#li"; +const RDF_NODE_ID: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#nodeID"; +const RDF_PARSE_TYPE: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#parseType"; +const RDF_RDF: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#RDF"; +const RDF_RESOURCE: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#resource"; + +const RESERVED_RDF_ELEMENTS: [&str; 11] = [ + RDF_ABOUT, + RDF_ABOUT_EACH, + RDF_ABOUT_EACH_PREFIX, + RDF_BAG_ID, + RDF_DATATYPE, + RDF_ID, + RDF_LI, + RDF_NODE_ID, + RDF_PARSE_TYPE, + RDF_RDF, + RDF_RESOURCE, +]; +const RESERVED_RDF_ATTRIBUTES: [&str; 5] = [ + RDF_ABOUT_EACH, + RDF_ABOUT_EACH_PREFIX, + RDF_LI, + RDF_RDF, + RDF_RESOURCE, +]; + +#[derive(Clone, Debug)] +enum NodeOrText { + Node(Subject), + Text(String), +} + +enum RdfXmlState { + Doc { + base_iri: Option<Iri<String>>, + }, + Rdf { + base_iri: Option<Iri<String>>, + language: Option<String>, + }, + NodeElt { + base_iri: Option<Iri<String>>, + language: Option<String>, + subject: Subject, + li_counter: u64, + }, + PropertyElt { + // Resource, Literal or Empty property element + iri: NamedNode, + base_iri: Option<Iri<String>>, + language: Option<String>, + subject: Subject, + object: Option<NodeOrText>, + id_attr: Option<NamedNode>, + datatype_attr: Option<NamedNode>, + }, + ParseTypeCollectionPropertyElt { + iri: NamedNode, + base_iri: Option<Iri<String>>, + language: Option<String>, + subject: Subject, + objects: Vec<Subject>, + id_attr: Option<NamedNode>, + }, + ParseTypeLiteralPropertyElt { + iri: NamedNode, + base_iri: Option<Iri<String>>, + language: Option<String>, + subject: Subject, + writer: Writer<Vec<u8>>, + id_attr: Option<NamedNode>, + emit: bool, // false for parseTypeOtherPropertyElt support + }, +} + +impl RdfXmlState { + fn base_iri(&self) -> Option<&Iri<String>> { + match self { + Self::Doc { base_iri, .. } + | Self::Rdf { base_iri, .. } + | Self::NodeElt { base_iri, .. } + | Self::PropertyElt { base_iri, .. } + | Self::ParseTypeCollectionPropertyElt { base_iri, .. } + | Self::ParseTypeLiteralPropertyElt { base_iri, .. } => base_iri.as_ref(), + } + } + + fn language(&self) -> Option<&String> { + match self { + Self::Doc { .. } => None, + Self::Rdf { language, .. } + | Self::NodeElt { language, .. } + | Self::PropertyElt { language, .. } + | Self::ParseTypeCollectionPropertyElt { language, .. } + | Self::ParseTypeLiteralPropertyElt { language, .. } => language.as_ref(), + } + } +} + +struct RdfXmlReader<R> { + reader: NsReader<R>, + state: Vec<RdfXmlState>, + custom_entities: HashMap<String, String>, + in_literal_depth: usize, + known_rdf_id: HashSet<String>, + is_end: bool, + unchecked: bool, +} + +impl<R> RdfXmlReader<R> { + fn parse_event( + &mut self, + event: Event<'_>, + results: &mut Vec<Triple>, + ) -> Result<(), RdfXmlParseError> { + match event { + Event::Start(event) => self.parse_start_event(&event, results), + Event::End(event) => self.parse_end_event(&event, results), + Event::Empty(_) => Err(RdfXmlSyntaxError::msg( + "The expand_empty_elements option must be enabled", + ) + .into()), + Event::Text(event) => self.parse_text_event(&event), + Event::CData(event) => self.parse_text_event(&event.escape()?), + Event::Comment(_) | Event::PI(_) => Ok(()), + Event::Decl(decl) => { + if let Some(encoding) = decl.encoding() { + if !is_utf8(&encoding?) { + return Err(RdfXmlSyntaxError::msg( + "Only UTF-8 is supported by the RDF/XML parser", + ) + .into()); + } + } + Ok(()) + } + Event::DocType(dt) => self.parse_doctype(&dt), + Event::Eof => { + self.is_end = true; + Ok(()) + } + } + } + + fn parse_doctype(&mut self, dt: &BytesText<'_>) -> Result<(), RdfXmlParseError> { + // we extract entities + for input in self + .reader + .decoder() + .decode(dt.as_ref())? + .split('<') + .skip(1) + { + if let Some(input) = input.strip_prefix("!ENTITY") { + let input = input.trim_start().strip_prefix('%').unwrap_or(input); + let (entity_name, input) = input.trim_start().split_once(|c: char| c.is_ascii_whitespace()).ok_or_else(|| { + RdfXmlSyntaxError::msg( + "<!ENTITY declarations should contain both an entity name and an entity value", + ) + })?; + let input = input.trim_start().strip_prefix('\"').ok_or_else(|| { + RdfXmlSyntaxError::msg("<!ENTITY values should be enclosed in double quotes") + })?; + let (entity_value, input) = input.split_once('"').ok_or_else(|| { + RdfXmlSyntaxError::msg( + "<!ENTITY declarations values should be enclosed in double quotes", + ) + })?; + input.trim_start().strip_prefix('>').ok_or_else(|| { + RdfXmlSyntaxError::msg("<!ENTITY declarations values should end with >") + })?; + + // Resolves custom entities within the current entity definition. + let entity_value = unescape_with(entity_value, |e| self.resolve_entity(e)) + .map_err(quick_xml::Error::from)?; + self.custom_entities + .insert(entity_name.to_owned(), entity_value.to_string()); + } + } + Ok(()) + } + + fn parse_start_event( + &mut self, + event: &BytesStart<'_>, + results: &mut Vec<Triple>, + ) -> Result<(), RdfXmlParseError> { + #[derive(PartialEq, Eq)] + enum RdfXmlParseType { + Default, + Collection, + Literal, + Resource, + Other, + } + + #[derive(PartialEq, Eq)] + enum RdfXmlNextProduction { + Rdf, + NodeElt, + PropertyElt { subject: Subject }, + } + + // Literal case + if let Some(RdfXmlState::ParseTypeLiteralPropertyElt { writer, .. }) = self.state.last_mut() + { + let mut clean_event = BytesStart::new( + self.reader + .decoder() + .decode(event.name().as_ref())? + .to_string(), + ); + for attr in event.attributes() { + clean_event.push_attribute(attr.map_err(Error::InvalidAttr)?); + } + writer.write_event(Event::Start(clean_event))?; + self.in_literal_depth += 1; + return Ok(()); + } + + let tag_name = self.resolve_tag_name(event.name())?; + + // We read attributes + let (mut language, mut base_iri) = if let Some(current_state) = self.state.last() { + ( + current_state.language().cloned(), + current_state.base_iri().cloned(), + ) + } else { + (None, None) + }; + + let mut id_attr = None; + let mut node_id_attr = None; + let mut about_attr = None; + let mut property_attrs = Vec::default(); + let mut resource_attr = None; + let mut datatype_attr = None; + let mut parse_type = RdfXmlParseType::Default; + let mut type_attr = None; + + for attribute in event.attributes() { + let attribute = attribute.map_err(Error::InvalidAttr)?; + if attribute.key.as_ref().starts_with(b"xml") { + if attribute.key.as_ref() == b"xml:lang" { + let tag = self.convert_attribute(&attribute)?.to_ascii_lowercase(); + language = Some(if self.unchecked { + tag + } else { + LanguageTag::parse(tag.to_ascii_lowercase()) + .map_err(|error| { + RdfXmlSyntaxError(SyntaxErrorKind::InvalidLanguageTag { + tag, + error, + }) + })? + .into_inner() + }); + } else if attribute.key.as_ref() == b"xml:base" { + let iri = self.convert_attribute(&attribute)?; + base_iri = Some( + if self.unchecked { + Iri::parse_unchecked(iri.clone()) + } else { + Iri::parse(iri.clone()) + } + .map_err(|error| { + RdfXmlSyntaxError(SyntaxErrorKind::InvalidIri { iri, error }) + })?, + ) + } else { + // We ignore other xml attributes + } + } else { + let attribute_url = self.resolve_attribute_name(attribute.key)?; + if *attribute_url == *RDF_ID { + let mut id = self.convert_attribute(&attribute)?; + if !is_nc_name(&id) { + return Err(RdfXmlSyntaxError::msg(format!( + "{id} is not a valid rdf:ID value" + )) + .into()); + } + id.insert(0, '#'); + id_attr = Some(id); + } else if *attribute_url == *RDF_BAG_ID { + let bag_id = self.convert_attribute(&attribute)?; + if !is_nc_name(&bag_id) { + return Err(RdfXmlSyntaxError::msg(format!( + "{bag_id} is not a valid rdf:bagID value" + )) + .into()); + } + } else if *attribute_url == *RDF_NODE_ID { + let id = self.convert_attribute(&attribute)?; + if !is_nc_name(&id) { + return Err(RdfXmlSyntaxError::msg(format!( + "{id} is not a valid rdf:nodeID value" + )) + .into()); + } + node_id_attr = Some(BlankNode::new_unchecked(id)); + } else if *attribute_url == *RDF_ABOUT { + about_attr = Some(attribute); + } else if *attribute_url == *RDF_RESOURCE { + resource_attr = Some(attribute); + } else if *attribute_url == *RDF_DATATYPE { + datatype_attr = Some(attribute); + } else if *attribute_url == *RDF_PARSE_TYPE { + parse_type = match attribute.value.as_ref() { + b"Collection" => RdfXmlParseType::Collection, + b"Literal" => RdfXmlParseType::Literal, + b"Resource" => RdfXmlParseType::Resource, + _ => RdfXmlParseType::Other, + }; + } else if attribute_url == rdf::TYPE.as_str() { + type_attr = Some(attribute); + } else if RESERVED_RDF_ATTRIBUTES.contains(&&*attribute_url) { + return Err(RdfXmlSyntaxError::msg(format!( + "{attribute_url} is not a valid attribute" + )) + .into()); + } else { + property_attrs.push(( + self.parse_iri(attribute_url)?, + self.convert_attribute(&attribute)?, + )); + } + } + } + + // Parsing with the base URI + let id_attr = match id_attr { + Some(iri) => { + let iri = self.resolve_iri(&base_iri, iri)?; + if self.known_rdf_id.contains(iri.as_str()) { + return Err(RdfXmlSyntaxError::msg(format!( + "{iri} has already been used as rdf:ID value" + )) + .into()); + } + self.known_rdf_id.insert(iri.as_str().into()); + Some(iri) + } + None => None, + }; + let about_attr = match about_attr { + Some(attr) => Some(self.convert_iri_attribute(&base_iri, &attr)?), + None => None, + }; + let resource_attr = match resource_attr { + Some(attr) => Some(self.convert_iri_attribute(&base_iri, &attr)?), + None => None, + }; + let datatype_attr = match datatype_attr { + Some(attr) => Some(self.convert_iri_attribute(&base_iri, &attr)?), + None => None, + }; + let type_attr = match type_attr { + Some(attr) => Some(self.convert_iri_attribute(&base_iri, &attr)?), + None => None, + }; + + let expected_production = match self.state.last() { + Some(RdfXmlState::Doc { .. }) => RdfXmlNextProduction::Rdf, + Some( + RdfXmlState::Rdf { .. } + | RdfXmlState::PropertyElt { .. } + | RdfXmlState::ParseTypeCollectionPropertyElt { .. }, + ) => RdfXmlNextProduction::NodeElt, + Some(RdfXmlState::NodeElt { subject, .. }) => RdfXmlNextProduction::PropertyElt { + subject: subject.clone(), + }, + Some(RdfXmlState::ParseTypeLiteralPropertyElt { .. }) => { + return Err( + RdfXmlSyntaxError::msg("ParseTypeLiteralPropertyElt production children should never be considered as a RDF/XML content").into() + ); + } + None => { + return Err(RdfXmlSyntaxError::msg( + "No state in the stack: the XML is not balanced", + ) + .into()); + } + }; + + let new_state = match expected_production { + RdfXmlNextProduction::Rdf => { + if *tag_name == *RDF_RDF { + RdfXmlState::Rdf { base_iri, language } + } else if RESERVED_RDF_ELEMENTS.contains(&&*tag_name) { + return Err(RdfXmlSyntaxError::msg(format!( + "Invalid node element tag name: {tag_name}" + )) + .into()); + } else { + Self::build_node_elt( + self.parse_iri(tag_name)?, + base_iri, + language, + id_attr, + node_id_attr, + about_attr, + type_attr, + property_attrs, + results, + )? + } + } + RdfXmlNextProduction::NodeElt => { + if RESERVED_RDF_ELEMENTS.contains(&&*tag_name) { + return Err(RdfXmlSyntaxError::msg(format!( + "Invalid property element tag name: {tag_name}" + )) + .into()); + } + Self::build_node_elt( + self.parse_iri(tag_name)?, + base_iri, + language, + id_attr, + node_id_attr, + about_attr, + type_attr, + property_attrs, + results, + )? + } + RdfXmlNextProduction::PropertyElt { subject } => { + let iri = if *tag_name == *RDF_LI { + let Some(RdfXmlState::NodeElt { li_counter, .. }) = self.state.last_mut() + else { + return Err(RdfXmlSyntaxError::msg(format!( + "Invalid property element tag name: {tag_name}" + )) + .into()); + }; + *li_counter += 1; + NamedNode::new_unchecked(format!( + "http://www.w3.org/1999/02/22-rdf-syntax-ns#_{li_counter}" + )) + } else if RESERVED_RDF_ELEMENTS.contains(&&*tag_name) + || *tag_name == *RDF_DESCRIPTION + { + return Err(RdfXmlSyntaxError::msg(format!( + "Invalid property element tag name: {tag_name}" + )) + .into()); + } else { + self.parse_iri(tag_name)? + }; + match parse_type { + RdfXmlParseType::Default => { + if resource_attr.is_some() + || node_id_attr.is_some() + || !property_attrs.is_empty() + { + let object = match (resource_attr, node_id_attr) + { + (Some(resource_attr), None) => Subject::from(resource_attr), + (None, Some(node_id_attr)) => node_id_attr.into(), + (None, None) => BlankNode::default().into(), + (Some(_), Some(_)) => return Err(RdfXmlSyntaxError::msg("Not both rdf:resource and rdf:nodeID could be set at the same time").into()) + }; + Self::emit_property_attrs(&object, property_attrs, &language, results); + if let Some(type_attr) = type_attr { + results.push(Triple::new(object.clone(), rdf::TYPE, type_attr)); + } + RdfXmlState::PropertyElt { + iri, + base_iri, + language, + subject, + object: Some(NodeOrText::Node(object)), + id_attr, + datatype_attr, + } + } else { + RdfXmlState::PropertyElt { + iri, + base_iri, + language, + subject, + object: None, + id_attr, + datatype_attr, + } + } + } + RdfXmlParseType::Literal => RdfXmlState::ParseTypeLiteralPropertyElt { + iri, + base_iri, + language, + subject, + writer: Writer::new(Vec::default()), + id_attr, + emit: true, + }, + RdfXmlParseType::Resource => Self::build_parse_type_resource_property_elt( + iri, base_iri, language, subject, id_attr, results, + ), + RdfXmlParseType::Collection => RdfXmlState::ParseTypeCollectionPropertyElt { + iri, + base_iri, + language, + subject, + objects: Vec::default(), + id_attr, + }, + RdfXmlParseType::Other => RdfXmlState::ParseTypeLiteralPropertyElt { + iri, + base_iri, + language, + subject, + writer: Writer::new(Vec::default()), + id_attr, + emit: false, + }, + } + } + }; + self.state.push(new_state); + Ok(()) + } + + fn parse_end_event( + &mut self, + event: &BytesEnd<'_>, + results: &mut Vec<Triple>, + ) -> Result<(), RdfXmlParseError> { + // Literal case + if self.in_literal_depth > 0 { + if let Some(RdfXmlState::ParseTypeLiteralPropertyElt { writer, .. }) = + self.state.last_mut() + { + writer.write_event(Event::End(BytesEnd::new( + self.reader.decoder().decode(event.name().as_ref())?, + )))?; + self.in_literal_depth -= 1; + return Ok(()); + } + } + + if let Some(current_state) = self.state.pop() { + self.end_state(current_state, results)?; + } + Ok(()) + } + + fn parse_text_event(&mut self, event: &BytesText<'_>) -> Result<(), RdfXmlParseError> { + let text = event.unescape_with(|e| self.resolve_entity(e))?.to_string(); + match self.state.last_mut() { + Some(RdfXmlState::PropertyElt { object, .. }) => { + if !event.iter().copied().all(is_whitespace) { + *object = Some(NodeOrText::Text(text)); + } + Ok(()) + } + Some(RdfXmlState::ParseTypeLiteralPropertyElt { writer, .. }) => { + writer.write_event(Event::Text(BytesText::new(&text)))?; + Ok(()) + } + _ => { + if event.iter().copied().all(is_whitespace) { + Ok(()) + } else { + Err(RdfXmlSyntaxError::msg(format!("Unexpected text event: '{text}'")).into()) + } + } + } + } + + fn resolve_tag_name(&self, qname: QName<'_>) -> Result<String, RdfXmlParseError> { + let (namespace, local_name) = self.reader.resolve_element(qname); + self.resolve_ns_name(namespace, local_name) + } + + fn resolve_attribute_name(&self, qname: QName<'_>) -> Result<String, RdfXmlParseError> { + let (namespace, local_name) = self.reader.resolve_attribute(qname); + self.resolve_ns_name(namespace, local_name) + } + + fn resolve_ns_name( + &self, + namespace: ResolveResult<'_>, + local_name: LocalName<'_>, + ) -> Result<String, RdfXmlParseError> { + match namespace { + ResolveResult::Bound(ns) => { + let mut value = Vec::with_capacity(ns.as_ref().len() + local_name.as_ref().len()); + value.extend_from_slice(ns.as_ref()); + value.extend_from_slice(local_name.as_ref()); + Ok(unescape_with(&self.reader.decoder().decode(&value)?, |e| { + self.resolve_entity(e) + }) + .map_err(quick_xml::Error::from)? + .to_string()) + } + ResolveResult::Unbound => { + Err(RdfXmlSyntaxError::msg("XML namespaces are required in RDF/XML").into()) + } + ResolveResult::Unknown(v) => Err(RdfXmlSyntaxError::msg(format!( + "Unknown prefix {}:", + self.reader.decoder().decode(&v)? + )) + .into()), + } + } + + #[allow(clippy::too_many_arguments)] + fn build_node_elt( + iri: NamedNode, + base_iri: Option<Iri<String>>, + language: Option<String>, + id_attr: Option<NamedNode>, + node_id_attr: Option<BlankNode>, + about_attr: Option<NamedNode>, + type_attr: Option<NamedNode>, + property_attrs: Vec<(NamedNode, String)>, + results: &mut Vec<Triple>, + ) -> Result<RdfXmlState, RdfXmlSyntaxError> { + let subject = match (id_attr, node_id_attr, about_attr) { + (Some(id_attr), None, None) => Subject::from(id_attr), + (None, Some(node_id_attr), None) => node_id_attr.into(), + (None, None, Some(about_attr)) => about_attr.into(), + (None, None, None) => BlankNode::default().into(), + (Some(_), Some(_), _) => { + return Err(RdfXmlSyntaxError::msg( + "Not both rdf:ID and rdf:nodeID could be set at the same time", + )) + } + (_, Some(_), Some(_)) => { + return Err(RdfXmlSyntaxError::msg( + "Not both rdf:nodeID and rdf:resource could be set at the same time", + )) + } + (Some(_), _, Some(_)) => { + return Err(RdfXmlSyntaxError::msg( + "Not both rdf:ID and rdf:resource could be set at the same time", + )) + } + }; + + Self::emit_property_attrs(&subject, property_attrs, &language, results); + + if let Some(type_attr) = type_attr { + results.push(Triple::new(subject.clone(), rdf::TYPE, type_attr)); + } + + if iri != *RDF_DESCRIPTION { + results.push(Triple::new(subject.clone(), rdf::TYPE, iri)); + } + Ok(RdfXmlState::NodeElt { + base_iri, + language, + subject, + li_counter: 0, + }) + } + + fn build_parse_type_resource_property_elt( + iri: NamedNode, + base_iri: Option<Iri<String>>, + language: Option<String>, + subject: Subject, + id_attr: Option<NamedNode>, + results: &mut Vec<Triple>, + ) -> RdfXmlState { + let object = BlankNode::default(); + let triple = Triple::new(subject, iri, object.clone()); + if let Some(id_attr) = id_attr { + Self::reify(triple.clone(), id_attr, results); + } + results.push(triple); + RdfXmlState::NodeElt { + base_iri, + language, + subject: object.into(), + li_counter: 0, + } + } + + fn end_state( + &mut self, + state: RdfXmlState, + results: &mut Vec<Triple>, + ) -> Result<(), RdfXmlSyntaxError> { + match state { + RdfXmlState::PropertyElt { + iri, + language, + subject, + id_attr, + datatype_attr, + object, + .. + } => { + let object = match object { + Some(NodeOrText::Node(node)) => Term::from(node), + Some(NodeOrText::Text(text)) => { + Self::new_literal(text, language, datatype_attr).into() + } + None => Self::new_literal(String::new(), language, datatype_attr).into(), + }; + let triple = Triple::new(subject, iri, object); + if let Some(id_attr) = id_attr { + Self::reify(triple.clone(), id_attr, results); + } + results.push(triple); + } + RdfXmlState::ParseTypeCollectionPropertyElt { + iri, + subject, + id_attr, + objects, + .. + } => { + let mut current_node = Subject::from(rdf::NIL); + for object in objects.into_iter().rev() { + let subject = Subject::from(BlankNode::default()); + results.push(Triple::new(subject.clone(), rdf::FIRST, object)); + results.push(Triple::new(subject.clone(), rdf::REST, current_node)); + current_node = subject; + } + let triple = Triple::new(subject, iri, current_node); + if let Some(id_attr) = id_attr { + Self::reify(triple.clone(), id_attr, results); + } + results.push(triple); + } + RdfXmlState::ParseTypeLiteralPropertyElt { + iri, + subject, + id_attr, + writer, + emit, + .. + } => { + if emit { + let object = writer.into_inner(); + if object.is_empty() { + return Err(RdfXmlSyntaxError::msg(format!( + "No value found for rdf:XMLLiteral value of property {iri}" + ))); + } + let triple = Triple::new( + subject, + iri, + Literal::new_typed_literal( + str::from_utf8(&object).map_err(|_| { + RdfXmlSyntaxError::msg( + "The XML literal is not in valid UTF-8".to_owned(), + ) + })?, + rdf::XML_LITERAL, + ), + ); + if let Some(id_attr) = id_attr { + Self::reify(triple.clone(), id_attr, results); + } + results.push(triple); + } + } + RdfXmlState::NodeElt { subject, .. } => match self.state.last_mut() { + Some(RdfXmlState::PropertyElt { object, .. }) => { + *object = Some(NodeOrText::Node(subject)) + } + Some(RdfXmlState::ParseTypeCollectionPropertyElt { objects, .. }) => { + objects.push(subject) + } + _ => (), + }, + _ => (), + } + Ok(()) + } + + fn new_literal( + value: String, + language: Option<String>, + datatype: Option<NamedNode>, + ) -> Literal { + if let Some(datatype) = datatype { + Literal::new_typed_literal(value, datatype) + } else if let Some(language) = language { + Literal::new_language_tagged_literal_unchecked(value, language) + } else { + Literal::new_simple_literal(value) + } + } + + fn reify(triple: Triple, statement_id: NamedNode, results: &mut Vec<Triple>) { + results.push(Triple::new(statement_id.clone(), rdf::TYPE, rdf::STATEMENT)); + results.push(Triple::new( + statement_id.clone(), + rdf::SUBJECT, + triple.subject, + )); + results.push(Triple::new( + statement_id.clone(), + rdf::PREDICATE, + triple.predicate, + )); + results.push(Triple::new(statement_id, rdf::OBJECT, triple.object)); + } + + fn emit_property_attrs( + subject: &Subject, + literal_attributes: Vec<(NamedNode, String)>, + language: &Option<String>, + results: &mut Vec<Triple>, + ) { + for (literal_predicate, literal_value) in literal_attributes { + results.push(Triple::new( + subject.clone(), + literal_predicate, + if let Some(language) = language.clone() { + Literal::new_language_tagged_literal_unchecked(literal_value, language) + } else { + Literal::new_simple_literal(literal_value) + }, + )); + } + } + + fn convert_attribute(&self, attribute: &Attribute<'_>) -> Result<String, RdfXmlParseError> { + Ok(attribute + .decode_and_unescape_value_with(&self.reader, |e| self.resolve_entity(e))? + .into_owned()) + } + + fn convert_iri_attribute( + &self, + base_iri: &Option<Iri<String>>, + attribute: &Attribute<'_>, + ) -> Result<NamedNode, RdfXmlParseError> { + Ok(self.resolve_iri(base_iri, self.convert_attribute(attribute)?)?) + } + + fn resolve_iri( + &self, + base_iri: &Option<Iri<String>>, + relative_iri: String, + ) -> Result<NamedNode, RdfXmlSyntaxError> { + if let Some(base_iri) = base_iri { + Ok(NamedNode::new_unchecked( + if self.unchecked { + base_iri.resolve_unchecked(&relative_iri) + } else { + base_iri.resolve(&relative_iri) + } + .map_err(|error| { + RdfXmlSyntaxError(SyntaxErrorKind::InvalidIri { + iri: relative_iri, + error, + }) + })? + .into_inner(), + )) + } else { + self.parse_iri(relative_iri) + } + } + + fn parse_iri(&self, relative_iri: String) -> Result<NamedNode, RdfXmlSyntaxError> { + Ok(NamedNode::new_unchecked(if self.unchecked { + relative_iri + } else { + Iri::parse(relative_iri.clone()) + .map_err(|error| { + RdfXmlSyntaxError(SyntaxErrorKind::InvalidIri { + iri: relative_iri, + error, + }) + })? + .into_inner() + })) + } + + fn resolve_entity(&self, e: &str) -> Option<&str> { + self.custom_entities.get(e).map(String::as_str) + } +} + +fn is_nc_name(name: &str) -> bool { + // Name - (Char* ':' Char*) + is_name(name) && name.chars().all(|c| c != ':') +} + +fn is_name(name: &str) -> bool { + // NameStartChar (NameChar)* + let mut c = name.chars(); + if !c.next().map_or(false, is_name_start_char) { + return false; + } + c.all(is_name_char) +} + +fn is_whitespace(c: u8) -> bool { + matches!(c, b' ' | b'\t' | b'\n' | b'\r') +} + +fn is_utf8(encoding: &[u8]) -> bool { + matches!( + encoding.to_ascii_lowercase().as_slice(), + b"unicode-1-1-utf-8" + | b"unicode11utf8" + | b"unicode20utf8" + | b"utf-8" + | b"utf8" + | b"x-unicode20utf8" + ) +} diff --git a/lib/oxrdfxml/src/serializer.rs b/lib/oxrdfxml/src/serializer.rs new file mode 100644 index 00000000..742b026e --- /dev/null +++ b/lib/oxrdfxml/src/serializer.rs @@ -0,0 +1,461 @@ +use crate::utils::*; +use oxiri::{Iri, IriParseError}; +use oxrdf::vocab::rdf; +use oxrdf::{NamedNodeRef, Subject, SubjectRef, TermRef, TripleRef}; +use quick_xml::events::{BytesDecl, BytesEnd, BytesStart, BytesText, Event}; +use quick_xml::Writer; +use std::borrow::Cow; +use std::collections::BTreeMap; +use std::io; +use std::io::Write; +use std::sync::Arc; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncWrite; + +/// A [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) serializer. +/// +/// ``` +/// use oxrdf::{LiteralRef, NamedNodeRef, TripleRef}; +/// use oxrdfxml::RdfXmlSerializer; +/// +/// let mut writer = RdfXmlSerializer::new().with_prefix("schema", "http://schema.org/")?.serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://schema.org/name")?, +/// LiteralRef::new_language_tagged_literal_unchecked("Foo Bar", "en"), +/// ))?; +/// assert_eq!( +/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct RdfXmlSerializer { + prefixes: BTreeMap<String, String>, +} + +impl RdfXmlSerializer { + /// Builds a new [`RdfXmlSerializer`]. + #[inline] + pub fn new() -> Self { + Self { + prefixes: BTreeMap::new(), + } + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.prefixes.insert( + Iri::parse(prefix_iri.into())?.into_inner(), + prefix_name.into(), + ); + Ok(self) + } + + /// Writes a RDF/XML file to a [`Write`] implementation. + /// + /// This writer does unbuffered writes. + /// + /// ``` + /// use oxrdf::{LiteralRef, NamedNodeRef, TripleRef}; + /// use oxrdfxml::RdfXmlSerializer; + /// + /// let mut writer = RdfXmlSerializer::new().with_prefix("schema", "http://schema.org/")?.serialize_to_write(Vec::new()); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// ))?; + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://schema.org/name")?, + /// LiteralRef::new_language_tagged_literal_unchecked("Foo Bar", "en"), + /// ))?; + /// assert_eq!( + /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>", + /// writer.finish()?.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[allow(clippy::unused_self)] + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteRdfXmlWriter<W> { + ToWriteRdfXmlWriter { + writer: Writer::new_with_indent(write, b'\t', 1), + inner: self.inner_writer(), + } + } + + /// Writes a RDF/XML file to a [`AsyncWrite`] implementation. + /// + /// This writer does unbuffered writes. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef, LiteralRef}; + /// use oxrdfxml::RdfXmlSerializer; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { + /// let mut writer = RdfXmlSerializer::new().with_prefix("schema", "http://schema.org/")?.serialize_to_tokio_async_write(Vec::new()); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// )).await?; + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://schema.org/name")?, + /// LiteralRef::new_language_tagged_literal_unchecked("Foo Bar", "en"), + /// )).await?; + /// assert_eq!( + /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>", + /// writer.finish().await?.as_slice() + /// ); + /// # Ok(()) + /// # } + /// ``` + #[allow(clippy::unused_self)] + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteRdfXmlWriter<W> { + ToTokioAsyncWriteRdfXmlWriter { + writer: Writer::new_with_indent(write, b'\t', 1), + inner: self.inner_writer(), + } + } + + fn inner_writer(mut self) -> InnerRdfXmlWriter { + self.prefixes.insert( + "http://www.w3.org/1999/02/22-rdf-syntax-ns#".into(), + "rdf".into(), + ); + InnerRdfXmlWriter { + current_subject: None, + current_resource_tag: None, + prefixes: self.prefixes, + } + } +} + +/// Writes a RDF/XML file to a [`Write`] implementation. Can be built using [`RdfXmlSerializer::serialize_to_write`]. +/// +/// ``` +/// use oxrdf::{LiteralRef, NamedNodeRef, TripleRef}; +/// use oxrdfxml::RdfXmlSerializer; +/// +/// let mut writer = RdfXmlSerializer::new().with_prefix("schema", "http://schema.org/")?.serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://schema.org/name")?, +/// LiteralRef::new_language_tagged_literal_unchecked("Foo Bar", "en"), +/// ))?; +/// assert_eq!( +/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteRdfXmlWriter<W: Write> { + writer: Writer<W>, + inner: InnerRdfXmlWriter, +} + +impl<W: Write> ToWriteRdfXmlWriter<W> { + /// Writes an extra triple. + #[allow(clippy::match_wildcard_for_single_variants, unreachable_patterns)] + pub fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + let mut buffer = Vec::new(); + self.inner.write_triple(t, &mut buffer)?; + self.flush_buffer(&mut buffer) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::new(); + self.inner.finish(&mut buffer); + self.flush_buffer(&mut buffer)?; + Ok(self.writer.into_inner()) + } + + fn flush_buffer(&mut self, buffer: &mut Vec<Event<'_>>) -> io::Result<()> { + for event in buffer.drain(0..) { + self.writer.write_event(event).map_err(map_err)?; + } + Ok(()) + } +} + +/// Writes a RDF/XML file to a [`AsyncWrite`] implementation. Can be built using [`RdfXmlSerializer::serialize_to_tokio_async_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef, LiteralRef}; +/// use oxrdfxml::RdfXmlSerializer; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), Box<dyn std::error::Error>> { +/// let mut writer = RdfXmlSerializer::new().with_prefix("schema", "http://schema.org/")?.serialize_to_tokio_async_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// )).await?; +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://schema.org/name")?, +/// LiteralRef::new_language_tagged_literal_unchecked("Foo Bar", "en"), +/// )).await?; +/// assert_eq!( +/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:schema=\"http://schema.org/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<schema:Person rdf:about=\"http://example.com#me\">\n\t\t<schema:name xml:lang=\"en\">Foo Bar</schema:name>\n\t</schema:Person>\n</rdf:RDF>", +/// writer.finish().await?.as_slice() +/// ); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteRdfXmlWriter<W: AsyncWrite + Unpin> { + writer: Writer<W>, + inner: InnerRdfXmlWriter, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteRdfXmlWriter<W> { + /// Writes an extra triple. + #[allow(clippy::match_wildcard_for_single_variants, unreachable_patterns)] + pub async fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + let mut buffer = Vec::new(); + self.inner.write_triple(t, &mut buffer)?; + self.flush_buffer(&mut buffer).await + } + + /// Ends the write process and returns the underlying [`Write`]. + pub async fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::new(); + self.inner.finish(&mut buffer); + self.flush_buffer(&mut buffer).await?; + Ok(self.writer.into_inner()) + } + + async fn flush_buffer(&mut self, buffer: &mut Vec<Event<'_>>) -> io::Result<()> { + for event in buffer.drain(0..) { + self.writer + .write_event_async(event) + .await + .map_err(map_err)?; + } + Ok(()) + } +} + +pub struct InnerRdfXmlWriter { + current_subject: Option<Subject>, + current_resource_tag: Option<String>, + prefixes: BTreeMap<String, String>, +} + +impl InnerRdfXmlWriter { + #[allow(clippy::match_wildcard_for_single_variants, unreachable_patterns)] + fn write_triple<'a>( + &mut self, + t: impl Into<TripleRef<'a>>, + output: &mut Vec<Event<'a>>, + ) -> io::Result<()> { + if self.current_subject.is_none() { + self.write_start(output); + } + + let triple = t.into(); + // We open a new rdf:Description if useful + if self.current_subject.as_ref().map(Subject::as_ref) != Some(triple.subject) { + if self.current_subject.is_some() { + output.push(Event::End( + self.current_resource_tag + .take() + .map_or_else(|| BytesEnd::new("rdf:Description"), BytesEnd::new), + )); + } + self.current_subject = Some(triple.subject.into_owned()); + + let (mut description_open, with_type_tag) = if triple.predicate == rdf::TYPE { + if let TermRef::NamedNode(t) = triple.object { + let (prop_qname, prop_xmlns) = self.uri_to_qname_and_xmlns(t); + let mut description_open = BytesStart::new(prop_qname.clone()); + if let Some(prop_xmlns) = prop_xmlns { + description_open.push_attribute(prop_xmlns); + } + self.current_resource_tag = Some(prop_qname.into_owned()); + (description_open, true) + } else { + (BytesStart::new("rdf:Description"), false) + } + } else { + (BytesStart::new("rdf:Description"), false) + }; + match triple.subject { + SubjectRef::NamedNode(node) => { + description_open.push_attribute(("rdf:about", node.as_str())) + } + SubjectRef::BlankNode(node) => { + description_open.push_attribute(("rdf:nodeID", node.as_str())) + } + _ => { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "RDF/XML only supports named or blank subject", + )) + } + } + output.push(Event::Start(description_open)); + if with_type_tag { + return Ok(()); // No need for a value + } + } + + let (prop_qname, prop_xmlns) = self.uri_to_qname_and_xmlns(triple.predicate); + let mut property_open = BytesStart::new(prop_qname.clone()); + if let Some(prop_xmlns) = prop_xmlns { + property_open.push_attribute(prop_xmlns); + } + let content = match triple.object { + TermRef::NamedNode(node) => { + property_open.push_attribute(("rdf:resource", node.as_str())); + None + } + TermRef::BlankNode(node) => { + property_open.push_attribute(("rdf:nodeID", node.as_str())); + None + } + TermRef::Literal(literal) => { + if let Some(language) = literal.language() { + property_open.push_attribute(("xml:lang", language)); + } else if !literal.is_plain() { + property_open.push_attribute(("rdf:datatype", literal.datatype().as_str())); + } + Some(literal.value()) + } + _ => { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "RDF/XML only supports named, blank or literal object", + )) + } + }; + if let Some(content) = content { + output.push(Event::Start(property_open)); + output.push(Event::Text(BytesText::new(content))); + output.push(Event::End(BytesEnd::new(prop_qname))); + } else { + output.push(Event::Empty(property_open)); + } + Ok(()) + } + + fn write_start(&self, output: &mut Vec<Event<'_>>) { + output.push(Event::Decl(BytesDecl::new("1.0", Some("UTF-8"), None))); + let mut rdf_open = BytesStart::new("rdf:RDF"); + for (prefix_value, prefix_name) in &self.prefixes { + rdf_open.push_attribute(( + format!("xmlns:{prefix_name}").as_str(), + prefix_value.as_str(), + )); + } + output.push(Event::Start(rdf_open)) + } + + fn finish(&mut self, output: &mut Vec<Event<'static>>) { + if self.current_subject.is_some() { + output.push(Event::End( + self.current_resource_tag + .take() + .map_or_else(|| BytesEnd::new("rdf:Description"), BytesEnd::new), + )); + } else { + self.write_start(output); + } + output.push(Event::End(BytesEnd::new("rdf:RDF"))); + } + + fn uri_to_qname_and_xmlns<'a>( + &self, + uri: NamedNodeRef<'a>, + ) -> (Cow<'a, str>, Option<(&'a str, &'a str)>) { + let (prop_prefix, prop_value) = split_iri(uri.as_str()); + if let Some(prop_prefix) = self.prefixes.get(prop_prefix) { + ( + if prop_prefix.is_empty() { + Cow::Borrowed(prop_value) + } else { + Cow::Owned(format!("{prop_prefix}:{prop_value}")) + }, + None, + ) + } else if prop_prefix == "http://www.w3.org/2000/xmlns/" { + (Cow::Owned(format!("xmlns:{prop_value}")), None) + } else if prop_value.is_empty() { + (Cow::Borrowed("p:"), Some(("xmlns:p", prop_prefix))) + } else { + (Cow::Borrowed(prop_value), Some(("xmlns", prop_prefix))) + } + } +} + +fn map_err(error: quick_xml::Error) -> io::Error { + if let quick_xml::Error::Io(error) = error { + Arc::try_unwrap(error).unwrap_or_else(|error| io::Error::new(error.kind(), error)) + } else { + io::Error::new(io::ErrorKind::Other, error) + } +} + +fn split_iri(iri: &str) -> (&str, &str) { + if let Some(position_base) = iri.rfind(|c| !is_name_char(c) || c == ':') { + if let Some(position_add) = iri[position_base..].find(|c| is_name_start_char(c) && c != ':') + { + ( + &iri[..position_base + position_add], + &iri[position_base + position_add..], + ) + } else { + (iri, "") + } + } else { + (iri, "") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_split_iri() { + assert_eq!( + split_iri("http://schema.org/Person"), + ("http://schema.org/", "Person") + ); + assert_eq!(split_iri("http://schema.org/"), ("http://schema.org/", "")); + assert_eq!( + split_iri("http://schema.org#foo"), + ("http://schema.org#", "foo") + ); + assert_eq!(split_iri("urn:isbn:foo"), ("urn:isbn:", "foo")); + } +} diff --git a/lib/oxrdfxml/src/utils.rs b/lib/oxrdfxml/src/utils.rs new file mode 100644 index 00000000..0483488d --- /dev/null +++ b/lib/oxrdfxml/src/utils.rs @@ -0,0 +1,26 @@ +pub fn is_name_start_char(c: char) -> bool { + // ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] + matches!(c, + ':' + | 'A'..='Z' + | '_' + | 'a'..='z' + | '\u{00C0}'..='\u{00D6}' + | '\u{00D8}'..='\u{00F6}' + | '\u{00F8}'..='\u{02FF}' + | '\u{0370}'..='\u{037D}' + | '\u{037F}'..='\u{1FFF}' + | '\u{200C}'..='\u{200D}' + | '\u{2070}'..='\u{218F}' + | '\u{2C00}'..='\u{2FEF}' + | '\u{3001}'..='\u{D7FF}' + | '\u{F900}'..='\u{FDCF}' + | '\u{FDF0}'..='\u{FFFD}' + | '\u{10000}'..='\u{EFFFF}') +} + +pub fn is_name_char(c: char) -> bool { + // NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] + is_name_start_char(c) + || matches!(c, '-' | '.' | '0'..='9' | '\u{B7}' | '\u{0300}'..='\u{036F}' | '\u{203F}'..='\u{2040}') +} diff --git a/lib/oxsdatatypes/Cargo.toml b/lib/oxsdatatypes/Cargo.toml index 293c8047..d0e8aafd 100644 --- a/lib/oxsdatatypes/Cargo.toml +++ b/lib/oxsdatatypes/Cargo.toml @@ -1,21 +1,31 @@ [package] name = "oxsdatatypes" -version = "0.1.3" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +version = "0.2.0-alpha.1" +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["XSD"] repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/oxsdatatypes" -homepage = "https://oxigraph.org/" description = """ An implementation of some XSD datatypes for SPARQL implementations """ documentation = "https://docs.rs/oxsdatatypes" -edition = "2021" -rust-version = "1.60" +edition.workspace = true +rust-version.workspace = true + +[features] +js = ["js-sys"] +custom-now = [] + +[dependencies] +thiserror.workspace = true [target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] -js-sys = "0.3" +js-sys = { workspace = true, optional = true } + +[lints] +workspace = true [package.metadata.docs.rs] all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/oxsdatatypes/README.md b/lib/oxsdatatypes/README.md index 1f0b419a..1c3b2c39 100644 --- a/lib/oxsdatatypes/README.md +++ b/lib/oxsdatatypes/README.md @@ -5,7 +5,7 @@ oxsdatatypes [](https://docs.rs/oxsdatatypes) [](https://crates.io/crates/oxsdatatypes) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) oxsdatatypes is an implementation of some [XML Schema Definition Language Datatypes](https://www.w3.org/TR/xmlschema11-2/). Its main aim is to ease the implementation of SPARQL and XPath. @@ -32,6 +32,22 @@ Each datatype provides: * `from_be_bytes` and `to_be_bytes` methods for serialization. +### `DateTime::now` behavior + +The `DateTime::now()` function needs special OS support. +Currently: +- If the `custom-now` feature is enabled, a function computing `now` must be set: + ```rust + use oxsdatatypes::Duration; + + #[no_mangle] + fn custom_ox_now() -> Duration { + unimplemented!("now implementation") + } + ``` +- For `wasm32-unknown-unknown` if the `js` feature is enabled the `Date.now()` ECMAScript API is used. +- For all other targets `SystemTime::now()` is used. + ## License This project is licensed under either of diff --git a/lib/oxsdatatypes/src/boolean.rs b/lib/oxsdatatypes/src/boolean.rs index fd213a90..ad231c47 100644 --- a/lib/oxsdatatypes/src/boolean.rs +++ b/lib/oxsdatatypes/src/boolean.rs @@ -14,7 +14,8 @@ pub struct Boolean { impl Boolean { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { self == other } } @@ -65,7 +66,7 @@ impl FromStr for Boolean { type Err = ParseBoolError; #[inline] - fn from_str(input: &str) -> Result<Self, ParseBoolError> { + fn from_str(input: &str) -> Result<Self, Self::Err> { Ok(match input { "true" | "1" => true, "false" | "0" => false, @@ -84,6 +85,8 @@ impl fmt::Display for Boolean { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] diff --git a/lib/oxsdatatypes/src/date_time.rs b/lib/oxsdatatypes/src/date_time.rs index b5763220..d508c0dd 100644 --- a/lib/oxsdatatypes/src/date_time.rs +++ b/lib/oxsdatatypes/src/date_time.rs @@ -1,14 +1,10 @@ -use super::{DayTimeDuration, Decimal, Duration, XsdParseError, YearMonthDuration}; -use crate::parser::{ - parse_date, parse_date_time, parse_g_day, parse_g_month, parse_g_month_day, parse_g_year, - parse_g_year_month, parse_time, -}; +#![allow(clippy::expect_used)] + +use crate::{DayTimeDuration, Decimal, Duration, YearMonthDuration}; use std::cmp::{min, Ordering}; -use std::error::Error; use std::fmt; use std::hash::{Hash, Hasher}; use std::str::FromStr; -use std::time::SystemTimeError; /// [XML Schema `dateTime` datatype](https://www.w3.org/TR/xmlschema11-2/#dateTime) /// @@ -20,6 +16,13 @@ pub struct DateTime { } impl DateTime { + pub const MAX: Self = Self { + timestamp: Timestamp::MAX, + }; + pub const MIN: Self = Self { + timestamp: Timestamp::MIN, + }; + #[inline] pub(super) fn new( year: i64, @@ -29,7 +32,7 @@ impl DateTime { minute: u8, second: Decimal, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: Some(year), @@ -45,13 +48,14 @@ impl DateTime { /// [fn:current-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-current-dateTime) #[inline] - pub fn now() -> Result<Self, DateTimeError> { - Ok(Self { - timestamp: Timestamp::now()?, - }) + pub fn now() -> Self { + Self { + timestamp: Timestamp::now(), + } } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -60,53 +64,61 @@ impl DateTime { /// [fn:year-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-year-from-dateTime) #[inline] - pub fn year(&self) -> i64 { + #[must_use] + pub fn year(self) -> i64 { self.timestamp.year() } /// [fn:month-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-month-from-dateTime) #[inline] - pub fn month(&self) -> u8 { + #[must_use] + pub fn month(self) -> u8 { self.timestamp.month() } /// [fn:day-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-day-from-dateTime) #[inline] - pub fn day(&self) -> u8 { + #[must_use] + pub fn day(self) -> u8 { self.timestamp.day() } /// [fn:hour-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-hours-from-dateTime) #[inline] - pub fn hour(&self) -> u8 { + #[must_use] + pub fn hour(self) -> u8 { self.timestamp.hour() } /// [fn:minute-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-minutes-from-dateTime) #[inline] - pub fn minute(&self) -> u8 { + #[must_use] + pub fn minute(self) -> u8 { self.timestamp.minute() } /// [fn:second-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-seconds-from-dateTime) #[inline] - pub fn second(&self) -> Decimal { + #[must_use] + pub fn second(self) -> Decimal { self.timestamp.second() } /// [fn:timezone-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-timezone-from-dateTime) #[inline] - pub fn timezone(&self) -> Option<DayTimeDuration> { + #[must_use] + pub fn timezone(self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] - pub fn timezone_offset(&self) -> Option<TimezoneOffset> { + #[must_use] + pub fn timezone_offset(self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] - fn properties(&self) -> DateTimeSevenPropertyModel { + fn properties(self) -> DateTimeSevenPropertyModel { DateTimeSevenPropertyModel { year: Some(self.year()), month: Some(self.month()), @@ -119,28 +131,38 @@ impl DateTime { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// [op:subtract-dateTimes](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dateTimes) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { self.timestamp.checked_sub(rhs.into().timestamp) } /// [op:add-yearMonthDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDuration-to-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] + #[must_use] pub fn checked_add_year_month_duration( - &self, + self, rhs: impl Into<YearMonthDuration>, ) -> Option<Self> { self.checked_add_duration(Duration::from(rhs.into())) } /// [op:add-dayTimeDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_add_day_time_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { + #[must_use] + pub fn checked_add_day_time_duration(self, rhs: impl Into<Duration>) -> Option<Self> { let rhs = rhs.into(); Some(Self { timestamp: self.timestamp.checked_add_seconds(rhs.all_seconds())?, @@ -148,8 +170,11 @@ impl DateTime { } /// [op:add-yearMonthDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDuration-to-dateTime) and [op:add-dayTimeDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_add_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { + #[must_use] + pub fn checked_add_duration(self, rhs: impl Into<Duration>) -> Option<Self> { let rhs = rhs.into(); if let Ok(rhs) = DayTimeDuration::try_from(rhs) { self.checked_add_day_time_duration(rhs) @@ -162,26 +187,35 @@ impl DateTime { } /// [op:subtract-yearMonthDuration-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDuration-from-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] + #[must_use] pub fn checked_sub_year_month_duration( - &self, + self, rhs: impl Into<YearMonthDuration>, ) -> Option<Self> { self.checked_sub_duration(Duration::from(rhs.into())) } /// [op:subtract-dayTimeDuration-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub_day_time_duration(&self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { + #[must_use] + pub fn checked_sub_day_time_duration(self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { let rhs = rhs.into(); Some(Self { - timestamp: self.timestamp.checked_sub_seconds(rhs.all_seconds())?, + timestamp: self.timestamp.checked_sub_seconds(rhs.as_seconds())?, }) } /// [op:subtract-yearMonthDuration-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDuration-from-dateTime) and [op:subtract-dayTimeDuration-from-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-dateTime) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { + #[must_use] + pub fn checked_sub_duration(self, rhs: impl Into<Duration>) -> Option<Self> { let rhs = rhs.into(); if let Ok(rhs) = DayTimeDuration::try_from(rhs) { self.checked_sub_day_time_duration(rhs) @@ -197,8 +231,11 @@ impl DateTime { } /// [fn:adjust-dateTime-to-timezone](https://www.w3.org/TR/xpath-functions-31/#func-adjust-dateTime-to-timezone) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { + #[must_use] + pub fn adjust(self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, }) @@ -206,17 +243,18 @@ impl DateTime { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). impl TryFrom<Date> for DateTime { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn try_from(date: Date) -> Result<Self, Self::Error> { Self::new( date.year(), date.month(), @@ -230,10 +268,10 @@ impl TryFrom<Date> for DateTime { } impl FromStr for DateTime { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_date_time(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, date_time_lexical_rep) } } @@ -242,8 +280,9 @@ impl fmt::Display for DateTime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let year = self.year(); if year < 0 { - write!(f, "-")?; + f.write_str("-")?; } + let second = self.second(); write!( f, "{:04}-{:02}-{:02}T{:02}:{:02}:{}{}", @@ -252,12 +291,12 @@ impl fmt::Display for DateTime { self.day(), self.hour(), self.minute(), - if self.second().abs() >= 10.into() { - "" - } else { + if Decimal::from(-10) < second && second < Decimal::from(10) { "0" + } else { + "" }, - self.second() + second )?; if let Some(timezone_offset) = self.timezone_offset() { write!(f, "{timezone_offset}")?; @@ -276,13 +315,28 @@ pub struct Time { } impl Time { - #[inline] - pub(super) fn new( + #[cfg(test)] + const MAX: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(62_230_255_200), + timezone_offset: Some(TimezoneOffset::MIN), + }, + }; + #[cfg(test)] + const MIN: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(62_230_154_400), + timezone_offset: Some(TimezoneOffset::MAX), + }, + }; + + #[inline] + fn new( mut hour: u8, minute: u8, second: Decimal, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { if hour == 24 && minute == 0 && second == Decimal::default() { hour = 0; } @@ -300,6 +354,7 @@ impl Time { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -308,160 +363,188 @@ impl Time { /// [fn:current-time](https://www.w3.org/TR/xpath-functions-31/#func-current-time) #[inline] - pub fn now() -> Result<Self, DateTimeError> { - DateTime::now()?.try_into() + pub fn now() -> Self { + Self { + timestamp: Timestamp::now(), + } } /// [fn:hour-from-time](https://www.w3.org/TR/xpath-functions-31/#func-hours-from-time) #[inline] - pub fn hour(&self) -> u8 { + #[must_use] + pub fn hour(self) -> u8 { self.timestamp.hour() } /// [fn:minute-from-time](https://www.w3.org/TR/xpath-functions-31/#func-minutes-from-time) #[inline] - pub fn minute(&self) -> u8 { + #[must_use] + pub fn minute(self) -> u8 { self.timestamp.minute() } /// [fn:second-from-time](https://www.w3.org/TR/xpath-functions-31/#func-seconds-from-time) #[inline] - pub fn second(&self) -> Decimal { + #[must_use] + pub fn second(self) -> Decimal { self.timestamp.second() } /// [fn:timezone-from-time](https://www.w3.org/TR/xpath-functions-31/#func-timezone-from-time) #[inline] - pub fn timezone(&self) -> Option<DayTimeDuration> { + #[must_use] + pub fn timezone(self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] - pub fn timezone_offset(&self) -> Option<TimezoneOffset> { + #[must_use] + pub fn timezone_offset(self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// [op:subtract-times](https://www.w3.org/TR/xpath-functions-31/#func-subtract-times) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { self.timestamp.checked_sub(rhs.into().timestamp) } /// [op:add-dayTimeDuration-to-time](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-time) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_add_day_time_duration(&self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { + #[must_use] + pub fn checked_add_day_time_duration(self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { self.checked_add_duration(Duration::from(rhs.into())) } /// [op:add-dayTimeDuration-to-time](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-time) - #[inline] - pub fn checked_add_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { - DateTime::new( - 1972, - 12, - 31, - self.hour(), - self.minute(), - self.second(), - self.timezone_offset(), + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). + #[inline] + #[must_use] + pub fn checked_add_duration(self, rhs: impl Into<Duration>) -> Option<Self> { + Some( + DateTime::new( + 1972, + 12, + 31, + self.hour(), + self.minute(), + self.second(), + self.timezone_offset(), + ) + .ok()? + .checked_add_duration(rhs)? + .into(), ) - .ok()? - .checked_add_duration(rhs)? - .try_into() - .ok() } /// [op:subtract-dayTimeDuration-from-time](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-time) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub_day_time_duration(&self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { + #[must_use] + pub fn checked_sub_day_time_duration(self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { self.checked_sub_duration(Duration::from(rhs.into())) } /// [op:subtract-dayTimeDuration-from-time](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-time) - #[inline] - pub fn checked_sub_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { - DateTime::new( - 1972, - 12, - 31, - self.hour(), - self.minute(), - self.second(), - self.timezone_offset(), + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). + #[inline] + #[must_use] + pub fn checked_sub_duration(self, rhs: impl Into<Duration>) -> Option<Self> { + Some( + DateTime::new( + 1972, + 12, + 31, + self.hour(), + self.minute(), + self.second(), + self.timezone_offset(), + ) + .ok()? + .checked_sub_duration(rhs)? + .into(), ) - .ok()? - .checked_sub_duration(rhs)? - .try_into() - .ok() } // [fn:adjust-time-to-timezone](https://www.w3.org/TR/xpath-functions-31/#func-adjust-time-to-timezone) #[inline] - pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { - DateTime::new( - 1972, - 12, - 31, - self.hour(), - self.minute(), - self.second(), - self.timezone_offset(), + #[must_use] + pub fn adjust(self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { + Some( + DateTime::new( + 1972, + 12, + 31, + self.hour(), + self.minute(), + self.second(), + self.timezone_offset(), + ) + .ok()? + .adjust(timezone_offset)? + .into(), ) - .ok()? - .adjust(timezone_offset)? - .try_into() - .ok() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<DateTime> for Time { - type Error = DateTimeError; - +impl From<DateTime> for Time { #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn from(date_time: DateTime) -> Self { Self::new( date_time.hour(), date_time.minute(), date_time.second(), date_time.timezone_offset(), ) + .expect("Casting from xsd:dateTime to xsd:date can't fail") } } impl FromStr for Time { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_time(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, time_lexical_rep) } } impl fmt::Display for Time { #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let second = self.second(); write!( f, "{:02}:{:02}:{}{}", self.hour(), self.minute(), - if self.second().abs() >= 10.into() { - "" - } else { + if Decimal::from(-10) < second && second < Decimal::from(10) { "0" + } else { + "" }, - self.second() + second )?; if let Some(timezone_offset) = self.timezone_offset() { write!(f, "{timezone_offset}")?; @@ -480,13 +563,26 @@ pub struct Date { } impl Date { - #[inline] - pub(super) fn new( + pub const MAX: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(170_141_183_460_469_216_800), + timezone_offset: Some(TimezoneOffset::MAX), + }, + }; + pub const MIN: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(-170_141_183_460_469_216_800), + timezone_offset: Some(TimezoneOffset::MIN), + }, + }; + + #[inline] + fn new( year: i64, month: u8, day: u8, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: Some(year), @@ -501,6 +597,7 @@ impl Date { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -509,69 +606,89 @@ impl Date { /// [fn:current-date](https://www.w3.org/TR/xpath-functions-31/#func-current-date) #[inline] - pub fn now() -> Result<Self, DateTimeError> { - DateTime::now()?.try_into() + pub fn now() -> Self { + DateTime::now() + .try_into() + .expect("The current time seems way in the future, it's strange") } /// [fn:year-from-date](https://www.w3.org/TR/xpath-functions-31/#func-year-from-date) #[inline] - pub fn year(&self) -> i64 { + #[must_use] + pub fn year(self) -> i64 { self.timestamp.year() } /// [fn:month-from-date](https://www.w3.org/TR/xpath-functions-31/#func-month-from-date) #[inline] - pub fn month(&self) -> u8 { + #[must_use] + pub fn month(self) -> u8 { self.timestamp.month() } /// [fn:day-from-date](https://www.w3.org/TR/xpath-functions-31/#func-day-from-date) #[inline] - pub fn day(&self) -> u8 { + #[must_use] + pub fn day(self) -> u8 { self.timestamp.day() } /// [fn:timezone-from-date](https://www.w3.org/TR/xpath-functions-31/#func-timezone-from-date) #[inline] - pub fn timezone(&self) -> Option<DayTimeDuration> { + #[must_use] + pub fn timezone(self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] - pub fn timezone_offset(&self) -> Option<TimezoneOffset> { + #[must_use] + pub fn timezone_offset(self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// [op:subtract-dates](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dates) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<DayTimeDuration> { self.timestamp.checked_sub(rhs.into().timestamp) } /// [op:add-yearMonthDuration-to-date](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDuration-to-date) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] + #[must_use] pub fn checked_add_year_month_duration( - &self, + self, rhs: impl Into<YearMonthDuration>, ) -> Option<Self> { self.checked_add_duration(Duration::from(rhs.into())) } /// [op:add-dayTimeDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-date) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_add_day_time_duration(&self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { + #[must_use] + pub fn checked_add_day_time_duration(self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { self.checked_add_duration(Duration::from(rhs.into())) } /// [op:add-yearMonthDuration-to-date](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDuration-to-date) and [op:add-dayTimeDuration-to-dateTime](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDuration-to-date) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_add_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { - DateTime::try_from(*self) + #[must_use] + pub fn checked_add_duration(self, rhs: impl Into<Duration>) -> Option<Self> { + DateTime::try_from(self) .ok()? .checked_add_duration(rhs)? .try_into() @@ -579,24 +696,31 @@ impl Date { } /// [op:subtract-yearMonthDuration-from-date](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDuration-from-date) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] + #[must_use] pub fn checked_sub_year_month_duration( - &self, + self, rhs: impl Into<YearMonthDuration>, ) -> Option<Self> { self.checked_sub_duration(Duration::from(rhs.into())) } /// [op:subtract-dayTimeDuration-from-date](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-date) + /// + /// Returns `None` in case of overflow ([`FODT0001`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001)). #[inline] - pub fn checked_sub_day_time_duration(&self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { + #[must_use] + pub fn checked_sub_day_time_duration(self, rhs: impl Into<DayTimeDuration>) -> Option<Self> { self.checked_sub_duration(Duration::from(rhs.into())) } /// [op:subtract-yearMonthDuration-from-date](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDuration-from-date) and [op:subtract-dayTimeDuration-from-date](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDuration-from-date) #[inline] - pub fn checked_sub_duration(&self, rhs: impl Into<Duration>) -> Option<Self> { - DateTime::try_from(*self) + #[must_use] + pub fn checked_sub_duration(self, rhs: impl Into<Duration>) -> Option<Self> { + DateTime::try_from(self) .ok()? .checked_sub_duration(rhs)? .try_into() @@ -605,7 +729,8 @@ impl Date { // [fn:adjust-date-to-timezone](https://www.w3.org/TR/xpath-functions-31/#func-adjust-date-to-timezone) #[inline] - pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { + #[must_use] + pub fn adjust(self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { DateTime::new( self.year(), self.month(), @@ -623,17 +748,18 @@ impl Date { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). impl TryFrom<DateTime> for Date { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn try_from(date_time: DateTime) -> Result<Self, Self::Error> { Self::new( date_time.year(), date_time.month(), @@ -644,10 +770,10 @@ impl TryFrom<DateTime> for Date { } impl FromStr for Date { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_date(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, date_lexical_rep) } } @@ -656,7 +782,7 @@ impl fmt::Display for Date { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let year = self.year(); if year < 0 { - write!(f, "-")?; + f.write_str("-")?; } write!(f, "{:04}-{:02}-{:02}", year.abs(), self.month(), self.day())?; if let Some(timezone_offset) = self.timezone_offset() { @@ -676,12 +802,25 @@ pub struct GYearMonth { } impl GYearMonth { - #[inline] - pub(super) fn new( + pub const MAX: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(170_141_183_460_469_216_800), + timezone_offset: Some(TimezoneOffset::MAX), + }, + }; + pub const MIN: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(-170_141_183_460_466_970_400), + timezone_offset: Some(TimezoneOffset::MIN), + }, + }; + + #[inline] + fn new( year: i64, month: u8, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: Some(year), @@ -696,6 +835,7 @@ impl GYearMonth { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -703,50 +843,57 @@ impl GYearMonth { } #[inline] - pub fn year(&self) -> i64 { + #[must_use] + pub fn year(self) -> i64 { self.timestamp.year() } #[inline] - pub fn month(&self) -> u8 { + #[must_use] + pub fn month(self) -> u8 { self.timestamp.month() } #[inline] - pub fn timezone(&self) -> Option<DayTimeDuration> { + #[must_use] + pub fn timezone(self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] - pub fn timezone_offset(&self) -> Option<TimezoneOffset> { + #[must_use] + pub fn timezone_offset(self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] - pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { + #[must_use] + pub fn adjust(self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, }) } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). impl TryFrom<DateTime> for GYearMonth { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn try_from(date_time: DateTime) -> Result<Self, Self::Error> { Self::new( date_time.year(), date_time.month(), @@ -756,20 +903,19 @@ impl TryFrom<DateTime> for GYearMonth { } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<Date> for GYearMonth { - type Error = DateTimeError; - +impl From<Date> for GYearMonth { #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn from(date: Date) -> Self { Self::new(date.year(), date.month(), date.timezone_offset()) + .expect("Casting from xsd:date to xsd:gYearMonth can't fail") } } impl FromStr for GYearMonth { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_g_year_month(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, g_year_month_lexical_rep) } } @@ -778,7 +924,7 @@ impl fmt::Display for GYearMonth { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let year = self.year(); if year < 0 { - write!(f, "-")?; + f.write_str("-")?; } write!(f, "{:04}-{:02}", year.abs(), self.month())?; if let Some(timezone_offset) = self.timezone_offset() { @@ -798,11 +944,24 @@ pub struct GYear { } impl GYear { - #[inline] - pub(super) fn new( + pub const MAX: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(170_141_183_460_461_440_800), + timezone_offset: Some(TimezoneOffset::MAX), + }, + }; + pub const MIN: Self = Self { + timestamp: Timestamp { + value: Decimal::new_from_i128_unchecked(-170_141_183_460_461_700_000), + timezone_offset: Some(TimezoneOffset::MIN), + }, + }; + + #[inline] + fn new( year: i64, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: Some(year), @@ -817,6 +976,7 @@ impl GYear { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -824,73 +984,79 @@ impl GYear { } #[inline] - pub fn year(&self) -> i64 { + #[must_use] + pub fn year(self) -> i64 { self.timestamp.year() } #[inline] - pub fn timezone(&self) -> Option<DayTimeDuration> { + #[must_use] + pub fn timezone(self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] - pub fn timezone_offset(&self) -> Option<TimezoneOffset> { + #[must_use] + pub fn timezone_offset(self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] - pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { + #[must_use] + pub fn adjust(self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, }) } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). impl TryFrom<DateTime> for GYear { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn try_from(date_time: DateTime) -> Result<Self, Self::Error> { Self::new(date_time.year(), date_time.timezone_offset()) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). impl TryFrom<Date> for GYear { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn try_from(date: Date) -> Result<Self, Self::Error> { Self::new(date.year(), date.timezone_offset()) } } impl TryFrom<GYearMonth> for GYear { - type Error = DateTimeError; + type Error = DateTimeOverflowError; #[inline] - fn try_from(year_month: GYearMonth) -> Result<Self, DateTimeError> { + fn try_from(year_month: GYearMonth) -> Result<Self, Self::Error> { Self::new(year_month.year(), year_month.timezone_offset()) } } impl FromStr for GYear { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_g_year(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, g_year_lexical_rep) } } @@ -899,7 +1065,7 @@ impl fmt::Display for GYear { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let year = self.year(); if year < 0 { - write!(f, "-")?; + f.write_str("-")?; } write!(f, "{:04}", year.abs())?; if let Some(timezone_offset) = self.timezone_offset() { @@ -920,11 +1086,11 @@ pub struct GMonthDay { impl GMonthDay { #[inline] - pub(super) fn new( + fn new( month: u8, day: u8, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: None, @@ -939,6 +1105,7 @@ impl GMonthDay { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -946,26 +1113,31 @@ impl GMonthDay { } #[inline] + #[must_use] pub fn month(&self) -> u8 { self.timestamp.month() } #[inline] + #[must_use] pub fn day(&self) -> u8 { self.timestamp.day() } #[inline] + #[must_use] pub fn timezone(&self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] + #[must_use] pub fn timezone_offset(&self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] + #[must_use] pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, @@ -973,46 +1145,46 @@ impl GMonthDay { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<DateTime> for GMonthDay { - type Error = DateTimeError; - +impl From<DateTime> for GMonthDay { #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn from(date_time: DateTime) -> Self { Self::new( date_time.month(), date_time.day(), date_time.timezone_offset(), ) + .expect("Casting from xsd:dateTime to xsd:gMonthDay can't fail") } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<Date> for GMonthDay { - type Error = DateTimeError; - +impl From<Date> for GMonthDay { #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn from(date: Date) -> Self { Self::new(date.month(), date.day(), date.timezone_offset()) + .expect("Casting from xsd:date to xsd:gMonthDay can't fail") } } impl FromStr for GMonthDay { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_g_month_day(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, g_month_day_lexical_rep) } } @@ -1038,10 +1210,10 @@ pub struct GMonth { impl GMonth { #[inline] - pub(super) fn new( + fn new( month: u8, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: None, @@ -1056,6 +1228,7 @@ impl GMonth { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -1063,21 +1236,25 @@ impl GMonth { } #[inline] + #[must_use] pub fn month(&self) -> u8 { self.timestamp.month() } #[inline] + #[must_use] pub fn timezone(&self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] + #[must_use] pub fn timezone_offset(&self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] + #[must_use] pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, @@ -1085,60 +1262,58 @@ impl GMonth { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<DateTime> for GMonth { - type Error = DateTimeError; - +impl From<DateTime> for GMonth { #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn from(date_time: DateTime) -> Self { Self::new(date_time.month(), date_time.timezone_offset()) + .expect("Casting from xsd:dateTime to xsd:gMonth can't fail") } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<Date> for GMonth { - type Error = DateTimeError; - +impl From<Date> for GMonth { #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn from(date: Date) -> Self { Self::new(date.month(), date.timezone_offset()) + .expect("Casting from xsd:date to xsd:gMonth can't fail") } } -impl TryFrom<GYearMonth> for GMonth { - type Error = DateTimeError; - +impl From<GYearMonth> for GMonth { #[inline] - fn try_from(year_month: GYearMonth) -> Result<Self, DateTimeError> { + fn from(year_month: GYearMonth) -> Self { Self::new(year_month.month(), year_month.timezone_offset()) + .expect("Casting from xsd:gYearMonth to xsd:gMonth can't fail") } } -impl TryFrom<GMonthDay> for GMonth { - type Error = DateTimeError; - +impl From<GMonthDay> for GMonth { #[inline] - fn try_from(month_day: GMonthDay) -> Result<Self, DateTimeError> { + fn from(month_day: GMonthDay) -> Self { Self::new(month_day.month(), month_day.timezone_offset()) + .expect("Casting from xsd:gMonthDay to xsd:gMonth can't fail") } } impl FromStr for GMonth { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_g_month(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, g_month_lexical_rep) } } @@ -1164,10 +1339,10 @@ pub struct GDay { impl GDay { #[inline] - pub(super) fn new( + fn new( day: u8, timezone_offset: Option<TimezoneOffset>, - ) -> Result<Self, DateTimeError> { + ) -> Result<Self, DateTimeOverflowError> { Ok(Self { timestamp: Timestamp::new(&DateTimeSevenPropertyModel { year: None, @@ -1182,6 +1357,7 @@ impl GDay { } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 18]) -> Self { Self { timestamp: Timestamp::from_be_bytes(bytes), @@ -1189,21 +1365,25 @@ impl GDay { } #[inline] + #[must_use] pub fn day(&self) -> u8 { self.timestamp.day() } #[inline] + #[must_use] pub fn timezone(&self) -> Option<DayTimeDuration> { Some(self.timezone_offset()?.into()) } #[inline] + #[must_use] pub fn timezone_offset(&self) -> Option<TimezoneOffset> { self.timestamp.timezone_offset() } #[inline] + #[must_use] pub fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(Self { timestamp: self.timestamp.adjust(timezone_offset)?, @@ -1211,51 +1391,50 @@ impl GDay { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 18] { self.timestamp.to_be_bytes() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.timestamp.is_identical_with(&other.timestamp) + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.timestamp.is_identical_with(other.timestamp) } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<DateTime> for GDay { - type Error = DateTimeError; - +impl From<DateTime> for GDay { #[inline] - fn try_from(date_time: DateTime) -> Result<Self, DateTimeError> { + fn from(date_time: DateTime) -> Self { Self::new(date_time.day(), date_time.timezone_offset()) + .expect("Casting from xsd:dateTime to xsd:gDay can't fail") } } /// Conversion according to [XPath cast rules](https://www.w3.org/TR/xpath-functions-31/#casting-to-datetimes). -impl TryFrom<Date> for GDay { - type Error = DateTimeError; - +impl From<Date> for GDay { #[inline] - fn try_from(date: Date) -> Result<Self, DateTimeError> { + fn from(date: Date) -> Self { Self::new(date.day(), date.timezone_offset()) + .expect("Casting from xsd:date to xsd:gDay can't fail") } } -impl TryFrom<GMonthDay> for GDay { - type Error = DateTimeError; - +impl From<GMonthDay> for GDay { #[inline] - fn try_from(month_day: GMonthDay) -> Result<Self, DateTimeError> { + fn from(month_day: GMonthDay) -> Self { Self::new(month_day.day(), month_day.timezone_offset()) + .expect("Casting from xsd:gMonthDay to xsd:gDay can't fail") } } impl FromStr for GDay { - type Err = XsdParseError; + type Err = ParseDateTimeError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_g_day(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + ensure_complete(input, g_day_lexical_rep) } } @@ -1279,20 +1458,27 @@ pub struct TimezoneOffset { } impl TimezoneOffset { + pub const MAX: Self = Self { offset: 14 * 60 }; + pub const MIN: Self = Self { offset: -14 * 60 }; + pub const UTC: Self = Self { offset: 0 }; + /// From offset in minute with respect to UTC #[inline] - pub fn new(offset_in_minutes: i16) -> Result<Self, DateTimeError> { + pub fn new(offset_in_minutes: i16) -> Result<Self, InvalidTimezoneError> { let value = Self { offset: offset_in_minutes, }; if Self::MIN <= value && value <= Self::MAX { Ok(value) } else { - Err(DATE_TIME_OVERFLOW) + Err(InvalidTimezoneError { + offset_in_minutes: offset_in_minutes.into(), + }) } } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 2]) -> Self { Self { offset: i16::from_be_bytes(bytes), @@ -1300,41 +1486,41 @@ impl TimezoneOffset { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 2] { self.offset.to_be_bytes() } - - pub const MIN: Self = Self { offset: -14 * 60 }; - pub const UTC: Self = Self { offset: 0 }; - pub const MAX: Self = Self { offset: 14 * 60 }; } impl TryFrom<DayTimeDuration> for TimezoneOffset { - type Error = DateTimeError; + type Error = InvalidTimezoneError; #[inline] - fn try_from(value: DayTimeDuration) -> Result<Self, DateTimeError> { + fn try_from(value: DayTimeDuration) -> Result<Self, Self::Error> { + let offset_in_minutes = value.minutes() + value.hours() * 60; let result = Self::new( - (value.minutes() + value.hours() * 60) + offset_in_minutes .try_into() - .map_err(|_| DATE_TIME_OVERFLOW)?, + .map_err(|_| Self::Error { offset_in_minutes })?, )?; if DayTimeDuration::from(result) == value { Ok(result) } else { // The value is not an integral number of minutes or overflow problems - Err(DATE_TIME_OVERFLOW) + Err(Self::Error { offset_in_minutes }) } } } impl TryFrom<Duration> for TimezoneOffset { - type Error = DateTimeError; + type Error = InvalidTimezoneError; #[inline] - fn try_from(value: Duration) -> Result<Self, DateTimeError> { + fn try_from(value: Duration) -> Result<Self, Self::Error> { DayTimeDuration::try_from(value) - .map_err(|_| DATE_TIME_OVERFLOW)? + .map_err(|_| Self::Error { + offset_in_minutes: 0, + })? .try_into() } } @@ -1357,7 +1543,7 @@ impl fmt::Display for TimezoneOffset { #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.offset { - 0 => write!(f, "Z"), + 0 => f.write_str("Z"), offset if offset < 0 => write!(f, "-{:02}:{:02}", -offset / 60, -offset % 60), offset => write!(f, "+{:02}:{:02}", offset / 60, offset % 60), } @@ -1387,7 +1573,7 @@ impl PartialEq for Timestamp { fn eq(&self, other: &Self) -> bool { match (self.timezone_offset, other.timezone_offset) { (Some(_), Some(_)) | (None, None) => self.value.eq(&other.value), - _ => false, //TODO: implicit timezone + _ => false, // TODO: implicit timezone } } } @@ -1433,29 +1619,28 @@ impl Hash for Timestamp { } impl Timestamp { - #[inline] - fn new(props: &DateTimeSevenPropertyModel) -> Result<Self, DateTimeError> { - // Validation - if let (Some(day), Some(month)) = (props.day, props.month) { - // Constraint: Day-of-month Values - if day > days_in_month(props.year, month) { - return Err(DateTimeError { - kind: DateTimeErrorKind::InvalidDayOfMonth { day, month }, - }); - } - } + pub const MAX: Self = Self { + value: Decimal::MAX, + timezone_offset: Some(TimezoneOffset::MAX), + }; + pub const MIN: Self = Self { + value: Decimal::MIN, + timezone_offset: Some(TimezoneOffset::MIN), + }; + #[inline] + fn new(props: &DateTimeSevenPropertyModel) -> Result<Self, DateTimeOverflowError> { Ok(Self { timezone_offset: props.timezone_offset, - value: time_on_timeline(props).ok_or(DATE_TIME_OVERFLOW)?, + value: time_on_timeline(props).ok_or(DateTimeOverflowError)?, }) } #[inline] - fn now() -> Result<Self, DateTimeError> { + fn now() -> Self { Self::new( &date_time_plus_duration( - since_unix_epoch()?, + since_unix_epoch(), &DateTimeSevenPropertyModel { year: Some(1970), month: Some(1), @@ -1466,8 +1651,9 @@ impl Timestamp { timezone_offset: Some(TimezoneOffset::UTC), }, ) - .ok_or(DATE_TIME_OVERFLOW)?, + .expect("The current time seems way in the future, it's strange"), ) + .expect("The current time seems way in the future, it's strange") } #[inline] @@ -1486,6 +1672,7 @@ impl Timestamp { #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] #[inline] + #[must_use] fn year_month_day(&self) -> (i64, u8, u8) { let mut days = (self.value.as_i128() + i128::from(self.timezone_offset.unwrap_or(TimezoneOffset::UTC).offset) * 60) @@ -1537,18 +1724,21 @@ impl Timestamp { } #[inline] + #[must_use] fn year(&self) -> i64 { let (year, _, _) = self.year_month_day(); year } #[inline] + #[must_use] fn month(&self) -> u8 { let (_, month, _) = self.year_month_day(); month } #[inline] + #[must_use] fn day(&self) -> u8 { let (_, _, day) = self.year_month_day(); day @@ -1556,6 +1746,7 @@ impl Timestamp { #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] #[inline] + #[must_use] fn hour(&self) -> u8 { (((self.value.as_i128() + i128::from(self.timezone_offset.unwrap_or(TimezoneOffset::UTC).offset) * 60) @@ -1565,6 +1756,7 @@ impl Timestamp { #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] #[inline] + #[must_use] fn minute(&self) -> u8 { (((self.value.as_i128() + i128::from(self.timezone_offset.unwrap_or(TimezoneOffset::UTC).offset) * 60) @@ -1573,16 +1765,23 @@ impl Timestamp { } #[inline] + #[must_use] fn second(&self) -> Decimal { - self.value.checked_rem_euclid(60).unwrap().abs() + self.value + .checked_rem_euclid(60) + .unwrap() + .checked_abs() + .unwrap() } #[inline] + #[must_use] const fn timezone_offset(&self) -> Option<TimezoneOffset> { self.timezone_offset } #[inline] + #[must_use] fn checked_add_seconds(&self, seconds: impl Into<Decimal>) -> Option<Self> { Some(Self { value: self.value.checked_add(seconds.into())?, @@ -1591,16 +1790,18 @@ impl Timestamp { } #[inline] + #[must_use] fn checked_sub(&self, rhs: Self) -> Option<DayTimeDuration> { match (self.timezone_offset, rhs.timezone_offset) { (Some(_), Some(_)) | (None, None) => { Some(DayTimeDuration::new(self.value.checked_sub(rhs.value)?)) } - _ => None, //TODO: implicit timezone + _ => None, // TODO: implicit timezone } } #[inline] + #[must_use] fn checked_sub_seconds(&self, seconds: Decimal) -> Option<Self> { Some(Self { value: self.value.checked_sub(seconds)?, @@ -1609,6 +1810,7 @@ impl Timestamp { } #[inline] + #[must_use] fn adjust(&self, timezone_offset: Option<TimezoneOffset>) -> Option<Self> { Some(if let Some(from_timezone) = self.timezone_offset { if let Some(to_timezone) = timezone_offset { @@ -1620,13 +1822,13 @@ impl Timestamp { Self { value: self .value - .checked_add(i64::from(from_timezone.offset) * 60)?, // We keep the literal value + .checked_add(i64::from(from_timezone.offset) * 60)?, /* We keep the literal value */ timezone_offset: None, } } } else if let Some(to_timezone) = timezone_offset { Self { - value: self.value.checked_sub(i64::from(to_timezone.offset) * 60)?, // We keep the literal value + value: self.value.checked_sub(i64::from(to_timezone.offset) * 60)?, /* We keep the literal value */ timezone_offset: Some(to_timezone), } } else { @@ -1638,6 +1840,7 @@ impl Timestamp { } #[inline] + #[must_use] fn to_be_bytes(self) -> [u8; 18] { let mut bytes = [0; 18]; bytes[0..16].copy_from_slice(&self.value.to_be_bytes()); @@ -1650,28 +1853,49 @@ impl Timestamp { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { self.value == other.value && self.timezone_offset == other.timezone_offset } } -#[cfg(all(target_family = "wasm", target_os = "unknown"))] -fn since_unix_epoch() -> Result<Duration, DateTimeError> { - Ok(Duration::new( - 0, +#[cfg(feature = "custom-now")] +#[allow(unsafe_code)] +pub fn since_unix_epoch() -> Duration { + extern "Rust" { + fn custom_ox_now() -> Duration; + } + + // SAFETY: Must be defined, if not compilation fails + unsafe { custom_ox_now() } +} + +#[cfg(all( + feature = "js", + not(feature = "custom-now"), + target_family = "wasm", + target_os = "unknown" +))] +fn since_unix_epoch() -> Duration { + DayTimeDuration::new( Decimal::try_from(crate::Double::from(js_sys::Date::now() / 1000.)) - .map_err(|_| DATE_TIME_OVERFLOW)?, - )) + .expect("The current time seems way in the future, it's strange"), + ) + .into() } -#[cfg(not(all(target_family = "wasm", target_os = "unknown")))] -fn since_unix_epoch() -> Result<Duration, DateTimeError> { +#[cfg(not(any( + feature = "custom-now", + all(feature = "js", target_family = "wasm", target_os = "unknown") +)))] +fn since_unix_epoch() -> Duration { use std::time::SystemTime; SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH)? + .duration_since(SystemTime::UNIX_EPOCH) + .expect("System time before UNIX epoch") .try_into() - .map_err(|_| DATE_TIME_OVERFLOW) + .expect("The current time seems way in the future, it's strange") } /// The [normalizeMonth](https://www.w3.org/TR/xmlschema11-2/#f-dt-normMo) function @@ -1732,7 +1956,7 @@ fn normalize_second( mi: i64, se: Decimal, ) -> Option<(i64, u8, u8, u8, u8, Decimal)> { - let mi = mi.checked_add(i64::try_from(se.as_i128().checked_div(60)?).ok()?)?; //TODO: good idea? + let mi = mi.checked_add(i64::try_from(se.as_i128().checked_div(60)?).ok()?)?; // TODO: good idea? let se = se.checked_rem(60)?; let (yr, mo, da, hr, mi) = normalize_minute(yr, mo, da, hr, mi)?; Some((yr, mo, da, hr, mi, se)) @@ -1813,61 +2037,391 @@ fn time_on_timeline(props: &DateTimeSevenPropertyModel) -> Option<Decimal> { .checked_add(se) } -/// An error when doing [`DateTime`] operations. -#[derive(Debug, Clone)] -pub struct DateTimeError { - kind: DateTimeErrorKind, -} +/// A parsing error +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct ParseDateTimeError(#[from] ParseDateTimeErrorKind); -#[derive(Debug, Clone)] -enum DateTimeErrorKind { +#[derive(Debug, Clone, thiserror::Error)] +enum ParseDateTimeErrorKind { + #[error("{day} is not a valid day of {month}")] InvalidDayOfMonth { day: u8, month: u8 }, - Overflow, - SystemTime(SystemTimeError), + #[error(transparent)] + Overflow(#[from] DateTimeOverflowError), + #[error(transparent)] + InvalidTimezone(InvalidTimezoneError), + #[error("{0}")] + Message(&'static str), +} + +impl ParseDateTimeError { + const fn msg(message: &'static str) -> Self { + Self(ParseDateTimeErrorKind::Message(message)) + } +} + +// [16] dateTimeLexicalRep ::= yearFrag '-' monthFrag '-' dayFrag 'T' ((hourFrag ':' minuteFrag ':' secondFrag) | endOfDayFrag) timezoneFrag? +fn date_time_lexical_rep(input: &str) -> Result<(DateTime, &str), ParseDateTimeError> { + let (year, input) = year_frag(input)?; + let input = expect_char(input, '-', "The year and month must be separated by '-'")?; + let (month, input) = month_frag(input)?; + let input = expect_char(input, '-', "The month and day must be separated by '-'")?; + let (day, input) = day_frag(input)?; + let input = expect_char(input, 'T', "The date and time must be separated by 'T'")?; + let (hour, input) = hour_frag(input)?; + let input = expect_char(input, ':', "The hours and minutes must be separated by ':'")?; + let (minute, input) = minute_frag(input)?; + let input = expect_char( + input, + ':', + "The minutes and seconds must be separated by ':'", + )?; + let (second, input) = second_frag(input)?; + // We validate 24:00:00 + if hour == 24 && minute != 0 && second != Decimal::from(0) { + return Err(ParseDateTimeError::msg( + "Times are not allowed to be after 24:00:00", + )); + } + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + validate_day_of_month(Some(year), month, day)?; + Ok(( + DateTime::new(year, month, day, hour, minute, second, timezone_offset)?, + input, + )) } -impl fmt::Display for DateTimeError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.kind { - DateTimeErrorKind::InvalidDayOfMonth { day, month } => { - write!(f, "{day} is not a valid day of {month}") - } - DateTimeErrorKind::Overflow => write!(f, "Overflow during date time normalization"), - DateTimeErrorKind::SystemTime(error) => error.fmt(f), - } +// [17] timeLexicalRep ::= ((hourFrag ':' minuteFrag ':' secondFrag) | endOfDayFrag) timezoneFrag? +fn time_lexical_rep(input: &str) -> Result<(Time, &str), ParseDateTimeError> { + let (hour, input) = hour_frag(input)?; + let input = expect_char(input, ':', "The hours and minutes must be separated by ':'")?; + let (minute, input) = minute_frag(input)?; + let input = expect_char( + input, + ':', + "The minutes and seconds must be separated by ':'", + )?; + let (second, input) = second_frag(input)?; + // We validate 24:00:00 + if hour == 24 && minute != 0 && second != Decimal::from(0) { + return Err(ParseDateTimeError::msg( + "Times are not allowed to be after 24:00:00", + )); + } + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + Ok((Time::new(hour, minute, second, timezone_offset)?, input)) +} + +// [18] dateLexicalRep ::= yearFrag '-' monthFrag '-' dayFrag timezoneFrag? Constraint: Day-of-month Representations +fn date_lexical_rep(input: &str) -> Result<(Date, &str), ParseDateTimeError> { + let (year, input) = year_frag(input)?; + let input = expect_char(input, '-', "The year and month must be separated by '-'")?; + let (month, input) = month_frag(input)?; + let input = expect_char(input, '-', "The month and day must be separated by '-'")?; + let (day, input) = day_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + validate_day_of_month(Some(year), month, day)?; + Ok((Date::new(year, month, day, timezone_offset)?, input)) +} + +// [19] gYearMonthLexicalRep ::= yearFrag '-' monthFrag timezoneFrag? +fn g_year_month_lexical_rep(input: &str) -> Result<(GYearMonth, &str), ParseDateTimeError> { + let (year, input) = year_frag(input)?; + let input = expect_char(input, '-', "The year and month must be separated by '-'")?; + let (month, input) = month_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + Ok((GYearMonth::new(year, month, timezone_offset)?, input)) +} + +// [20] gYearLexicalRep ::= yearFrag timezoneFrag? +fn g_year_lexical_rep(input: &str) -> Result<(GYear, &str), ParseDateTimeError> { + let (year, input) = year_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + Ok((GYear::new(year, timezone_offset)?, input)) +} + +// [21] gMonthDayLexicalRep ::= '--' monthFrag '-' dayFrag timezoneFrag? Constraint: Day-of-month Representations +fn g_month_day_lexical_rep(input: &str) -> Result<(GMonthDay, &str), ParseDateTimeError> { + let input = expect_char(input, '-', "gMonthDay values must start with '--'")?; + let input = expect_char(input, '-', "gMonthDay values must start with '--'")?; + let (month, input) = month_frag(input)?; + let input = expect_char(input, '-', "The month and day must be separated by '-'")?; + let (day, input) = day_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + validate_day_of_month(None, month, day)?; + Ok((GMonthDay::new(month, day, timezone_offset)?, input)) +} + +// [22] gDayLexicalRep ::= '---' dayFrag timezoneFrag? +fn g_day_lexical_rep(input: &str) -> Result<(GDay, &str), ParseDateTimeError> { + let input = expect_char(input, '-', "gDay values must start with '---'")?; + let input = expect_char(input, '-', "gDay values must start with '---'")?; + let input = expect_char(input, '-', "gDay values must start with '---'")?; + let (day, input) = day_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + Ok((GDay::new(day, timezone_offset)?, input)) +} + +// [23] gMonthLexicalRep ::= '--' monthFrag timezoneFrag? +fn g_month_lexical_rep(input: &str) -> Result<(GMonth, &str), ParseDateTimeError> { + let input = expect_char(input, '-', "gMonth values must start with '--'")?; + let input = expect_char(input, '-', "gMonth values must start with '--'")?; + let (month, input) = month_frag(input)?; + let (timezone_offset, input) = optional_end(input, timezone_frag)?; + Ok((GMonth::new(month, timezone_offset)?, input)) +} + +// [56] yearFrag ::= '-'? (([1-9] digit digit digit+)) | ('0' digit digit digit)) +fn year_frag(input: &str) -> Result<(i64, &str), ParseDateTimeError> { + let (sign, input) = if let Some(left) = input.strip_prefix('-') { + (-1, left) + } else { + (1, input) + }; + let (number_str, input) = integer_prefix(input); + if number_str.len() < 4 { + return Err(ParseDateTimeError::msg( + "The year should be encoded on 4 digits", + )); + } + if number_str.len() > 4 && number_str.starts_with('0') { + return Err(ParseDateTimeError::msg( + "The years value must not start with 0 if it can be encoded in at least 4 digits", + )); + } + let number = i64::from_str(number_str).expect("valid integer"); + Ok((sign * number, input)) +} + +// [57] monthFrag ::= ('0' [1-9]) | ('1' [0-2]) +fn month_frag(input: &str) -> Result<(u8, &str), ParseDateTimeError> { + let (number_str, input) = integer_prefix(input); + if number_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "Month must be encoded with two digits", + )); + } + let number = u8::from_str(number_str).expect("valid integer"); + if !(1..=12).contains(&number) { + return Err(ParseDateTimeError::msg("Month must be between 01 and 12")); + } + Ok((number, input)) +} + +// [58] dayFrag ::= ('0' [1-9]) | ([12] digit) | ('3' [01]) +fn day_frag(input: &str) -> Result<(u8, &str), ParseDateTimeError> { + let (number_str, input) = integer_prefix(input); + if number_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "Day must be encoded with two digits", + )); + } + let number = u8::from_str(number_str).expect("valid integer"); + if !(1..=31).contains(&number) { + return Err(ParseDateTimeError::msg("Day must be between 01 and 31")); + } + Ok((number, input)) +} + +// [59] hourFrag ::= ([01] digit) | ('2' [0-3]) +// We also allow 24 for ease of parsing +fn hour_frag(input: &str) -> Result<(u8, &str), ParseDateTimeError> { + let (number_str, input) = integer_prefix(input); + if number_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "Hours must be encoded with two digits", + )); + } + let number = u8::from_str(number_str).expect("valid integer"); + if !(0..=24).contains(&number) { + return Err(ParseDateTimeError::msg("Hours must be between 00 and 24")); + } + Ok((number, input)) +} + +// [60] minuteFrag ::= [0-5] digit +fn minute_frag(input: &str) -> Result<(u8, &str), ParseDateTimeError> { + let (number_str, input) = integer_prefix(input); + if number_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "Minutes must be encoded with two digits", + )); + } + let number = u8::from_str(number_str).expect("valid integer"); + if !(0..=59).contains(&number) { + return Err(ParseDateTimeError::msg("Minutes must be between 00 and 59")); + } + Ok((number, input)) +} + +// [61] secondFrag ::= ([0-5] digit) ('.' digit+)? +fn second_frag(input: &str) -> Result<(Decimal, &str), ParseDateTimeError> { + let (number_str, input) = decimal_prefix(input); + let (before_dot_str, _) = number_str.split_once('.').unwrap_or((number_str, "")); + if before_dot_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "Seconds must be encoded with two digits", + )); + } + let number = Decimal::from_str(number_str) + .map_err(|_| ParseDateTimeError::msg("The second precision is too large"))?; + if number < Decimal::from(0) || number >= Decimal::from(60) { + return Err(ParseDateTimeError::msg("Seconds must be between 00 and 60")); + } + if number_str.ends_with('.') { + return Err(ParseDateTimeError::msg( + "Seconds are not allowed to end with a dot", + )); + } + Ok((number, input)) +} + +// [63] timezoneFrag ::= 'Z' | ('+' | '-') (('0' digit | '1' [0-3]) ':' minuteFrag | '14:00') +fn timezone_frag(input: &str) -> Result<(TimezoneOffset, &str), ParseDateTimeError> { + if let Some(left) = input.strip_prefix('Z') { + return Ok((TimezoneOffset::UTC, left)); } + let (sign, input) = if let Some(left) = input.strip_prefix('-') { + (-1, left) + } else if let Some(left) = input.strip_prefix('+') { + (1, left) + } else { + (1, input) + }; + + let (hour_str, input) = integer_prefix(input); + if hour_str.len() != 2 { + return Err(ParseDateTimeError::msg( + "The timezone hours must be encoded with two digits", + )); + } + let hours = i16::from_str(hour_str).expect("valid integer"); + + let input = expect_char( + input, + ':', + "The timezone hours and minutes must be separated by ':'", + )?; + let (minutes, input) = minute_frag(input)?; + + if hours > 13 && !(hours == 14 && minutes == 0) { + return Err(ParseDateTimeError::msg( + "The timezone hours must be between 00 and 13", + )); + } + + Ok(( + TimezoneOffset::new(sign * (hours * 60 + i16::from(minutes))) + .map_err(|e| ParseDateTimeError(ParseDateTimeErrorKind::InvalidTimezone(e)))?, + input, + )) } -impl Error for DateTimeError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match &self.kind { - DateTimeErrorKind::SystemTime(error) => Some(error), - _ => None, +fn ensure_complete<T>( + input: &str, + parse: impl FnOnce(&str) -> Result<(T, &str), ParseDateTimeError>, +) -> Result<T, ParseDateTimeError> { + let (result, left) = parse(input)?; + if !left.is_empty() { + return Err(ParseDateTimeError::msg("Unrecognized value suffix")); + } + Ok(result) +} + +fn expect_char<'a>( + input: &'a str, + constant: char, + error_message: &'static str, +) -> Result<&'a str, ParseDateTimeError> { + if let Some(left) = input.strip_prefix(constant) { + Ok(left) + } else { + Err(ParseDateTimeError::msg(error_message)) + } +} + +fn integer_prefix(input: &str) -> (&str, &str) { + let mut end = input.len(); + for (i, c) in input.char_indices() { + if !c.is_ascii_digit() { + end = i; + break; } } + input.split_at(end) } -impl From<SystemTimeError> for DateTimeError { - #[inline] - fn from(error: SystemTimeError) -> Self { - Self { - kind: DateTimeErrorKind::SystemTime(error), +fn decimal_prefix(input: &str) -> (&str, &str) { + let mut end = input.len(); + let mut dot_seen = false; + for (i, c) in input.char_indices() { + if c.is_ascii_digit() { + // Ok + } else if c == '.' && !dot_seen { + dot_seen = true; + } else { + end = i; + break; } } + input.split_at(end) +} + +fn optional_end<T>( + input: &str, + parse: impl FnOnce(&str) -> Result<(T, &str), ParseDateTimeError>, +) -> Result<(Option<T>, &str), ParseDateTimeError> { + Ok(if input.is_empty() { + (None, input) + } else { + let (result, input) = parse(input)?; + (Some(result), input) + }) +} + +fn validate_day_of_month(year: Option<i64>, month: u8, day: u8) -> Result<(), ParseDateTimeError> { + // Constraint: Day-of-month Values + if day > days_in_month(year, month) { + return Err(ParseDateTimeError( + ParseDateTimeErrorKind::InvalidDayOfMonth { day, month }, + )); + } + Ok(()) +} + +/// An overflow during [`DateTime`]-related operations. +/// +/// Matches XPath [`FODT0001` error](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0001). +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("overflow during xsd:dateTime computation")] +pub struct DateTimeOverflowError; + +impl From<DateTimeOverflowError> for ParseDateTimeError { + fn from(error: DateTimeOverflowError) -> Self { + Self(ParseDateTimeErrorKind::Overflow(error)) + } } -const DATE_TIME_OVERFLOW: DateTimeError = DateTimeError { - kind: DateTimeErrorKind::Overflow, -}; +/// The value provided as timezone is not valid. +/// +/// Matches XPath [`FODT0003` error](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0003). +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("invalid timezone offset {}:{}", + self.offset_in_minutes / 60, + self.offset_in_minutes.abs() % 60)] +pub struct InvalidTimezoneError { + offset_in_minutes: i64, +} #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; + use std::error::Error; #[test] - fn from_str() -> Result<(), XsdParseError> { + fn from_str() -> Result<(), ParseDateTimeError> { assert_eq!(Time::from_str("00:00:00Z")?.to_string(), "00:00:00Z"); assert_eq!(Time::from_str("00:00:00+00:00")?.to_string(), "00:00:00Z"); assert_eq!(Time::from_str("00:00:00-00:00")?.to_string(), "00:00:00Z"); @@ -2025,14 +2579,60 @@ mod tests { assert_eq!(GMonth::from_str("--01+01:00")?.to_string(), "--01+01:00"); assert_eq!(GMonth::from_str("--01")?.to_string(), "--01"); - assert!(GYear::from_str("02020").is_err()); - assert!(GYear::from_str("+2020").is_err()); - assert!(GYear::from_str("33").is_err()); + GYear::from_str("02020").unwrap_err(); + GYear::from_str("+2020").unwrap_err(); + GYear::from_str("33").unwrap_err(); + + assert_eq!(Time::from_str("00:00:00+14:00")?, Time::MIN); + assert_eq!(Time::from_str("24:00:00-14:00")?, Time::MAX); + Ok(()) + } + + #[test] + fn to_be_bytes() -> Result<(), ParseDateTimeError> { + assert_eq!( + DateTime::from_be_bytes(DateTime::MIN.to_be_bytes()), + DateTime::MIN + ); + assert_eq!( + DateTime::from_be_bytes(DateTime::MAX.to_be_bytes()), + DateTime::MAX + ); + assert_eq!( + DateTime::from_be_bytes(DateTime::from_str("2022-01-03T01:02:03")?.to_be_bytes()), + DateTime::from_str("2022-01-03T01:02:03")? + ); + assert_eq!(Date::from_be_bytes(Date::MIN.to_be_bytes()), Date::MIN); + assert_eq!(Date::from_be_bytes(Date::MAX.to_be_bytes()), Date::MAX); + assert_eq!( + Date::from_be_bytes(Date::from_str("2022-01-03")?.to_be_bytes()), + Date::from_str("2022-01-03")? + ); + assert_eq!(Time::from_be_bytes(Time::MIN.to_be_bytes()), Time::MIN); + assert_eq!(Time::from_be_bytes(Time::MAX.to_be_bytes()), Time::MAX); + assert_eq!( + Time::from_be_bytes(Time::from_str("01:02:03")?.to_be_bytes()), + Time::from_str("01:02:03")? + ); + assert_eq!( + Time::from_be_bytes(Time::from_str("01:02:03")?.to_be_bytes()), + Time::from_str("01:02:03")? + ); + assert_eq!( + GYearMonth::from_be_bytes(GYearMonth::MIN.to_be_bytes()), + GYearMonth::MIN + ); + assert_eq!( + GYearMonth::from_be_bytes(GYearMonth::MAX.to_be_bytes()), + GYearMonth::MAX + ); + assert_eq!(GYear::from_be_bytes(GYear::MIN.to_be_bytes()), GYear::MIN); + assert_eq!(GYear::from_be_bytes(GYear::MAX.to_be_bytes()), GYear::MAX); Ok(()) } #[test] - fn equals() -> Result<(), XsdParseError> { + fn equals() -> Result<(), ParseDateTimeError> { assert_eq!( DateTime::from_str("2002-04-02T12:00:00-01:00")?, DateTime::from_str("2002-04-02T17:00:00+04:00")? @@ -2133,7 +2733,7 @@ mod tests { #[test] #[allow(clippy::neg_cmp_op_on_partial_ord)] - fn cmp() -> Result<(), XsdParseError> { + fn cmp() -> Result<(), ParseDateTimeError> { assert!(Date::from_str("2004-12-25Z")? < Date::from_str("2004-12-25-05:00")?); assert!(!(Date::from_str("2004-12-25-12:00")? < Date::from_str("2004-12-26+12:00")?)); @@ -2160,7 +2760,7 @@ mod tests { } #[test] - fn year() -> Result<(), XsdParseError> { + fn year() -> Result<(), ParseDateTimeError> { assert_eq!( DateTime::from_str("1999-05-31T13:20:00-05:00")?.year(), 1999 @@ -2183,7 +2783,7 @@ mod tests { } #[test] - fn month() -> Result<(), XsdParseError> { + fn month() -> Result<(), ParseDateTimeError> { assert_eq!(DateTime::from_str("1999-05-31T13:20:00-05:00")?.month(), 5); assert_eq!(DateTime::from_str("1999-12-31T19:20:00-05:00")?.month(), 12); @@ -2197,7 +2797,7 @@ mod tests { } #[test] - fn day() -> Result<(), XsdParseError> { + fn day() -> Result<(), ParseDateTimeError> { assert_eq!(DateTime::from_str("1999-05-31T13:20:00-05:00")?.day(), 31); assert_eq!(DateTime::from_str("1999-12-31T20:00:00-05:00")?.day(), 31); @@ -2210,7 +2810,7 @@ mod tests { } #[test] - fn hour() -> Result<(), XsdParseError> { + fn hour() -> Result<(), ParseDateTimeError> { assert_eq!(DateTime::from_str("1999-05-31T08:20:00-05:00")?.hour(), 8); assert_eq!(DateTime::from_str("1999-12-31T21:20:00-05:00")?.hour(), 21); assert_eq!(DateTime::from_str("1999-12-31T12:00:00")?.hour(), 12); @@ -2224,7 +2824,7 @@ mod tests { } #[test] - fn minute() -> Result<(), XsdParseError> { + fn minute() -> Result<(), ParseDateTimeError> { assert_eq!( DateTime::from_str("1999-05-31T13:20:00-05:00")?.minute(), 20 @@ -2239,7 +2839,7 @@ mod tests { } #[test] - fn second() -> Result<(), XsdParseError> { + fn second() -> Result<(), Box<dyn Error>> { assert_eq!( DateTime::from_str("1999-05-31T13:20:00-05:00")?.second(), Decimal::from(0) @@ -2253,7 +2853,7 @@ mod tests { } #[test] - fn timezone() -> Result<(), XsdParseError> { + fn timezone() -> Result<(), Box<dyn Error>> { assert_eq!( DateTime::from_str("1999-05-31T13:20:00-05:00")?.timezone(), Some(DayTimeDuration::from_str("-PT5H")?) @@ -2282,7 +2882,7 @@ mod tests { } #[test] - fn sub() -> Result<(), XsdParseError> { + fn sub() -> Result<(), Box<dyn Error>> { assert_eq!( DateTime::from_str("2000-10-30T06:12:00-05:00")? .checked_sub(DateTime::from_str("1999-11-28T09:00:00Z")?), @@ -2322,7 +2922,7 @@ mod tests { } #[test] - fn add_duration() -> Result<(), XsdParseError> { + fn add_duration() -> Result<(), Box<dyn Error>> { assert_eq!( DateTime::from_str("2000-01-12T12:13:14Z")? .checked_add_duration(Duration::from_str("P1Y3M5DT7H10M3.3S")?), @@ -2386,7 +2986,7 @@ mod tests { } #[test] - fn sub_duration() -> Result<(), XsdParseError> { + fn sub_duration() -> Result<(), Box<dyn Error>> { assert_eq!( DateTime::from_str("2000-10-30T11:12:00")? .checked_sub_duration(Duration::from_str("P1Y2M")?), @@ -2428,17 +3028,15 @@ mod tests { } #[test] - fn adjust() -> Result<(), XsdParseError> { + fn adjust() -> Result<(), Box<dyn Error>> { assert_eq!( - DateTime::from_str("2002-03-07T10:00:00-07:00")?.adjust(Some( - DayTimeDuration::from_str("PT10H")?.try_into().unwrap() - )), + DateTime::from_str("2002-03-07T10:00:00-07:00")? + .adjust(Some(DayTimeDuration::from_str("PT10H")?.try_into()?)), Some(DateTime::from_str("2002-03-08T03:00:00+10:00")?) ); assert_eq!( - DateTime::from_str("2002-03-07T00:00:00+01:00")?.adjust(Some( - DayTimeDuration::from_str("-PT8H")?.try_into().unwrap() - )), + DateTime::from_str("2002-03-07T00:00:00+01:00")? + .adjust(Some(DayTimeDuration::from_str("-PT8H")?.try_into()?)), Some(DateTime::from_str("2002-03-06T15:00:00-08:00")?) ); assert_eq!( @@ -2451,18 +3049,13 @@ mod tests { ); assert_eq!( - Date::from_str("2002-03-07")?.adjust(Some( - DayTimeDuration::from_str("-PT10H")?.try_into().unwrap() - )), + Date::from_str("2002-03-07")? + .adjust(Some(DayTimeDuration::from_str("-PT10H")?.try_into()?)), Some(Date::from_str("2002-03-07-10:00")?) ); assert_eq!( - Date::from_str("2002-03-07-07:00")?.adjust(Some( - DayTimeDuration::from_str("-PT10H") - .unwrap() - .try_into() - .unwrap() - )), + Date::from_str("2002-03-07-07:00")? + .adjust(Some(DayTimeDuration::from_str("-PT10H")?.try_into()?)), Some(Date::from_str("2002-03-06-10:00")?) ); assert_eq!( @@ -2475,15 +3068,13 @@ mod tests { ); assert_eq!( - Time::from_str("10:00:00")?.adjust(Some( - DayTimeDuration::from_str("-PT10H")?.try_into().unwrap() - )), + Time::from_str("10:00:00")? + .adjust(Some(DayTimeDuration::from_str("-PT10H")?.try_into()?)), Some(Time::from_str("10:00:00-10:00")?) ); assert_eq!( - Time::from_str("10:00:00-07:00")?.adjust(Some( - DayTimeDuration::from_str("-PT10H")?.try_into().unwrap() - )), + Time::from_str("10:00:00-07:00")? + .adjust(Some(DayTimeDuration::from_str("-PT10H")?.try_into()?)), Some(Time::from_str("07:00:00-10:00")?) ); assert_eq!( @@ -2495,24 +3086,78 @@ mod tests { Some(Time::from_str("10:00:00")?) ); assert_eq!( - Time::from_str("10:00:00-07:00")?.adjust(Some( - DayTimeDuration::from_str("PT10H")?.try_into().unwrap() - )), + Time::from_str("10:00:00-07:00")? + .adjust(Some(DayTimeDuration::from_str("PT10H")?.try_into()?)), Some(Time::from_str("03:00:00+10:00")?) ); Ok(()) } #[test] - fn now() -> Result<(), XsdParseError> { - let now = DateTime::now().unwrap(); + fn time_from_datetime() -> Result<(), ParseDateTimeError> { + assert_eq!( + Time::from(DateTime::MIN), + Time::from_str("19:51:08.312696284115894272-14:00")? + ); + assert_eq!( + Time::from(DateTime::MAX), + Time::from_str("04:08:51.687303715884105727+14:00")? + ); + Ok(()) + } + + #[test] + fn date_from_datetime() -> Result<(), Box<dyn Error>> { + assert_eq!( + Date::try_from( + DateTime::MIN + .checked_add_day_time_duration(DayTimeDuration::from_str("P1D")?) + .unwrap() + )?, + Date::MIN + ); + assert_eq!(Date::try_from(DateTime::MAX)?, Date::MAX); + Ok(()) + } + + #[test] + fn g_year_month_from_date() { + assert_eq!(GYearMonth::from(Date::MIN), GYearMonth::MIN); + assert_eq!(GYearMonth::from(Date::MAX), GYearMonth::MAX); + } + + #[test] + fn g_year_from_g_year_month() -> Result<(), ParseDateTimeError> { + assert_eq!(GYear::try_from(GYearMonth::MIN)?, GYear::MIN); + assert_eq!( + GYear::try_from(GYearMonth::from_str("5391559471918-12+14:00")?)?, + GYear::MAX + ); + Ok(()) + } + + #[cfg(feature = "custom-now")] + #[test] + fn custom_now() { + #[allow(unsafe_code)] + #[no_mangle] + extern "Rust" fn custom_ox_now() -> Duration { + Duration::default() + } + DateTime::now(); + } + + #[cfg(not(feature = "custom-now"))] + #[test] + fn now() -> Result<(), ParseDateTimeError> { + let now = DateTime::now(); assert!(DateTime::from_str("2022-01-01T00:00:00Z")? < now); assert!(now < DateTime::from_str("2100-01-01T00:00:00Z")?); Ok(()) } #[test] - fn minimally_conformant() -> Result<(), XsdParseError> { + fn minimally_conformant() -> Result<(), ParseDateTimeError> { // All minimally conforming processors must support nonnegative year values less than 10000 // (i.e., those expressible with four digits) in all datatypes which // use the seven-property model defined in The Seven-property Model (§D.2.1) diff --git a/lib/oxsdatatypes/src/decimal.rs b/lib/oxsdatatypes/src/decimal.rs index 19d93fed..72740dc1 100644 --- a/lib/oxsdatatypes/src/decimal.rs +++ b/lib/oxsdatatypes/src/decimal.rs @@ -1,8 +1,6 @@ -use crate::{Boolean, Double, Float, Integer}; -use std::error::Error; +use crate::{Boolean, Double, Float, Integer, TooLargeForIntegerError}; use std::fmt; use std::fmt::Write; -use std::ops::Neg; use std::str::FromStr; const DECIMAL_PART_DIGITS: u32 = 18; @@ -20,20 +18,31 @@ pub struct Decimal { } impl Decimal { + pub const MAX: Self = Self { value: i128::MAX }; + pub const MIN: Self = Self { value: i128::MIN }; + #[cfg(test)] + pub const STEP: Self = Self { value: 1 }; + /// Constructs the decimal i / 10^n #[inline] - pub fn new(i: i128, n: u32) -> Result<Self, DecimalOverflowError> { - let shift = DECIMAL_PART_DIGITS - .checked_sub(n) - .ok_or(DecimalOverflowError)?; - Ok(Self { - value: i - .checked_mul(10_i128.pow(shift)) - .ok_or(DecimalOverflowError)?, - }) + pub const fn new(i: i128, n: u32) -> Result<Self, TooLargeForDecimalError> { + let Some(shift) = DECIMAL_PART_DIGITS.checked_sub(n) else { + return Err(TooLargeForDecimalError); + }; + let Some(value) = i.checked_mul(10_i128.pow(shift)) else { + return Err(TooLargeForDecimalError); + }; + Ok(Self { value }) + } + + pub(crate) const fn new_from_i128_unchecked(value: i128) -> Self { + Self { + value: value * DECIMAL_PART_POW, + } } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 16]) -> Self { Self { value: i128::from_be_bytes(bytes), @@ -41,29 +50,39 @@ impl Decimal { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 16] { self.value.to_be_bytes() } /// [op:numeric-add](https://www.w3.org/TR/xpath-functions-31/#func-numeric-add) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_add(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_add(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_add(rhs.into().value)?, }) } /// [op:numeric-subtract](https://www.w3.org/TR/xpath-functions-31/#func-numeric-subtract) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_sub(rhs.into().value)?, }) } /// [op:numeric-multiply](https://www.w3.org/TR/xpath-functions-31/#func-numeric-multiply) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_mul(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_mul(self, rhs: impl Into<Self>) -> Option<Self> { // Idea: we shift right as much as possible to keep as much precision as possible // Do the multiplication and do the required left shift let mut left = self.value; @@ -94,8 +113,11 @@ impl Decimal { } /// [op:numeric-divide](https://www.w3.org/TR/xpath-functions-31/#func-numeric-divide) + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_div(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_div(self, rhs: impl Into<Self>) -> Option<Self> { // Idea: we shift the dividend left as much as possible to keep as much precision as possible // And we shift right the divisor as much as possible // Do the multiplication and do the required shift @@ -103,7 +125,6 @@ impl Decimal { let mut shift_left = 0_u32; if left != 0 { while let Some(r) = left.checked_mul(10) { - assert_eq!(r / 10, left); left = r; shift_left += 1; } @@ -127,100 +148,122 @@ impl Decimal { } /// [op:numeric-mod](https://www.w3.org/TR/xpath-functions-31/#func-numeric-mod) + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_rem(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_rem(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_rem(rhs.into().value)?, }) } + /// Euclidean remainder + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_rem_euclid(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_rem_euclid(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_rem_euclid(rhs.into().value)?, }) } /// [op:numeric-unary-minus](https://www.w3.org/TR/xpath-functions-31/#func-numeric-unary-minus) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_neg(&self) -> Option<Self> { + #[must_use] + pub fn checked_neg(self) -> Option<Self> { Some(Self { value: self.value.checked_neg()?, }) } /// [fn:abs](https://www.w3.org/TR/xpath-functions-31/#func-abs) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub const fn abs(&self) -> Self { - Self { - value: self.value.abs(), - } + #[must_use] + pub fn checked_abs(self) -> Option<Self> { + Some(Self { + value: self.value.checked_abs()?, + }) } /// [fn:round](https://www.w3.org/TR/xpath-functions-31/#func-round) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn round(&self) -> Self { + #[must_use] + pub fn checked_round(self) -> Option<Self> { let value = self.value / DECIMAL_PART_POW_MINUS_ONE; - Self { + Some(Self { value: if value >= 0 { - (value / 10 + i128::from(value % 10 >= 5)) * DECIMAL_PART_POW + value / 10 + i128::from(value % 10 >= 5) } else { - (value / 10 - i128::from(-value % 10 > 5)) * DECIMAL_PART_POW - }, - } + value / 10 - i128::from(-value % 10 > 5) + } + .checked_mul(DECIMAL_PART_POW)?, + }) } /// [fn:ceiling](https://www.w3.org/TR/xpath-functions-31/#func-ceiling) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn ceil(&self) -> Self { - Self { - value: if self.value >= 0 && self.value % DECIMAL_PART_POW != 0 { - (self.value / DECIMAL_PART_POW + 1) * DECIMAL_PART_POW + #[must_use] + pub fn checked_ceil(self) -> Option<Self> { + Some(Self { + value: if self.value > 0 && self.value % DECIMAL_PART_POW != 0 { + self.value / DECIMAL_PART_POW + 1 } else { - (self.value / DECIMAL_PART_POW) * DECIMAL_PART_POW - }, - } + self.value / DECIMAL_PART_POW + } + .checked_mul(DECIMAL_PART_POW)?, + }) } /// [fn:floor](https://www.w3.org/TR/xpath-functions-31/#func-floor) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn floor(&self) -> Self { - Self { + #[must_use] + pub fn checked_floor(self) -> Option<Self> { + Some(Self { value: if self.value >= 0 || self.value % DECIMAL_PART_POW == 0 { - (self.value / DECIMAL_PART_POW) * DECIMAL_PART_POW + self.value / DECIMAL_PART_POW } else { - (self.value / DECIMAL_PART_POW - 1) * DECIMAL_PART_POW - }, - } + self.value / DECIMAL_PART_POW - 1 + } + .checked_mul(DECIMAL_PART_POW)?, + }) } #[inline] - pub const fn is_negative(&self) -> bool { + #[must_use] + pub const fn is_negative(self) -> bool { self.value < 0 } #[inline] - pub const fn is_positive(&self) -> bool { + #[must_use] + pub const fn is_positive(self) -> bool { self.value > 0 } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { self == other } #[inline] - pub(super) const fn as_i128(&self) -> i128 { + #[must_use] + pub(super) const fn as_i128(self) -> i128 { self.value / DECIMAL_PART_POW } - - pub const MIN: Self = Self { value: i128::MIN }; - - pub const MAX: Self = Self { value: i128::MAX }; - - #[cfg(test)] - pub const STEP: Self = Self { value: 1 }; } impl From<bool> for Decimal { @@ -312,28 +355,28 @@ impl From<Integer> for Decimal { } impl TryFrom<i128> for Decimal { - type Error = DecimalOverflowError; + type Error = TooLargeForDecimalError; #[inline] - fn try_from(value: i128) -> Result<Self, DecimalOverflowError> { + fn try_from(value: i128) -> Result<Self, Self::Error> { Ok(Self { value: value .checked_mul(DECIMAL_PART_POW) - .ok_or(DecimalOverflowError)?, + .ok_or(TooLargeForDecimalError)?, }) } } impl TryFrom<u128> for Decimal { - type Error = DecimalOverflowError; + type Error = TooLargeForDecimalError; #[inline] - fn try_from(value: u128) -> Result<Self, DecimalOverflowError> { + fn try_from(value: u128) -> Result<Self, Self::Error> { Ok(Self { value: i128::try_from(value) - .map_err(|_| DecimalOverflowError)? + .map_err(|_| TooLargeForDecimalError)? .checked_mul(DECIMAL_PART_POW) - .ok_or(DecimalOverflowError)?, + .ok_or(TooLargeForDecimalError)?, }) } } @@ -346,27 +389,27 @@ impl From<Boolean> for Decimal { } impl TryFrom<Float> for Decimal { - type Error = DecimalOverflowError; + type Error = TooLargeForDecimalError; #[inline] - fn try_from(value: Float) -> Result<Self, DecimalOverflowError> { + fn try_from(value: Float) -> Result<Self, Self::Error> { Double::from(value).try_into() } } impl TryFrom<Double> for Decimal { - type Error = DecimalOverflowError; + type Error = TooLargeForDecimalError; #[inline] #[allow(clippy::cast_precision_loss, clippy::cast_possible_truncation)] - fn try_from(value: Double) -> Result<Self, DecimalOverflowError> { + fn try_from(value: Double) -> Result<Self, Self::Error> { let shifted = f64::from(value) * (DECIMAL_PART_POW as f64); - if shifted.is_finite() && (i128::MIN as f64) <= shifted && shifted <= (i128::MAX as f64) { + if (i128::MIN as f64) <= shifted && shifted <= (i128::MAX as f64) { Ok(Self { value: shifted as i128, }) } else { - Err(DecimalOverflowError) + Err(TooLargeForDecimalError) } } } @@ -399,17 +442,17 @@ impl From<Decimal> for Double { } impl TryFrom<Decimal> for Integer { - type Error = DecimalOverflowError; + type Error = TooLargeForIntegerError; #[inline] - fn try_from(value: Decimal) -> Result<Self, DecimalOverflowError> { + fn try_from(value: Decimal) -> Result<Self, Self::Error> { Ok(i64::try_from( value .value .checked_div(DECIMAL_PART_POW) - .ok_or(DecimalOverflowError)?, + .ok_or(TooLargeForIntegerError)?, ) - .map_err(|_| DecimalOverflowError)? + .map_err(|_| TooLargeForIntegerError)? .into()) } } @@ -418,7 +461,7 @@ impl FromStr for Decimal { type Err = ParseDecimalError; /// Parses decimals lexical mapping - fn from_str(input: &str) -> Result<Self, ParseDecimalError> { + fn from_str(input: &str) -> Result<Self, Self::Err> { // (\+|-)?([0-9]+(\.[0-9]*)?|\.[0-9]+) let input = input.as_bytes(); if input.is_empty() { @@ -453,7 +496,7 @@ impl FromStr for Decimal { } input = &input[1..]; if input.is_empty() && !with_before_dot { - //We only have a dot + // We only have a dot return Err(PARSE_UNEXPECTED_END); } while input.last() == Some(&b'0') { @@ -474,11 +517,11 @@ impl FromStr for Decimal { } } if exp == 0 { - //Underflow + // Underflow return Err(PARSE_UNDERFLOW); } } else if !with_before_dot { - //It's empty + // It's empty return Err(PARSE_UNEXPECTED_END); } @@ -524,7 +567,7 @@ impl fmt::Display for Decimal { .find_map(|(i, v)| if v == b'0' { None } else { Some(i) }) .unwrap_or(40); - let decimal_part_digits = usize::try_from(DECIMAL_PART_DIGITS).unwrap(); + let decimal_part_digits = usize::try_from(DECIMAL_PART_DIGITS).map_err(|_| fmt::Error)?; if last_non_zero >= decimal_part_digits { let end = if let Some(mut width) = f.width() { if self.value.is_negative() { @@ -564,79 +607,47 @@ impl fmt::Display for Decimal { } } -impl Neg for Decimal { - type Output = Self; - - #[inline] - fn neg(self) -> Self { - Self { - value: self.value.neg(), - } - } -} - /// An error when parsing a [`Decimal`]. -#[derive(Debug, Clone)] -pub struct ParseDecimalError { - kind: DecimalParseErrorKind, -} +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct ParseDecimalError(#[from] DecimalParseErrorKind); -#[derive(Debug, Clone)] +#[derive(Debug, Clone, thiserror::Error)] enum DecimalParseErrorKind { + #[error("Value overflow")] Overflow, + #[error("Value underflow")] Underflow, + #[error("Unexpected character")] UnexpectedChar, + #[error("Unexpected end of string")] UnexpectedEnd, } -const PARSE_OVERFLOW: ParseDecimalError = ParseDecimalError { - kind: DecimalParseErrorKind::Overflow, -}; -const PARSE_UNDERFLOW: ParseDecimalError = ParseDecimalError { - kind: DecimalParseErrorKind::Underflow, -}; -const PARSE_UNEXPECTED_CHAR: ParseDecimalError = ParseDecimalError { - kind: DecimalParseErrorKind::UnexpectedChar, -}; -const PARSE_UNEXPECTED_END: ParseDecimalError = ParseDecimalError { - kind: DecimalParseErrorKind::UnexpectedEnd, -}; - -impl fmt::Display for ParseDecimalError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self.kind { - DecimalParseErrorKind::Overflow => write!(f, "Value overflow"), - DecimalParseErrorKind::Underflow => write!(f, "Value underflow"), - DecimalParseErrorKind::UnexpectedChar => write!(f, "Unexpected character"), - DecimalParseErrorKind::UnexpectedEnd => write!(f, "Unexpected end of string"), - } - } -} +const PARSE_OVERFLOW: ParseDecimalError = ParseDecimalError(DecimalParseErrorKind::Overflow); +const PARSE_UNDERFLOW: ParseDecimalError = ParseDecimalError(DecimalParseErrorKind::Underflow); +const PARSE_UNEXPECTED_CHAR: ParseDecimalError = + ParseDecimalError(DecimalParseErrorKind::UnexpectedChar); +const PARSE_UNEXPECTED_END: ParseDecimalError = + ParseDecimalError(DecimalParseErrorKind::UnexpectedEnd); -impl Error for ParseDecimalError {} - -impl From<DecimalOverflowError> for ParseDecimalError { - fn from(_: DecimalOverflowError) -> Self { - Self { - kind: DecimalParseErrorKind::Overflow, - } +impl From<TooLargeForDecimalError> for ParseDecimalError { + fn from(_: TooLargeForDecimalError) -> Self { + Self(DecimalParseErrorKind::Overflow) } } -/// An overflow in [`Decimal`] computations. -#[derive(Debug, Clone, Copy)] -pub struct DecimalOverflowError; - -impl fmt::Display for DecimalOverflowError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Value overflow") - } -} - -impl Error for DecimalOverflowError {} +/// The input is too large to fit into a [`Decimal`]. +/// +/// Matches XPath [`FOCA0001` error](https://www.w3.org/TR/xpath-functions-31/#ERRFOCA0001). +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("Value too large for xsd:decimal internal representation")] +pub struct TooLargeForDecimalError; #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] @@ -651,14 +662,14 @@ mod tests { #[test] fn from_str() -> Result<(), ParseDecimalError> { - assert!(Decimal::from_str("").is_err()); - assert!(Decimal::from_str("+").is_err()); - assert!(Decimal::from_str("-").is_err()); - assert!(Decimal::from_str(".").is_err()); - assert!(Decimal::from_str("+.").is_err()); - assert!(Decimal::from_str("-.").is_err()); - assert!(Decimal::from_str("a").is_err()); - assert!(Decimal::from_str(".a").is_err()); + Decimal::from_str("").unwrap_err(); + Decimal::from_str("+").unwrap_err(); + Decimal::from_str("-").unwrap_err(); + Decimal::from_str(".").unwrap_err(); + Decimal::from_str("+.").unwrap_err(); + Decimal::from_str("-.").unwrap_err(); + Decimal::from_str("a").unwrap_err(); + Decimal::from_str(".a").unwrap_err(); assert_eq!(Decimal::from_str("210")?.to_string(), "210"); assert_eq!(Decimal::from_str("1000")?.to_string(), "1000"); assert_eq!(Decimal::from_str("-1.23")?.to_string(), "-1.23"); @@ -676,8 +687,8 @@ mod tests { assert_eq!(Decimal::from_str("-0")?.to_string(), "0"); assert_eq!(Decimal::from_str(&Decimal::MAX.to_string())?, Decimal::MAX); assert_eq!(Decimal::from_str(&Decimal::MIN.to_string())?, Decimal::MIN); - assert!(Decimal::from_str("0.0000000000000000001").is_err()); - assert!(Decimal::from_str("1000000000000000000000").is_err()); + Decimal::from_str("0.0000000000000000001").unwrap_err(); + Decimal::from_str("1000000000000000000000").unwrap_err(); assert_eq!( Decimal::from_str("0.100000000000000000000000000").unwrap(), Decimal::from_str("0.1").unwrap() @@ -792,45 +803,156 @@ mod tests { Some(Decimal::from_str("0.9")?) ); assert_eq!(Decimal::from(1).checked_rem(0), None); + assert_eq!( + Decimal::MAX.checked_rem(1), + Some(Decimal::from_str("0.687303715884105727")?) + ); + assert_eq!( + Decimal::MIN.checked_rem(1), + Some(Decimal::from_str("-0.687303715884105728")?) + ); + assert_eq!( + Decimal::MAX.checked_rem(Decimal::STEP), + Some(Decimal::default()) + ); + assert_eq!( + Decimal::MIN.checked_rem(Decimal::STEP), + Some(Decimal::default()) + ); + assert_eq!( + Decimal::MAX.checked_rem(Decimal::MAX), + Some(Decimal::default()) + ); + assert_eq!( + Decimal::MIN.checked_rem(Decimal::MIN), + Some(Decimal::default()) + ); Ok(()) } #[test] fn round() -> Result<(), ParseDecimalError> { - assert_eq!(Decimal::from(10).round(), Decimal::from(10)); - assert_eq!(Decimal::from(-10).round(), Decimal::from(-10)); - assert_eq!(Decimal::from_str("2.5")?.round(), Decimal::from(3)); - assert_eq!(Decimal::from_str("2.4999")?.round(), Decimal::from(2)); - assert_eq!(Decimal::from_str("-2.5")?.round(), Decimal::from(-2)); - assert_eq!(Decimal::from(i64::MIN).round(), Decimal::from(i64::MIN)); - assert_eq!(Decimal::from(i64::MAX).round(), Decimal::from(i64::MAX)); + assert_eq!(Decimal::from(10).checked_round(), Some(Decimal::from(10))); + assert_eq!(Decimal::from(-10).checked_round(), Some(Decimal::from(-10))); + assert_eq!( + Decimal::from(i64::MIN).checked_round(), + Some(Decimal::from(i64::MIN)) + ); + assert_eq!( + Decimal::from(i64::MAX).checked_round(), + Some(Decimal::from(i64::MAX)) + ); + assert_eq!( + Decimal::from_str("2.5")?.checked_round(), + Some(Decimal::from(3)) + ); + assert_eq!( + Decimal::from_str("2.4999")?.checked_round(), + Some(Decimal::from(2)) + ); + assert_eq!( + Decimal::from_str("-2.5")?.checked_round(), + Some(Decimal::from(-2)) + ); + assert_eq!(Decimal::MAX.checked_round(), None); + assert_eq!( + Decimal::MAX + .checked_sub(Decimal::from_str("0.5")?) + .unwrap() + .checked_round(), + Some(Decimal::from_str("170141183460469231731")?) + ); + assert_eq!(Decimal::MIN.checked_round(), None); + assert_eq!( + Decimal::MIN + .checked_add(Decimal::from_str("0.5")?) + .unwrap() + .checked_round(), + Some(Decimal::from_str("-170141183460469231731")?) + ); Ok(()) } #[test] fn ceil() -> Result<(), ParseDecimalError> { - assert_eq!(Decimal::from(10).ceil(), Decimal::from(10)); - assert_eq!(Decimal::from(-10).ceil(), Decimal::from(-10)); - assert_eq!(Decimal::from_str("10.5")?.ceil(), Decimal::from(11)); - assert_eq!(Decimal::from_str("-10.5")?.ceil(), Decimal::from(-10)); - assert_eq!(Decimal::from(i64::MIN).ceil(), Decimal::from(i64::MIN)); - assert_eq!(Decimal::from(i64::MAX).ceil(), Decimal::from(i64::MAX)); + assert_eq!(Decimal::from(10).checked_ceil(), Some(Decimal::from(10))); + assert_eq!(Decimal::from(-10).checked_ceil(), Some(Decimal::from(-10))); + assert_eq!( + Decimal::from_str("10.5")?.checked_ceil(), + Some(Decimal::from(11)) + ); + assert_eq!( + Decimal::from_str("-10.5")?.checked_ceil(), + Some(Decimal::from(-10)) + ); + assert_eq!( + Decimal::from(i64::MIN).checked_ceil(), + Some(Decimal::from(i64::MIN)) + ); + assert_eq!( + Decimal::from(i64::MAX).checked_ceil(), + Some(Decimal::from(i64::MAX)) + ); + assert_eq!(Decimal::MAX.checked_ceil(), None); + assert_eq!( + Decimal::MAX + .checked_sub(Decimal::from(1)) + .unwrap() + .checked_ceil(), + Some(Decimal::from_str("170141183460469231731")?) + ); + assert_eq!( + Decimal::MIN.checked_ceil(), + Some(Decimal::from_str("-170141183460469231731")?) + ); Ok(()) } #[test] fn floor() -> Result<(), ParseDecimalError> { - assert_eq!(Decimal::from(10).ceil(), Decimal::from(10)); - assert_eq!(Decimal::from(-10).ceil(), Decimal::from(-10)); - assert_eq!(Decimal::from_str("10.5")?.floor(), Decimal::from(10)); - assert_eq!(Decimal::from_str("-10.5")?.floor(), Decimal::from(-11)); - assert_eq!(Decimal::from(i64::MIN).floor(), Decimal::from(i64::MIN)); - assert_eq!(Decimal::from(i64::MAX).floor(), Decimal::from(i64::MAX)); + assert_eq!(Decimal::from(10).checked_floor(), Some(Decimal::from(10))); + assert_eq!(Decimal::from(-10).checked_floor(), Some(Decimal::from(-10))); + assert_eq!( + Decimal::from_str("10.5")?.checked_floor(), + Some(Decimal::from(10)) + ); + assert_eq!( + Decimal::from_str("-10.5")?.checked_floor(), + Some(Decimal::from(-11)) + ); + assert_eq!( + Decimal::from(i64::MIN).checked_floor(), + Some(Decimal::from(i64::MIN)) + ); + assert_eq!( + Decimal::from(i64::MAX).checked_floor(), + Some(Decimal::from(i64::MAX)) + ); + assert_eq!( + Decimal::MAX.checked_floor(), + Some(Decimal::from_str("170141183460469231731")?) + ); + assert_eq!(Decimal::MIN.checked_floor(), None); + assert_eq!( + Decimal::MIN + .checked_add(Decimal::from_str("1")?) + .unwrap() + .checked_floor(), + Some(Decimal::from_str("-170141183460469231731")?) + ); Ok(()) } #[test] fn to_be_bytes() -> Result<(), ParseDecimalError> { + assert_eq!( + Decimal::from_be_bytes(Decimal::MIN.to_be_bytes()), + Decimal::MIN + ); + assert_eq!( + Decimal::from_be_bytes(Decimal::MAX.to_be_bytes()), + Decimal::MAX + ); assert_eq!( Decimal::from_be_bytes(Decimal::from(i64::MIN).to_be_bytes()), Decimal::from(i64::MIN) @@ -874,17 +996,18 @@ mod tests { Decimal::try_from(Float::from(-123.5)).ok(), Some(Decimal::from_str("-123.5")?) ); - assert!(Decimal::try_from(Float::from(f32::NAN)).is_err()); - assert!(Decimal::try_from(Float::from(f32::INFINITY)).is_err()); - assert!(Decimal::try_from(Float::from(f32::NEG_INFINITY)).is_err()); - assert!(Decimal::try_from(Float::from(f32::MIN)).is_err()); - assert!(Decimal::try_from(Float::from(f32::MAX)).is_err()); + Decimal::try_from(Float::from(f32::NAN)).unwrap_err(); + Decimal::try_from(Float::from(f32::INFINITY)).unwrap_err(); + Decimal::try_from(Float::from(f32::NEG_INFINITY)).unwrap_err(); + Decimal::try_from(Float::from(f32::MIN)).unwrap_err(); + Decimal::try_from(Float::from(f32::MAX)).unwrap_err(); assert!( Decimal::try_from(Float::from(1_672_507_300_000.)) .unwrap() .checked_sub(Decimal::from(1_672_507_293_696_i64)) .unwrap() - .abs() + .checked_abs() + .unwrap() < Decimal::from(1) ); Ok(()) @@ -909,14 +1032,15 @@ mod tests { .unwrap() .checked_sub(Decimal::from(1_672_507_302_466_i64)) .unwrap() - .abs() + .checked_abs() + .unwrap() < Decimal::from(1) ); - assert!(Decimal::try_from(Double::from(f64::NAN)).is_err()); - assert!(Decimal::try_from(Double::from(f64::INFINITY)).is_err()); - assert!(Decimal::try_from(Double::from(f64::NEG_INFINITY)).is_err()); - assert!(Decimal::try_from(Double::from(f64::MIN)).is_err()); - assert!(Decimal::try_from(Double::from(f64::MAX)).is_err()); + Decimal::try_from(Double::from(f64::NAN)).unwrap_err(); + Decimal::try_from(Double::from(f64::INFINITY)).unwrap_err(); + Decimal::try_from(Double::from(f64::NEG_INFINITY)).unwrap_err(); + Decimal::try_from(Double::from(f64::MIN)).unwrap_err(); + Decimal::try_from(Double::from(f64::MAX)).unwrap_err(); Ok(()) } diff --git a/lib/oxsdatatypes/src/double.rs b/lib/oxsdatatypes/src/double.rs index b1465c9e..3b58858f 100644 --- a/lib/oxsdatatypes/src/double.rs +++ b/lib/oxsdatatypes/src/double.rs @@ -9,7 +9,7 @@ use std::str::FromStr; /// /// Uses internally a [`f64`]. /// -/// Beware: serialization is currently buggy and do not follow the canonical mapping yet. +/// <div class="warning">Serialization does not follow the canonical mapping.</div> #[derive(Debug, Clone, Copy, Default, PartialEq)] #[repr(transparent)] pub struct Double { @@ -17,7 +17,18 @@ pub struct Double { } impl Double { + pub const INFINITY: Self = Self { + value: f64::INFINITY, + }; + pub const MAX: Self = Self { value: f64::MAX }; + pub const MIN: Self = Self { value: f64::MIN }; + pub const NAN: Self = Self { value: f64::NAN }; + pub const NEG_INFINITY: Self = Self { + value: f64::NEG_INFINITY, + }; + #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 8]) -> Self { Self { value: f64::from_be_bytes(bytes), @@ -25,69 +36,57 @@ impl Double { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 8] { self.value.to_be_bytes() } /// [fn:abs](https://www.w3.org/TR/xpath-functions-31/#func-abs) #[inline] + #[must_use] pub fn abs(self) -> Self { self.value.abs().into() } /// [fn:ceiling](https://www.w3.org/TR/xpath-functions-31/#func-ceiling) #[inline] + #[must_use] pub fn ceil(self) -> Self { self.value.ceil().into() } /// [fn:floor](https://www.w3.org/TR/xpath-functions-31/#func-floor) #[inline] + #[must_use] pub fn floor(self) -> Self { self.value.floor().into() } /// [fn:round](https://www.w3.org/TR/xpath-functions-31/#func-round) #[inline] + #[must_use] pub fn round(self) -> Self { self.value.round().into() } #[inline] + #[must_use] pub fn is_nan(self) -> bool { self.value.is_nan() } - #[deprecated(note = "Use .is_nan()")] - #[inline] - pub fn is_naan(self) -> bool { - self.value.is_nan() - } - #[inline] + #[must_use] pub fn is_finite(self) -> bool { self.value.is_finite() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.value.to_ne_bytes() == other.value.to_ne_bytes() + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.value.to_bits() == other.value.to_bits() } - - pub const MIN: Self = Self { value: f64::MIN }; - - pub const MAX: Self = Self { value: f64::MAX }; - - pub const INFINITY: Self = Self { - value: f64::INFINITY, - }; - - pub const NEG_INFINITY: Self = Self { - value: f64::NEG_INFINITY, - }; - - pub const NAN: Self = Self { value: f64::NAN }; } impl From<Double> for f64 { @@ -170,7 +169,7 @@ impl From<Float> for Double { impl From<Boolean> for Double { #[inline] fn from(value: Boolean) -> Self { - if bool::from(value) { 1. } else { 0. }.into() + f64::from(bool::from(value)).into() } } @@ -186,7 +185,7 @@ impl FromStr for Double { type Err = ParseFloatError; #[inline] - fn from_str(input: &str) -> Result<Self, ParseFloatError> { + fn from_str(input: &str) -> Result<Self, Self::Err> { Ok(f64::from_str(input)?.into()) } } @@ -258,6 +257,8 @@ impl Div for Double { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] @@ -291,9 +292,9 @@ mod tests { #[test] fn is_identical_with() { - assert!(Double::from(0.).is_identical_with(&Double::from(0.))); - assert!(Double::NAN.is_identical_with(&Double::NAN)); - assert!(!Double::from(-0.).is_identical_with(&Double::from(0.))); + assert!(Double::from(0.).is_identical_with(Double::from(0.))); + assert!(Double::NAN.is_identical_with(Double::NAN)); + assert!(!Double::from(-0.).is_identical_with(Double::from(0.))); } #[test] diff --git a/lib/oxsdatatypes/src/duration.rs b/lib/oxsdatatypes/src/duration.rs index 96faec7b..fe0514ab 100644 --- a/lib/oxsdatatypes/src/duration.rs +++ b/lib/oxsdatatypes/src/duration.rs @@ -1,9 +1,6 @@ -use super::decimal::DecimalOverflowError; -use super::parser::*; -use super::*; +use crate::{DateTime, Decimal}; use std::cmp::Ordering; use std::fmt; -use std::ops::Neg; use std::str::FromStr; use std::time::Duration as StdDuration; @@ -17,15 +14,44 @@ pub struct Duration { } impl Duration { + pub const MAX: Self = Self { + year_month: YearMonthDuration::MAX, + day_time: DayTimeDuration::MAX, + }; + pub const MIN: Self = Self { + year_month: YearMonthDuration::MIN, + day_time: DayTimeDuration::MIN, + }; + #[inline] - pub fn new(months: impl Into<i64>, seconds: impl Into<Decimal>) -> Self { - Self { - year_month: YearMonthDuration::new(months), - day_time: DayTimeDuration::new(seconds), + pub fn new( + months: impl Into<i64>, + seconds: impl Into<Decimal>, + ) -> Result<Self, OppositeSignInDurationComponentsError> { + Self::construct( + YearMonthDuration::new(months), + DayTimeDuration::new(seconds), + ) + } + + #[inline] + fn construct( + year_month: YearMonthDuration, + day_time: DayTimeDuration, + ) -> Result<Self, OppositeSignInDurationComponentsError> { + if (year_month > YearMonthDuration::default() && day_time < DayTimeDuration::default()) + || (year_month < YearMonthDuration::default() && day_time > DayTimeDuration::default()) + { + return Err(OppositeSignInDurationComponentsError); } + Ok(Self { + year_month, + day_time, + }) } #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 24]) -> Self { Self { year_month: YearMonthDuration::from_be_bytes(bytes[0..8].try_into().unwrap()), @@ -35,51 +61,60 @@ impl Duration { /// [fn:years-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-years-from-duration) #[inline] - pub fn years(&self) -> i64 { + #[must_use] + pub fn years(self) -> i64 { self.year_month.years() } /// [fn:months-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-months-from-duration) #[inline] - pub fn months(&self) -> i64 { + #[must_use] + pub fn months(self) -> i64 { self.year_month.months() } /// [fn:days-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-days-from-duration) #[inline] - pub fn days(&self) -> i64 { + #[must_use] + pub fn days(self) -> i64 { self.day_time.days() } /// [fn:hours-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-hours-from-duration) #[inline] - pub fn hours(&self) -> i64 { + #[must_use] + pub fn hours(self) -> i64 { self.day_time.hours() } /// [fn:minutes-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-minutes-from-duration) #[inline] - pub fn minutes(&self) -> i64 { + #[must_use] + pub fn minutes(self) -> i64 { self.day_time.minutes() } /// [fn:seconds-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-seconds-from-duration) #[inline] - pub fn seconds(&self) -> Decimal { + #[must_use] + pub fn seconds(self) -> Decimal { self.day_time.seconds() } #[inline] - pub(super) const fn all_months(&self) -> i64 { + #[must_use] + pub(crate) const fn all_months(self) -> i64 { self.year_month.all_months() } #[inline] - pub(super) const fn all_seconds(&self) -> Decimal { - self.day_time.all_seconds() + #[must_use] + pub(crate) const fn all_seconds(self) -> Decimal { + self.day_time.as_seconds() } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 24] { let mut bytes = [0; 24]; bytes[0..8].copy_from_slice(&self.year_month.to_be_bytes()); @@ -88,27 +123,39 @@ impl Duration { } /// [op:add-yearMonthDurations](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDurations) and [op:add-dayTimeDurations](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_add(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_add(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); - Some(Self { - year_month: self.year_month.checked_add(rhs.year_month)?, - day_time: self.day_time.checked_add(rhs.day_time)?, - }) + Self::construct( + self.year_month.checked_add(rhs.year_month)?, + self.day_time.checked_add(rhs.day_time)?, + ) + .ok() } /// [op:subtract-yearMonthDurations](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDurations) and [op:subtract-dayTimeDurations](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); - Some(Self { - year_month: self.year_month.checked_sub(rhs.year_month)?, - day_time: self.day_time.checked_sub(rhs.day_time)?, - }) + Self::construct( + self.year_month.checked_sub(rhs.year_month)?, + self.day_time.checked_sub(rhs.day_time)?, + ) + .ok() } + /// Unary negation. + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_neg(&self) -> Option<Self> { + #[must_use] + pub fn checked_neg(self) -> Option<Self> { Some(Self { year_month: self.year_month.checked_neg()?, day_time: self.day_time.checked_neg()?, @@ -117,25 +164,33 @@ impl Duration { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { self == other } } impl TryFrom<StdDuration> for Duration { - type Error = DecimalOverflowError; + type Error = DurationOverflowError; #[inline] - fn try_from(value: StdDuration) -> Result<Self, DecimalOverflowError> { + fn try_from(value: StdDuration) -> Result<Self, Self::Error> { Ok(DayTimeDuration::try_from(value)?.into()) } } impl FromStr for Duration { - type Err = XsdParseError; + type Err = ParseDurationError; - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_duration(input) + fn from_str(input: &str) -> Result<Self, Self::Err> { + let parts = ensure_complete(input, duration_parts)?; + if parts.year_month.is_none() && parts.day_time.is_none() { + return Err(Self::Err::msg("Empty duration")); + } + Ok(Self::new( + parts.year_month.unwrap_or(0), + parts.day_time.unwrap_or_default(), + )?) } } @@ -146,13 +201,16 @@ impl fmt::Display for Duration { let ym = self.year_month.months; let ss = self.day_time.seconds; + if (ym < 0 && ss > 0.into()) || (ym > 0 && ss < 0.into()) { + return Err(fmt::Error); // Not able to format with only a part of the duration that is negative + } if ym < 0 || ss < 0.into() { - write!(f, "-")?; + f.write_str("-")?; } - write!(f, "P")?; + f.write_str("P")?; if ym == 0 && ss == 0.into() { - return write!(f, "T0S"); + return f.write_str("T0S"); } { @@ -186,7 +244,7 @@ impl fmt::Display for Duration { } if h != 0 || m != 0 || s != 0.into() { - write!(f, "T")?; + f.write_str("T")?; if h != 0 { write!(f, "{}H", h.abs())?; } @@ -194,7 +252,7 @@ impl fmt::Display for Duration { write!(f, "{}M", m.abs())?; } if s != 0.into() { - write!(f, "{}S", s.abs())?; + write!(f, "{}S", s.checked_abs().ok_or(fmt::Error)?)?; } } } @@ -232,18 +290,6 @@ impl PartialOrd for Duration { } } -impl Neg for Duration { - type Output = Self; - - #[inline] - fn neg(self) -> Self { - Self { - year_month: self.year_month.neg(), - day_time: self.day_time.neg(), - } - } -} - /// [XML Schema `yearMonthDuration` datatype](https://www.w3.org/TR/xmlschema11-2/#yearMonthDuration) /// /// It stores the duration as a number of months encoded using a [`i64`]. @@ -253,6 +299,9 @@ pub struct YearMonthDuration { } impl YearMonthDuration { + pub const MAX: Self = Self { months: i64::MAX }; + pub const MIN: Self = Self { months: i64::MIN }; + #[inline] pub fn new(months: impl Into<i64>) -> Self { Self { @@ -280,7 +329,7 @@ impl YearMonthDuration { } #[inline] - pub(super) const fn all_months(self) -> i64 { + pub(crate) const fn all_months(self) -> i64 { self.months } @@ -290,6 +339,8 @@ impl YearMonthDuration { } /// [op:add-yearMonthDurations](https://www.w3.org/TR/xpath-functions-31/#func-add-yearMonthDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] pub fn checked_add(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); @@ -299,6 +350,8 @@ impl YearMonthDuration { } /// [op:subtract-yearMonthDurations](https://www.w3.org/TR/xpath-functions-31/#func-subtract-yearMonthDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); @@ -307,8 +360,11 @@ impl YearMonthDuration { }) } + /// Unary negation. + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_neg(&self) -> Option<Self> { + pub fn checked_neg(self) -> Option<Self> { Some(Self { months: self.months.checked_neg()?, }) @@ -316,7 +372,7 @@ impl YearMonthDuration { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + pub fn is_identical_with(self, other: Self) -> bool { self == other } } @@ -332,23 +388,33 @@ impl From<YearMonthDuration> for Duration { } impl TryFrom<Duration> for YearMonthDuration { - type Error = DecimalOverflowError; + type Error = DurationOverflowError; #[inline] - fn try_from(value: Duration) -> Result<Self, DecimalOverflowError> { + fn try_from(value: Duration) -> Result<Self, Self::Error> { if value.day_time == DayTimeDuration::default() { Ok(value.year_month) } else { - Err(DecimalOverflowError {}) + Err(DurationOverflowError) } } } impl FromStr for YearMonthDuration { - type Err = XsdParseError; - - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_year_month_duration(input) + type Err = ParseDurationError; + + fn from_str(input: &str) -> Result<Self, Self::Err> { + let parts = ensure_complete(input, duration_parts)?; + if parts.day_time.is_some() { + return Err(Self::Err::msg( + "There must not be any day or time component in a yearMonthDuration", + )); + } + Ok(Self::new( + parts + .year_month + .ok_or(Self::Err::msg("No year and month values found"))?, + )) } } @@ -356,7 +422,7 @@ impl fmt::Display for YearMonthDuration { #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.months == 0 { - write!(f, "P0M") + f.write_str("P0M") } else { Duration::from(*self).fmt(f) } @@ -391,17 +457,6 @@ impl PartialOrd<YearMonthDuration> for Duration { } } -impl Neg for YearMonthDuration { - type Output = Self; - - #[inline] - fn neg(self) -> Self { - Self { - months: self.months.neg(), - } - } -} - /// [XML Schema `dayTimeDuration` datatype](https://www.w3.org/TR/xmlschema11-2/#dayTimeDuration) /// /// It stores the duration as a number of seconds encoded using a [`Decimal`]. @@ -411,6 +466,13 @@ pub struct DayTimeDuration { } impl DayTimeDuration { + pub const MAX: Self = Self { + seconds: Decimal::MAX, + }; + pub const MIN: Self = Self { + seconds: Decimal::MIN, + }; + #[inline] pub fn new(seconds: impl Into<Decimal>) -> Self { Self { @@ -428,32 +490,33 @@ impl DayTimeDuration { /// [fn:days-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-days-from-duration) #[allow(clippy::cast_possible_truncation)] #[inline] - pub fn days(&self) -> i64 { + pub fn days(self) -> i64 { (self.seconds.as_i128() / 86400) as i64 } /// [fn:hours-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-hours-from-duration) #[allow(clippy::cast_possible_truncation)] #[inline] - pub fn hours(&self) -> i64 { + pub fn hours(self) -> i64 { ((self.seconds.as_i128() % 86400) / 3600) as i64 } /// [fn:minutes-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-minutes-from-duration) #[allow(clippy::cast_possible_truncation)] #[inline] - pub fn minutes(&self) -> i64 { + pub fn minutes(self) -> i64 { ((self.seconds.as_i128() % 3600) / 60) as i64 } /// [fn:seconds-from-duration](https://www.w3.org/TR/xpath-functions-31/#func-seconds-from-duration) #[inline] - pub fn seconds(&self) -> Decimal { + pub fn seconds(self) -> Decimal { self.seconds.checked_rem(60).unwrap() } + /// The duration in seconds. #[inline] - pub(super) const fn all_seconds(&self) -> Decimal { + pub const fn as_seconds(self) -> Decimal { self.seconds } @@ -463,8 +526,10 @@ impl DayTimeDuration { } /// [op:add-dayTimeDurations](https://www.w3.org/TR/xpath-functions-31/#func-add-dayTimeDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_add(&self, rhs: impl Into<Self>) -> Option<Self> { + pub fn checked_add(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); Some(Self { seconds: self.seconds.checked_add(rhs.seconds)?, @@ -472,16 +537,21 @@ impl DayTimeDuration { } /// [op:subtract-dayTimeDurations](https://www.w3.org/TR/xpath-functions-31/#func-subtract-dayTimeDurations) + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<Self> { + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<Self> { let rhs = rhs.into(); Some(Self { seconds: self.seconds.checked_sub(rhs.seconds)?, }) } + /// Unary negation. + /// + /// Returns `None` in case of overflow ([`FODT0002`](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002)). #[inline] - pub fn checked_neg(&self) -> Option<Self> { + pub fn checked_neg(self) -> Option<Self> { Some(Self { seconds: self.seconds.checked_neg()?, }) @@ -489,7 +559,7 @@ impl DayTimeDuration { /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + pub fn is_identical_with(self, other: Self) -> bool { self == other } } @@ -505,37 +575,77 @@ impl From<DayTimeDuration> for Duration { } impl TryFrom<Duration> for DayTimeDuration { - type Error = DecimalOverflowError; + type Error = DurationOverflowError; #[inline] - fn try_from(value: Duration) -> Result<Self, DecimalOverflowError> { + fn try_from(value: Duration) -> Result<Self, Self::Error> { if value.year_month == YearMonthDuration::default() { Ok(value.day_time) } else { - Err(DecimalOverflowError {}) + Err(DurationOverflowError) } } } impl TryFrom<StdDuration> for DayTimeDuration { - type Error = DecimalOverflowError; + type Error = DurationOverflowError; #[inline] - fn try_from(value: StdDuration) -> Result<Self, DecimalOverflowError> { + fn try_from(value: StdDuration) -> Result<Self, Self::Error> { Ok(Self { seconds: Decimal::new( - i128::try_from(value.as_nanos()).map_err(|_| DecimalOverflowError)?, + i128::try_from(value.as_nanos()).map_err(|_| DurationOverflowError)?, 9, - )?, + ) + .map_err(|_| DurationOverflowError)?, }) } } -impl FromStr for DayTimeDuration { - type Err = XsdParseError; +impl TryFrom<DayTimeDuration> for StdDuration { + type Error = DurationOverflowError; + + #[inline] + fn try_from(value: DayTimeDuration) -> Result<Self, Self::Error> { + if value.seconds.is_negative() { + return Err(DurationOverflowError); + } + let secs = value.seconds.checked_floor().ok_or(DurationOverflowError)?; + let nanos = value + .seconds + .checked_sub(secs) + .ok_or(DurationOverflowError)? + .checked_mul(1_000_000_000) + .ok_or(DurationOverflowError)? + .checked_floor() + .ok_or(DurationOverflowError)?; + Ok(Self::new( + secs.as_i128() + .try_into() + .map_err(|_| DurationOverflowError)?, + nanos + .as_i128() + .try_into() + .map_err(|_| DurationOverflowError)?, + )) + } +} - fn from_str(input: &str) -> Result<Self, XsdParseError> { - parse_day_time_duration(input) +impl FromStr for DayTimeDuration { + type Err = ParseDurationError; + + fn from_str(input: &str) -> Result<Self, Self::Err> { + let parts = ensure_complete(input, duration_parts)?; + if parts.year_month.is_some() { + return Err(Self::Err::msg( + "There must not be any year or month component in a dayTimeDuration", + )); + } + Ok(Self::new( + parts + .day_time + .ok_or(Self::Err::msg("No day or time values found"))?, + )) } } @@ -602,25 +712,278 @@ impl PartialOrd<DayTimeDuration> for YearMonthDuration { } } -impl Neg for DayTimeDuration { - type Output = Self; +// [6] duYearFrag ::= unsignedNoDecimalPtNumeral 'Y' +// [7] duMonthFrag ::= unsignedNoDecimalPtNumeral 'M' +// [8] duDayFrag ::= unsignedNoDecimalPtNumeral 'D' +// [9] duHourFrag ::= unsignedNoDecimalPtNumeral 'H' +// [10] duMinuteFrag ::= unsignedNoDecimalPtNumeral 'M' +// [11] duSecondFrag ::= (unsignedNoDecimalPtNumeral | unsignedDecimalPtNumeral) 'S' +// [12] duYearMonthFrag ::= (duYearFrag duMonthFrag?) | duMonthFrag +// [13] duTimeFrag ::= 'T' ((duHourFrag duMinuteFrag? duSecondFrag?) | (duMinuteFrag duSecondFrag?) | duSecondFrag) +// [14] duDayTimeFrag ::= (duDayFrag duTimeFrag?) | duTimeFrag +// [15] durationLexicalRep ::= '-'? 'P' ((duYearMonthFrag duDayTimeFrag?) | duDayTimeFrag) +struct DurationParts { + year_month: Option<i64>, + day_time: Option<Decimal>, +} +fn duration_parts(input: &str) -> Result<(DurationParts, &str), ParseDurationError> { + // States + const START: u32 = 0; + const AFTER_YEAR: u32 = 1; + const AFTER_MONTH: u32 = 2; + const AFTER_DAY: u32 = 3; + const AFTER_T: u32 = 4; + const AFTER_HOUR: u32 = 5; + const AFTER_MINUTE: u32 = 6; + const AFTER_SECOND: u32 = 7; + + let (is_negative, input) = if let Some(left) = input.strip_prefix('-') { + (true, left) + } else { + (false, input) + }; + let mut input = expect_char(input, 'P', "Durations must start with 'P'")?; + let mut state = START; + let mut year_month: Option<i64> = None; + let mut day_time: Option<Decimal> = None; + while !input.is_empty() { + if let Some(left) = input.strip_prefix('T') { + if state >= AFTER_T { + return Err(ParseDurationError::msg("Duplicated time separator 'T'")); + } + state = AFTER_T; + input = left; + } else { + let (number_str, left) = decimal_prefix(input); + match left.chars().next() { + Some('Y') if state < AFTER_YEAR => { + year_month = Some( + year_month + .unwrap_or_default() + .checked_add( + apply_i64_neg( + i64::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )? + .checked_mul(12) + .ok_or(OVERFLOW_ERROR)?, + ) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_YEAR; + } + Some('M') if state < AFTER_MONTH => { + year_month = Some( + year_month + .unwrap_or_default() + .checked_add(apply_i64_neg( + i64::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )?) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_MONTH; + } + Some('D') if state < AFTER_DAY => { + if number_str.contains('.') { + return Err(ParseDurationError::msg( + "Decimal numbers are not allowed for days", + )); + } + day_time = Some( + day_time + .unwrap_or_default() + .checked_add( + apply_decimal_neg( + Decimal::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )? + .checked_mul(86400) + .ok_or(OVERFLOW_ERROR)?, + ) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_DAY; + } + Some('H') if state == AFTER_T => { + if number_str.contains('.') { + return Err(ParseDurationError::msg( + "Decimal numbers are not allowed for hours", + )); + } + day_time = Some( + day_time + .unwrap_or_default() + .checked_add( + apply_decimal_neg( + Decimal::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )? + .checked_mul(3600) + .ok_or(OVERFLOW_ERROR)?, + ) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_HOUR; + } + Some('M') if (AFTER_T..AFTER_MINUTE).contains(&state) => { + if number_str.contains('.') { + return Err(ParseDurationError::msg( + "Decimal numbers are not allowed for minutes", + )); + } + day_time = Some( + day_time + .unwrap_or_default() + .checked_add( + apply_decimal_neg( + Decimal::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )? + .checked_mul(60) + .ok_or(OVERFLOW_ERROR)?, + ) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_MINUTE; + } + Some('S') if (AFTER_T..AFTER_SECOND).contains(&state) => { + day_time = Some( + day_time + .unwrap_or_default() + .checked_add(apply_decimal_neg( + Decimal::from_str(number_str).map_err(|_| OVERFLOW_ERROR)?, + is_negative, + )?) + .ok_or(OVERFLOW_ERROR)?, + ); + state = AFTER_SECOND; + } + Some(_) => return Err(ParseDurationError::msg("Unexpected type character")), + None => { + return Err(ParseDurationError::msg( + "Numbers in durations must be followed by a type character", + )) + } + } + input = &left[1..]; + } + } + + Ok(( + DurationParts { + year_month, + day_time, + }, + input, + )) +} + +fn apply_i64_neg(value: i64, is_negative: bool) -> Result<i64, ParseDurationError> { + if is_negative { + value.checked_neg().ok_or(OVERFLOW_ERROR) + } else { + Ok(value) + } +} + +fn apply_decimal_neg(value: Decimal, is_negative: bool) -> Result<Decimal, ParseDurationError> { + if is_negative { + value.checked_neg().ok_or(OVERFLOW_ERROR) + } else { + Ok(value) + } +} + +fn ensure_complete<T>( + input: &str, + parse: impl FnOnce(&str) -> Result<(T, &str), ParseDurationError>, +) -> Result<T, ParseDurationError> { + let (result, left) = parse(input)?; + if !left.is_empty() { + return Err(ParseDurationError::msg("Unrecognized value suffix")); + } + Ok(result) +} + +fn expect_char<'a>( + input: &'a str, + constant: char, + error_message: &'static str, +) -> Result<&'a str, ParseDurationError> { + if let Some(left) = input.strip_prefix(constant) { + Ok(left) + } else { + Err(ParseDurationError::msg(error_message)) + } +} + +fn decimal_prefix(input: &str) -> (&str, &str) { + let mut end = input.len(); + let mut dot_seen = false; + for (i, c) in input.char_indices() { + if c.is_ascii_digit() { + // Ok + } else if c == '.' && !dot_seen { + dot_seen = true; + } else { + end = i; + break; + } + } + input.split_at(end) +} + +/// A parsing error +#[derive(Debug, Clone, thiserror::Error)] +#[error("{msg}")] +pub struct ParseDurationError { + msg: &'static str, +} + +const OVERFLOW_ERROR: ParseDurationError = ParseDurationError { + msg: "Overflow error", +}; + +impl ParseDurationError { + const fn msg(msg: &'static str) -> Self { + Self { msg } + } +} + +/// An overflow during [`Duration`]-related operations. +/// +/// Matches XPath [`FODT0002` error](https://www.w3.org/TR/xpath-functions-31/#ERRFODT0002). +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("overflow during xsd:duration computation")] +pub struct DurationOverflowError; + +/// The year-month and the day-time components of a [`Duration`] have an opposite sign. +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("The xsd:yearMonthDuration and xsd:dayTimeDuration components of a xsd:duration can't have opposite sign")] +pub struct OppositeSignInDurationComponentsError; + +impl From<OppositeSignInDurationComponentsError> for ParseDurationError { #[inline] - fn neg(self) -> Self { + fn from(_: OppositeSignInDurationComponentsError) -> Self { Self { - seconds: self.seconds.neg(), + msg: "The xsd:yearMonthDuration and xsd:dayTimeDuration components of a xsd:duration can't have opposite sign" } } } #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; + use std::error::Error; #[test] - fn from_str() -> Result<(), XsdParseError> { - let min = Duration::new(i64::MIN, Decimal::MIN); - let max = Duration::new(i64::MAX, Decimal::MAX); + fn from_str() -> Result<(), ParseDurationError> { + let min = Duration::new(i64::MIN, Decimal::MIN)?; + let max = Duration::new(i64::MAX, Decimal::MAX)?; assert_eq!(YearMonthDuration::from_str("P1Y")?.to_string(), "P1Y"); assert_eq!(Duration::from_str("P1Y")?.to_string(), "P1Y"); @@ -658,17 +1021,52 @@ mod tests { } #[test] - fn from_std() { + fn from_std() -> Result<(), DurationOverflowError> { assert_eq!( - Duration::try_from(StdDuration::new(10, 10)) - .unwrap() - .to_string(), + Duration::try_from(StdDuration::new(10, 10))?.to_string(), "PT10.00000001S" ); + Ok(()) + } + + #[test] + fn to_std() -> Result<(), Box<dyn Error>> { + let duration = StdDuration::try_from(DayTimeDuration::from_str("PT10.00000001S")?)?; + assert_eq!(duration.as_secs(), 10); + assert_eq!(duration.subsec_nanos(), 10); + Ok(()) + } + + #[test] + fn to_be_bytes() { + assert_eq!( + Duration::from_be_bytes(Duration::MIN.to_be_bytes()), + Duration::MIN + ); + assert_eq!( + Duration::from_be_bytes(Duration::MAX.to_be_bytes()), + Duration::MAX + ); + assert_eq!( + YearMonthDuration::from_be_bytes(YearMonthDuration::MIN.to_be_bytes()), + YearMonthDuration::MIN + ); + assert_eq!( + YearMonthDuration::from_be_bytes(YearMonthDuration::MAX.to_be_bytes()), + YearMonthDuration::MAX + ); + assert_eq!( + DayTimeDuration::from_be_bytes(DayTimeDuration::MIN.to_be_bytes()), + DayTimeDuration::MIN + ); + assert_eq!( + DayTimeDuration::from_be_bytes(DayTimeDuration::MAX.to_be_bytes()), + DayTimeDuration::MAX + ); } #[test] - fn equals() -> Result<(), XsdParseError> { + fn equals() -> Result<(), ParseDurationError> { assert_eq!( YearMonthDuration::from_str("P1Y")?, YearMonthDuration::from_str("P12M")? @@ -713,7 +1111,24 @@ mod tests { } #[test] - fn years() -> Result<(), XsdParseError> { + #[allow(clippy::neg_cmp_op_on_partial_ord)] + fn cmp() -> Result<(), ParseDurationError> { + assert!(Duration::from_str("P1Y1D")? < Duration::from_str("P13MT25H")?); + assert!(YearMonthDuration::from_str("P1Y")? < YearMonthDuration::from_str("P13M")?); + assert!(Duration::from_str("P1Y")? < YearMonthDuration::from_str("P13M")?); + assert!(YearMonthDuration::from_str("P1Y")? < Duration::from_str("P13M")?); + assert!(DayTimeDuration::from_str("P1D")? < DayTimeDuration::from_str("PT25H")?); + assert!(DayTimeDuration::from_str("PT1H")? < DayTimeDuration::from_str("PT61M")?); + assert!(DayTimeDuration::from_str("PT1M")? < DayTimeDuration::from_str("PT61S")?); + assert!(Duration::from_str("PT1H")? < DayTimeDuration::from_str("PT61M")?); + assert!(DayTimeDuration::from_str("PT1H")? < Duration::from_str("PT61M")?); + assert!(YearMonthDuration::from_str("P1M")? < DayTimeDuration::from_str("P40D")?); + assert!(DayTimeDuration::from_str("P25D")? < YearMonthDuration::from_str("P1M")?); + Ok(()) + } + + #[test] + fn years() -> Result<(), ParseDurationError> { assert_eq!(Duration::from_str("P20Y15M")?.years(), 21); assert_eq!(Duration::from_str("-P15M")?.years(), -1); assert_eq!(Duration::from_str("-P2DT15H")?.years(), 0); @@ -721,7 +1136,7 @@ mod tests { } #[test] - fn months() -> Result<(), XsdParseError> { + fn months() -> Result<(), ParseDurationError> { assert_eq!(Duration::from_str("P20Y15M")?.months(), 3); assert_eq!(Duration::from_str("-P20Y18M")?.months(), -6); assert_eq!(Duration::from_str("-P2DT15H0M0S")?.months(), 0); @@ -729,7 +1144,7 @@ mod tests { } #[test] - fn days() -> Result<(), XsdParseError> { + fn days() -> Result<(), ParseDurationError> { assert_eq!(Duration::from_str("P3DT10H")?.days(), 3); assert_eq!(Duration::from_str("P3DT55H")?.days(), 5); assert_eq!(Duration::from_str("P3Y5M")?.days(), 0); @@ -737,7 +1152,7 @@ mod tests { } #[test] - fn hours() -> Result<(), XsdParseError> { + fn hours() -> Result<(), ParseDurationError> { assert_eq!(Duration::from_str("P3DT10H")?.hours(), 10); assert_eq!(Duration::from_str("P3DT12H32M12S")?.hours(), 12); assert_eq!(Duration::from_str("PT123H")?.hours(), 3); @@ -746,14 +1161,14 @@ mod tests { } #[test] - fn minutes() -> Result<(), XsdParseError> { + fn minutes() -> Result<(), ParseDurationError> { assert_eq!(Duration::from_str("P3DT10H")?.minutes(), 0); assert_eq!(Duration::from_str("-P5DT12H30M")?.minutes(), -30); Ok(()) } #[test] - fn seconds() -> Result<(), XsdParseError> { + fn seconds() -> Result<(), Box<dyn Error>> { assert_eq!( Duration::from_str("P3DT10H12.5S")?.seconds(), Decimal::from_str("12.5")? @@ -766,7 +1181,7 @@ mod tests { } #[test] - fn add() -> Result<(), XsdParseError> { + fn add() -> Result<(), ParseDurationError> { assert_eq!( Duration::from_str("P2Y11M")?.checked_add(Duration::from_str("P3Y3M")?), Some(Duration::from_str("P6Y2M")?) @@ -775,11 +1190,19 @@ mod tests { Duration::from_str("P2DT12H5M")?.checked_add(Duration::from_str("P5DT12H")?), Some(Duration::from_str("P8DT5M")?) ); + assert_eq!( + Duration::from_str("P1M2D")?.checked_add(Duration::from_str("-P3D")?), + None + ); + assert_eq!( + Duration::from_str("P1M2D")?.checked_add(Duration::from_str("-P2M")?), + None + ); Ok(()) } #[test] - fn sub() -> Result<(), XsdParseError> { + fn sub() -> Result<(), ParseDurationError> { assert_eq!( Duration::from_str("P2Y11M")?.checked_sub(Duration::from_str("P3Y3M")?), Some(Duration::from_str("-P4M")?) @@ -788,11 +1211,19 @@ mod tests { Duration::from_str("P2DT12H")?.checked_sub(Duration::from_str("P1DT10H30M")?), Some(Duration::from_str("P1DT1H30M")?) ); + assert_eq!( + Duration::from_str("P1M2D")?.checked_sub(Duration::from_str("P3D")?), + None + ); + assert_eq!( + Duration::from_str("P1M2D")?.checked_sub(Duration::from_str("P2M")?), + None + ); Ok(()) } #[test] - fn minimally_conformant() -> Result<(), XsdParseError> { + fn minimally_conformant() -> Result<(), ParseDurationError> { // All minimally conforming processors must support fractional-second duration values // to milliseconds (i.e. those expressible with three fraction digits). assert_eq!(Duration::from_str("PT0.001S")?.to_string(), "PT0.001S"); diff --git a/lib/oxsdatatypes/src/float.rs b/lib/oxsdatatypes/src/float.rs index 7f7b979b..c4d08d6c 100644 --- a/lib/oxsdatatypes/src/float.rs +++ b/lib/oxsdatatypes/src/float.rs @@ -9,7 +9,7 @@ use std::str::FromStr; /// /// Uses internally a [`f32`]. /// -/// Beware: serialization is currently buggy and do not follow the canonical mapping yet. +/// <div class="warning">Serialization does not follow the canonical mapping.</div> #[derive(Debug, Clone, Copy, Default, PartialEq)] #[repr(transparent)] pub struct Float { @@ -17,7 +17,18 @@ pub struct Float { } impl Float { + pub const INFINITY: Self = Self { + value: f32::INFINITY, + }; + pub const MAX: Self = Self { value: f32::MAX }; + pub const MIN: Self = Self { value: f32::MIN }; + pub const NAN: Self = Self { value: f32::NAN }; + pub const NEG_INFINITY: Self = Self { + value: f32::NEG_INFINITY, + }; + #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 4]) -> Self { Self { value: f32::from_be_bytes(bytes), @@ -25,69 +36,57 @@ impl Float { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 4] { self.value.to_be_bytes() } /// [fn:abs](https://www.w3.org/TR/xpath-functions-31/#func-abs) #[inline] + #[must_use] pub fn abs(self) -> Self { self.value.abs().into() } /// [fn:ceiling](https://www.w3.org/TR/xpath-functions-31/#func-ceiling) #[inline] + #[must_use] pub fn ceil(self) -> Self { self.value.ceil().into() } /// [fn:floor](https://www.w3.org/TR/xpath-functions-31/#func-floor) #[inline] + #[must_use] pub fn floor(self) -> Self { self.value.floor().into() } /// [fn:round](https://www.w3.org/TR/xpath-functions-31/#func-round) #[inline] + #[must_use] pub fn round(self) -> Self { self.value.round().into() } - #[deprecated(note = "Use .is_nan()")] - #[inline] - pub fn is_naan(self) -> bool { - self.value.is_nan() - } - #[inline] + #[must_use] pub fn is_nan(self) -> bool { self.value.is_nan() } #[inline] + #[must_use] pub fn is_finite(self) -> bool { self.value.is_finite() } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { - self.value.to_ne_bytes() == other.value.to_ne_bytes() + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { + self.value.to_bits() == other.value.to_bits() } - - pub const MIN: Self = Self { value: f32::MIN }; - - pub const MAX: Self = Self { value: f32::MAX }; - - pub const INFINITY: Self = Self { - value: f32::INFINITY, - }; - - pub const NEG_INFINITY: Self = Self { - value: f32::NEG_INFINITY, - }; - - pub const NAN: Self = Self { value: f32::NAN }; } impl From<Float> for f32 { @@ -150,7 +149,7 @@ impl From<u16> for Float { impl From<Boolean> for Float { #[inline] fn from(value: Boolean) -> Self { - if bool::from(value) { 1. } else { 0. }.into() + f32::from(bool::from(value)).into() } } @@ -176,7 +175,7 @@ impl FromStr for Float { type Err = ParseFloatError; #[inline] - fn from_str(input: &str) -> Result<Self, ParseFloatError> { + fn from_str(input: &str) -> Result<Self, Self::Err> { Ok(f32::from_str(input)?.into()) } } @@ -248,6 +247,8 @@ impl Div for Float { #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] @@ -281,9 +282,9 @@ mod tests { #[test] fn is_identical_with() { - assert!(Float::from(0.).is_identical_with(&Float::from(0.))); - assert!(Float::NAN.is_identical_with(&Float::NAN)); - assert!(!Float::from(-0.).is_identical_with(&Float::from(0.))); + assert!(Float::from(0.).is_identical_with(Float::from(0.))); + assert!(Float::NAN.is_identical_with(Float::NAN)); + assert!(!Float::from(-0.).is_identical_with(Float::from(0.))); } #[test] diff --git a/lib/oxsdatatypes/src/integer.rs b/lib/oxsdatatypes/src/integer.rs index d3b5fbc9..d0a693ea 100644 --- a/lib/oxsdatatypes/src/integer.rs +++ b/lib/oxsdatatypes/src/integer.rs @@ -1,7 +1,6 @@ -use crate::{Boolean, Decimal, DecimalOverflowError, Double, Float}; +use crate::{Boolean, Decimal, Double, Float}; use std::fmt; use std::num::ParseIntError; -use std::ops::Neg; use std::str::FromStr; /// [XML Schema `integer` datatype](https://www.w3.org/TR/xmlschema11-2/#integer) @@ -14,7 +13,11 @@ pub struct Integer { } impl Integer { + pub const MAX: Self = Self { value: i64::MAX }; + pub const MIN: Self = Self { value: i64::MIN }; + #[inline] + #[must_use] pub fn from_be_bytes(bytes: [u8; 8]) -> Self { Self { value: i64::from_be_bytes(bytes), @@ -22,92 +25,117 @@ impl Integer { } #[inline] + #[must_use] pub fn to_be_bytes(self) -> [u8; 8] { self.value.to_be_bytes() } /// [op:numeric-add](https://www.w3.org/TR/xpath-functions-31/#func-numeric-add) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_add(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_add(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_add(rhs.into().value)?, }) } /// [op:numeric-subtract](https://www.w3.org/TR/xpath-functions-31/#func-numeric-subtract) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_sub(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_sub(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_sub(rhs.into().value)?, }) } /// [op:numeric-multiply](https://www.w3.org/TR/xpath-functions-31/#func-numeric-multiply) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_mul(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_mul(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_mul(rhs.into().value)?, }) } - /// [op:numeric-divide](https://www.w3.org/TR/xpath-functions-31/#func-numeric-divide) + /// [op:numeric-integer-divide](https://www.w3.org/TR/xpath-functions-31/#func-numeric-integer-divide) + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_div(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_div(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_div(rhs.into().value)?, }) } /// [op:numeric-mod](https://www.w3.org/TR/xpath-functions-31/#func-numeric-mod) + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_rem(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_rem(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_rem(rhs.into().value)?, }) } + /// Euclidean remainder + /// + /// Returns `None` in case of division by 0 ([FOAR0001](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0001)) or overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_rem_euclid(&self, rhs: impl Into<Self>) -> Option<Self> { + #[must_use] + pub fn checked_rem_euclid(self, rhs: impl Into<Self>) -> Option<Self> { Some(Self { value: self.value.checked_rem_euclid(rhs.into().value)?, }) } /// [op:numeric-unary-minus](https://www.w3.org/TR/xpath-functions-31/#func-numeric-unary-minus) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub fn checked_neg(&self) -> Option<Self> { + #[must_use] + pub fn checked_neg(self) -> Option<Self> { Some(Self { value: self.value.checked_neg()?, }) } /// [fn:abs](https://www.w3.org/TR/xpath-functions-31/#func-abs) + /// + /// Returns `None` in case of overflow ([FOAR0002](https://www.w3.org/TR/xpath-functions-31/#ERRFOAR0002)). #[inline] - pub const fn abs(&self) -> Self { - Self { - value: self.value.abs(), - } + #[must_use] + pub fn checked_abs(self) -> Option<Self> { + Some(Self { + value: self.value.checked_abs()?, + }) } #[inline] - pub const fn is_negative(&self) -> bool { + #[must_use] + pub const fn is_negative(self) -> bool { self.value < 0 } #[inline] - pub const fn is_positive(&self) -> bool { + #[must_use] + pub const fn is_positive(self) -> bool { self.value > 0 } /// Checks if the two values are [identical](https://www.w3.org/TR/xmlschema11-2/#identity). #[inline] - pub fn is_identical_with(&self, other: &Self) -> bool { + #[must_use] + pub fn is_identical_with(self, other: Self) -> bool { self == other } - - pub const MIN: Self = Self { value: i64::MIN }; - - pub const MAX: Self = Self { value: i64::MAX }; } impl From<bool> for Integer { @@ -198,7 +226,7 @@ impl FromStr for Integer { type Err = ParseIntError; #[inline] - fn from_str(input: &str) -> Result<Self, ParseIntError> { + fn from_str(input: &str) -> Result<Self, Self::Err> { Ok(i64::from_str(input)?.into()) } } @@ -210,35 +238,39 @@ impl fmt::Display for Integer { } } -impl Neg for Integer { - type Output = Self; - - #[inline] - fn neg(self) -> Self { - (-self.value).into() - } -} - impl TryFrom<Float> for Integer { - type Error = DecimalOverflowError; + type Error = TooLargeForIntegerError; #[inline] - fn try_from(value: Float) -> Result<Self, DecimalOverflowError> { - Decimal::try_from(value)?.try_into() + fn try_from(value: Float) -> Result<Self, Self::Error> { + Decimal::try_from(value) + .map_err(|_| TooLargeForIntegerError)? + .try_into() } } impl TryFrom<Double> for Integer { - type Error = DecimalOverflowError; + type Error = TooLargeForIntegerError; #[inline] - fn try_from(value: Double) -> Result<Self, DecimalOverflowError> { - Decimal::try_from(value)?.try_into() + fn try_from(value: Double) -> Result<Self, Self::Error> { + Decimal::try_from(value) + .map_err(|_| TooLargeForIntegerError)? + .try_into() } } +/// The input is too large to fit into an [`Integer`]. +/// +/// Matches XPath [`FOCA0003` error](https://www.w3.org/TR/xpath-functions-31/#ERRFOCA0003). +#[derive(Debug, Clone, Copy, thiserror::Error)] +#[error("Value too large for xsd:integer internal representation")] +pub struct TooLargeForIntegerError; + #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; #[test] @@ -247,7 +279,7 @@ mod tests { assert_eq!(Integer::from_str("-0")?.to_string(), "0"); assert_eq!(Integer::from_str("123")?.to_string(), "123"); assert_eq!(Integer::from_str("-123")?.to_string(), "-123"); - assert!(Integer::from_str("123456789123456789123456789123456789123456789").is_err()); + Integer::from_str("123456789123456789123456789123456789123456789").unwrap_err(); Ok(()) } @@ -265,17 +297,18 @@ mod tests { Integer::try_from(Float::from(-123.1)).ok(), Some(Integer::from_str("-123")?) ); - assert!(Integer::try_from(Float::from(f32::NAN)).is_err()); - assert!(Integer::try_from(Float::from(f32::INFINITY)).is_err()); - assert!(Integer::try_from(Float::from(f32::NEG_INFINITY)).is_err()); - assert!(Integer::try_from(Float::from(f32::MIN)).is_err()); - assert!(Integer::try_from(Float::from(f32::MAX)).is_err()); + Integer::try_from(Float::from(f32::NAN)).unwrap_err(); + Integer::try_from(Float::from(f32::INFINITY)).unwrap_err(); + Integer::try_from(Float::from(f32::NEG_INFINITY)).unwrap_err(); + Integer::try_from(Float::from(f32::MIN)).unwrap_err(); + Integer::try_from(Float::from(f32::MAX)).unwrap_err(); assert!( Integer::try_from(Float::from(1_672_507_300_000.)) .unwrap() .checked_sub(Integer::from_str("1672507300000")?) .unwrap() - .abs() + .checked_abs() + .unwrap() < Integer::from(1_000_000) ); Ok(()) @@ -300,14 +333,15 @@ mod tests { .unwrap() .checked_sub(Integer::from_str("1672507300000").unwrap()) .unwrap() - .abs() + .checked_abs() + .unwrap() < Integer::from(10) ); - assert!(Integer::try_from(Double::from(f64::NAN)).is_err()); - assert!(Integer::try_from(Double::from(f64::INFINITY)).is_err()); - assert!(Integer::try_from(Double::from(f64::NEG_INFINITY)).is_err()); - assert!(Integer::try_from(Double::from(f64::MIN)).is_err()); - assert!(Integer::try_from(Double::from(f64::MAX)).is_err()); + Integer::try_from(Double::from(f64::NAN)).unwrap_err(); + Integer::try_from(Double::from(f64::INFINITY)).unwrap_err(); + Integer::try_from(Double::from(f64::NEG_INFINITY)).unwrap_err(); + Integer::try_from(Double::from(f64::MIN)).unwrap_err(); + Integer::try_from(Double::from(f64::MAX)).unwrap_err(); Ok(()) } @@ -321,8 +355,8 @@ mod tests { Integer::try_from(Decimal::from_str("-123.1").unwrap()).ok(), Some(Integer::from_str("-123")?) ); - assert!(Integer::try_from(Decimal::MIN).is_err()); - assert!(Integer::try_from(Decimal::MAX).is_err()); + Integer::try_from(Decimal::MIN).unwrap_err(); + Integer::try_from(Decimal::MAX).unwrap_err(); Ok(()) } diff --git a/lib/oxsdatatypes/src/lib.rs b/lib/oxsdatatypes/src/lib.rs index 67737b13..336bdd20 100644 --- a/lib/oxsdatatypes/src/lib.rs +++ b/lib/oxsdatatypes/src/lib.rs @@ -3,7 +3,6 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] #![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] -#![allow(clippy::return_self_not_must_use)] mod boolean; mod date_time; @@ -12,15 +11,17 @@ mod double; mod duration; mod float; mod integer; -mod parser; pub use self::boolean::Boolean; pub use self::date_time::{ - Date, DateTime, DateTimeError, GDay, GMonth, GMonthDay, GYear, GYearMonth, Time, TimezoneOffset, + Date, DateTime, DateTimeOverflowError, GDay, GMonth, GMonthDay, GYear, GYearMonth, + InvalidTimezoneError, ParseDateTimeError, Time, TimezoneOffset, }; -pub use self::decimal::{Decimal, DecimalOverflowError, ParseDecimalError}; +pub use self::decimal::{Decimal, ParseDecimalError, TooLargeForDecimalError}; pub use self::double::Double; -pub use self::duration::{DayTimeDuration, Duration, YearMonthDuration}; +pub use self::duration::{ + DayTimeDuration, Duration, DurationOverflowError, OppositeSignInDurationComponentsError, + ParseDurationError, YearMonthDuration, +}; pub use self::float::Float; -pub use self::integer::Integer; -pub use self::parser::XsdParseError; +pub use self::integer::{Integer, TooLargeForIntegerError}; diff --git a/lib/oxsdatatypes/src/parser.rs b/lib/oxsdatatypes/src/parser.rs deleted file mode 100644 index 942c71e4..00000000 --- a/lib/oxsdatatypes/src/parser.rs +++ /dev/null @@ -1,626 +0,0 @@ -use super::date_time::{DateTimeError, GDay, GMonth, GMonthDay, GYear, GYearMonth, TimezoneOffset}; -use super::decimal::ParseDecimalError; -use super::duration::{DayTimeDuration, YearMonthDuration}; -use super::*; -use std::error::Error; -use std::fmt; -use std::num::ParseIntError; -use std::str::FromStr; - -/// A parsing error -#[derive(Debug, Clone)] -pub struct XsdParseError { - kind: XsdParseErrorKind, -} - -#[derive(Debug, Clone)] -enum XsdParseErrorKind { - ParseInt(ParseIntError), - ParseDecimal(ParseDecimalError), - DateTime(DateTimeError), - Message(&'static str), -} - -const OVERFLOW_ERROR: XsdParseError = XsdParseError { - kind: XsdParseErrorKind::Message("Overflow error"), -}; - -impl fmt::Display for XsdParseError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.kind { - XsdParseErrorKind::ParseInt(error) => { - write!(f, "Error while parsing integer: {error}") - } - XsdParseErrorKind::ParseDecimal(error) => { - write!(f, "Error while parsing decimal: {error}") - } - XsdParseErrorKind::DateTime(error) => error.fmt(f), - XsdParseErrorKind::Message(msg) => write!(f, "{msg}"), - } - } -} - -impl XsdParseError { - const fn msg(message: &'static str) -> Self { - Self { - kind: XsdParseErrorKind::Message(message), - } - } -} - -impl Error for XsdParseError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - match &self.kind { - XsdParseErrorKind::ParseInt(error) => Some(error), - XsdParseErrorKind::ParseDecimal(error) => Some(error), - XsdParseErrorKind::DateTime(error) => Some(error), - XsdParseErrorKind::Message(_) => None, - } - } -} - -impl From<ParseIntError> for XsdParseError { - fn from(error: ParseIntError) -> Self { - Self { - kind: XsdParseErrorKind::ParseInt(error), - } - } -} - -impl From<ParseDecimalError> for XsdParseError { - fn from(error: ParseDecimalError) -> Self { - Self { - kind: XsdParseErrorKind::ParseDecimal(error), - } - } -} - -impl From<DateTimeError> for XsdParseError { - fn from(error: DateTimeError) -> Self { - Self { - kind: XsdParseErrorKind::DateTime(error), - } - } -} - -// [6] duYearFrag ::= unsignedNoDecimalPtNumeral 'Y' -// [7] duMonthFrag ::= unsignedNoDecimalPtNumeral 'M' -// [8] duDayFrag ::= unsignedNoDecimalPtNumeral 'D' -// [9] duHourFrag ::= unsignedNoDecimalPtNumeral 'H' -// [10] duMinuteFrag ::= unsignedNoDecimalPtNumeral 'M' -// [11] duSecondFrag ::= (unsignedNoDecimalPtNumeral | unsignedDecimalPtNumeral) 'S' -// [12] duYearMonthFrag ::= (duYearFrag duMonthFrag?) | duMonthFrag -// [13] duTimeFrag ::= 'T' ((duHourFrag duMinuteFrag? duSecondFrag?) | (duMinuteFrag duSecondFrag?) | duSecondFrag) -// [14] duDayTimeFrag ::= (duDayFrag duTimeFrag?) | duTimeFrag -// [15] durationLexicalRep ::= '-'? 'P' ((duYearMonthFrag duDayTimeFrag?) | duDayTimeFrag) -struct DurationParts { - year_month: Option<i64>, - day_time: Option<Decimal>, -} - -fn duration_parts(input: &str) -> Result<(DurationParts, &str), XsdParseError> { - // States - const START: u32 = 0; - const AFTER_YEAR: u32 = 1; - const AFTER_MONTH: u32 = 2; - const AFTER_DAY: u32 = 3; - const AFTER_T: u32 = 4; - const AFTER_HOUR: u32 = 5; - const AFTER_MINUTE: u32 = 6; - const AFTER_SECOND: u32 = 7; - - let (is_negative, input) = if let Some(left) = input.strip_prefix('-') { - (true, left) - } else { - (false, input) - }; - let mut input = expect_char(input, 'P', "Durations must start with 'P'")?; - let mut state = START; - let mut year_month: Option<i64> = None; - let mut day_time: Option<Decimal> = None; - while !input.is_empty() { - if let Some(left) = input.strip_prefix('T') { - if state >= AFTER_T { - return Err(XsdParseError::msg("Duplicated time separator 'T'")); - } - state = AFTER_T; - input = left; - } else { - let (number_str, left) = decimal_prefix(input); - match left.chars().next() { - Some('Y') if state < AFTER_YEAR => { - year_month = Some( - year_month - .unwrap_or_default() - .checked_add( - apply_i64_neg(i64::from_str(number_str)?, is_negative)? - .checked_mul(12) - .ok_or(OVERFLOW_ERROR)?, - ) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_YEAR; - } - Some('M') if state < AFTER_MONTH => { - year_month = Some( - year_month - .unwrap_or_default() - .checked_add(apply_i64_neg(i64::from_str(number_str)?, is_negative)?) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_MONTH; - } - Some('D') if state < AFTER_DAY => { - if number_str.contains('.') { - return Err(XsdParseError::msg( - "Decimal numbers are not allowed for days", - )); - } - day_time = Some( - day_time - .unwrap_or_default() - .checked_add( - apply_decimal_neg(Decimal::from_str(number_str)?, is_negative)? - .checked_mul(86400) - .ok_or(OVERFLOW_ERROR)?, - ) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_DAY; - } - Some('H') if state == AFTER_T => { - if number_str.contains('.') { - return Err(XsdParseError::msg( - "Decimal numbers are not allowed for hours", - )); - } - day_time = Some( - day_time - .unwrap_or_default() - .checked_add( - apply_decimal_neg(Decimal::from_str(number_str)?, is_negative)? - .checked_mul(3600) - .ok_or(OVERFLOW_ERROR)?, - ) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_HOUR; - } - Some('M') if (AFTER_T..AFTER_MINUTE).contains(&state) => { - if number_str.contains('.') { - return Err(XsdParseError::msg( - "Decimal numbers are not allowed for minutes", - )); - } - day_time = Some( - day_time - .unwrap_or_default() - .checked_add( - apply_decimal_neg(Decimal::from_str(number_str)?, is_negative)? - .checked_mul(60) - .ok_or(OVERFLOW_ERROR)?, - ) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_MINUTE; - } - Some('S') if (AFTER_T..AFTER_SECOND).contains(&state) => { - day_time = Some( - day_time - .unwrap_or_default() - .checked_add(apply_decimal_neg( - Decimal::from_str(number_str)?, - is_negative, - )?) - .ok_or(OVERFLOW_ERROR)?, - ); - state = AFTER_SECOND; - } - Some(_) => return Err(XsdParseError::msg("Unexpected type character")), - None => { - return Err(XsdParseError::msg( - "Numbers in durations must be followed by a type character", - )) - } - } - input = &left[1..]; - } - } - - Ok(( - DurationParts { - year_month, - day_time, - }, - input, - )) -} - -fn apply_i64_neg(value: i64, is_negative: bool) -> Result<i64, XsdParseError> { - if is_negative { - value.checked_neg().ok_or(OVERFLOW_ERROR) - } else { - Ok(value) - } -} - -fn apply_decimal_neg(value: Decimal, is_negative: bool) -> Result<Decimal, XsdParseError> { - if is_negative { - value.checked_neg().ok_or(OVERFLOW_ERROR) - } else { - Ok(value) - } -} - -pub fn parse_duration(input: &str) -> Result<Duration, XsdParseError> { - let parts = ensure_complete(input, duration_parts)?; - if parts.year_month.is_none() && parts.day_time.is_none() { - return Err(XsdParseError::msg("Empty duration")); - } - Ok(Duration::new( - parts.year_month.unwrap_or(0), - parts.day_time.unwrap_or_default(), - )) -} - -pub fn parse_year_month_duration(input: &str) -> Result<YearMonthDuration, XsdParseError> { - let parts = ensure_complete(input, duration_parts)?; - if parts.day_time.is_some() { - return Err(XsdParseError::msg( - "There must not be any day or time component in a yearMonthDuration", - )); - } - Ok(YearMonthDuration::new(parts.year_month.ok_or( - XsdParseError::msg("No year and month values found"), - )?)) -} - -pub fn parse_day_time_duration(input: &str) -> Result<DayTimeDuration, XsdParseError> { - let parts = ensure_complete(input, duration_parts)?; - if parts.year_month.is_some() { - return Err(XsdParseError::msg( - "There must not be any year or month component in a dayTimeDuration", - )); - } - Ok(DayTimeDuration::new(parts.day_time.ok_or( - XsdParseError::msg("No day or time values found"), - )?)) -} - -// [16] dateTimeLexicalRep ::= yearFrag '-' monthFrag '-' dayFrag 'T' ((hourFrag ':' minuteFrag ':' secondFrag) | endOfDayFrag) timezoneFrag? -fn date_time_lexical_rep(input: &str) -> Result<(DateTime, &str), XsdParseError> { - let (year, input) = year_frag(input)?; - let input = expect_char(input, '-', "The year and month must be separated by '-'")?; - let (month, input) = month_frag(input)?; - let input = expect_char(input, '-', "The month and day must be separated by '-'")?; - let (day, input) = day_frag(input)?; - let input = expect_char(input, 'T', "The date and time must be separated by 'T'")?; - let (hour, input) = hour_frag(input)?; - let input = expect_char(input, ':', "The hours and minutes must be separated by ':'")?; - let (minute, input) = minute_frag(input)?; - let input = expect_char( - input, - ':', - "The minutes and seconds must be separated by ':'", - )?; - let (second, input) = second_frag(input)?; - // We validate 24:00:00 - if hour == 24 && minute != 0 && second != Decimal::from(0) { - return Err(XsdParseError::msg( - "Times are not allowed to be after 24:00:00", - )); - } - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok(( - DateTime::new(year, month, day, hour, minute, second, timezone_offset)?, - input, - )) -} - -pub fn parse_date_time(input: &str) -> Result<DateTime, XsdParseError> { - ensure_complete(input, date_time_lexical_rep) -} - -// [17] timeLexicalRep ::= ((hourFrag ':' minuteFrag ':' secondFrag) | endOfDayFrag) timezoneFrag? -fn time_lexical_rep(input: &str) -> Result<(Time, &str), XsdParseError> { - let (hour, input) = hour_frag(input)?; - let input = expect_char(input, ':', "The hours and minutes must be separated by ':'")?; - let (minute, input) = minute_frag(input)?; - let input = expect_char( - input, - ':', - "The minutes and seconds must be separated by ':'", - )?; - let (second, input) = second_frag(input)?; - // We validate 24:00:00 - if hour == 24 && minute != 0 && second != Decimal::from(0) { - return Err(XsdParseError::msg( - "Times are not allowed to be after 24:00:00", - )); - } - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((Time::new(hour, minute, second, timezone_offset)?, input)) -} - -pub fn parse_time(input: &str) -> Result<Time, XsdParseError> { - ensure_complete(input, time_lexical_rep) -} - -// [18] dateLexicalRep ::= yearFrag '-' monthFrag '-' dayFrag timezoneFrag? Constraint: Day-of-month Representations -fn date_lexical_rep(input: &str) -> Result<(Date, &str), XsdParseError> { - let (year, input) = year_frag(input)?; - let input = expect_char(input, '-', "The year and month must be separated by '-'")?; - let (month, input) = month_frag(input)?; - let input = expect_char(input, '-', "The month and day must be separated by '-'")?; - let (day, input) = day_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((Date::new(year, month, day, timezone_offset)?, input)) -} - -pub fn parse_date(input: &str) -> Result<Date, XsdParseError> { - ensure_complete(input, date_lexical_rep) -} - -// [19] gYearMonthLexicalRep ::= yearFrag '-' monthFrag timezoneFrag? -fn g_year_month_lexical_rep(input: &str) -> Result<(GYearMonth, &str), XsdParseError> { - let (year, input) = year_frag(input)?; - let input = expect_char(input, '-', "The year and month must be separated by '-'")?; - let (month, input) = month_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((GYearMonth::new(year, month, timezone_offset)?, input)) -} - -pub fn parse_g_year_month(input: &str) -> Result<GYearMonth, XsdParseError> { - ensure_complete(input, g_year_month_lexical_rep) -} - -// [20] gYearLexicalRep ::= yearFrag timezoneFrag? -fn g_year_lexical_rep(input: &str) -> Result<(GYear, &str), XsdParseError> { - let (year, input) = year_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((GYear::new(year, timezone_offset)?, input)) -} - -pub fn parse_g_year(input: &str) -> Result<GYear, XsdParseError> { - ensure_complete(input, g_year_lexical_rep) -} - -// [21] gMonthDayLexicalRep ::= '--' monthFrag '-' dayFrag timezoneFrag? Constraint: Day-of-month Representations -fn g_month_day_lexical_rep(input: &str) -> Result<(GMonthDay, &str), XsdParseError> { - let input = expect_char(input, '-', "gMonthDay values must start with '--'")?; - let input = expect_char(input, '-', "gMonthDay values must start with '--'")?; - let (month, input) = month_frag(input)?; - let input = expect_char(input, '-', "The month and day must be separated by '-'")?; - let (day, input) = day_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((GMonthDay::new(month, day, timezone_offset)?, input)) -} - -pub fn parse_g_month_day(input: &str) -> Result<GMonthDay, XsdParseError> { - ensure_complete(input, g_month_day_lexical_rep) -} - -// [22] gDayLexicalRep ::= '---' dayFrag timezoneFrag? -fn g_day_lexical_rep(input: &str) -> Result<(GDay, &str), XsdParseError> { - let input = expect_char(input, '-', "gDay values must start with '---'")?; - let input = expect_char(input, '-', "gDay values must start with '---'")?; - let input = expect_char(input, '-', "gDay values must start with '---'")?; - let (day, input) = day_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((GDay::new(day, timezone_offset)?, input)) -} - -pub fn parse_g_day(input: &str) -> Result<GDay, XsdParseError> { - ensure_complete(input, g_day_lexical_rep) -} - -// [23] gMonthLexicalRep ::= '--' monthFrag timezoneFrag? -fn g_month_lexical_rep(input: &str) -> Result<(GMonth, &str), XsdParseError> { - let input = expect_char(input, '-', "gMonth values must start with '--'")?; - let input = expect_char(input, '-', "gMonth values must start with '--'")?; - let (month, input) = month_frag(input)?; - let (timezone_offset, input) = optional_end(input, timezone_frag)?; - Ok((GMonth::new(month, timezone_offset)?, input)) -} - -pub fn parse_g_month(input: &str) -> Result<GMonth, XsdParseError> { - ensure_complete(input, g_month_lexical_rep) -} - -// [56] yearFrag ::= '-'? (([1-9] digit digit digit+)) | ('0' digit digit digit)) -fn year_frag(input: &str) -> Result<(i64, &str), XsdParseError> { - let (sign, input) = if let Some(left) = input.strip_prefix('-') { - (-1, left) - } else { - (1, input) - }; - let (number_str, input) = integer_prefix(input); - if number_str.len() < 4 { - return Err(XsdParseError::msg("The year should be encoded on 4 digits")); - } - if number_str.len() > 4 && number_str.starts_with('0') { - return Err(XsdParseError::msg( - "The years value must not start with 0 if it can be encoded in at least 4 digits", - )); - } - let number = i64::from_str(number_str)?; - Ok((sign * number, input)) -} - -// [57] monthFrag ::= ('0' [1-9]) | ('1' [0-2]) -fn month_frag(input: &str) -> Result<(u8, &str), XsdParseError> { - let (number_str, input) = integer_prefix(input); - if number_str.len() != 2 { - return Err(XsdParseError::msg("Month must be encoded with two digits")); - } - let number = u8::from_str(number_str)?; - if !(1..=12).contains(&number) { - return Err(XsdParseError::msg("Month must be between 01 and 12")); - } - Ok((number, input)) -} - -// [58] dayFrag ::= ('0' [1-9]) | ([12] digit) | ('3' [01]) -fn day_frag(input: &str) -> Result<(u8, &str), XsdParseError> { - let (number_str, input) = integer_prefix(input); - if number_str.len() != 2 { - return Err(XsdParseError::msg("Day must be encoded with two digits")); - } - let number = u8::from_str(number_str)?; - if !(1..=31).contains(&number) { - return Err(XsdParseError::msg("Day must be between 01 and 31")); - } - Ok((number, input)) -} - -// [59] hourFrag ::= ([01] digit) | ('2' [0-3]) -// We also allow 24 for ease of parsing -fn hour_frag(input: &str) -> Result<(u8, &str), XsdParseError> { - let (number_str, input) = integer_prefix(input); - if number_str.len() != 2 { - return Err(XsdParseError::msg("Hours must be encoded with two digits")); - } - let number = u8::from_str(number_str)?; - if !(0..=24).contains(&number) { - return Err(XsdParseError::msg("Hours must be between 00 and 24")); - } - Ok((number, input)) -} - -// [60] minuteFrag ::= [0-5] digit -fn minute_frag(input: &str) -> Result<(u8, &str), XsdParseError> { - let (number_str, input) = integer_prefix(input); - if number_str.len() != 2 { - return Err(XsdParseError::msg( - "Minutes must be encoded with two digits", - )); - } - let number = u8::from_str(number_str)?; - if !(0..=59).contains(&number) { - return Err(XsdParseError::msg("Minutes must be between 00 and 59")); - } - Ok((number, input)) -} - -// [61] secondFrag ::= ([0-5] digit) ('.' digit+)? -fn second_frag(input: &str) -> Result<(Decimal, &str), XsdParseError> { - let (number_str, input) = decimal_prefix(input); - let (before_dot_str, _) = number_str.split_once('.').unwrap_or((number_str, "")); - if before_dot_str.len() != 2 { - return Err(XsdParseError::msg( - "Seconds must be encoded with two digits", - )); - } - let number = Decimal::from_str(number_str)?; - if number < Decimal::from(0) || number >= Decimal::from(60) { - return Err(XsdParseError::msg("Seconds must be between 00 and 60")); - } - if number_str.ends_with('.') { - return Err(XsdParseError::msg( - "Seconds are not allowed to end with a dot", - )); - } - Ok((number, input)) -} - -// [63] timezoneFrag ::= 'Z' | ('+' | '-') (('0' digit | '1' [0-3]) ':' minuteFrag | '14:00') -fn timezone_frag(input: &str) -> Result<(TimezoneOffset, &str), XsdParseError> { - if let Some(left) = input.strip_prefix('Z') { - return Ok((TimezoneOffset::UTC, left)); - } - let (sign, input) = if let Some(left) = input.strip_prefix('-') { - (-1, left) - } else if let Some(left) = input.strip_prefix('+') { - (1, left) - } else { - (1, input) - }; - - let (hour_str, input) = integer_prefix(input); - if hour_str.len() != 2 { - return Err(XsdParseError::msg( - "The timezone hours must be encoded with two digits", - )); - } - let hours = i16::from_str(hour_str)?; - - let input = expect_char( - input, - ':', - "The timezone hours and minutes must be separated by ':'", - )?; - let (minutes, input) = minute_frag(input)?; - - if hours > 13 && !(hours == 14 && minutes == 0) { - return Err(XsdParseError::msg( - "The timezone hours must be between 00 and 13", - )); - } - - Ok(( - TimezoneOffset::new(sign * (hours * 60 + i16::from(minutes)))?, - input, - )) -} - -fn ensure_complete<T>( - input: &str, - parse: impl FnOnce(&str) -> Result<(T, &str), XsdParseError>, -) -> Result<T, XsdParseError> { - let (result, left) = parse(input)?; - if !left.is_empty() { - return Err(XsdParseError::msg("Unrecognized value suffix")); - } - Ok(result) -} - -fn expect_char<'a>( - input: &'a str, - constant: char, - error_message: &'static str, -) -> Result<&'a str, XsdParseError> { - if let Some(left) = input.strip_prefix(constant) { - Ok(left) - } else { - Err(XsdParseError::msg(error_message)) - } -} - -fn integer_prefix(input: &str) -> (&str, &str) { - let mut end = input.len(); - for (i, c) in input.char_indices() { - if !c.is_ascii_digit() { - end = i; - break; - } - } - input.split_at(end) -} - -fn decimal_prefix(input: &str) -> (&str, &str) { - let mut end = input.len(); - let mut dot_seen = false; - for (i, c) in input.char_indices() { - if c.is_ascii_digit() { - // Ok - } else if c == '.' && !dot_seen { - dot_seen = true; - } else { - end = i; - break; - } - } - input.split_at(end) -} - -fn optional_end<T>( - input: &str, - parse: impl FnOnce(&str) -> Result<(T, &str), XsdParseError>, -) -> Result<(Option<T>, &str), XsdParseError> { - Ok(if input.is_empty() { - (None, input) - } else { - let (result, input) = parse(input)?; - (Some(result), input) - }) -} diff --git a/lib/oxttl/Cargo.toml b/lib/oxttl/Cargo.toml new file mode 100644 index 00000000..c86150ed --- /dev/null +++ b/lib/oxttl/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "oxttl" +version = "0.1.0-alpha.3-dev" +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["N-Triples", "N-Quads", "Turtle", "TriG", "N3"] +repository = "https://github.com/oxigraph/oxigraph/tree/master/lib/oxttl" +description = """ +Parser and serializer for languages related to RDF Turtle (N-Triples, N-Quads, Turtle, TriG and N3) +""" +documentation = "https://docs.rs/oxttl" +edition.workspace = true +rust-version.workspace = true + +[features] +default = [] +rdf-star = ["oxrdf/rdf-star"] +async-tokio = ["dep:tokio"] + +[dependencies] +memchr.workspace = true +oxrdf.workspace = true +oxiri.workspace = true +oxilangtag.workspace = true +thiserror.workspace = true +tokio = { workspace = true, optional = true, features = ["io-util"] } + +[dev-dependencies] +tokio = { workspace = true, features = ["rt", "macros"] } + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/oxttl/README.md b/lib/oxttl/README.md new file mode 100644 index 00000000..47ec03ef --- /dev/null +++ b/lib/oxttl/README.md @@ -0,0 +1,54 @@ +OxTTL +===== + +[](https://crates.io/crates/oxttl) +[](https://docs.rs/oxttl) +[](https://crates.io/crates/oxttl) +[](https://github.com/oxigraph/oxigraph/actions) +[](https://gitter.im/oxigraph/community) + +Oxttl is a set of parsers and serializers for [Turtle](https://www.w3.org/TR/turtle/), [TriG](https://www.w3.org/TR/trig/), [N-Triples](https://www.w3.org/TR/n-triples/), [N-Quads](https://www.w3.org/TR/n-quads/) and [N3](https://w3c.github.io/N3/spec/). + +Support for [SPARQL-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html) is also available behind the `rdf-star`feature for all languages but N3 ([Turtle-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#turtle-star), [TriG-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#trig-star), [N-Triples-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-triples-star) and [N-Quads-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-quads-star)) + +It is designed as a low level parser compatible with both synchronous and asynchronous I/O. + +Usage example counting the number of people in a Turtle file: +```rust +use oxrdf::{NamedNodeRef, vocab::rdf}; +use oxttl::TurtleParser; + +let file = b"@base <http://example.com/> . +@prefix schema: <http://schema.org/> . +<foo> a schema:Person ; + schema:name \"Foo\" . +<bar> a schema:Person ; + schema:name \"Bar\" ."; + +let schema_person = NamedNodeRef::new("http://schema.org/Person").unwrap(); +let mut count = 0; +for triple in TurtleParser::new().parse_read(file.as_ref()) { + let triple = triple.unwrap(); + if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + count += 1; + } +} +assert_eq!(2, count); +``` + + +## License + +This project is licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or + `<http://www.apache.org/licenses/LICENSE-2.0>`) +* MIT license ([LICENSE-MIT](../LICENSE-MIT) or + `<http://opensource.org/licenses/MIT>`) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/lib/oxttl/src/lexer.rs b/lib/oxttl/src/lexer.rs new file mode 100644 index 00000000..f60c230e --- /dev/null +++ b/lib/oxttl/src/lexer.rs @@ -0,0 +1,976 @@ +use crate::toolkit::{TokenRecognizer, TokenRecognizerError}; +use memchr::{memchr, memchr2}; +use oxilangtag::LanguageTag; +use oxiri::Iri; +use oxrdf::NamedNode; +use std::borrow::Cow; +use std::cmp::min; +use std::collections::HashMap; +use std::ops::Range; +use std::str; + +#[derive(Debug, PartialEq, Eq)] +pub enum N3Token<'a> { + IriRef(String), + PrefixedName { + prefix: &'a str, + local: Cow<'a, str>, + might_be_invalid_iri: bool, + }, + Variable(Cow<'a, str>), + BlankNodeLabel(&'a str), + String(String), + Integer(&'a str), + Decimal(&'a str), + Double(&'a str), + LangTag(&'a str), + Punctuation(&'a str), + PlainKeyword(&'a str), +} + +#[derive(Eq, PartialEq)] +pub enum N3LexerMode { + NTriples, + Turtle, + N3, +} + +#[derive(Default)] +pub struct N3LexerOptions { + pub base_iri: Option<Iri<String>>, +} + +pub struct N3Lexer { + mode: N3LexerMode, + unchecked: bool, +} + +// TODO: there are a lot of 'None' (missing data) returned even if the stream is ending!!! +// TODO: simplify by not giving is_end and fail with an "unexpected eof" is none is returned when is_end=true? + +impl TokenRecognizer for N3Lexer { + type Token<'a> = N3Token<'a>; + type Options = N3LexerOptions; + + fn recognize_next_token<'a>( + &mut self, + data: &'a [u8], + is_ending: bool, + options: &N3LexerOptions, + ) -> Option<(usize, Result<N3Token<'a>, TokenRecognizerError>)> { + match *data.first()? { + b'<' => match *data.get(1)? { + b'<' => Some((2, Ok(N3Token::Punctuation("<<")))), + b'=' if self.mode == N3LexerMode::N3 => { + if let Some((consumed, result)) = self.recognize_iri(data, options) { + Some(if let Ok(result) = result { + (consumed, Ok(result)) + } else { + (2, Ok(N3Token::Punctuation("<="))) + }) + } else if is_ending { + Some((2, Ok(N3Token::Punctuation("<=")))) + } else { + None + } + } + b'-' if self.mode == N3LexerMode::N3 => { + if let Some((consumed, result)) = self.recognize_iri(data, options) { + Some(if let Ok(result) = result { + (consumed, Ok(result)) + } else { + (2, Ok(N3Token::Punctuation("<-"))) + }) + } else if is_ending { + Some((2, Ok(N3Token::Punctuation("<-")))) + } else { + None + } + } + _ => self.recognize_iri(data, options), + }, + b'>' => { + if *data.get(1)? == b'>' { + Some((2, Ok(N3Token::Punctuation(">>")))) + } else { + Some((1, Ok(N3Token::Punctuation(">")))) + } + } + b'_' => match data.get(1)? { + b':' => Self::recognize_blank_node_label(data), + c => Some(( + 1, + Err((0, format!("Unexpected character '{}'", char::from(*c))).into()), + )), + }, + b'"' => { + if self.mode != N3LexerMode::NTriples + && *data.get(1)? == b'"' + && *data.get(2)? == b'"' + { + Self::recognize_long_string(data, b'"') + } else { + Self::recognize_string(data, b'"') + } + } + b'\'' if self.mode != N3LexerMode::NTriples => { + if *data.get(1)? == b'\'' && *data.get(2)? == b'\'' { + Self::recognize_long_string(data, b'\'') + } else { + Self::recognize_string(data, b'\'') + } + } + b'@' => self.recognize_lang_tag(data), + b'.' => match data.get(1) { + Some(b'0'..=b'9') => Self::recognize_number(data), + Some(_) => Some((1, Ok(N3Token::Punctuation(".")))), + None => is_ending.then_some((1, Ok(N3Token::Punctuation(".")))), + }, + b'^' => { + if *data.get(1)? == b'^' { + Some((2, Ok(N3Token::Punctuation("^^")))) + } else { + Some((1, Ok(N3Token::Punctuation("^")))) + } + } + b'(' => Some((1, Ok(N3Token::Punctuation("(")))), + b')' => Some((1, Ok(N3Token::Punctuation(")")))), + b'[' => Some((1, Ok(N3Token::Punctuation("[")))), + b']' => Some((1, Ok(N3Token::Punctuation("]")))), + b'{' => { + if *data.get(1)? == b'|' { + Some((2, Ok(N3Token::Punctuation("{|")))) + } else { + Some((1, Ok(N3Token::Punctuation("{")))) + } + } + b'}' => Some((1, Ok(N3Token::Punctuation("}")))), + b',' => Some((1, Ok(N3Token::Punctuation(",")))), + b';' => Some((1, Ok(N3Token::Punctuation(";")))), + b'!' => Some((1, Ok(N3Token::Punctuation("!")))), + b'|' => { + if *data.get(1)? == b'}' { + Some((2, Ok(N3Token::Punctuation("|}")))) + } else { + Some((1, Ok(N3Token::Punctuation("|")))) + } + } + b'=' => { + if *data.get(1)? == b'>' { + Some((2, Ok(N3Token::Punctuation("=>")))) + } else { + Some((1, Ok(N3Token::Punctuation("=")))) + } + } + b'0'..=b'9' | b'+' | b'-' => Self::recognize_number(data), + b'?' => self.recognize_variable(data, is_ending), + _ => self.recognize_pname_or_keyword(data, is_ending), + } + } +} + +impl N3Lexer { + pub fn new(mode: N3LexerMode, unchecked: bool) -> Self { + Self { mode, unchecked } + } + + fn recognize_iri( + &self, + data: &[u8], + options: &N3LexerOptions, + ) -> Option<(usize, Result<N3Token<'static>, TokenRecognizerError>)> { + // [18] IRIREF ::= '<' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '>' /* #x00=NULL #01-#x1F=control codes #x20=space */ + let mut string = Vec::new(); + let mut i = 1; + loop { + let end = memchr2(b'>', b'\\', &data[i..])?; + string.extend_from_slice(&data[i..i + end]); + i += end; + match data[i] { + b'>' => { + #[allow(clippy::range_plus_one)] + return Some((i + 1, self.parse_iri(string, 0..i + 1, options))); + } + b'\\' => { + let (additional, c) = Self::recognize_escape(&data[i..], i, false)?; + i += additional + 1; + match c { + Ok(c) => { + let mut buf = [0; 4]; + string.extend_from_slice(c.encode_utf8(&mut buf).as_bytes()); + } + Err(e) => return Some((i, Err(e))), + } + } + _ => unreachable!(), + } + } + } + + fn parse_iri( + &self, + iri: Vec<u8>, + position: Range<usize>, + options: &N3LexerOptions, + ) -> Result<N3Token<'static>, TokenRecognizerError> { + let iri = string_from_utf8(iri, position.clone())?; + Ok(N3Token::IriRef( + if let Some(base_iri) = options.base_iri.as_ref() { + if self.unchecked { + base_iri.resolve_unchecked(&iri) + } else { + base_iri.resolve(&iri) + } + .map_err(|e| (position, e.to_string()))? + .into_inner() + } else if self.unchecked { + iri + } else { + Iri::parse(iri) + .map_err(|e| (position, e.to_string()))? + .into_inner() + }, + )) + } + + fn recognize_pname_or_keyword<'a>( + &self, + data: &'a [u8], + is_ending: bool, + ) -> Option<(usize, Result<N3Token<'a>, TokenRecognizerError>)> { + // [139s] PNAME_NS ::= PN_PREFIX? ':' + // [140s] PNAME_LN ::= PNAME_NS PN_LOCAL + // [167s] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)? + let mut i = 0; + loop { + if let Some(r) = Self::recognize_unicode_char(&data[i..], i) { + match r { + Ok((c, consumed)) => { + if c == ':' { + i += consumed; + break; + } else if i == 0 { + if !Self::is_possible_pn_chars_base(c) { + return Some(( + consumed, + Err(( + 0..consumed, + format!( + "'{c}' is not allowed at the beginning of a prefix name" + ), + ) + .into()), + )); + } + i += consumed; + } else if Self::is_possible_pn_chars(c) || c == '.' { + i += consumed; + } else { + while data[..i].ends_with(b".") { + i -= 1; + } + return Some(( + i, + str_from_utf8(&data[..i], 0..i).map(N3Token::PlainKeyword), + )); + } + } + Err(e) => return Some((e.location.end, Err(e))), + } + } else if is_ending { + while data[..i].ends_with(b".") { + i -= 1; + } + return Some(if i == 0 { + ( + 1, + Err((0..1, format!("Unexpected byte {}", data[0])).into()), + ) + } else { + ( + i, + str_from_utf8(&data[..i], 0..i).map(N3Token::PlainKeyword), + ) + }); + } else { + return None; + } + } + let pn_prefix = match str_from_utf8(&data[..i - 1], 0..i - 1) { + Ok(pn_prefix) => pn_prefix, + Err(e) => return Some((i, Err(e))), + }; + if pn_prefix.ends_with('.') { + return Some(( + i, + Err(( + 0..i, + format!( + "'{pn_prefix}' is not a valid prefix: prefixes are not allowed to end with '.'"), + ) + .into()), + )); + } + + let (consumed, pn_local_result) = + self.recognize_optional_pn_local(&data[i..], is_ending)?; + Some(( + consumed + i, + pn_local_result.map(|(local, might_be_invalid_iri)| N3Token::PrefixedName { + prefix: pn_prefix, + local, + might_be_invalid_iri, + }), + )) + } + + fn recognize_variable<'a>( + &self, + data: &'a [u8], + is_ending: bool, + ) -> Option<(usize, Result<N3Token<'a>, TokenRecognizerError>)> { + // [36] QUICK_VAR_NAME ::= "?" PN_LOCAL + let (consumed, result) = self.recognize_optional_pn_local(&data[1..], is_ending)?; + Some(( + consumed + 1, + result.and_then(|(name, _)| { + if name.is_empty() { + Err((0..consumed, "A variable name is not allowed to be empty").into()) + } else { + Ok(N3Token::Variable(name)) + } + }), + )) + } + + fn recognize_optional_pn_local<'a>( + &self, + data: &'a [u8], + is_ending: bool, + ) -> Option<(usize, Result<(Cow<'a, str>, bool), TokenRecognizerError>)> { + // [168s] PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))? + let mut i = 0; + let mut buffer = None; // Buffer if there are some escaped characters + let mut position_that_is_already_in_buffer = 0; + let mut might_be_invalid_iri = false; + let mut ends_with_unescaped_dot = 0; + loop { + if let Some(r) = Self::recognize_unicode_char(&data[i..], i) { + match r { + Ok((c, consumed)) => { + if c == '%' { + i += 1; + let a = char::from(*data.get(i)?); + i += 1; + let b = char::from(*data.get(i)?); + if !a.is_ascii_hexdigit() || !b.is_ascii_hexdigit() { + return Some((i + 1, Err(( + i - 2..=i, format!("escapes in IRIs should be % followed by two hexadecimal characters, found '%{a}{b}'") + ).into()))); + } + i += 1; + ends_with_unescaped_dot = 0; + } else if c == '\\' { + i += 1; + let a = char::from(*data.get(i)?); + if self.unchecked + || matches!( + a, + '_' | '~' + | '.' + | '-' + | '!' + | '$' + | '&' + | '\'' + | '(' + | ')' + | '*' + | '+' + | ',' + | ';' + | '=' + ) + { + // ok to escape + } else if matches!(a, '/' | '?' | '#' | '@' | '%') { + // ok to escape but requires IRI validation + might_be_invalid_iri = true; + } else { + return Some((i + 1, Err(( + i..=i, format!("The character that are allowed to be escaped in IRIs are _~.-!$&'()*+,;=/?#@%, found '{a}'") + ).into()))); + } + let buffer = buffer.get_or_insert_with(String::new); + // We add the missing bytes + if i - position_that_is_already_in_buffer > 1 { + buffer.push_str( + match str_from_utf8( + &data[position_that_is_already_in_buffer..i - 1], + position_that_is_already_in_buffer..i - 1, + ) { + Ok(data) => data, + Err(e) => return Some((i, Err(e))), + }, + ) + } + buffer.push(a); + i += 1; + position_that_is_already_in_buffer = i; + ends_with_unescaped_dot = 0; + } else if i == 0 { + if !(Self::is_possible_pn_chars_u(c) || c == ':' || c.is_ascii_digit()) + { + return Some((0, Ok((Cow::Borrowed(""), false)))); + } + if !self.unchecked { + might_be_invalid_iri |= + Self::is_possible_pn_chars_base_but_not_valid_iri(c) + || c == ':'; + } + i += consumed; + } else if Self::is_possible_pn_chars(c) || c == ':' { + if !self.unchecked { + might_be_invalid_iri |= + Self::is_possible_pn_chars_base_but_not_valid_iri(c) + || c == ':'; + } + i += consumed; + ends_with_unescaped_dot = 0; + } else if c == '.' { + i += consumed; + ends_with_unescaped_dot += 1; + } else { + let buffer = if let Some(mut buffer) = buffer { + buffer.push_str( + match str_from_utf8( + &data[position_that_is_already_in_buffer..i], + position_that_is_already_in_buffer..i, + ) { + Ok(data) => data, + Err(e) => return Some((i, Err(e))), + }, + ); + // We do not include the last dots + for _ in 0..ends_with_unescaped_dot { + buffer.pop(); + } + i -= ends_with_unescaped_dot; + Cow::Owned(buffer) + } else { + let mut data = match str_from_utf8(&data[..i], 0..i) { + Ok(data) => data, + Err(e) => return Some((i, Err(e))), + }; + // We do not include the last dots + data = &data[..data.len() - ends_with_unescaped_dot]; + i -= ends_with_unescaped_dot; + Cow::Borrowed(data) + }; + return Some((i, Ok((buffer, might_be_invalid_iri)))); + } + } + Err(e) => return Some((e.location.end, Err(e))), + } + } else if is_ending { + let buffer = if let Some(mut buffer) = buffer { + // We do not include the last dot + while buffer.ends_with('.') { + buffer.pop(); + i -= 1; + } + Cow::Owned(buffer) + } else { + let mut data = match str_from_utf8(&data[..i], 0..i) { + Ok(data) => data, + Err(e) => return Some((i, Err(e))), + }; + // We do not include the last dot + while let Some(d) = data.strip_suffix('.') { + data = d; + i -= 1; + } + Cow::Borrowed(data) + }; + return Some((i, Ok((buffer, might_be_invalid_iri)))); + } else { + return None; + } + } + } + + fn recognize_blank_node_label( + data: &[u8], + ) -> Option<(usize, Result<N3Token<'_>, TokenRecognizerError>)> { + // [141s] BLANK_NODE_LABEL ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)? + let mut i = 2; + loop { + match Self::recognize_unicode_char(&data[i..], i)? { + Ok((c, consumed)) => { + if (i == 2 && (Self::is_possible_pn_chars_u(c) || c.is_ascii_digit())) + || (i > 2 && Self::is_possible_pn_chars(c)) + { + // Ok + } else if i > 2 && c == '.' { + if data[i - 1] == b'.' { + i -= 1; + return Some(( + i, + str_from_utf8(&data[2..i], 2..i).map(N3Token::BlankNodeLabel), + )); + } + } else if i == 0 { + return Some(( + i, + Err((0..i, "A blank node ID should not be empty").into()), + )); + } else if data[i - 1] == b'.' { + i -= 1; + return Some(( + i, + str_from_utf8(&data[2..i], 2..i).map(N3Token::BlankNodeLabel), + )); + } else { + return Some(( + i, + str_from_utf8(&data[2..i], 2..i).map(N3Token::BlankNodeLabel), + )); + } + i += consumed; + } + Err(e) => return Some((e.location.end, Err(e))), + } + } + } + + fn recognize_lang_tag<'a>( + &self, + data: &'a [u8], + ) -> Option<(usize, Result<N3Token<'a>, TokenRecognizerError>)> { + // [144s] LANGTAG ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* + let mut is_last_block_empty = true; + for (i, c) in data[1..].iter().enumerate() { + if c.is_ascii_alphabetic() { + is_last_block_empty = false; + } else if i == 0 { + return Some(( + 1, + Err((1..2, "A language code should always start with a letter").into()), + )); + } else if is_last_block_empty { + return Some((i, self.parse_lang_tag(&data[1..i], 1..i - 1))); + } else if *c == b'-' { + is_last_block_empty = true; + } else { + return Some((i + 1, self.parse_lang_tag(&data[1..=i], 1..i))); + } + } + None + } + + fn parse_lang_tag<'a>( + &self, + lang_tag: &'a [u8], + position: Range<usize>, + ) -> Result<N3Token<'a>, TokenRecognizerError> { + let lang_tag = str_from_utf8(lang_tag, position.clone())?; + Ok(N3Token::LangTag(if self.unchecked { + lang_tag + } else { + LanguageTag::parse(lang_tag) + .map_err(|e| (position.clone(), e.to_string()))? + .into_inner() + })) + } + + fn recognize_string( + data: &[u8], + delimiter: u8, + ) -> Option<(usize, Result<N3Token<'static>, TokenRecognizerError>)> { + // [22] STRING_LITERAL_QUOTE ::= '"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '"' /* #x22=" #x5C=\ #xA=new line #xD=carriage return */ + // [23] STRING_LITERAL_SINGLE_QUOTE ::= "'" ([^#x27#x5C#xA#xD] | ECHAR | UCHAR)* "'" /* #x27=' #x5C=\ #xA=new line #xD=carriage return */ + let mut string = String::new(); + let mut i = 1; + loop { + let end = memchr2(delimiter, b'\\', &data[i..])?; + match str_from_utf8(&data[i..i + end], i..i + end) { + Ok(s) => string.push_str(s), + Err(e) => return Some((end, Err(e))), + }; + i += end; + match data[i] { + c if c == delimiter => { + return Some((i + 1, Ok(N3Token::String(string)))); + } + b'\\' => { + let (additional, c) = Self::recognize_escape(&data[i..], i, true)?; + i += additional + 1; + match c { + Ok(c) => { + string.push(c); + } + Err(e) => { + // We read until the end of string char + let end = memchr(delimiter, &data[i..])?; + return Some((i + end + 1, Err(e))); + } + } + } + _ => unreachable!(), + } + } + } + + fn recognize_long_string( + data: &[u8], + delimiter: u8, + ) -> Option<(usize, Result<N3Token<'static>, TokenRecognizerError>)> { + // [24] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" (("'" | "''")? ([^'\] | ECHAR | UCHAR))* "'''" + // [25] STRING_LITERAL_LONG_QUOTE ::= '"""' (('"' | '""')? ([^"\] | ECHAR | UCHAR))* '"""' + let mut string = String::new(); + let mut i = 3; + loop { + let end = memchr2(delimiter, b'\\', &data[i..])?; + match str_from_utf8(&data[i..i + end], i..i + end) { + Ok(s) => string.push_str(s), + Err(e) => return Some((end, Err(e))), + }; + i += end; + match data[i] { + c if c == delimiter => { + if *data.get(i + 1)? == delimiter && *data.get(i + 2)? == delimiter { + return Some((i + 3, Ok(N3Token::String(string)))); + } + i += 1; + string.push(char::from(delimiter)); + } + b'\\' => { + let (additional, c) = Self::recognize_escape(&data[i..], i, true)?; + i += additional + 1; + match c { + Ok(c) => { + string.push(c); + } + Err(e) => return Some((i, Err(e))), + } + } + _ => unreachable!(), + } + } + } + + fn recognize_number(data: &[u8]) -> Option<(usize, Result<N3Token<'_>, TokenRecognizerError>)> { + // [19] INTEGER ::= [+-]? [0-9]+ + // [20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+ + // [21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT) + // [154s] EXPONENT ::= [eE] [+-]? [0-9]+ + let mut i = 0; + let c = *data.first()?; + if matches!(c, b'+' | b'-') { + i += 1; + } + // We read the digits before . + let mut count_before: usize = 0; + loop { + let c = *data.get(i)?; + if c.is_ascii_digit() { + i += 1; + count_before += 1; + } else { + break; + } + } + + // We read the digits after . + #[allow(clippy::if_then_some_else_none)] + let count_after = if *data.get(i)? == b'.' { + i += 1; + + let mut count_after = 0; + loop { + let c = *data.get(i)?; + if c.is_ascii_digit() { + i += 1; + count_after += 1; + } else { + break; + } + } + Some(count_after) + } else { + None + }; + + // End + let c = *data.get(i)?; + if matches!(c, b'e' | b'E') { + i += 1; + + let c = *data.get(i)?; + if matches!(c, b'+' | b'-') { + i += 1; + } + + let mut found = false; + loop { + let c = *data.get(i)?; + if c.is_ascii_digit() { + i += 1; + found = true; + } else { + break; + } + } + Some(( + i, + if !found { + Err((0..i, "A double exponent cannot be empty").into()) + } else if count_before == 0 && count_after.unwrap_or(0) == 0 { + Err((0..i, "A double should not be empty").into()) + } else { + str_from_utf8(&data[..i], 0..i).map(N3Token::Double) + }, + )) + } else if let Some(count_after) = count_after { + if count_after == 0 { + // We do not consume the '.' after all + i -= 1; + Some(( + i, + if count_before == 0 { + Err((0..i, "An integer should not be empty").into()) + } else { + str_from_utf8(&data[..i], 0..i).map(N3Token::Integer) + }, + )) + } else { + Some((i, str_from_utf8(&data[..i], 0..i).map(N3Token::Decimal))) + } + } else { + Some(( + i, + if count_before == 0 { + Err((0..i, "An integer should not be empty").into()) + } else { + str_from_utf8(&data[..i], 0..i).map(N3Token::Integer) + }, + )) + } + } + + fn recognize_escape( + data: &[u8], + position: usize, + with_echar: bool, + ) -> Option<(usize, Result<char, TokenRecognizerError>)> { + // [26] UCHAR ::= '\u' HEX HEX HEX HEX | '\U' HEX HEX HEX HEX HEX HEX HEX HEX + // [159s] ECHAR ::= '\' [tbnrf"'\] + match *data.get(1)? { + b'u' => match Self::recognize_hex_char(&data[2..], 4, 'u', position) { + Ok(c) => Some((5, Ok(c?))), + Err(e) => Some((5, Err(e))), + }, + b'U' => match Self::recognize_hex_char(&data[2..], 8, 'u', position) { + Ok(c) => Some((9, Ok(c?))), + Err(e) => Some((9, Err(e))), + }, + b't' if with_echar => Some((1, Ok('\t'))), + b'b' if with_echar => Some((1, Ok('\x08'))), + b'n' if with_echar => Some((1, Ok('\n'))), + b'r' if with_echar => Some((1, Ok('\r'))), + b'f' if with_echar => Some((1, Ok('\x0C'))), + b'"' if with_echar => Some((1, Ok('"'))), + b'\'' if with_echar => Some((1, Ok('\''))), + b'\\' if with_echar => Some((1, Ok('\\'))), + c => Some(( + 1, + Err(( + position..position + 2, + format!("Unexpected escape character '\\{}'", char::from(c)), + ) + .into()), + )), // TODO: read until end of string + } + } + + fn recognize_hex_char( + data: &[u8], + len: usize, + escape_char: char, + position: usize, + ) -> Result<Option<char>, TokenRecognizerError> { + if data.len() < len { + return Ok(None); + } + let val = str_from_utf8(&data[..len], position..position + len + 2)?; + let codepoint = u32::from_str_radix(val, 16).map_err(|e| { + ( + position..position + len + 2, + format!( + "The escape sequence '\\{escape_char}{val}' is not a valid hexadecimal string: {e}" + ), + ) + })?; + let c = char::from_u32(codepoint).ok_or_else(|| { + ( + position..position + len +2, + format!( + "The escape sequence '\\{escape_char}{val}' is encoding {codepoint:X} that is not a valid unicode character", + ), + ) + })?; + Ok(Some(c)) + } + + fn recognize_unicode_char( + data: &[u8], + position: usize, + ) -> Option<Result<(char, usize), TokenRecognizerError>> { + let mut code_point: u32; + let bytes_needed: usize; + let mut lower_boundary = 0x80; + let mut upper_boundary = 0xBF; + + let byte = *data.first()?; + match byte { + 0x00..=0x7F => return Some(Ok((char::from(byte), 1))), + 0xC2..=0xDF => { + bytes_needed = 1; + code_point = u32::from(byte) & 0x1F; + } + 0xE0..=0xEF => { + if byte == 0xE0 { + lower_boundary = 0xA0; + } + if byte == 0xED { + upper_boundary = 0x9F; + } + bytes_needed = 2; + code_point = u32::from(byte) & 0xF; + } + 0xF0..=0xF4 => { + if byte == 0xF0 { + lower_boundary = 0x90; + } + if byte == 0xF4 { + upper_boundary = 0x8F; + } + bytes_needed = 3; + code_point = u32::from(byte) & 0x7; + } + _ => { + return Some(Err(( + position..=position, + "Invalid UTF-8 character encoding", + ) + .into())) + } + } + + for i in 1..=bytes_needed { + let byte = *data.get(i)?; + if byte < lower_boundary || upper_boundary < byte { + return Some(Err(( + position..=position + i, + "Invalid UTF-8 character encoding", + ) + .into())); + } + lower_boundary = 0x80; + upper_boundary = 0xBF; + code_point = (code_point << 6) | (u32::from(byte) & 0x3F); + } + + Some( + char::from_u32(code_point) + .map(|c| (c, bytes_needed + 1)) + .ok_or_else(|| { + ( + position..=position + bytes_needed, + format!("The codepoint {code_point:X} is not a valid unicode character"), + ) + .into() + }), + ) + } + + // [157s] PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] + fn is_possible_pn_chars_base(c: char) -> bool { + matches!(c, + 'A'..='Z' + | 'a'..='z' + | '\u{00C0}'..='\u{00D6}' + | '\u{00D8}'..='\u{00F6}' + | '\u{00F8}'..='\u{02FF}' + | '\u{0370}'..='\u{037D}' + | '\u{037F}'..='\u{1FFF}' + | '\u{200C}'..='\u{200D}' + | '\u{2070}'..='\u{218F}' + | '\u{2C00}'..='\u{2FEF}' + | '\u{3001}'..='\u{D7FF}' + | '\u{F900}'..='\u{FDCF}' + | '\u{FDF0}'..='\u{FFFD}' + | '\u{10000}'..='\u{EFFFF}') + } + + // [158s] PN_CHARS_U ::= PN_CHARS_BASE | '_' | ':' + pub(super) fn is_possible_pn_chars_u(c: char) -> bool { + Self::is_possible_pn_chars_base(c) || c == '_' + } + + // [160s] PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] + pub(crate) fn is_possible_pn_chars(c: char) -> bool { + Self::is_possible_pn_chars_u(c) + || matches!(c, + '-' | '0'..='9' | '\u{00B7}' | '\u{0300}'..='\u{036F}' | '\u{203F}'..='\u{2040}') + } + + fn is_possible_pn_chars_base_but_not_valid_iri(c: char) -> bool { + matches!(c, '\u{FFF0}'..='\u{FFFD}') + || u32::from(c) % u32::from('\u{FFFE}') == 0 + || u32::from(c) % u32::from('\u{FFFF}') == 0 + } +} + +pub fn resolve_local_name( + prefix: &str, + local: &str, + might_be_invalid_iri: bool, + prefixes: &HashMap<String, Iri<String>>, +) -> Result<NamedNode, String> { + if let Some(start) = prefixes.get(prefix) { + let iri = format!("{start}{local}"); + if might_be_invalid_iri || start.path().is_empty() { + // We validate again. We always validate if the local part might be the IRI authority. + if let Err(e) = Iri::parse(iri.as_str()) { + return Err(format!( + "The prefixed name {prefix}:{local} builds IRI {iri} that is invalid: {e}" + )); + } + } + Ok(NamedNode::new_unchecked(iri)) + } else { + Err(format!("The prefix {prefix}: has not been declared")) + } +} + +fn str_from_utf8(data: &[u8], range: Range<usize>) -> Result<&str, TokenRecognizerError> { + str::from_utf8(data).map_err(|e| { + ( + range.start + e.valid_up_to()..min(range.end, range.start + e.valid_up_to() + 4), + format!("Invalid UTF-8: {e}"), + ) + .into() + }) +} + +fn string_from_utf8(data: Vec<u8>, range: Range<usize>) -> Result<String, TokenRecognizerError> { + String::from_utf8(data).map_err(|e| { + ( + range.start + e.utf8_error().valid_up_to() + ..min(range.end, range.start + e.utf8_error().valid_up_to() + 4), + format!("Invalid UTF-8: {e}"), + ) + .into() + }) +} diff --git a/lib/oxttl/src/lib.rs b/lib/oxttl/src/lib.rs new file mode 100644 index 00000000..a1dd95f9 --- /dev/null +++ b/lib/oxttl/src/lib.rs @@ -0,0 +1,25 @@ +#![doc = include_str!("../README.md")] +#![doc(test(attr(deny(warnings))))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] + +mod lexer; +mod line_formats; +pub mod n3; +pub mod nquads; +pub mod ntriples; +mod terse; +mod toolkit; +pub mod trig; +pub mod turtle; + +pub use crate::n3::N3Parser; +pub use crate::nquads::{NQuadsParser, NQuadsSerializer}; +pub use crate::ntriples::{NTriplesParser, NTriplesSerializer}; +pub use crate::toolkit::{TextPosition, TurtleParseError, TurtleSyntaxError}; +pub use crate::trig::{TriGParser, TriGSerializer}; +pub use crate::turtle::{TurtleParser, TurtleSerializer}; + +pub(crate) const MIN_BUFFER_SIZE: usize = 4096; +pub(crate) const MAX_BUFFER_SIZE: usize = 4096 * 4096; diff --git a/lib/oxttl/src/line_formats.rs b/lib/oxttl/src/line_formats.rs new file mode 100644 index 00000000..e522bd53 --- /dev/null +++ b/lib/oxttl/src/line_formats.rs @@ -0,0 +1,314 @@ +//! Shared parser implementation for N-Triples and N-Quads. + +use crate::lexer::{N3Lexer, N3LexerMode, N3LexerOptions, N3Token}; +use crate::toolkit::{Lexer, Parser, RuleRecognizer, RuleRecognizerError}; +use crate::{MAX_BUFFER_SIZE, MIN_BUFFER_SIZE}; +#[cfg(feature = "rdf-star")] +use oxrdf::Triple; +use oxrdf::{BlankNode, GraphName, Literal, NamedNode, Quad, Subject, Term}; + +pub struct NQuadsRecognizer { + stack: Vec<NQuadsState>, + subjects: Vec<Subject>, + predicates: Vec<NamedNode>, + objects: Vec<Term>, +} +pub struct NQuadsRecognizerContext { + with_graph_name: bool, + #[cfg(feature = "rdf-star")] + with_quoted_triples: bool, + lexer_options: N3LexerOptions, +} + +enum NQuadsState { + ExpectSubject, + ExpectPredicate, + ExpectedObject, + ExpectPossibleGraphOrEndOfQuotedTriple, + ExpectDot, + ExpectLiteralAnnotationOrGraphNameOrDot { + value: String, + }, + ExpectLiteralDatatype { + value: String, + }, + #[cfg(feature = "rdf-star")] + AfterQuotedSubject, + #[cfg(feature = "rdf-star")] + AfterQuotedObject, +} + +impl RuleRecognizer for NQuadsRecognizer { + type TokenRecognizer = N3Lexer; + type Output = Quad; + type Context = NQuadsRecognizerContext; + + fn error_recovery_state(mut self) -> Self { + self.stack.clear(); + self.subjects.clear(); + self.predicates.clear(); + self.objects.clear(); + self + } + + fn recognize_next( + mut self, + token: N3Token<'_>, + context: &mut NQuadsRecognizerContext, + results: &mut Vec<Quad>, + errors: &mut Vec<RuleRecognizerError>, + ) -> Self { + if let Some(state) = self.stack.pop() { + match state { + NQuadsState::ExpectSubject => match token { + N3Token::IriRef(s) => { + self.subjects + .push(NamedNode::new_unchecked(s).into()); + self.stack.push(NQuadsState::ExpectPredicate); + self + } + N3Token::BlankNodeLabel(s) => { + self.subjects.push(BlankNode::new_unchecked(s).into()); + self.stack.push(NQuadsState::ExpectPredicate); + self + } + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("<<") if context.with_quoted_triples => { + self.stack.push(NQuadsState::AfterQuotedSubject); + self.stack.push(NQuadsState::ExpectSubject); + self + } + _ => self.error( + errors, + "The subject of a triple should be an IRI or a blank node, TOKEN found", + ), + }, + NQuadsState::ExpectPredicate => match token { + N3Token::IriRef(p) => { + self.predicates + .push(NamedNode::new_unchecked(p)); + self.stack.push(NQuadsState::ExpectedObject); + self + } + _ => self.error( + errors, + "The predicate of a triple should be an IRI, TOKEN found", + ), + }, + NQuadsState::ExpectedObject => match token { + N3Token::IriRef(o) => { + self.objects + .push(NamedNode::new_unchecked(o).into()); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self + } + N3Token::BlankNodeLabel(o) => { + self.objects.push(BlankNode::new_unchecked(o).into()); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self + } + N3Token::String(value) => { + self.stack + .push(NQuadsState::ExpectLiteralAnnotationOrGraphNameOrDot { value }); + self + } + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("<<") if context.with_quoted_triples => { + self.stack.push(NQuadsState::AfterQuotedObject); + self.stack.push(NQuadsState::ExpectSubject); + self + } + _ => self.error( + errors, + "The object of a triple should be an IRI, a blank node or a literal, TOKEN found", + ), + }, + NQuadsState::ExpectLiteralAnnotationOrGraphNameOrDot { value } => match token { + N3Token::LangTag(lang_tag) => { + self.objects.push( + Literal::new_language_tagged_literal_unchecked( + value, + lang_tag.to_ascii_lowercase(), + ) + .into(), + ); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self + } + N3Token::Punctuation("^^") => { + self.stack + .push(NQuadsState::ExpectLiteralDatatype { value }); + self + } + _ => { + self.objects.push(Literal::new_simple_literal(value).into()); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self.recognize_next(token, context, results, errors) + } + }, + NQuadsState::ExpectLiteralDatatype { value } => match token { + N3Token::IriRef(d) => { + self.objects.push( + Literal::new_typed_literal( + value, + NamedNode::new_unchecked(d) + ) + .into(), + ); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self + } + _ => self.error(errors, "A literal datatype must be an IRI, found TOKEN"), + }, + NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple => { + if self.stack.is_empty() { + match token { + N3Token::IriRef(g) if context.with_graph_name => { + self.emit_quad( + results, + NamedNode::new_unchecked(g).into(), + ); + self.stack.push(NQuadsState::ExpectDot); + self + } + N3Token::BlankNodeLabel(g) if context.with_graph_name => { + self.emit_quad(results, BlankNode::new_unchecked(g).into()); + self.stack.push(NQuadsState::ExpectDot); + self + } + _ => { + self.emit_quad(results, GraphName::DefaultGraph); + self.stack.push(NQuadsState::ExpectDot); + self.recognize_next(token, context, results, errors) + } + } + } else if token == N3Token::Punctuation(">>") { + self + } else { + self.error(errors, "Expecting the end of a quoted triple '>>'") + } + } + NQuadsState::ExpectDot => if let N3Token::Punctuation(".") = token { + self.stack.push(NQuadsState::ExpectSubject); + self + } else { + errors.push("Quads should be followed by a dot".into()); + self.stack.push(NQuadsState::ExpectSubject); + self.recognize_next(token, context, results, errors) + }, + #[cfg(feature = "rdf-star")] + NQuadsState::AfterQuotedSubject => { + let triple = Triple { + subject: self.subjects.pop().unwrap(), + predicate: self.predicates.pop().unwrap(), + object: self.objects.pop().unwrap(), + }; + self.subjects.push(triple.into()); + self.stack.push(NQuadsState::ExpectPredicate); + self.recognize_next(token,context, results, errors) + } + #[cfg(feature = "rdf-star")] + NQuadsState::AfterQuotedObject => { + let triple = Triple { + subject: self.subjects.pop().unwrap(), + predicate: self.predicates.pop().unwrap(), + object: self.objects.pop().unwrap(), + }; + self.objects.push(triple.into()); + self.stack + .push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple); + self.recognize_next(token, context, results, errors) + } + } + } else if token == N3Token::Punctuation(".") { + self.stack.push(NQuadsState::ExpectSubject); + self + } else { + self + } + } + + fn recognize_end( + mut self, + _context: &mut NQuadsRecognizerContext, + results: &mut Vec<Quad>, + errors: &mut Vec<RuleRecognizerError>, + ) { + match &*self.stack { + [NQuadsState::ExpectSubject] | [] => (), + [NQuadsState::ExpectDot] => errors.push("Triples should be followed by a dot".into()), + [NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple] => { + self.emit_quad(results, GraphName::DefaultGraph); + errors.push("Triples should be followed by a dot".into()) + } + [NQuadsState::ExpectLiteralAnnotationOrGraphNameOrDot { value }] => { + self.objects.push(Literal::new_simple_literal(value).into()); + self.emit_quad(results, GraphName::DefaultGraph); + errors.push("Triples should be followed by a dot".into()) + } + _ => errors.push("Unexpected end".into()), // TODO + } + } + + fn lexer_options(context: &NQuadsRecognizerContext) -> &N3LexerOptions { + &context.lexer_options + } +} + +impl NQuadsRecognizer { + pub fn new_parser( + with_graph_name: bool, + #[cfg(feature = "rdf-star")] with_quoted_triples: bool, + unchecked: bool, + ) -> Parser<Self> { + Parser::new( + Lexer::new( + N3Lexer::new(N3LexerMode::NTriples, unchecked), + MIN_BUFFER_SIZE, + MAX_BUFFER_SIZE, + true, + Some(b"#"), + ), + Self { + stack: vec![NQuadsState::ExpectSubject], + subjects: Vec::new(), + predicates: Vec::new(), + objects: Vec::new(), + }, + NQuadsRecognizerContext { + with_graph_name, + #[cfg(feature = "rdf-star")] + with_quoted_triples, + lexer_options: N3LexerOptions::default(), + }, + ) + } + + #[must_use] + fn error( + mut self, + errors: &mut Vec<RuleRecognizerError>, + msg: impl Into<RuleRecognizerError>, + ) -> Self { + errors.push(msg.into()); + self.stack.clear(); + self.subjects.clear(); + self.predicates.clear(); + self.objects.clear(); + self + } + + fn emit_quad(&mut self, results: &mut Vec<Quad>, graph_name: GraphName) { + results.push(Quad { + subject: self.subjects.pop().unwrap(), + predicate: self.predicates.pop().unwrap(), + object: self.objects.pop().unwrap(), + graph_name, + }) + } +} diff --git a/lib/oxttl/src/n3.rs b/lib/oxttl/src/n3.rs new file mode 100644 index 00000000..de3e9363 --- /dev/null +++ b/lib/oxttl/src/n3.rs @@ -0,0 +1,1339 @@ +//! A [N3](https://w3c.github.io/N3/spec/) streaming parser implemented by [`N3Parser`]. + +use crate::lexer::{resolve_local_name, N3Lexer, N3LexerMode, N3LexerOptions, N3Token}; +#[cfg(feature = "async-tokio")] +use crate::toolkit::FromTokioAsyncReadIterator; +use crate::toolkit::{ + FromReadIterator, Lexer, Parser, RuleRecognizer, RuleRecognizerError, TurtleSyntaxError, +}; +use crate::{TurtleParseError, MAX_BUFFER_SIZE, MIN_BUFFER_SIZE}; +use oxiri::{Iri, IriParseError}; +use oxrdf::vocab::{rdf, xsd}; +#[cfg(feature = "rdf-star")] +use oxrdf::Triple; +use oxrdf::{ + BlankNode, GraphName, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Quad, Subject, Term, + Variable, +}; +use std::collections::hash_map::Iter; +use std::collections::HashMap; +use std::fmt; +use std::io::Read; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncRead; + +/// A N3 term i.e. a RDF `Term` or a `Variable`. +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum N3Term { + NamedNode(NamedNode), + BlankNode(BlankNode), + Literal(Literal), + #[cfg(feature = "rdf-star")] + Triple(Box<Triple>), + Variable(Variable), +} + +impl fmt::Display for N3Term { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::NamedNode(term) => term.fmt(f), + Self::BlankNode(term) => term.fmt(f), + Self::Literal(term) => term.fmt(f), + #[cfg(feature = "rdf-star")] + Self::Triple(term) => term.fmt(f), + Self::Variable(term) => term.fmt(f), + } + } +} + +impl From<NamedNode> for N3Term { + #[inline] + fn from(node: NamedNode) -> Self { + Self::NamedNode(node) + } +} + +impl From<NamedNodeRef<'_>> for N3Term { + #[inline] + fn from(node: NamedNodeRef<'_>) -> Self { + Self::NamedNode(node.into_owned()) + } +} + +impl From<BlankNode> for N3Term { + #[inline] + fn from(node: BlankNode) -> Self { + Self::BlankNode(node) + } +} + +impl From<Literal> for N3Term { + #[inline] + fn from(literal: Literal) -> Self { + Self::Literal(literal) + } +} + +#[cfg(feature = "rdf-star")] +impl From<Triple> for N3Term { + #[inline] + fn from(triple: Triple) -> Self { + Self::Triple(Box::new(triple)) + } +} + +#[cfg(feature = "rdf-star")] +impl From<Box<Triple>> for N3Term { + #[inline] + fn from(node: Box<Triple>) -> Self { + Self::Triple(node) + } +} + +impl From<NamedOrBlankNode> for N3Term { + #[inline] + fn from(node: NamedOrBlankNode) -> Self { + match node { + NamedOrBlankNode::NamedNode(node) => node.into(), + NamedOrBlankNode::BlankNode(node) => node.into(), + } + } +} + +impl From<Subject> for N3Term { + #[inline] + fn from(node: Subject) -> Self { + match node { + Subject::NamedNode(node) => node.into(), + Subject::BlankNode(node) => node.into(), + #[cfg(feature = "rdf-star")] + Subject::Triple(triple) => Self::Triple(triple), + } + } +} + +impl From<Term> for N3Term { + #[inline] + fn from(node: Term) -> Self { + match node { + Term::NamedNode(node) => node.into(), + Term::BlankNode(node) => node.into(), + Term::Literal(node) => node.into(), + #[cfg(feature = "rdf-star")] + Term::Triple(triple) => Self::Triple(triple), + } + } +} + +impl From<Variable> for N3Term { + #[inline] + fn from(variable: Variable) -> Self { + Self::Variable(variable) + } +} + +/// A N3 quad i.e. a quad composed of [`N3Term`]. +/// +/// The `graph_name` is used to encode the formula where the triple is in. +/// In this case the formula is encoded by a blank node. +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub struct N3Quad { + /// The [subject](https://www.w3.org/TR/rdf11-concepts/#dfn-subject) of this triple. + pub subject: N3Term, + + /// The [predicate](https://www.w3.org/TR/rdf11-concepts/#dfn-predicate) of this triple. + pub predicate: N3Term, + + /// The [object](https://www.w3.org/TR/rdf11-concepts/#dfn-object) of this triple. + pub object: N3Term, + + /// The name of the RDF [graph](https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph) in which the triple is. + pub graph_name: GraphName, +} + +impl fmt::Display for N3Quad { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if self.graph_name == GraphName::DefaultGraph { + write!(f, "{} {} {}", self.subject, self.predicate, self.object) + } else { + write!( + f, + "{} {} {} {}", + self.subject, self.predicate, self.object, self.graph_name + ) + } + } +} + +impl From<Quad> for N3Quad { + fn from(quad: Quad) -> Self { + Self { + subject: quad.subject.into(), + predicate: quad.predicate.into(), + object: quad.object.into(), + graph_name: quad.graph_name, + } + } +} + +/// A [N3](https://w3c.github.io/N3/spec/) streaming parser. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNode; +/// use oxttl::n3::{N3Parser, N3Term}; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); +/// let schema_person = N3Term::NamedNode(NamedNode::new("http://schema.org/Person")?); +/// let mut count = 0; +/// for triple in N3Parser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf_type && triple.object == schema_person { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct N3Parser { + unchecked: bool, + base: Option<Iri<String>>, + prefixes: HashMap<String, Iri<String>>, +} + +impl N3Parser { + /// Builds a new [`N3Parser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + #[inline] + pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + self.base = Some(Iri::parse(base_iri.into())?); + Ok(self) + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.prefixes + .insert(prefix_name.into(), Iri::parse(prefix_iri.into())?); + Ok(self) + } + + /// Parses a N3 file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::NamedNode; + /// use oxttl::n3::{N3Parser, N3Term}; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let rdf_type = N3Term::NamedNode(NamedNode::new( + /// "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", + /// )?); + /// let schema_person = N3Term::NamedNode(NamedNode::new("http://schema.org/Person")?); + /// let mut count = 0; + /// for triple in N3Parser::new().parse_read(file.as_ref()) { + /// let triple = triple?; + /// if triple.predicate == rdf_type && triple.object == schema_person { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadN3Reader<R> { + FromReadN3Reader { + inner: self.parse().parser.parse_read(read), + } + } + + /// Parses a N3 file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNode; + /// use oxttl::n3::{N3Parser, N3Term}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); + /// let schema_person = N3Term::NamedNode(NamedNode::new_unchecked("http://schema.org/Person")); + /// let mut count = 0; + /// let mut parser = N3Parser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf_type && triple.object == schema_person { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadN3Reader<R> { + FromTokioAsyncReadN3Reader { + inner: self.parse().parser.parse_tokio_async_read(read), + } + } + + /// Allows to parse a N3 file by using a low-level API. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNode; + /// use oxttl::n3::{N3Parser, N3Term}; + /// + /// let file: [&[u8]; 5] = [ + /// b"@base <http://example.com/>", + /// b". @prefix schema: <http://schema.org/> .", + /// b"<foo> a schema:Person", + /// b" ; schema:name \"Foo\" . <bar>", + /// b" a schema:Person ; schema:name \"Bar\" .", + /// ]; + /// + /// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); + /// let schema_person = N3Term::NamedNode(NamedNode::new("http://schema.org/Person")?); + /// let mut count = 0; + /// let mut parser = N3Parser::new().parse(); + /// let mut file_chunks = file.iter(); + /// while !parser.is_end() { + /// // We feed more data to the parser + /// if let Some(chunk) = file_chunks.next() { + /// parser.extend_from_slice(chunk); + /// } else { + /// parser.end(); // It's finished + /// } + /// // We read as many triples from the parser as possible + /// while let Some(triple) = parser.read_next() { + /// let triple = triple?; + /// if triple.predicate == rdf_type && triple.object == schema_person { + /// count += 1; + /// } + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse(self) -> LowLevelN3Reader { + LowLevelN3Reader { + parser: N3Recognizer::new_parser(self.unchecked, self.base, self.prefixes), + } + } +} + +/// Parses a N3 file from a [`Read`] implementation. Can be built using [`N3Parser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNode; +/// use oxttl::n3::{N3Parser, N3Term}; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); +/// let schema_person = N3Term::NamedNode(NamedNode::new("http://schema.org/Person")?); +/// let mut count = 0; +/// for triple in N3Parser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf_type && triple.object == schema_person { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadN3Reader<R: Read> { + inner: FromReadIterator<R, N3Recognizer>, +} + +impl<R: Read> FromReadN3Reader<R> { + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse_read(file.as_ref()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> N3PrefixesIter<'_> { + N3PrefixesIter { + inner: self.inner.parser.context.prefixes.iter(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base at the beginning because none has been given to the parser. + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI. + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +impl<R: Read> Iterator for FromReadN3Reader<R> { + type Item = Result<N3Quad, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + self.inner.next() + } +} + +/// Parses a N3 file from a [`AsyncRead`] implementation. Can be built using [`N3Parser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNode; +/// use oxttl::n3::{N3Parser, N3Term}; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxttl::TurtleParseError> { +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); +/// let schema_person = N3Term::NamedNode(NamedNode::new_unchecked("http://schema.org/Person")); +/// let mut count = 0; +/// let mut parser = N3Parser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf_type && triple.object == schema_person { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadN3Reader<R: AsyncRead + Unpin> { + inner: FromTokioAsyncReadIterator<R, N3Recognizer>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadN3Reader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<N3Quad, TurtleParseError>> { + Some(self.inner.next().await?.map(Into::into)) + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse_tokio_async_read(file.as_ref()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Ok(()) + /// # } + /// ``` + pub fn prefixes(&self) -> N3PrefixesIter<'_> { + N3PrefixesIter { + inner: self.inner.parser.context.prefixes.iter(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse_tokio_async_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Ok(()) + /// # } + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +/// Parses a N3 file by using a low-level API. Can be built using [`N3Parser::parse`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNode; +/// use oxttl::n3::{N3Parser, N3Term}; +/// +/// let file: [&[u8]; 5] = [ +/// b"@base <http://example.com/>", +/// b". @prefix schema: <http://schema.org/> .", +/// b"<foo> a schema:Person", +/// b" ; schema:name \"Foo\" . <bar>", +/// b" a schema:Person ; schema:name \"Bar\" .", +/// ]; +/// +/// let rdf_type = N3Term::NamedNode(rdf::TYPE.into_owned()); +/// let schema_person = N3Term::NamedNode(NamedNode::new("http://schema.org/Person")?); +/// let mut count = 0; +/// let mut parser = N3Parser::new().parse(); +/// let mut file_chunks = file.iter(); +/// while !parser.is_end() { +/// // We feed more data to the parser +/// if let Some(chunk) = file_chunks.next() { +/// parser.extend_from_slice(chunk); +/// } else { +/// parser.end(); // It's finished +/// } +/// // We read as many triples from the parser as possible +/// while let Some(triple) = parser.read_next() { +/// let triple = triple?; +/// if triple.predicate == rdf_type && triple.object == schema_person { +/// count += 1; +/// } +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelN3Reader { + parser: Parser<N3Recognizer>, +} + +impl LowLevelN3Reader { + /// Adds some extra bytes to the parser. Should be called when [`read_next`](Self::read_next) returns [`None`] and there is still unread data. + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.parser.extend_from_slice(other) + } + + /// Tell the parser that the file is finished. + /// + /// This triggers the parsing of the final bytes and might lead [`read_next`](Self::read_next) to return some extra values. + pub fn end(&mut self) { + self.parser.end() + } + + /// Returns if the parsing is finished i.e. [`end`](Self::end) has been called and [`read_next`](Self::read_next) is always going to return `None`. + pub fn is_end(&self) -> bool { + self.parser.is_end() + } + + /// Attempt to parse a new quad from the already provided data. + /// + /// Returns [`None`] if the parsing is finished or more data is required. + /// If it is the case more data should be fed using [`extend_from_slice`](Self::extend_from_slice). + pub fn read_next(&mut self) -> Option<Result<N3Quad, TurtleSyntaxError>> { + self.parser.read_next() + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse(); + /// reader.extend_from_slice(file); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> N3PrefixesIter<'_> { + N3PrefixesIter { + inner: self.parser.context.prefixes.iter(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::N3Parser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = N3Parser::new().parse(); + /// reader.extend_from_slice(file); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +#[derive(Clone)] +enum Predicate { + Regular(N3Term), + Inverted(N3Term), +} + +struct N3Recognizer { + stack: Vec<N3State>, + terms: Vec<N3Term>, + predicates: Vec<Predicate>, + contexts: Vec<BlankNode>, +} + +struct N3RecognizerContext { + lexer_options: N3LexerOptions, + prefixes: HashMap<String, Iri<String>>, +} + +impl RuleRecognizer for N3Recognizer { + type TokenRecognizer = N3Lexer; + type Output = N3Quad; + type Context = N3RecognizerContext; + + fn error_recovery_state(mut self) -> Self { + self.stack.clear(); + self.terms.clear(); + self.predicates.clear(); + self.contexts.clear(); + self + } + + fn recognize_next( + mut self, + token: N3Token<'_>, + context: &mut N3RecognizerContext, + results: &mut Vec<N3Quad>, + errors: &mut Vec<RuleRecognizerError>, + ) -> Self { + while let Some(rule) = self.stack.pop() { + match rule { + // [1] n3Doc ::= ( ( n3Statement ".") | sparqlDirective) * + // [2] n3Statement ::= n3Directive | triples + // [3] n3Directive ::= prefixID | base + // [4] sparqlDirective ::= sparqlBase | sparqlPrefix + // [5] sparqlBase ::= BASE IRIREF + // [6] sparqlPrefix ::= PREFIX PNAME_NS IRIREF + // [7] prefixID ::= "@prefix" PNAME_NS IRIREF + // [8] base ::= "@base" IRIREF + N3State::N3Doc => { + self.stack.push(N3State::N3Doc); + match token { + N3Token::PlainKeyword(k) if k.eq_ignore_ascii_case("base") => { + self.stack.push(N3State::BaseExpectIri); + return self; + } + N3Token::PlainKeyword(k) if k.eq_ignore_ascii_case("prefix") => { + self.stack.push(N3State::PrefixExpectPrefix); + return self; + } + N3Token::LangTag("prefix") => { + self.stack.push(N3State::N3DocExpectDot); + self.stack.push(N3State::PrefixExpectPrefix); + return self; + } + N3Token::LangTag("base") => { + self.stack.push(N3State::N3DocExpectDot); + self.stack.push(N3State::BaseExpectIri); + return self; + } + _ => { + self.stack.push(N3State::N3DocExpectDot); + self.stack.push(N3State::Triples); + } + } + } + N3State::N3DocExpectDot => { + if token == N3Token::Punctuation(".") { + return self; + } + errors.push("A dot is expected at the end of N3 statements".into()); + } + N3State::BaseExpectIri => return match token { + N3Token::IriRef(iri) => { + match Iri::parse_unchecked(iri) { + Ok(iri) => { + context.lexer_options.base_iri = Some(iri); + self + } + Err(e) => self.error(errors, format!("Invalid base IRI: {e}")) + } + } + _ => self.error(errors, "The BASE keyword should be followed by an IRI"), + }, + N3State::PrefixExpectPrefix => return match token { + N3Token::PrefixedName { prefix, local, .. } if local.is_empty() => { + self.stack.push(N3State::PrefixExpectIri { name: prefix.to_owned() }); + self + } + _ => { + self.error(errors, "The PREFIX keyword should be followed by a prefix like 'ex:'") + } + }, + N3State::PrefixExpectIri { name } => return match token { + N3Token::IriRef(iri) => { + match Iri::parse_unchecked(iri) { + Ok(iri) => { + context.prefixes.insert(name, iri); + self + } + Err(e) => self.error(errors, format!("Invalid prefix IRI: {e}")) + } + } + _ => self.error(errors, "The PREFIX declaration should be followed by a prefix and its value as an IRI"), + }, + // [9] triples ::= subject predicateObjectList? + N3State::Triples => { + self.stack.push(N3State::TriplesMiddle); + self.stack.push(N3State::Path); + } + N3State::TriplesMiddle => if matches!(token, N3Token::Punctuation("." | "]" | "}" | ")")) {} else { + self.stack.push(N3State::TriplesEnd); + self.stack.push(N3State::PredicateObjectList); + }, + N3State::TriplesEnd => { + self.terms.pop(); + } + // [10] predicateObjectList ::= verb objectList ( ";" ( verb objectList) ? ) * + N3State::PredicateObjectList => { + self.stack.push(N3State::PredicateObjectListEnd); + self.stack.push(N3State::ObjectsList); + self.stack.push(N3State::Verb); + } + N3State::PredicateObjectListEnd => { + self.predicates.pop(); + if token == N3Token::Punctuation(";") { + self.stack.push(N3State::PredicateObjectListPossibleContinuation); + return self; + } + } + N3State::PredicateObjectListPossibleContinuation => if token == N3Token::Punctuation(";") { + self.stack.push(N3State::PredicateObjectListPossibleContinuation); + return self; + } else if matches!(token, N3Token::Punctuation(";" | "." | "}" | "]" | ")")) {} else { + self.stack.push(N3State::PredicateObjectListEnd); + self.stack.push(N3State::ObjectsList); + self.stack.push(N3State::Verb); + }, + // [11] objectList ::= object ( "," object) * + N3State::ObjectsList => { + self.stack.push(N3State::ObjectsListEnd); + self.stack.push(N3State::Path); + } + N3State::ObjectsListEnd => { + let object = self.terms.pop().unwrap(); + let subject = self.terms.last().unwrap().clone(); + results.push(match self.predicates.last().unwrap().clone() { + Predicate::Regular(predicate) => self.quad( + subject, + predicate, + object, + ), + Predicate::Inverted(predicate) => self.quad( + object, + predicate, + subject, + ) + }); + if token == N3Token::Punctuation(",") { + self.stack.push(N3State::ObjectsListEnd); + self.stack.push(N3State::Path); + return self; + } + } + // [12] verb ::= predicate | "a" | ( "has" expression) | ( "is" expression "of") | "=" | "<=" | "=>" + // [14] predicate ::= expression | ( "<-" expression) + N3State::Verb => match token { + N3Token::PlainKeyword("a") => { + self.predicates.push(Predicate::Regular(rdf::TYPE.into())); + return self; + } + N3Token::PlainKeyword("has") => { + self.stack.push(N3State::AfterRegularVerb); + self.stack.push(N3State::Path); + return self; + } + N3Token::PlainKeyword("is") => { + self.stack.push(N3State::AfterVerbIs); + self.stack.push(N3State::Path); + return self; + } + N3Token::Punctuation("=") => { + self.predicates.push(Predicate::Regular(NamedNode::new_unchecked("http://www.w3.org/2002/07/owl#sameAs").into())); + return self; + } + N3Token::Punctuation("=>") => { + self.predicates.push(Predicate::Regular(NamedNode::new_unchecked("http://www.w3.org/2000/10/swap/log#implies").into())); + return self; + } + N3Token::Punctuation("<=") => { + self.predicates.push(Predicate::Inverted(NamedNode::new_unchecked("http://www.w3.org/2000/10/swap/log#implies").into())); + return self; + } + N3Token::Punctuation("<-") => { + self.stack.push(N3State::AfterInvertedVerb); + self.stack.push(N3State::Path); + return self; + } + _ => { + self.stack.push(N3State::AfterRegularVerb); + self.stack.push(N3State::Path); + } + } + N3State::AfterRegularVerb => { + self.predicates.push(Predicate::Regular(self.terms.pop().unwrap())); + } + N3State::AfterInvertedVerb => { + self.predicates.push(Predicate::Inverted(self.terms.pop().unwrap())); + } + N3State::AfterVerbIs => return match token { + N3Token::PlainKeyword("of") => { + self.predicates.push(Predicate::Inverted(self.terms.pop().unwrap())); + self + } + _ => { + self.error(errors, "The keyword 'is' should be followed by a predicate then by the keyword 'of'") + } + }, + // [13] subject ::= expression + // [15] object ::= expression + // [16] expression ::= path + // [17] path ::= pathItem ( ( "!" path) | ( "^" path) ) ? + N3State::Path => { + self.stack.push(N3State::PathFollowUp); + self.stack.push(N3State::PathItem); + } + N3State::PathFollowUp => match token { + N3Token::Punctuation("!") => { + self.stack.push(N3State::PathAfterIndicator { is_inverse: false }); + self.stack.push(N3State::PathItem); + return self; + } + N3Token::Punctuation("^") => { + self.stack.push(N3State::PathAfterIndicator { is_inverse: true }); + self.stack.push(N3State::PathItem); + return self; + } + _ => () + }, + N3State::PathAfterIndicator { is_inverse } => { + let predicate = self.terms.pop().unwrap(); + let previous = self.terms.pop().unwrap(); + let current = BlankNode::default(); + results.push(if is_inverse { self.quad(current.clone(), predicate, previous) } else { self.quad(previous, predicate, current.clone()) }); + self.terms.push(current.into()); + self.stack.push(N3State::PathFollowUp); + } + // [18] pathItem ::= iri | blankNode | quickVar | collection | blankNodePropertyList | iriPropertyList | literal | formula + // [19] literal ::= rdfLiteral | numericLiteral | BOOLEAN_LITERAL + // [20] blankNodePropertyList ::= "[" predicateObjectList "]" + // [21] iriPropertyList ::= IPLSTART iri predicateObjectList "]" + // [22] collection ::= "(" object* ")" + // [23] formula ::= "{" formulaContent? "}" + // [25] numericLiteral ::= DOUBLE | DECIMAL | INTEGER + // [26] rdfLiteral ::= STRING ( LANGTAG | ( "^^" iri) ) ? + // [27] iri ::= IRIREF | prefixedName + // [28] prefixedName ::= PNAME_LN | PNAME_NS + // [29] blankNode ::= BLANK_NODE_LABEL | ANON + // [30] quickVar ::= QUICK_VAR_NAME + N3State::PathItem => { + return match token { + N3Token::IriRef(iri) => { + self.terms.push(NamedNode::new_unchecked(iri).into()); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.terms.push(t.into()); + self + } + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(bnode) => { + self.terms.push(BlankNode::new_unchecked(bnode).into()); + self + } + N3Token::Variable(name) => { + self.terms.push(Variable::new_unchecked(name).into()); + self + } + N3Token::Punctuation("[") => { + self.stack.push(N3State::PropertyListMiddle); + self + } + N3Token::Punctuation("(") => { + self.stack.push(N3State::CollectionBeginning); + self + } + N3Token::String(value) => { + self.stack.push(N3State::LiteralPossibleSuffix { value }); + self + } + N3Token::Integer(v) => { + self.terms.push(Literal::new_typed_literal(v, xsd::INTEGER).into()); + self + } + N3Token::Decimal(v) => { + self.terms.push(Literal::new_typed_literal(v, xsd::DECIMAL).into()); + self + } + N3Token::Double(v) => { + self.terms.push(Literal::new_typed_literal(v, xsd::DOUBLE).into()); + self + } + N3Token::PlainKeyword("true") => { + self.terms.push(Literal::new_typed_literal("true", xsd::BOOLEAN).into()); + self + } + N3Token::PlainKeyword("false") => { + self.terms.push(Literal::new_typed_literal("false", xsd::BOOLEAN).into()); + self + } + N3Token::Punctuation("{") => { + self.contexts.push(BlankNode::default()); + self.stack.push(N3State::FormulaContent); + self + } + _ => + self.error(errors, "TOKEN is not a valid RDF value") + + } + } + N3State::PropertyListMiddle => match token { + N3Token::Punctuation("]") => { + self.terms.push(BlankNode::default().into()); + return self; + } + N3Token::PlainKeyword("id") => { + self.stack.push(N3State::IriPropertyList); + return self; + } + _ => { + self.terms.push(BlankNode::default().into()); + self.stack.push(N3State::PropertyListEnd); + self.stack.push(N3State::PredicateObjectList); + } + } + N3State::PropertyListEnd => if token == N3Token::Punctuation("]") { + return self; + } else { + errors.push("blank node property lists should end with a ']'".into()); + } + N3State::IriPropertyList => return match token { + N3Token::IriRef(id) => { + self.terms.push(NamedNode::new_unchecked(id).into()); + self.stack.push(N3State::PropertyListEnd); + self.stack.push(N3State::PredicateObjectList); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.terms.push(t.into()); + self.stack.push(N3State::PropertyListEnd); + self.stack.push(N3State::PredicateObjectList); + self + } + Err(e) => { + self.error(errors, e) + } + } + _ => { + self.error(errors, "The '[ id' construction should be followed by an IRI") + } + }, + N3State::CollectionBeginning => if let N3Token::Punctuation(")") = token { + self.terms.push(rdf::NIL.into()); + return self; + } else { + let root = BlankNode::default(); + self.terms.push(root.clone().into()); + self.terms.push(root.into()); + self.stack.push(N3State::CollectionPossibleEnd); + self.stack.push(N3State::Path); + }, + N3State::CollectionPossibleEnd => { + let value = self.terms.pop().unwrap(); + let old = self.terms.pop().unwrap(); + results.push(self.quad( + old.clone(), + rdf::FIRST, + value, + )); + if let N3Token::Punctuation(")") = token { + results.push(self.quad( + old, + rdf::REST, + rdf::NIL, + )); + return self; + } + let new = BlankNode::default(); + results.push(self.quad( + old, + rdf::REST, + new.clone(), + )); + self.terms.push(new.into()); + self.stack.push(N3State::CollectionPossibleEnd); + self.stack.push(N3State::Path); + } + N3State::LiteralPossibleSuffix { value } => { + match token { + N3Token::LangTag(lang) => { + self.terms.push(Literal::new_language_tagged_literal_unchecked(value, lang.to_ascii_lowercase()).into()); + return self; + } + N3Token::Punctuation("^^") => { + self.stack.push(N3State::LiteralExpectDatatype { value }); + return self; + } + _ => { + self.terms.push(Literal::new_simple_literal(value).into()); + } + } + } + N3State::LiteralExpectDatatype { value } => { + match token { + N3Token::IriRef(datatype) => { + self.terms.push(Literal::new_typed_literal(value, NamedNode::new_unchecked(datatype)).into()); + return self; + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(datatype) => { + self.terms.push(Literal::new_typed_literal(value, datatype).into()); + return self; + } + Err(e) => { + return self.error(errors, e); + } + } + _ => { + errors.push("Expecting a datatype IRI after '^^, found TOKEN".into()); + self.stack.clear(); + } + } + } + // [24] formulaContent ::= ( n3Statement ( "." formulaContent? ) ? ) | ( sparqlDirective formulaContent? ) + N3State::FormulaContent => { + match token { + N3Token::Punctuation("}") => { + self.terms.push(self.contexts.pop().unwrap().into()); + return self; + } + N3Token::PlainKeyword(k)if k.eq_ignore_ascii_case("base") => { + self.stack.push(N3State::FormulaContent); + self.stack.push(N3State::BaseExpectIri); + return self; + } + N3Token::PlainKeyword(k)if k.eq_ignore_ascii_case("prefix") => { + self.stack.push(N3State::FormulaContent); + self.stack.push(N3State::PrefixExpectPrefix); + return self; + } + N3Token::LangTag("prefix") => { + self.stack.push(N3State::FormulaContentExpectDot); + self.stack.push(N3State::PrefixExpectPrefix); + return self; + } + N3Token::LangTag("base") => { + self.stack.push(N3State::FormulaContentExpectDot); + self.stack.push(N3State::BaseExpectIri); + return self; + } + _ => { + self.stack.push(N3State::FormulaContentExpectDot); + self.stack.push(N3State::Triples); + } + } + } + N3State::FormulaContentExpectDot => { + match token { + N3Token::Punctuation("}") => { + self.terms.push(self.contexts.pop().unwrap().into()); + return self; + } + N3Token::Punctuation(".") => { + self.stack.push(N3State::FormulaContent); + return self; + } + _ => { + errors.push("A dot is expected at the end of N3 statements".into()); + self.stack.push(N3State::FormulaContent); + } + } + } + } + } + // Empty stack + if token == N3Token::Punctuation(".") { + self.stack.push(N3State::N3Doc); + self + } else { + self + } + } + + fn recognize_end( + self, + _state: &mut N3RecognizerContext, + _results: &mut Vec<Self::Output>, + errors: &mut Vec<RuleRecognizerError>, + ) { + match &*self.stack { + [] | [N3State::N3Doc] => (), + _ => errors.push("Unexpected end".into()), // TODO + } + } + + fn lexer_options(context: &N3RecognizerContext) -> &N3LexerOptions { + &context.lexer_options + } +} + +impl N3Recognizer { + pub fn new_parser( + unchecked: bool, + base_iri: Option<Iri<String>>, + prefixes: HashMap<String, Iri<String>>, + ) -> Parser<Self> { + Parser::new( + Lexer::new( + N3Lexer::new(N3LexerMode::N3, unchecked), + MIN_BUFFER_SIZE, + MAX_BUFFER_SIZE, + true, + Some(b"#"), + ), + Self { + stack: vec![N3State::N3Doc], + terms: Vec::new(), + predicates: Vec::new(), + contexts: Vec::new(), + }, + N3RecognizerContext { + lexer_options: N3LexerOptions { base_iri }, + prefixes, + }, + ) + } + + #[must_use] + fn error( + mut self, + errors: &mut Vec<RuleRecognizerError>, + msg: impl Into<RuleRecognizerError>, + ) -> Self { + errors.push(msg.into()); + self.stack.clear(); + self + } + + fn quad( + &self, + subject: impl Into<N3Term>, + predicate: impl Into<N3Term>, + object: impl Into<N3Term>, + ) -> N3Quad { + N3Quad { + subject: subject.into(), + predicate: predicate.into(), + object: object.into(), + graph_name: self + .contexts + .last() + .map_or(GraphName::DefaultGraph, |g| g.clone().into()), + } + } +} + +#[derive(Debug)] +enum N3State { + N3Doc, + N3DocExpectDot, + BaseExpectIri, + PrefixExpectPrefix, + PrefixExpectIri { name: String }, + Triples, + TriplesMiddle, + TriplesEnd, + PredicateObjectList, + PredicateObjectListEnd, + PredicateObjectListPossibleContinuation, + ObjectsList, + ObjectsListEnd, + Verb, + AfterRegularVerb, + AfterInvertedVerb, + AfterVerbIs, + Path, + PathFollowUp, + PathAfterIndicator { is_inverse: bool }, + PathItem, + PropertyListMiddle, + PropertyListEnd, + IriPropertyList, + CollectionBeginning, + CollectionPossibleEnd, + LiteralPossibleSuffix { value: String }, + LiteralExpectDatatype { value: String }, + FormulaContent, + FormulaContentExpectDot, +} + +/// Iterator on the file prefixes. +/// +/// See [`LowLevelN3Reader::prefixes`]. +pub struct N3PrefixesIter<'a> { + inner: Iter<'a, String, Iri<String>>, +} + +impl<'a> Iterator for N3PrefixesIter<'a> { + type Item = (&'a str, &'a str); + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + let (key, value) = self.inner.next()?; + Some((key.as_str(), value.as_str())) + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.inner.size_hint() + } +} diff --git a/lib/oxttl/src/nquads.rs b/lib/oxttl/src/nquads.rs new file mode 100644 index 00000000..9f48bc76 --- /dev/null +++ b/lib/oxttl/src/nquads.rs @@ -0,0 +1,564 @@ +//! A [N-Quads](https://www.w3.org/TR/n-quads/) streaming parser implemented by [`NQuadsParser`] +//! and a serializer implemented by [`NQuadsSerializer`]. + +use crate::line_formats::NQuadsRecognizer; +#[cfg(feature = "async-tokio")] +use crate::toolkit::FromTokioAsyncReadIterator; +use crate::toolkit::{FromReadIterator, Parser, TurtleParseError, TurtleSyntaxError}; +use oxrdf::{Quad, QuadRef}; +use std::io::{self, Read, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; + +/// A [N-Quads](https://www.w3.org/TR/n-quads/) streaming parser. +/// +/// Support for [N-Quads-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-quads-star) is available behind the `rdf-star` feature and the [`NQuadsParser::with_quoted_triples`] option. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NQuadsParser; +/// +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for quad in NQuadsParser::new().parse_read(file.as_ref()) { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct NQuadsParser { + unchecked: bool, + #[cfg(feature = "rdf-star")] + with_quoted_triples: bool, +} + +impl NQuadsParser { + /// Builds a new [`NQuadsParser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + /// Enables [N-Quads-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-quads-star). + #[cfg(feature = "rdf-star")] + #[inline] + pub fn with_quoted_triples(mut self) -> Self { + self.with_quoted_triples = true; + self + } + + /// Parses a N-Quads file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NQuadsParser; + /// + /// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/foo> <http://schema.org/name> "Foo" . + /// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// for quad in NQuadsParser::new().parse_read(file.as_ref()) { + /// let quad = quad?; + /// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadNQuadsReader<R> { + FromReadNQuadsReader { + inner: self.parse().parser.parse_read(read), + } + } + + /// Parses a N-Quads file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NQuadsParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/foo> <http://schema.org/name> "Foo" . + /// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); + /// let mut count = 0; + /// let mut parser = NQuadsParser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadNQuadsReader<R> { + FromTokioAsyncReadNQuadsReader { + inner: self.parse().parser.parse_tokio_async_read(read), + } + } + + /// Allows to parse a N-Quads file by using a low-level API. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NQuadsParser; + /// + /// let file: [&[u8]; 4] = [ + /// b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// b"<http://example.com/foo> <http://schema.org/name> \"Foo\" .\n", + /// b"<http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// b"<http://example.com/bar> <http://schema.org/name> \"Bar\" .\n" + /// ]; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// let mut parser = NQuadsParser::new().parse(); + /// let mut file_chunks = file.iter(); + /// while !parser.is_end() { + /// // We feed more data to the parser + /// if let Some(chunk) = file_chunks.next() { + /// parser.extend_from_slice(chunk); + /// } else { + /// parser.end(); // It's finished + /// } + /// // We read as many quads from the parser as possible + /// while let Some(quad) = parser.read_next() { + /// let quad = quad?; + /// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[allow(clippy::unused_self)] + pub fn parse(self) -> LowLevelNQuadsReader { + LowLevelNQuadsReader { + parser: NQuadsRecognizer::new_parser( + true, + #[cfg(feature = "rdf-star")] + self.with_quoted_triples, + self.unchecked, + ), + } + } +} + +/// Parses a N-Quads file from a [`Read`] implementation. Can be built using [`NQuadsParser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NQuadsParser; +/// +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for quad in NQuadsParser::new().parse_read(file.as_ref()) { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadNQuadsReader<R: Read> { + inner: FromReadIterator<R, NQuadsRecognizer>, +} + +impl<R: Read> Iterator for FromReadNQuadsReader<R> { + type Item = Result<Quad, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + self.inner.next() + } +} + +/// Parses a N-Quads file from a [`AsyncRead`] implementation. Can be built using [`NQuadsParser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NQuadsParser; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxttl::TurtleParseError> { +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); +/// let mut count = 0; +/// let mut parser = NQuadsParser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadNQuadsReader<R: AsyncRead + Unpin> { + inner: FromTokioAsyncReadIterator<R, NQuadsRecognizer>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadNQuadsReader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<Quad, TurtleParseError>> { + Some(self.inner.next().await?.map(Into::into)) + } +} + +/// Parses a N-Quads file by using a low-level API. Can be built using [`NQuadsParser::parse`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NQuadsParser; +/// +/// let file: [&[u8]; 4] = [ +/// b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// b"<http://example.com/foo> <http://schema.org/name> \"Foo\" .\n", +/// b"<http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// b"<http://example.com/bar> <http://schema.org/name> \"Bar\" .\n" +/// ]; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// let mut parser = NQuadsParser::new().parse(); +/// let mut file_chunks = file.iter(); +/// while !parser.is_end() { +/// // We feed more data to the parser +/// if let Some(chunk) = file_chunks.next() { +/// parser.extend_from_slice(chunk); +/// } else { +/// parser.end(); // It's finished +/// } +/// // We read as many quads from the parser as possible +/// while let Some(quad) = parser.read_next() { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelNQuadsReader { + parser: Parser<NQuadsRecognizer>, +} + +impl LowLevelNQuadsReader { + /// Adds some extra bytes to the parser. Should be called when [`read_next`](Self::read_next) returns [`None`] and there is still unread data. + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.parser.extend_from_slice(other) + } + + /// Tell the parser that the file is finished. + /// + /// This triggers the parsing of the final bytes and might lead [`read_next`](Self::read_next) to return some extra values. + pub fn end(&mut self) { + self.parser.end() + } + + /// Returns if the parsing is finished i.e. [`end`](Self::end) has been called and [`read_next`](Self::read_next) is always going to return `None`. + pub fn is_end(&self) -> bool { + self.parser.is_end() + } + + /// Attempt to parse a new quad from the already provided data. + /// + /// Returns [`None`] if the parsing is finished or more data is required. + /// If it is the case more data should be fed using [`extend_from_slice`](Self::extend_from_slice). + pub fn read_next(&mut self) -> Option<Result<Quad, TurtleSyntaxError>> { + self.parser.read_next() + } +} + +/// A [N-Quads](https://www.w3.org/TR/n-quads/) serializer. +/// +/// Support for [N-Quads-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-quads-star) is available behind the `rdf-star` feature. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::NQuadsSerializer; +/// +/// let mut writer = NQuadsSerializer::new().serialize_to_write(Vec::new()); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ))?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", +/// writer.finish().as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct NQuadsSerializer; + +impl NQuadsSerializer { + /// Builds a new [`NQuadsSerializer`]. + #[inline] + pub fn new() -> Self { + Self + } + + /// Writes a N-Quads file to a [`Write`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::NQuadsSerializer; + /// + /// let mut writer = NQuadsSerializer::new().serialize_to_write(Vec::new()); + /// writer.write_quad(QuadRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// NamedNodeRef::new("http://example.com")?, + /// ))?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", + /// writer.finish().as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteNQuadsWriter<W> { + ToWriteNQuadsWriter { + write, + writer: self.serialize(), + } + } + + /// Writes a N-Quads file to a [`AsyncWrite`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::NQuadsSerializer; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let mut writer = NQuadsSerializer::new().serialize_to_tokio_async_write(Vec::new()); + /// writer.write_quad(QuadRef::new( + /// NamedNodeRef::new_unchecked("http://example.com#me"), + /// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), + /// NamedNodeRef::new_unchecked("http://schema.org/Person"), + /// NamedNodeRef::new_unchecked("http://example.com"), + /// )).await?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", + /// writer.finish().as_slice() + /// ); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteNQuadsWriter<W> { + ToTokioAsyncWriteNQuadsWriter { + write, + writer: self.serialize(), + buffer: Vec::new(), + } + } + + /// Builds a low-level N-Quads writer. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::NQuadsSerializer; + /// + /// let mut buf = Vec::new(); + /// let mut writer = NQuadsSerializer::new().serialize(); + /// writer.write_quad(QuadRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// NamedNodeRef::new("http://example.com")?, + /// ), &mut buf)?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", + /// buf.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[allow(clippy::unused_self)] + pub fn serialize(self) -> LowLevelNQuadsWriter { + LowLevelNQuadsWriter + } +} + +/// Writes a N-Quads file to a [`Write`] implementation. Can be built using [`NQuadsSerializer::serialize_to_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::NQuadsSerializer; +/// +/// let mut writer = NQuadsSerializer::new().serialize_to_write(Vec::new()); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ))?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", +/// writer.finish().as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteNQuadsWriter<W: Write> { + write: W, + writer: LowLevelNQuadsWriter, +} + +impl<W: Write> ToWriteNQuadsWriter<W> { + /// Writes an extra quad. + pub fn write_quad<'a>(&mut self, q: impl Into<QuadRef<'a>>) -> io::Result<()> { + self.writer.write_quad(q, &mut self.write) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(self) -> W { + self.write + } +} + +/// Writes a N-Quads file to a [`AsyncWrite`] implementation. Can be built using [`NQuadsSerializer::serialize_to_tokio_async_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::NQuadsSerializer; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> std::io::Result<()> { +/// let mut writer = NQuadsSerializer::new().serialize_to_tokio_async_write(Vec::new()); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new_unchecked("http://example.com#me"), +/// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), +/// NamedNodeRef::new_unchecked("http://schema.org/Person"), +/// NamedNodeRef::new_unchecked("http://example.com"), +/// )).await?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", +/// writer.finish().as_slice() +/// ); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteNQuadsWriter<W: AsyncWrite + Unpin> { + write: W, + writer: LowLevelNQuadsWriter, + buffer: Vec<u8>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteNQuadsWriter<W> { + /// Writes an extra quad. + pub async fn write_quad<'a>(&mut self, q: impl Into<QuadRef<'a>>) -> io::Result<()> { + self.writer.write_quad(q, &mut self.buffer)?; + self.write.write_all(&self.buffer).await?; + self.buffer.clear(); + Ok(()) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(self) -> W { + self.write + } +} + +/// Writes a N-Quads file by using a low-level API. Can be built using [`NQuadsSerializer::serialize`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::NQuadsSerializer; +/// +/// let mut buf = Vec::new(); +/// let mut writer = NQuadsSerializer::new().serialize(); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ), &mut buf)?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> <http://example.com> .\n", +/// buf.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelNQuadsWriter; + +impl LowLevelNQuadsWriter { + /// Writes an extra quad. + #[allow(clippy::unused_self)] + pub fn write_quad<'a>( + &mut self, + q: impl Into<QuadRef<'a>>, + mut write: impl Write, + ) -> io::Result<()> { + writeln!(write, "{} .", q.into()) + } +} diff --git a/lib/oxttl/src/ntriples.rs b/lib/oxttl/src/ntriples.rs new file mode 100644 index 00000000..ca033959 --- /dev/null +++ b/lib/oxttl/src/ntriples.rs @@ -0,0 +1,580 @@ +//! A [N-Triples](https://www.w3.org/TR/n-triples/) streaming parser implemented by [`NTriplesParser`] +//! and a serializer implemented by [`NTriplesSerializer`]. + +use crate::line_formats::NQuadsRecognizer; +#[cfg(feature = "async-tokio")] +use crate::toolkit::FromTokioAsyncReadIterator; +use crate::toolkit::{FromReadIterator, Parser, TurtleParseError, TurtleSyntaxError}; +use oxrdf::{Triple, TripleRef}; +use std::io::{self, Read, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; + +/// A [N-Triples](https://www.w3.org/TR/n-triples/) streaming parser. +/// +/// Support for [N-Triples-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-triples-star) is available behind the `rdf-star` feature and the [`NTriplesParser::with_quoted_triples`] option. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NTriplesParser; +/// +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in NTriplesParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct NTriplesParser { + unchecked: bool, + #[cfg(feature = "rdf-star")] + with_quoted_triples: bool, +} + +impl NTriplesParser { + /// Builds a new [`NTriplesParser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. /// + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + /// Enables [N-Triples-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-triples-star). + #[cfg(feature = "rdf-star")] + #[inline] + pub fn with_quoted_triples(mut self) -> Self { + self.with_quoted_triples = true; + self + } + + /// Parses a N-Triples file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NTriplesParser; + /// + /// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/foo> <http://schema.org/name> "Foo" . + /// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// for triple in NTriplesParser::new().parse_read(file.as_ref()) { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadNTriplesReader<R> { + FromReadNTriplesReader { + inner: self.parse().parser.parse_read(read), + } + } + + /// Parses a N-Triples file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NTriplesParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/foo> <http://schema.org/name> "Foo" . + /// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . + /// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); + /// let mut count = 0; + /// let mut parser = NTriplesParser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadNTriplesReader<R> { + FromTokioAsyncReadNTriplesReader { + inner: self.parse().parser.parse_tokio_async_read(read), + } + } + + /// Allows to parse a N-Triples file by using a low-level API. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::{NamedNodeRef, vocab::rdf}; + /// use oxttl::NTriplesParser; + /// + /// let file: [&[u8]; 4] = [ + /// b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// b"<http://example.com/foo> <http://schema.org/name> \"Foo\" .\n", + /// b"<http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// b"<http://example.com/bar> <http://schema.org/name> \"Bar\" .\n" + /// ]; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// let mut parser = NTriplesParser::new().parse(); + /// let mut file_chunks = file.iter(); + /// while !parser.is_end() { + /// // We feed more data to the parser + /// if let Some(chunk) = file_chunks.next() { + /// parser.extend_from_slice(chunk); + /// } else { + /// parser.end(); // It's finished + /// } + /// // We read as many triples from the parser as possible + /// while let Some(triple) = parser.read_next() { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[allow(clippy::unused_self)] + pub fn parse(self) -> LowLevelNTriplesReader { + LowLevelNTriplesReader { + parser: NQuadsRecognizer::new_parser( + false, + #[cfg(feature = "rdf-star")] + self.with_quoted_triples, + self.unchecked, + ), + } + } +} + +/// Parses a N-Triples file from a [`Read`] implementation. Can be built using [`NTriplesParser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NTriplesParser; +/// +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in NTriplesParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadNTriplesReader<R: Read> { + inner: FromReadIterator<R, NQuadsRecognizer>, +} + +impl<R: Read> Iterator for FromReadNTriplesReader<R> { + type Item = Result<Triple, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some(self.inner.next()?.map(Into::into)) + } +} + +/// Parses a N-Triples file from a [`AsyncRead`] implementation. Can be built using [`NTriplesParser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NTriplesParser; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxttl::TurtleParseError> { +/// let file = br#"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/foo> <http://schema.org/name> "Foo" . +/// <http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> . +/// <http://example.com/bar> <http://schema.org/name> "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); +/// let mut count = 0; +/// let mut parser = NTriplesParser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadNTriplesReader<R: AsyncRead + Unpin> { + inner: FromTokioAsyncReadIterator<R, NQuadsRecognizer>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadNTriplesReader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<Triple, TurtleParseError>> { + Some(self.inner.next().await?.map(Into::into)) + } +} + +/// Parses a N-Triples file by using a low-level API. Can be built using [`NTriplesParser::parse`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::{NamedNodeRef, vocab::rdf}; +/// use oxttl::NTriplesParser; +/// +/// let file: [&[u8]; 4] = [ +/// b"<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// b"<http://example.com/foo> <http://schema.org/name> \"Foo\" .\n", +/// b"<http://example.com/bar> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// b"<http://example.com/bar> <http://schema.org/name> \"Bar\" .\n" +/// ]; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// let mut parser = NTriplesParser::new().parse(); +/// let mut file_chunks = file.iter(); +/// while !parser.is_end() { +/// // We feed more data to the parser +/// if let Some(chunk) = file_chunks.next() { +/// parser.extend_from_slice(chunk); +/// } else { +/// parser.end(); // It's finished +/// } +/// // We read as many triples from the parser as possible +/// while let Some(triple) = parser.read_next() { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelNTriplesReader { + parser: Parser<NQuadsRecognizer>, +} + +impl LowLevelNTriplesReader { + /// Adds some extra bytes to the parser. Should be called when [`read_next`](Self::read_next) returns [`None`] and there is still unread data. + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.parser.extend_from_slice(other) + } + + /// Tell the parser that the file is finished. + /// + /// This triggers the parsing of the final bytes and might lead [`read_next`](Self::read_next) to return some extra values. + pub fn end(&mut self) { + self.parser.end() + } + + /// Returns if the parsing is finished i.e. [`end`](Self::end) has been called and [`read_next`](Self::read_next) is always going to return `None`. + pub fn is_end(&self) -> bool { + self.parser.is_end() + } + + /// Attempt to parse a new triple from the already provided data. + /// + /// Returns [`None`] if the parsing is finished or more data is required. + /// If it is the case more data should be fed using [`extend_from_slice`](Self::extend_from_slice). + pub fn read_next(&mut self) -> Option<Result<Triple, TurtleSyntaxError>> { + Some(self.parser.read_next()?.map(Into::into)) + } +} + +/// A [canonical](https://www.w3.org/TR/n-triples/#canonical-ntriples) [N-Triples](https://www.w3.org/TR/n-triples/) serializer. +/// +/// Support for [N-Triples-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#n-triples-star) is available behind the `rdf-star` feature. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::NTriplesSerializer; +/// +/// let mut writer = NTriplesSerializer::new().serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// writer.finish().as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct NTriplesSerializer; + +impl NTriplesSerializer { + /// Builds a new [`NTriplesSerializer`]. + #[inline] + pub fn new() -> Self { + Self + } + + /// Writes a N-Triples file to a [`Write`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::NTriplesSerializer; + /// + /// let mut writer = NTriplesSerializer::new().serialize_to_write(Vec::new()); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// ))?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// writer.finish().as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteNTriplesWriter<W> { + ToWriteNTriplesWriter { + write, + writer: self.serialize(), + } + } + + /// Writes a N-Triples file to a [`AsyncWrite`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::NTriplesSerializer; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let mut writer = NTriplesSerializer::new().serialize_to_tokio_async_write(Vec::new()); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new_unchecked("http://example.com#me"), + /// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), + /// NamedNodeRef::new_unchecked("http://schema.org/Person"), + /// )).await?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// writer.finish().as_slice() + /// ); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteNTriplesWriter<W> { + ToTokioAsyncWriteNTriplesWriter { + write, + writer: self.serialize(), + buffer: Vec::new(), + } + } + + /// Builds a low-level N-Triples writer. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::NTriplesSerializer; + /// + /// let mut buf = Vec::new(); + /// let mut writer = NTriplesSerializer::new().serialize(); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// ), &mut buf)?; + /// assert_eq!( + /// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", + /// buf.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + #[allow(clippy::unused_self)] + pub fn serialize(self) -> LowLevelNTriplesWriter { + LowLevelNTriplesWriter + } +} + +/// Writes a N-Triples file to a [`Write`] implementation. Can be built using [`NTriplesSerializer::serialize_to_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::NTriplesSerializer; +/// +/// let mut writer = NTriplesSerializer::new().serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// writer.finish().as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteNTriplesWriter<W: Write> { + write: W, + writer: LowLevelNTriplesWriter, +} + +impl<W: Write> ToWriteNTriplesWriter<W> { + /// Writes an extra triple. + pub fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.writer.write_triple(t, &mut self.write) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(self) -> W { + self.write + } +} + +/// Writes a N-Triples file to a [`AsyncWrite`] implementation. Can be built using [`NTriplesSerializer::serialize_to_tokio_async_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::NTriplesSerializer; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> std::io::Result<()> { +/// let mut writer = NTriplesSerializer::new().serialize_to_tokio_async_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new_unchecked("http://example.com#me"), +/// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), +/// NamedNodeRef::new_unchecked("http://schema.org/Person") +/// )).await?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// writer.finish().as_slice() +/// ); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteNTriplesWriter<W: AsyncWrite + Unpin> { + write: W, + writer: LowLevelNTriplesWriter, + buffer: Vec<u8>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteNTriplesWriter<W> { + /// Writes an extra triple. + pub async fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.writer.write_triple(t, &mut self.buffer)?; + self.write.write_all(&self.buffer).await?; + self.buffer.clear(); + Ok(()) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(self) -> W { + self.write + } +} + +/// Writes a N-Triples file by using a low-level API. Can be built using [`NTriplesSerializer::serialize`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::NTriplesSerializer; +/// +/// let mut buf = Vec::new(); +/// let mut writer = NTriplesSerializer::new().serialize(); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ), &mut buf)?; +/// assert_eq!( +/// b"<http://example.com#me> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://schema.org/Person> .\n", +/// buf.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelNTriplesWriter; + +impl LowLevelNTriplesWriter { + /// Writes an extra triple. + #[allow(clippy::unused_self)] + pub fn write_triple<'a>( + &mut self, + t: impl Into<TripleRef<'a>>, + mut write: impl Write, + ) -> io::Result<()> { + writeln!(write, "{} .", t.into()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use oxrdf::{Literal, NamedNode}; + + #[test] + fn unchecked_parsing() { + let triples = NTriplesParser::new() + .unchecked() + .parse_read(r#"<foo> <bar> "baz"@toolonglangtag ."#.as_bytes()) + .collect::<Result<Vec<_>, _>>() + .unwrap(); + assert_eq!( + triples, + [Triple::new( + NamedNode::new_unchecked("foo"), + NamedNode::new_unchecked("bar"), + Literal::new_language_tagged_literal_unchecked("baz", "toolonglangtag"), + )] + ) + } +} diff --git a/lib/oxttl/src/terse.rs b/lib/oxttl/src/terse.rs new file mode 100644 index 00000000..c233c735 --- /dev/null +++ b/lib/oxttl/src/terse.rs @@ -0,0 +1,953 @@ +//! Shared parser implementation for Turtle and TriG. + +use crate::lexer::{resolve_local_name, N3Lexer, N3LexerMode, N3LexerOptions, N3Token}; +use crate::toolkit::{Lexer, Parser, RuleRecognizer, RuleRecognizerError}; +use crate::{MAX_BUFFER_SIZE, MIN_BUFFER_SIZE}; +use oxiri::Iri; +use oxrdf::vocab::{rdf, xsd}; +#[cfg(feature = "rdf-star")] +use oxrdf::Triple; +use oxrdf::{BlankNode, GraphName, Literal, NamedNode, NamedOrBlankNode, Quad, Subject, Term}; +use std::collections::hash_map::Iter; +use std::collections::HashMap; + +pub struct TriGRecognizer { + stack: Vec<TriGState>, + cur_subject: Vec<Subject>, + cur_predicate: Vec<NamedNode>, + cur_object: Vec<Term>, + cur_graph: GraphName, +} + +#[allow(clippy::partial_pub_fields)] +pub struct TriGRecognizerContext { + pub lexer_options: N3LexerOptions, + pub with_graph_name: bool, + #[cfg(feature = "rdf-star")] + pub with_quoted_triples: bool, + prefixes: HashMap<String, Iri<String>>, +} + +impl TriGRecognizerContext { + pub fn prefixes(&self) -> Iter<'_, String, Iri<String>> { + self.prefixes.iter() + } +} + +impl RuleRecognizer for TriGRecognizer { + type TokenRecognizer = N3Lexer; + type Output = Quad; + type Context = TriGRecognizerContext; + + fn error_recovery_state(mut self) -> Self { + self.stack.clear(); + self.cur_subject.clear(); + self.cur_predicate.clear(); + self.cur_object.clear(); + self.cur_graph = GraphName::DefaultGraph; + self + } + + fn recognize_next( + mut self, + token: N3Token<'_>, + context: &mut TriGRecognizerContext, + results: &mut Vec<Quad>, + errors: &mut Vec<RuleRecognizerError>, + ) -> Self { + if let Some(rule) = self.stack.pop() { + match rule { + // [1g] trigDoc ::= (directive | block)* + // [2g] block ::= triplesOrGraph | wrappedGraph | triples2 | "GRAPH" labelOrSubject wrappedGraph + // [3] directive ::= prefixID | base | sparqlPrefix | sparqlBase + // [4] prefixID ::= '@prefix' PNAME_NS IRIREF '.' + // [5] base ::= '@base' IRIREF '.' + // [5s] sparqlPrefix ::= "PREFIX" PNAME_NS IRIREF + // [6s] sparqlBase ::= "BASE" IRIREF + TriGState::TriGDoc => { + self.cur_graph = GraphName::DefaultGraph; + self.stack.push(TriGState::TriGDoc); + match token { + N3Token::PlainKeyword(k) if k.eq_ignore_ascii_case("base") => { + self.stack.push(TriGState::BaseExpectIri); + self + } + N3Token::PlainKeyword(k) if k.eq_ignore_ascii_case("prefix") => { + self.stack.push(TriGState::PrefixExpectPrefix); + self + } + N3Token::LangTag("prefix") => { + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::PrefixExpectPrefix); + self + } + N3Token::LangTag("base") => { + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::BaseExpectIri); + self + } + N3Token::PlainKeyword(k) if k.eq_ignore_ascii_case("graph") && context.with_graph_name => { + self.stack.push(TriGState::WrappedGraph); + self.stack.push(TriGState::GraphName); + self + } + N3Token::Punctuation("{") if context.with_graph_name => { + self.stack.push(TriGState::WrappedGraph); + self.recognize_next(token, context,results, errors) + } + _ => { + self.stack.push(TriGState::TriplesOrGraph); + self.recognize_next(token, context,results, errors) + } + } + }, + TriGState::ExpectDot => { + self.cur_subject.pop(); + if token == N3Token::Punctuation(".") { + self + } else { + errors.push("A dot is expected at the end of statements".into()); + self.recognize_next(token, context,results, errors) + } + }, + TriGState::BaseExpectIri => match token { + N3Token::IriRef(iri) => { + match Iri::parse_unchecked(iri) { + Ok(iri) => { + context.lexer_options.base_iri = Some(iri); + self + } + Err(e) => self.error(errors, format!("Invalid base IRI: {e}")) + } + } + _ => self.error(errors, "The BASE keyword should be followed by an IRI"), + }, + TriGState::PrefixExpectPrefix => match token { + N3Token::PrefixedName { prefix, local, .. } if local.is_empty() => { + self.stack.push(TriGState::PrefixExpectIri { name: prefix.to_owned() }); + self + } + _ => { + self.error(errors, "The PREFIX keyword should be followed by a prefix like 'ex:'") + } + }, + TriGState::PrefixExpectIri { name } => match token { + N3Token::IriRef(iri) => { + match Iri::parse_unchecked(iri) { + Ok(iri) => { + context.prefixes.insert(name, iri); + self + } + Err(e) => self.error(errors, format!("Invalid prefix IRI: {e}")) + } } + _ => self.error(errors, "The PREFIX declaration should be followed by a prefix and its value as an IRI"), + }, + // [3g] triplesOrGraph ::= labelOrSubject ( wrappedGraph | predicateObjectList '.' ) | quotedTriple predicateObjectList '.' + // [4g] triples2 ::= blankNodePropertyList predicateObjectList? '.' | collection predicateObjectList '.' + TriGState::TriplesOrGraph => match token { + N3Token::IriRef(iri) => { + self.stack.push(TriGState::WrappedGraphOrPredicateObjectList { + term: NamedNode::new_unchecked(iri).into() + }); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.stack.push(TriGState::WrappedGraphOrPredicateObjectList { + term: t.into() + }); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.stack.push(TriGState::WrappedGraphOrPredicateObjectList { + term: BlankNode::new_unchecked(label).into() + }); + self + } + N3Token::Punctuation("[") => { + self.stack.push(TriGState::WrappedGraphBlankNodePropertyListCurrent); + self + } + N3Token::Punctuation("(") => { + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::PredicateObjectList); + self.stack.push(TriGState::SubjectCollectionBeginning); + self + } + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("<<") if context.with_quoted_triples => { + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::PredicateObjectList); + self.stack.push(TriGState::SubjectQuotedTripleEnd); + self.stack.push(TriGState::QuotedObject); + self.stack.push(TriGState::Verb); + self.stack.push(TriGState::QuotedSubject); + self + } + _ => { + self.error(errors, "TOKEN is not a valid subject or graph name") + } + } + TriGState::WrappedGraphOrPredicateObjectList { term } => { + if token == N3Token::Punctuation("{") && context.with_graph_name { + self.cur_graph = term.into(); + self.stack.push(TriGState::WrappedGraph); + } else { + self.cur_subject.push(term.into()); + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::PredicateObjectList); + } + self.recognize_next(token, context,results, errors) + } + TriGState::WrappedGraphBlankNodePropertyListCurrent => if token == N3Token::Punctuation("]") { + self.stack.push(TriGState::WrappedGraphOrPredicateObjectList { + term: BlankNode::default().into() + }); + self + } else { + self.cur_subject.push(BlankNode::default().into()); + self.stack.push(TriGState::ExpectDot); + self.stack.push(TriGState::SubjectBlankNodePropertyListEnd); + self.stack.push(TriGState::PredicateObjectList); + self.recognize_next(token, context,results, errors) + } + TriGState::SubjectBlankNodePropertyListEnd => if token == N3Token::Punctuation("]") { + self.stack.push(TriGState::SubjectBlankNodePropertyListAfter ); + self + } else { + errors.push("blank node property lists should end with a ']'".into()); + self.stack.push(TriGState::SubjectBlankNodePropertyListAfter ); + self.recognize_next(token, context,results, errors) + } + TriGState::SubjectBlankNodePropertyListAfter => if matches!(token, N3Token::Punctuation("." | "}")) { + self.recognize_next(token, context,results, errors) + } else { + self.stack.push(TriGState::PredicateObjectList); + self.recognize_next(token, context,results, errors) + } + TriGState::SubjectCollectionBeginning => { + if let N3Token::Punctuation(")") = token { + self.cur_subject.push(rdf::NIL.into()); + self + } else { + let root = BlankNode::default(); + self.cur_subject.push(root.clone().into()); + self.cur_subject.push(root.into()); + self.cur_predicate.push(rdf::FIRST.into()); + self.stack.push(TriGState::SubjectCollectionPossibleEnd); + self.stack.push(TriGState::Object); + self.recognize_next(token, context,results, errors) + } + }, + TriGState::SubjectCollectionPossibleEnd => { + let old = self.cur_subject.pop().unwrap(); + self.cur_object.pop(); + if let N3Token::Punctuation(")") = token { + self.cur_predicate.pop(); + results.push(Quad::new( + old, + rdf::REST, + rdf::NIL, + self.cur_graph.clone() + )); + self + } else { + let new = BlankNode::default(); + results.push(Quad::new( + old, + rdf::REST, + new.clone(), + self.cur_graph.clone() + )); + self.cur_subject.push(new.into()); + self.stack.push(TriGState::ObjectCollectionPossibleEnd); + self.stack.push(TriGState::Object); + self.recognize_next(token, context,results, errors) + } + } + // [5g] wrappedGraph ::= '{' triplesBlock? '}' + // [6g] triplesBlock ::= triples ('.' triplesBlock?)? + TriGState::WrappedGraph => if token == N3Token::Punctuation("{") { + self.stack.push(TriGState::WrappedGraphPossibleEnd); + self.stack.push(TriGState::Triples); + self + } else { + self.error(errors, "The GRAPH keyword should be followed by a graph name and a value in '{'") + }, + TriGState::WrappedGraphPossibleEnd => { + self.cur_subject.pop(); + match token { + N3Token::Punctuation("}") => { + self + } + N3Token::Punctuation(".") => { + self.stack.push(TriGState::WrappedGraphPossibleEnd); + self.stack.push(TriGState::Triples); + self + } + _ => { + errors.push("A '}' or a '.' is expected at the end of a graph block".into()); + self.recognize_next(token, context,results, errors) + } + } + } + // [6] triples ::= subject predicateObjectList | blankNodePropertyList predicateObjectList? + // [10] subject ::= iri | BlankNode | collection | quotedTriple + TriGState::Triples => match token { + N3Token::Punctuation("}") => { + self.recognize_next(token, context,results, errors) // Early end + }, + N3Token::Punctuation("[") => { + self.cur_subject.push(BlankNode::default().into()); + self.stack.push(TriGState::TriplesBlankNodePropertyListCurrent); + self + } + N3Token::IriRef(iri) => { + self.cur_subject.push(NamedNode::new_unchecked(iri).into()); + self.stack.push(TriGState::PredicateObjectList); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_subject.push(t.into()); + self.stack.push(TriGState::PredicateObjectList); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.cur_subject.push(BlankNode::new_unchecked(label).into()); + self.stack.push(TriGState::PredicateObjectList); + self + } + N3Token::Punctuation("(") => { + self.stack.push(TriGState::PredicateObjectList); + self.stack.push(TriGState::SubjectCollectionBeginning); + self + } + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("<<") if context.with_quoted_triples => { + self.stack.push(TriGState::PredicateObjectList); + self.stack.push(TriGState::SubjectQuotedTripleEnd); + self.stack.push(TriGState::QuotedObject); + self.stack.push(TriGState::Verb); + self.stack.push(TriGState::QuotedSubject); + self + } + _ => { + self.error(errors, "TOKEN is not a valid RDF subject") + } + }, + TriGState::TriplesBlankNodePropertyListCurrent => if token == N3Token::Punctuation("]") { + self.stack.push(TriGState::PredicateObjectList); + self + } else { + self.stack.push(TriGState::SubjectBlankNodePropertyListEnd); + self.stack.push(TriGState::PredicateObjectList); + self.recognize_next(token, context,results, errors) + } + // [7g] labelOrSubject ::= iri | BlankNode + TriGState::GraphName => match token { + N3Token::IriRef(iri) => { + self.cur_graph = NamedNode::new_unchecked(iri).into(); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_graph = t.into(); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.cur_graph = BlankNode::new_unchecked(label).into(); + self + } + N3Token::Punctuation("[") => { + self.stack.push(TriGState::GraphNameAnonEnd); + self + } + _ => { + self.error(errors, "TOKEN is not a valid graph name") + } + } + TriGState::GraphNameAnonEnd => if token == N3Token::Punctuation("]") { + self.cur_graph = BlankNode::default().into(); + self + } else { + self.error(errors, "Anonymous blank node with a property list are not allowed as graph name") + } + // [7] predicateObjectList ::= verb objectList (';' (verb objectList)?)* + TriGState::PredicateObjectList => { + self.stack.push(TriGState::PredicateObjectListEnd); + self.stack.push(TriGState::ObjectsList); + self.stack.push(TriGState::Verb); + self.recognize_next(token, context,results, errors) + }, + TriGState::PredicateObjectListEnd => { + self.cur_predicate.pop(); + if token == N3Token::Punctuation(";") { + self.stack.push(TriGState::PredicateObjectListPossibleContinuation); + self + } else { + self.recognize_next(token, context,results, errors) + } + }, + TriGState::PredicateObjectListPossibleContinuation => if token == N3Token::Punctuation(";") { + self.stack.push(TriGState::PredicateObjectListPossibleContinuation); + self + } else if matches!(token, N3Token::Punctuation("." | "}" | "]")) { + self.recognize_next(token, context,results, errors) + } else { + self.stack.push(TriGState::PredicateObjectListEnd); + self.stack.push(TriGState::ObjectsList); + self.stack.push(TriGState::Verb); + self.recognize_next(token, context,results, errors) + }, + // [8] objectList ::= object annotation? ( ',' object annotation? )* + // [30t] annotation ::= '{|' predicateObjectList '|}' + TriGState::ObjectsList => { + self.stack.push(TriGState::ObjectsListEnd); + self.stack.push(TriGState::Object); + self.recognize_next(token, context,results, errors) + } + TriGState::ObjectsListEnd => { + match token { + N3Token::Punctuation(",") => { + self.cur_object.pop(); + self.stack.push(TriGState::ObjectsListEnd); + self.stack.push(TriGState::Object); + self + }, + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("{|") => { + let triple = Triple::new( + self.cur_subject.last().unwrap().clone(), + self.cur_predicate.last().unwrap().clone(), + self.cur_object.pop().unwrap() + ); + self.cur_subject.push(triple.into()); + self.stack.push(TriGState::AnnotationEnd); + self.stack.push(TriGState::PredicateObjectList); + self + } + _ => { + self.cur_object.pop(); + self.recognize_next(token, context,results, errors) + } + } + }, + #[cfg(feature = "rdf-star")] + TriGState::AnnotationEnd => { + self.cur_subject.pop(); + self.stack.push(TriGState::ObjectsListAfterAnnotation); + if token == N3Token::Punctuation("|}") { + self + } else { + self.error(errors, "Annotations should end with '|}'") + } + }, + #[cfg(feature = "rdf-star")] + TriGState::ObjectsListAfterAnnotation => if token == N3Token::Punctuation(",") { + self.stack.push(TriGState::ObjectsListEnd); + self.stack.push(TriGState::Object); + self + } else { + self.recognize_next(token, context,results, errors) + }, + // [9] verb ::= predicate | 'a' + // [11] predicate ::= iri + TriGState::Verb => match token { + N3Token::PlainKeyword("a") => { + self.cur_predicate.push(rdf::TYPE.into()); + self + } + N3Token::IriRef(iri) => { + self.cur_predicate.push(NamedNode::new_unchecked(iri)); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_predicate.push(t); + self + }, + Err(e) => self.error(errors, e) + } + _ => { + self.error(errors, "TOKEN is not a valid predicate") + } + } + // [12] object ::= iri | BlankNode | collection | blankNodePropertyList | literal | quotedTriple + // [13] literal ::= RDFLiteral | NumericLiteral | BooleanLiteral + // [14] blank ::= BlankNode | collection + // [15] blankNodePropertyList ::= '[' predicateObjectList ']' + // [16] collection ::= '(' object* ')' + // [17] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE + // [128s] RDFLiteral ::= String (LANGTAG | '^^' iri)? + // [133s] BooleanLiteral ::= 'true' | 'false' + // [18] String ::= STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE + // [135s] iri ::= IRIREF | PrefixedName + // [136s] PrefixedName ::= PNAME_LN | PNAME_NS + // [137s] BlankNode ::= BLANK_NODE_LABEL | ANON + TriGState::Object => match token { + N3Token::IriRef(iri) => { + self.cur_object.push(NamedNode::new_unchecked(iri).into()); + self.emit_quad(results); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_object.push(t.into()); + self.emit_quad(results); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.cur_object.push(BlankNode::new_unchecked(label).into()); + self.emit_quad(results); + self + } + N3Token::Punctuation("[") => { + self.stack.push(TriGState::ObjectBlankNodePropertyListCurrent); + self + } + N3Token::Punctuation("(") => { + self.stack.push(TriGState::ObjectCollectionBeginning); + self + } + N3Token::String(value) => { + self.stack.push(TriGState::LiteralPossibleSuffix { value, emit: true }); + self + } + N3Token::Integer(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::INTEGER).into()); + self.emit_quad(results); + self + } + N3Token::Decimal(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::DECIMAL).into()); + self.emit_quad(results); + self + } + N3Token::Double(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::DOUBLE).into()); + self.emit_quad(results); + self + } + N3Token::PlainKeyword("true") => { + self.cur_object.push(Literal::new_typed_literal("true", xsd::BOOLEAN).into()); + self.emit_quad(results); + self + } + N3Token::PlainKeyword("false") => { + self.cur_object.push(Literal::new_typed_literal("false", xsd::BOOLEAN).into()); + self.emit_quad(results); + self + } + #[cfg(feature = "rdf-star")] + N3Token::Punctuation("<<") if context.with_quoted_triples => { + self.stack.push(TriGState::ObjectQuotedTripleEnd { emit: true }); + self.stack.push(TriGState::QuotedObject); + self.stack.push(TriGState::Verb); + self.stack.push(TriGState::QuotedSubject); + self + } + _ => { + self.error(errors, "TOKEN is not a valid RDF object") + } + + } + TriGState::ObjectBlankNodePropertyListCurrent => if token == N3Token::Punctuation("]") { + self.cur_object.push(BlankNode::default().into()); + self.emit_quad(results); + self + } else { + self.cur_subject.push(BlankNode::default().into()); + self.stack.push(TriGState::ObjectBlankNodePropertyListEnd); + self.stack.push(TriGState::PredicateObjectList); + self.recognize_next(token, context,results, errors) + } + TriGState::ObjectBlankNodePropertyListEnd => if token == N3Token::Punctuation("]") { + self.cur_object.push(self.cur_subject.pop().unwrap().into()); + self.emit_quad(results); + self + } else { + self.error(errors, "blank node property lists should end with a ']'") + } + TriGState::ObjectCollectionBeginning => if let N3Token::Punctuation(")") = token { + self.cur_object.push(rdf::NIL.into()); + self.emit_quad(results); + self + } else { + let root = BlankNode::default(); + self.cur_object.push(root.clone().into()); + self.emit_quad(results); + self.cur_subject.push(root.into()); + self.cur_predicate.push(rdf::FIRST.into()); + self.stack.push(TriGState::ObjectCollectionPossibleEnd); + self.stack.push(TriGState::Object); + self.recognize_next(token, context,results, errors) + }, + TriGState::ObjectCollectionPossibleEnd => { + let old = self.cur_subject.pop().unwrap(); + self.cur_object.pop(); + if let N3Token::Punctuation(")") = token { + self.cur_predicate.pop(); + results.push(Quad::new(old, + rdf::REST, + rdf::NIL, + self.cur_graph.clone() + )); + self + }else { + let new = BlankNode::default(); + results.push(Quad::new(old, + rdf::REST, + new.clone(), + self.cur_graph.clone() + )); + self.cur_subject.push(new.into()); + self.stack.push(TriGState::ObjectCollectionPossibleEnd); + self.stack.push(TriGState::Object); + self.recognize_next(token, context,results, errors) + } + } + TriGState::LiteralPossibleSuffix { value, emit } => { + match token { + N3Token::LangTag(lang) => { + self.cur_object.push(Literal::new_language_tagged_literal_unchecked(value, lang.to_ascii_lowercase()).into()); + if emit { + self.emit_quad(results); + } + self + }, + N3Token::Punctuation("^^") => { + self.stack.push(TriGState::LiteralExpectDatatype { value, emit }); + self + } + _ => { + self.cur_object.push(Literal::new_simple_literal(value).into()); + if emit { + self.emit_quad(results); + } + self.recognize_next(token, context,results, errors) + } + } + } + TriGState::LiteralExpectDatatype { value, emit } => { + match token { + N3Token::IriRef(datatype) => { + self.cur_object.push(Literal::new_typed_literal(value, NamedNode::new_unchecked(datatype)).into()); + if emit { + self.emit_quad(results); + } + self + }, + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_object.push(Literal::new_typed_literal(value, t).into()); + if emit { + self.emit_quad(results); + } + self + }, + Err(e) => self.error(errors, e) + } + _ => { + self.error(errors, "Expecting a datatype IRI after ^^, found TOKEN").recognize_next(token, context, results, errors) + } + } + } + // [27t] quotedTriple ::= '<<' qtSubject verb qtObject '>>' + #[cfg(feature = "rdf-star")] + TriGState::SubjectQuotedTripleEnd => { + let triple = Triple::new( + self.cur_subject.pop().unwrap(), + self.cur_predicate.pop().unwrap(), + self.cur_object.pop().unwrap() + ); + self.cur_subject.push(triple.into()); + if token == N3Token::Punctuation(">>") { + self + } else { + self.error(errors, "Expecting '>>' to close a quoted triple, found TOKEN") + } + } + #[cfg(feature = "rdf-star")] + TriGState::ObjectQuotedTripleEnd { emit } => { + let triple = Triple::new( + self.cur_subject.pop().unwrap(), + self.cur_predicate.pop().unwrap(), + self.cur_object.pop().unwrap() + ); + self.cur_object.push(triple.into()); + if emit { + self.emit_quad(results); + } + if token == N3Token::Punctuation(">>") { + self + } else { + self.error(errors, "Expecting '>>' to close a quoted triple, found TOKEN") + } + } + // [28t] qtSubject ::= iri | BlankNode | quotedTriple + #[cfg(feature = "rdf-star")] + TriGState::QuotedSubject => match token { + N3Token::Punctuation("[") => { + self.cur_subject.push(BlankNode::default().into()); + self.stack.push(TriGState::QuotedAnonEnd); + self + } + N3Token::IriRef(iri) => { + self.cur_subject.push(NamedNode::new_unchecked(iri).into()); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_subject.push(t.into()); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.cur_subject.push(BlankNode::new_unchecked(label).into()); + self + } + N3Token::Punctuation("<<") => { + self.stack.push(TriGState::SubjectQuotedTripleEnd); + self.stack.push(TriGState::QuotedObject); + self.stack.push(TriGState::Verb); + self.stack.push(TriGState::QuotedSubject); + self + } + _ => self.error(errors, "TOKEN is not a valid RDF quoted triple subject: TOKEN") + } + // [29t] qtObject ::= iri | BlankNode | literal | quotedTriple + #[cfg(feature = "rdf-star")] + TriGState::QuotedObject => match token { + N3Token::Punctuation("[") => { + self.cur_object.push(BlankNode::default().into()); + self.stack.push(TriGState::QuotedAnonEnd); + self + } + N3Token::IriRef(iri) => { + self.cur_object.push(NamedNode::new_unchecked(iri).into()); + self + } + N3Token::PrefixedName { prefix, local, might_be_invalid_iri } => match resolve_local_name(prefix, &local, might_be_invalid_iri, &context.prefixes) { + Ok(t) => { + self.cur_object.push(t.into()); + self + }, + Err(e) => self.error(errors, e) + } + N3Token::BlankNodeLabel(label) => { + self.cur_object.push(BlankNode::new_unchecked(label).into()); + self + } + N3Token::String(value) => { + self.stack.push(TriGState::LiteralPossibleSuffix { value, emit: false }); + self + } + N3Token::Integer(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::INTEGER).into()); + self + } + N3Token::Decimal(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::DECIMAL).into()); + self + } + N3Token::Double(v) => { + self.cur_object.push(Literal::new_typed_literal(v, xsd::DOUBLE).into()); + self + } + N3Token::PlainKeyword("true") => { + self.cur_object.push(Literal::new_typed_literal("true", xsd::BOOLEAN).into()); + self + } + N3Token::PlainKeyword("false") => { + self.cur_object.push(Literal::new_typed_literal("false", xsd::BOOLEAN).into()); + self + } + N3Token::Punctuation("<<") => { + self.stack.push(TriGState::ObjectQuotedTripleEnd { emit: false }); + self.stack.push(TriGState::QuotedObject); + self.stack.push(TriGState::Verb); + self.stack.push(TriGState::QuotedSubject); + self + } + _ => self.error(errors, "TOKEN is not a valid RDF quoted triple object") + } + #[cfg(feature = "rdf-star")] + TriGState::QuotedAnonEnd => if token == N3Token::Punctuation("]") { + self + } else { + self.error(errors, "Anonymous blank node with a property list are not allowed in quoted triples") + } + } + } else if token == N3Token::Punctuation(".") || token == N3Token::Punctuation("}") { + // TODO: be smarter depending if we are in '{' or not + self.stack.push(TriGState::TriGDoc); + self + } else { + self + } + } + + fn recognize_end( + mut self, + _context: &mut TriGRecognizerContext, + results: &mut Vec<Self::Output>, + errors: &mut Vec<RuleRecognizerError>, + ) { + match &*self.stack { + [] | [TriGState::TriGDoc] => { + debug_assert!( + self.cur_subject.is_empty(), + "The cur_subject stack must be empty if the state stack is empty" + ); + debug_assert!( + self.cur_predicate.is_empty(), + "The cur_predicate stack must be empty if the state stack is empty" + ); + debug_assert!( + self.cur_object.is_empty(), + "The cur_object stack must be empty if the state stack is empty" + ); + } + [.., TriGState::LiteralPossibleSuffix { value, emit: true }] => { + self.cur_object + .push(Literal::new_simple_literal(value).into()); + self.emit_quad(results); + errors.push("Triples should be followed by a dot".into()) + } + _ => errors.push("Unexpected end".into()), // TODO + } + } + + fn lexer_options(context: &TriGRecognizerContext) -> &N3LexerOptions { + &context.lexer_options + } +} + +impl TriGRecognizer { + pub fn new_parser( + with_graph_name: bool, + #[cfg(feature = "rdf-star")] with_quoted_triples: bool, + unchecked: bool, + base_iri: Option<Iri<String>>, + prefixes: HashMap<String, Iri<String>>, + ) -> Parser<Self> { + Parser::new( + Lexer::new( + N3Lexer::new(N3LexerMode::Turtle, unchecked), + MIN_BUFFER_SIZE, + MAX_BUFFER_SIZE, + true, + Some(b"#"), + ), + Self { + stack: vec![TriGState::TriGDoc], + cur_subject: Vec::new(), + cur_predicate: Vec::new(), + cur_object: Vec::new(), + cur_graph: GraphName::DefaultGraph, + }, + TriGRecognizerContext { + with_graph_name, + #[cfg(feature = "rdf-star")] + with_quoted_triples, + prefixes, + lexer_options: N3LexerOptions { base_iri }, + }, + ) + } + + #[must_use] + fn error( + mut self, + errors: &mut Vec<RuleRecognizerError>, + msg: impl Into<RuleRecognizerError>, + ) -> Self { + errors.push(msg.into()); + self.stack.clear(); + self.cur_subject.clear(); + self.cur_predicate.clear(); + self.cur_object.clear(); + self.cur_graph = GraphName::DefaultGraph; + self + } + + fn emit_quad(&mut self, results: &mut Vec<Quad>) { + results.push(Quad::new( + self.cur_subject.last().unwrap().clone(), + self.cur_predicate.last().unwrap().clone(), + self.cur_object.last().unwrap().clone(), + self.cur_graph.clone(), + )); + } +} + +#[derive(Debug)] +enum TriGState { + TriGDoc, + ExpectDot, + BaseExpectIri, + PrefixExpectPrefix, + PrefixExpectIri { + name: String, + }, + TriplesOrGraph, + WrappedGraphBlankNodePropertyListCurrent, + SubjectBlankNodePropertyListEnd, + SubjectBlankNodePropertyListAfter, + SubjectCollectionBeginning, + SubjectCollectionPossibleEnd, + WrappedGraphOrPredicateObjectList { + term: NamedOrBlankNode, + }, + WrappedGraph, + WrappedGraphPossibleEnd, + GraphName, + GraphNameAnonEnd, + Triples, + TriplesBlankNodePropertyListCurrent, + PredicateObjectList, + PredicateObjectListEnd, + PredicateObjectListPossibleContinuation, + ObjectsList, + ObjectsListEnd, + #[cfg(feature = "rdf-star")] + AnnotationEnd, + #[cfg(feature = "rdf-star")] + ObjectsListAfterAnnotation, + Verb, + Object, + ObjectBlankNodePropertyListCurrent, + ObjectBlankNodePropertyListEnd, + ObjectCollectionBeginning, + ObjectCollectionPossibleEnd, + LiteralPossibleSuffix { + value: String, + emit: bool, + }, + LiteralExpectDatatype { + value: String, + emit: bool, + }, + #[cfg(feature = "rdf-star")] + SubjectQuotedTripleEnd, + #[cfg(feature = "rdf-star")] + ObjectQuotedTripleEnd { + emit: bool, + }, + #[cfg(feature = "rdf-star")] + QuotedSubject, + #[cfg(feature = "rdf-star")] + QuotedObject, + #[cfg(feature = "rdf-star")] + QuotedAnonEnd, +} diff --git a/lib/oxttl/src/toolkit/error.rs b/lib/oxttl/src/toolkit/error.rs new file mode 100644 index 00000000..083adefa --- /dev/null +++ b/lib/oxttl/src/toolkit/error.rs @@ -0,0 +1,97 @@ +use std::ops::Range; +use std::{fmt, io}; + +/// A position in a text i.e. a `line` number starting from 0, a `column` number starting from 0 (in number of code points) and a global file `offset` starting from 0 (in number of bytes). +#[derive(Eq, PartialEq, Debug, Clone, Copy)] +pub struct TextPosition { + pub line: u64, + pub column: u64, + pub offset: u64, +} + +/// An error in the syntax of the parsed file. +/// +/// It is composed of a message and a byte range in the input. +#[derive(Debug, thiserror::Error)] +pub struct TurtleSyntaxError { + pub(super) location: Range<TextPosition>, + pub(super) message: String, +} + +impl TurtleSyntaxError { + /// The location of the error inside of the file. + #[inline] + pub fn location(&self) -> Range<TextPosition> { + self.location.clone() + } + + /// The error message. + #[inline] + pub fn message(&self) -> &str { + &self.message + } +} + +impl fmt::Display for TurtleSyntaxError { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if self.location.start.offset + 1 >= self.location.end.offset { + write!( + f, + "Parser error at line {} column {}: {}", + self.location.start.line + 1, + self.location.start.column + 1, + self.message + ) + } else if self.location.start.line == self.location.end.line { + write!( + f, + "Parser error between at line {} between columns {} and column {}: {}", + self.location.start.line + 1, + self.location.start.column + 1, + self.location.end.column + 1, + self.message + ) + } else { + write!( + f, + "Parser error between line {} column {} and line {} column {}: {}", + self.location.start.line + 1, + self.location.start.column + 1, + self.location.end.line + 1, + self.location.end.column + 1, + self.message + ) + } + } +} + +impl From<TurtleSyntaxError> for io::Error { + #[inline] + fn from(error: TurtleSyntaxError) -> Self { + Self::new(io::ErrorKind::InvalidData, error) + } +} + +/// A parsing error. +/// +/// It is the union of [`TurtleSyntaxError`] and [`io::Error`]. +#[derive(Debug, thiserror::Error)] +pub enum TurtleParseError { + /// I/O error during parsing (file not found...). + #[error(transparent)] + Io(#[from] io::Error), + /// An error in the file syntax. + #[error(transparent)] + Syntax(#[from] TurtleSyntaxError), +} + +impl From<TurtleParseError> for io::Error { + #[inline] + fn from(error: TurtleParseError) -> Self { + match error { + TurtleParseError::Syntax(e) => e.into(), + TurtleParseError::Io(e) => e, + } + } +} diff --git a/lib/oxttl/src/toolkit/lexer.rs b/lib/oxttl/src/toolkit/lexer.rs new file mode 100644 index 00000000..4db73fae --- /dev/null +++ b/lib/oxttl/src/toolkit/lexer.rs @@ -0,0 +1,432 @@ +use crate::toolkit::error::{TextPosition, TurtleSyntaxError}; +use memchr::{memchr2, memchr2_iter}; +use std::borrow::Cow; +use std::cmp::min; +use std::io::{self, Read}; +use std::ops::{Range, RangeInclusive}; +use std::str; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncReadExt}; + +pub trait TokenRecognizer { + type Token<'a> + where + Self: 'a; + type Options: Default; + + fn recognize_next_token<'a>( + &mut self, + data: &'a [u8], + is_ending: bool, + config: &Self::Options, + ) -> Option<(usize, Result<Self::Token<'a>, TokenRecognizerError>)>; +} + +pub struct TokenRecognizerError { + pub location: Range<usize>, + pub message: String, +} + +impl<S: Into<String>> From<(Range<usize>, S)> for TokenRecognizerError { + fn from((location, message): (Range<usize>, S)) -> Self { + Self { + location, + message: message.into(), + } + } +} + +#[allow(clippy::range_plus_one)] +impl<S: Into<String>> From<(RangeInclusive<usize>, S)> for TokenRecognizerError { + fn from((location, message): (RangeInclusive<usize>, S)) -> Self { + (*location.start()..*location.end() + 1, message).into() + } +} + +impl<S: Into<String>> From<(usize, S)> for TokenRecognizerError { + fn from((location, message): (usize, S)) -> Self { + (location..=location, message).into() + } +} + +pub struct Lexer<R: TokenRecognizer> { + parser: R, + data: Vec<u8>, + position: Position, + previous_position: Position, // Lexer position before the last emitted token + is_ending: bool, + min_buffer_size: usize, + max_buffer_size: usize, + is_line_jump_whitespace: bool, + line_comment_start: Option<&'static [u8]>, +} + +#[derive(Clone, Copy)] +struct Position { + line_start_buffer_offset: usize, + buffer_offset: usize, + global_offset: u64, + global_line: u64, +} + +impl<R: TokenRecognizer> Lexer<R> { + pub fn new( + parser: R, + min_buffer_size: usize, + max_buffer_size: usize, + is_line_jump_whitespace: bool, + line_comment_start: Option<&'static [u8]>, + ) -> Self { + Self { + parser, + data: Vec::new(), + position: Position { + line_start_buffer_offset: 0, + buffer_offset: 0, + global_offset: 0, + global_line: 0, + }, + previous_position: Position { + line_start_buffer_offset: 0, + buffer_offset: 0, + global_offset: 0, + global_line: 0, + }, + is_ending: false, + min_buffer_size, + max_buffer_size, + is_line_jump_whitespace, + line_comment_start, + } + } + + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.shrink_data(); + self.data.extend_from_slice(other); + } + + #[inline] + pub fn end(&mut self) { + self.is_ending = true; + } + + pub fn extend_from_read(&mut self, read: &mut impl Read) -> io::Result<()> { + self.shrink_data(); + if self.data.len() == self.max_buffer_size { + return Err(io::Error::new( + io::ErrorKind::OutOfMemory, + format!( + "Reached the buffer maximal size of {}", + self.max_buffer_size + ), + )); + } + let min_end = min(self.data.len() + self.min_buffer_size, self.max_buffer_size); + let new_start = self.data.len(); + self.data.resize(min_end, 0); + if self.data.len() < self.data.capacity() { + // We keep extending to have as much space as available without reallocation + self.data.resize(self.data.capacity(), 0); + } + let read = read.read(&mut self.data[new_start..])?; + self.data.truncate(new_start + read); + self.is_ending = read == 0; + Ok(()) + } + + #[cfg(feature = "async-tokio")] + pub async fn extend_from_tokio_async_read( + &mut self, + read: &mut (impl AsyncRead + Unpin), + ) -> io::Result<()> { + self.shrink_data(); + if self.data.len() == self.max_buffer_size { + return Err(io::Error::new( + io::ErrorKind::OutOfMemory, + format!( + "Reached the buffer maximal size of {}", + self.max_buffer_size + ), + )); + } + let min_end = min(self.data.len() + self.min_buffer_size, self.max_buffer_size); + let new_start = self.data.len(); + self.data.resize(min_end, 0); + if self.data.len() < self.data.capacity() { + // We keep extending to have as much space as available without reallocation + self.data.resize(self.data.capacity(), 0); + } + let read = read.read(&mut self.data[new_start..]).await?; + self.data.truncate(new_start + read); + self.is_ending = read == 0; + Ok(()) + } + + #[allow(clippy::unwrap_in_result)] + pub fn read_next( + &mut self, + options: &R::Options, + ) -> Option<Result<R::Token<'_>, TurtleSyntaxError>> { + self.skip_whitespaces_and_comments()?; + self.previous_position = self.position; + let Some((consumed, result)) = self.parser.recognize_next_token( + &self.data[self.position.buffer_offset..], + self.is_ending, + options, + ) else { + return if self.is_ending { + if self.position.buffer_offset == self.data.len() { + None // We have finished + } else { + let (new_line_jumps, new_line_start) = + Self::find_number_of_line_jumps_and_start_of_last_line( + &self.data[self.position.buffer_offset..], + ); + if new_line_jumps > 0 { + self.position.line_start_buffer_offset = + self.position.buffer_offset + new_line_start; + } + self.position.global_offset += + u64::try_from(self.data.len() - self.position.buffer_offset).unwrap(); + self.position.buffer_offset = self.data.len(); + self.position.global_line += new_line_jumps; + let new_position = TextPosition { + line: self.position.global_line, + column: Self::column_from_bytes( + &self.data[self.position.line_start_buffer_offset..], + ), + offset: self.position.global_offset, + }; + let error = TurtleSyntaxError { + location: new_position..new_position, + message: "Unexpected end of file".into(), + }; + self.position.buffer_offset = self.data.len(); // We consume everything + Some(Err(error)) + } + } else { + None + }; + }; + debug_assert!( + consumed > 0, + "The lexer must consume at least one byte each time" + ); + debug_assert!( + self.position.buffer_offset + consumed <= self.data.len(), + "The lexer tried to consumed {consumed} bytes but only {} bytes are readable", + self.data.len() - self.position.buffer_offset + ); + let (new_line_jumps, new_line_start) = + Self::find_number_of_line_jumps_and_start_of_last_line( + &self.data[self.position.buffer_offset..self.position.buffer_offset + consumed], + ); + if new_line_jumps > 0 { + self.position.line_start_buffer_offset = self.position.buffer_offset + new_line_start; + } + self.position.buffer_offset += consumed; + self.position.global_offset += u64::try_from(consumed).unwrap(); + self.position.global_line += new_line_jumps; + Some(result.map_err(|e| TurtleSyntaxError { + location: self.location_from_buffer_offset_range(e.location), + message: e.message, + })) + } + + pub fn location_from_buffer_offset_range( + &self, + offset_range: Range<usize>, + ) -> Range<TextPosition> { + let start_offset = self.previous_position.buffer_offset + offset_range.start; + let (start_extra_line_jumps, start_line_start) = + Self::find_number_of_line_jumps_and_start_of_last_line( + &self.data[self.previous_position.buffer_offset..start_offset], + ); + let start_line_start = if start_extra_line_jumps > 0 { + start_line_start + self.previous_position.buffer_offset + } else { + self.previous_position.line_start_buffer_offset + }; + let end_offset = self.previous_position.buffer_offset + offset_range.end; + let (end_extra_line_jumps, end_line_start) = + Self::find_number_of_line_jumps_and_start_of_last_line( + &self.data[self.previous_position.buffer_offset..end_offset], + ); + let end_line_start = if end_extra_line_jumps > 0 { + end_line_start + self.previous_position.buffer_offset + } else { + self.previous_position.line_start_buffer_offset + }; + TextPosition { + line: self.previous_position.global_line + start_extra_line_jumps, + column: Self::column_from_bytes(&self.data[start_line_start..start_offset]), + offset: self.previous_position.global_offset + + u64::try_from(offset_range.start).unwrap(), + }..TextPosition { + line: self.previous_position.global_line + end_extra_line_jumps, + column: Self::column_from_bytes(&self.data[end_line_start..end_offset]), + offset: self.previous_position.global_offset + u64::try_from(offset_range.end).unwrap(), + } + } + + pub fn last_token_location(&self) -> Range<TextPosition> { + TextPosition { + line: self.previous_position.global_line, + column: Self::column_from_bytes( + &self.data[self.previous_position.line_start_buffer_offset + ..self.previous_position.buffer_offset], + ), + offset: self.previous_position.global_offset, + }..TextPosition { + line: self.position.global_line, + column: Self::column_from_bytes( + &self.data[self.position.line_start_buffer_offset..self.position.buffer_offset], + ), + offset: self.position.global_offset, + } + } + + pub fn last_token_source(&self) -> Cow<'_, str> { + String::from_utf8_lossy( + &self.data[self.previous_position.buffer_offset..self.position.buffer_offset], + ) + } + + pub fn is_end(&self) -> bool { + self.is_ending && self.data.len() == self.position.buffer_offset + } + + #[allow(clippy::unwrap_in_result)] + fn skip_whitespaces_and_comments(&mut self) -> Option<()> { + loop { + self.skip_whitespaces()?; + + let buf = &self.data[self.position.buffer_offset..]; + if let Some(line_comment_start) = self.line_comment_start { + if buf.starts_with(line_comment_start) { + // Comment + if let Some(end) = memchr2(b'\r', b'\n', &buf[line_comment_start.len()..]) { + let mut end_position = line_comment_start.len() + end; + if buf.get(end_position).copied() == Some(b'\r') { + // We look for \n for Windows line end style + if let Some(c) = buf.get(end_position + 1) { + if *c == b'\n' { + end_position += 1; + } + } else if !self.is_ending { + return None; // We need to read more + } + } + let comment_size = end_position + 1; + self.position.buffer_offset += comment_size; + self.position.line_start_buffer_offset = self.position.buffer_offset; + self.position.global_offset += u64::try_from(comment_size).unwrap(); + self.position.global_line += 1; + continue; + } + if self.is_ending { + self.position.buffer_offset = self.data.len(); // EOF + return Some(()); + } + return None; // We need more data + } + } + return Some(()); + } + } + + fn skip_whitespaces(&mut self) -> Option<()> { + if self.is_line_jump_whitespace { + let mut i = self.position.buffer_offset; + while let Some(c) = self.data.get(i) { + match c { + b' ' | b'\t' => { + self.position.buffer_offset += 1; + self.position.global_offset += 1; + } + b'\r' => { + // We look for \n for Windows line end style + let mut increment: u8 = 1; + if let Some(c) = self.data.get(i + 1) { + if *c == b'\n' { + increment += 1; + i += 1; + } + } else if !self.is_ending { + return None; // We need to read more + } + self.position.buffer_offset += usize::from(increment); + self.position.line_start_buffer_offset = self.position.buffer_offset; + self.position.global_offset += u64::from(increment); + self.position.global_line += 1; + } + b'\n' => { + self.position.buffer_offset += 1; + self.position.line_start_buffer_offset = self.position.buffer_offset; + self.position.global_offset += 1; + self.position.global_line += 1; + } + _ => return Some(()), + } + i += 1; + // TODO: SIMD + } + } else { + for c in &self.data[self.position.buffer_offset..] { + if matches!(c, b' ' | b'\t') { + self.position.buffer_offset += 1; + self.position.global_offset += 1; + } else { + return Some(()); + } + // TODO: SIMD + } + } + Some(()) + } + + fn shrink_data(&mut self) { + if self.position.line_start_buffer_offset > 0 { + self.data + .copy_within(self.position.line_start_buffer_offset.., 0); + self.data + .truncate(self.data.len() - self.position.line_start_buffer_offset); + self.position.buffer_offset -= self.position.line_start_buffer_offset; + self.position.line_start_buffer_offset = 0; + self.previous_position = self.position; + } + } + + fn find_number_of_line_jumps_and_start_of_last_line(bytes: &[u8]) -> (u64, usize) { + let mut num_of_jumps = 0; + let mut last_jump_pos = 0; + let mut previous_cr = 0; + for pos in memchr2_iter(b'\r', b'\n', bytes) { + if bytes[pos] == b'\r' { + previous_cr = pos; + num_of_jumps += 1; + last_jump_pos = pos + 1; + } else { + if previous_cr < pos - 1 { + // We count \r\n as a single line jump + num_of_jumps += 1; + } + last_jump_pos = pos + 1; + } + } + (num_of_jumps, last_jump_pos) + } + + fn column_from_bytes(bytes: &[u8]) -> u64 { + match str::from_utf8(bytes) { + Ok(s) => u64::try_from(s.chars().count()).unwrap(), + Err(e) => { + if e.valid_up_to() == 0 { + 0 + } else { + Self::column_from_bytes(&bytes[..e.valid_up_to()]) + } + } + } + } +} diff --git a/lib/oxttl/src/toolkit/mod.rs b/lib/oxttl/src/toolkit/mod.rs new file mode 100644 index 00000000..10c42163 --- /dev/null +++ b/lib/oxttl/src/toolkit/mod.rs @@ -0,0 +1,13 @@ +//! oxttl parsing toolkit. +//! +//! Provides the basic code to write plain Rust lexers and parsers able to read files chunk by chunk. + +mod error; +mod lexer; +mod parser; + +pub use self::error::{TextPosition, TurtleParseError, TurtleSyntaxError}; +pub use self::lexer::{Lexer, TokenRecognizer, TokenRecognizerError}; +#[cfg(feature = "async-tokio")] +pub use self::parser::FromTokioAsyncReadIterator; +pub use self::parser::{FromReadIterator, Parser, RuleRecognizer, RuleRecognizerError}; diff --git a/lib/oxttl/src/toolkit/parser.rs b/lib/oxttl/src/toolkit/parser.rs new file mode 100644 index 00000000..6ac8a1ac --- /dev/null +++ b/lib/oxttl/src/toolkit/parser.rs @@ -0,0 +1,183 @@ +use crate::toolkit::error::{TurtleParseError, TurtleSyntaxError}; +use crate::toolkit::lexer::{Lexer, TokenRecognizer}; +use std::io::Read; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncRead; + +pub trait RuleRecognizer: Sized { + type TokenRecognizer: TokenRecognizer; + type Output; + type Context; + + fn error_recovery_state(self) -> Self; + + fn recognize_next( + self, + token: <Self::TokenRecognizer as TokenRecognizer>::Token<'_>, + context: &mut Self::Context, + results: &mut Vec<Self::Output>, + errors: &mut Vec<RuleRecognizerError>, + ) -> Self; + + fn recognize_end( + self, + context: &mut Self::Context, + results: &mut Vec<Self::Output>, + errors: &mut Vec<RuleRecognizerError>, + ); + + fn lexer_options( + context: &Self::Context, + ) -> &<Self::TokenRecognizer as TokenRecognizer>::Options; +} + +pub struct RuleRecognizerError { + pub message: String, +} + +impl<S: Into<String>> From<S> for RuleRecognizerError { + fn from(message: S) -> Self { + Self { + message: message.into(), + } + } +} + +#[allow(clippy::partial_pub_fields)] +pub struct Parser<RR: RuleRecognizer> { + lexer: Lexer<RR::TokenRecognizer>, + state: Option<RR>, + pub context: RR::Context, + results: Vec<RR::Output>, + errors: Vec<RuleRecognizerError>, +} + +impl<RR: RuleRecognizer> Parser<RR> { + pub fn new(lexer: Lexer<RR::TokenRecognizer>, recognizer: RR, context: RR::Context) -> Self { + Self { + lexer, + state: Some(recognizer), + context, + results: vec![], + errors: vec![], + } + } + + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.lexer.extend_from_slice(other) + } + + #[inline] + pub fn end(&mut self) { + self.lexer.end() + } + + #[inline] + pub fn is_end(&self) -> bool { + self.state.is_none() && self.results.is_empty() && self.errors.is_empty() + } + + pub fn read_next(&mut self) -> Option<Result<RR::Output, TurtleSyntaxError>> { + loop { + if let Some(error) = self.errors.pop() { + return Some(Err(TurtleSyntaxError { + location: self.lexer.last_token_location(), + message: error + .message + .replace("TOKEN", &self.lexer.last_token_source()), + })); + } + if let Some(result) = self.results.pop() { + return Some(Ok(result)); + } + if let Some(result) = self.lexer.read_next(RR::lexer_options(&self.context)) { + match result { + Ok(token) => { + self.state = self.state.take().map(|state| { + state.recognize_next( + token, + &mut self.context, + &mut self.results, + &mut self.errors, + ) + }); + continue; + } + Err(e) => { + self.state = self.state.take().map(RR::error_recovery_state); + return Some(Err(e)); + } + } + } + if self.lexer.is_end() { + self.state.take()?.recognize_end( + &mut self.context, + &mut self.results, + &mut self.errors, + ) + } else { + return None; + } + } + } + + pub fn parse_read<R: Read>(self, read: R) -> FromReadIterator<R, RR> { + FromReadIterator { read, parser: self } + } + + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadIterator<R, RR> { + FromTokioAsyncReadIterator { read, parser: self } + } +} + +#[allow(clippy::partial_pub_fields)] +pub struct FromReadIterator<R: Read, RR: RuleRecognizer> { + read: R, + pub parser: Parser<RR>, +} + +impl<R: Read, RR: RuleRecognizer> Iterator for FromReadIterator<R, RR> { + type Item = Result<RR::Output, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + while !self.parser.is_end() { + if let Some(result) = self.parser.read_next() { + return Some(result.map_err(TurtleParseError::Syntax)); + } + if let Err(e) = self.parser.lexer.extend_from_read(&mut self.read) { + return Some(Err(e.into())); + } + } + None + } +} + +#[cfg(feature = "async-tokio")] +pub struct FromTokioAsyncReadIterator<R: AsyncRead + Unpin, RR: RuleRecognizer> { + pub read: R, + pub parser: Parser<RR>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin, RR: RuleRecognizer> FromTokioAsyncReadIterator<R, RR> { + pub async fn next(&mut self) -> Option<Result<RR::Output, TurtleParseError>> { + while !self.parser.is_end() { + if let Some(result) = self.parser.read_next() { + return Some(result.map_err(TurtleParseError::Syntax)); + } + if let Err(e) = self + .parser + .lexer + .extend_from_tokio_async_read(&mut self.read) + .await + { + return Some(Err(e.into())); + } + } + None + } +} diff --git a/lib/oxttl/src/trig.rs b/lib/oxttl/src/trig.rs new file mode 100644 index 00000000..e230b9be --- /dev/null +++ b/lib/oxttl/src/trig.rs @@ -0,0 +1,1254 @@ +//! A [TriG](https://www.w3.org/TR/trig/) streaming parser implemented by [`TriGParser`] +//! and a serializer implemented by [`TriGSerializer`]. + +use crate::lexer::N3Lexer; +use crate::terse::TriGRecognizer; +#[cfg(feature = "async-tokio")] +use crate::toolkit::FromTokioAsyncReadIterator; +use crate::toolkit::{FromReadIterator, Parser, TurtleParseError, TurtleSyntaxError}; +use oxiri::{Iri, IriParseError}; +use oxrdf::vocab::{rdf, xsd}; +use oxrdf::{ + GraphName, GraphNameRef, LiteralRef, NamedNode, NamedNodeRef, Quad, QuadRef, Subject, TermRef, +}; +use std::collections::hash_map::Iter; +use std::collections::{BTreeMap, HashMap}; +use std::fmt; +use std::io::{self, Read, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; + +/// A [TriG](https://www.w3.org/TR/trig/) streaming parser. +/// +/// Support for [TriG-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#trig-star) is available behind the `rdf-star` feature and the [`TriGParser::with_quoted_triples`] option. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TriGParser; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for quad in TriGParser::new().parse_read(file.as_ref()) { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct TriGParser { + unchecked: bool, + base: Option<Iri<String>>, + prefixes: HashMap<String, Iri<String>>, + #[cfg(feature = "rdf-star")] + with_quoted_triples: bool, +} + +impl TriGParser { + /// Builds a new [`TriGParser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + #[inline] + pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + self.base = Some(Iri::parse(base_iri.into())?); + Ok(self) + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.prefixes + .insert(prefix_name.into(), Iri::parse(prefix_iri.into())?); + Ok(self) + } + + /// Enables [TriG-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#trig-star). + #[cfg(feature = "rdf-star")] + #[inline] + pub fn with_quoted_triples(mut self) -> Self { + self.with_quoted_triples = true; + self + } + + /// Parses a TriG file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TriGParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// for quad in TriGParser::new().parse_read(file.as_ref()) { + /// let quad = quad?; + /// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadTriGReader<R> { + FromReadTriGReader { + inner: self.parse().parser.parse_read(read), + } + } + + /// Parses a TriG file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TriGParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); + /// let mut count = 0; + /// let mut parser = TriGParser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadTriGReader<R> { + FromTokioAsyncReadTriGReader { + inner: self.parse().parser.parse_tokio_async_read(read), + } + } + + /// Allows to parse a TriG file by using a low-level API. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TriGParser; + /// + /// let file: [&[u8]; 5] = [ + /// b"@base <http://example.com/>", + /// b". @prefix schema: <http://schema.org/> .", + /// b"<foo> a schema:Person", + /// b" ; schema:name \"Foo\" . <bar>", + /// b" a schema:Person ; schema:name \"Bar\" .", + /// ]; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// let mut parser = TriGParser::new().parse(); + /// let mut file_chunks = file.iter(); + /// while !parser.is_end() { + /// // We feed more data to the parser + /// if let Some(chunk) = file_chunks.next() { + /// parser.extend_from_slice(chunk); + /// } else { + /// parser.end(); // It's finished + /// } + /// // We read as many quads from the parser as possible + /// while let Some(quad) = parser.read_next() { + /// let quad = quad?; + /// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse(self) -> LowLevelTriGReader { + LowLevelTriGReader { + parser: TriGRecognizer::new_parser( + true, + #[cfg(feature = "rdf-star")] + self.with_quoted_triples, + self.unchecked, + self.base, + self.prefixes, + ), + } + } +} + +/// Parses a TriG file from a [`Read`] implementation. Can be built using [`TriGParser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TriGParser; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for quad in TriGParser::new().parse_read(file.as_ref()) { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadTriGReader<R: Read> { + inner: FromReadIterator<R, TriGRecognizer>, +} + +impl<R: Read> FromReadTriGReader<R> { + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse_read(file.as_ref()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> TriGPrefixesIter<'_> { + TriGPrefixesIter { + inner: self.inner.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base at the beginning because none has been given to the parser. + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI. + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +impl<R: Read> Iterator for FromReadTriGReader<R> { + type Item = Result<Quad, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + self.inner.next() + } +} + +/// Parses a TriG file from a [`AsyncRead`] implementation. Can be built using [`TriGParser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TriGParser; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxttl::TurtleParseError> { +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); +/// let mut count = 0; +/// let mut parser = TriGParser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadTriGReader<R: AsyncRead + Unpin> { + inner: FromTokioAsyncReadIterator<R, TriGRecognizer>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadTriGReader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<Quad, TurtleParseError>> { + Some(self.inner.next().await?.map(Into::into)) + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse_tokio_async_read(file.as_ref()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Ok(()) + /// # } + /// ``` + pub fn prefixes(&self) -> TriGPrefixesIter<'_> { + TriGPrefixesIter { + inner: self.inner.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse_tokio_async_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Ok(()) + /// # } + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +/// Parses a TriG file by using a low-level API. Can be built using [`TriGParser::parse`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TriGParser; +/// +/// let file: [&[u8]; 5] = [ +/// b"@base <http://example.com/>", +/// b". @prefix schema: <http://schema.org/> .", +/// b"<foo> a schema:Person", +/// b" ; schema:name \"Foo\" . <bar>", +/// b" a schema:Person ; schema:name \"Bar\" .", +/// ]; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// let mut parser = TriGParser::new().parse(); +/// let mut file_chunks = file.iter(); +/// while !parser.is_end() { +/// // We feed more data to the parser +/// if let Some(chunk) = file_chunks.next() { +/// parser.extend_from_slice(chunk); +/// } else { +/// parser.end(); // It's finished +/// } +/// // We read as many quads from the parser as possible +/// while let Some(quad) = parser.read_next() { +/// let quad = quad?; +/// if quad.predicate == rdf::TYPE && quad.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelTriGReader { + parser: Parser<TriGRecognizer>, +} + +impl LowLevelTriGReader { + /// Adds some extra bytes to the parser. Should be called when [`read_next`](Self::read_next) returns [`None`] and there is still unread data. + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.parser.extend_from_slice(other) + } + + /// Tell the parser that the file is finished. + /// + /// This triggers the parsing of the final bytes and might lead [`read_next`](Self::read_next) to return some extra values. + pub fn end(&mut self) { + self.parser.end() + } + + /// Returns if the parsing is finished i.e. [`end`](Self::end) has been called and [`read_next`](Self::read_next) is always going to return `None`. + pub fn is_end(&self) -> bool { + self.parser.is_end() + } + + /// Attempt to parse a new quad from the already provided data. + /// + /// Returns [`None`] if the parsing is finished or more data is required. + /// If it is the case more data should be fed using [`extend_from_slice`](Self::extend_from_slice). + pub fn read_next(&mut self) -> Option<Result<Quad, TurtleSyntaxError>> { + self.parser.read_next() + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse(); + /// reader.extend_from_slice(file); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> TriGPrefixesIter<'_> { + TriGPrefixesIter { + inner: self.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TriGParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TriGParser::new().parse(); + /// reader.extend_from_slice(file); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +/// Iterator on the file prefixes. +/// +/// See [`LowLevelTriGReader::prefixes`]. +pub struct TriGPrefixesIter<'a> { + inner: Iter<'a, String, Iri<String>>, +} + +impl<'a> Iterator for TriGPrefixesIter<'a> { + type Item = (&'a str, &'a str); + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + let (key, value) = self.inner.next()?; + Some((key.as_str(), value.as_str())) + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.inner.size_hint() + } +} + +/// A [TriG](https://www.w3.org/TR/trig/) serializer. +/// +/// Support for [TriG-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#trig-star) is available behind the `rdf-star` feature. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::TriGSerializer; +/// +/// let mut writer = TriGSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_write(Vec::new()); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ))?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct TriGSerializer { + prefixes: BTreeMap<String, String>, +} + +impl TriGSerializer { + /// Builds a new [`TriGSerializer`]. + #[inline] + pub fn new() -> Self { + Self { + prefixes: BTreeMap::new(), + } + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.prefixes.insert( + Iri::parse(prefix_iri.into())?.into_inner(), + prefix_name.into(), + ); + Ok(self) + } + + /// Writes a TriG file to a [`Write`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::TriGSerializer; + /// + /// let mut writer = TriGSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize_to_write(Vec::new()); + /// writer.write_quad(QuadRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// NamedNodeRef::new("http://example.com")?, + /// ))?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", + /// writer.finish()?.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteTriGWriter<W> { + ToWriteTriGWriter { + write, + writer: self.serialize(), + } + } + + /// Writes a TriG file to a [`AsyncWrite`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::TriGSerializer; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), Box<dyn std::error::Error>> { + /// let mut writer = TriGSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize_to_tokio_async_write(Vec::new()); + /// writer + /// .write_quad(QuadRef::new( + /// NamedNodeRef::new_unchecked("http://example.com#me"), + /// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), + /// NamedNodeRef::new_unchecked("http://schema.org/Person"), + /// NamedNodeRef::new_unchecked("http://example.com"), + /// )) + /// .await?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", + /// writer.finish().await?.as_slice() + /// ); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteTriGWriter<W> { + ToTokioAsyncWriteTriGWriter { + write, + writer: self.serialize(), + buffer: Vec::new(), + } + } + + /// Builds a low-level TriG writer. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, QuadRef}; + /// use oxttl::TriGSerializer; + /// + /// let mut buf = Vec::new(); + /// let mut writer = TriGSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize(); + /// writer.write_quad( + /// QuadRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// NamedNodeRef::new("http://example.com")?, + /// ), + /// &mut buf, + /// )?; + /// writer.finish(&mut buf)?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", + /// buf.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize(self) -> LowLevelTriGWriter { + LowLevelTriGWriter { + prefixes: self.prefixes, + prelude_written: false, + current_graph_name: GraphName::DefaultGraph, + current_subject_predicate: None, + } + } +} + +/// Writes a TriG file to a [`Write`] implementation. Can be built using [`TriGSerializer::serialize_to_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::TriGSerializer; +/// +/// let mut writer = TriGSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_write(Vec::new()); +/// writer.write_quad(QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ))?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteTriGWriter<W: Write> { + write: W, + writer: LowLevelTriGWriter, +} + +impl<W: Write> ToWriteTriGWriter<W> { + /// Writes an extra quad. + pub fn write_quad<'a>(&mut self, q: impl Into<QuadRef<'a>>) -> io::Result<()> { + self.writer.write_quad(q, &mut self.write) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(mut self) -> io::Result<W> { + self.writer.finish(&mut self.write)?; + Ok(self.write) + } +} + +/// Writes a TriG file to a [`AsyncWrite`] implementation. Can be built using [`TriGSerializer::serialize_to_tokio_async_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::TriGSerializer; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), Box<dyn std::error::Error>> { +/// let mut writer = TriGSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_tokio_async_write(Vec::new()); +/// writer +/// .write_quad(QuadRef::new( +/// NamedNodeRef::new_unchecked("http://example.com#me"), +/// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), +/// NamedNodeRef::new_unchecked("http://schema.org/Person"), +/// NamedNodeRef::new_unchecked("http://example.com"), +/// )) +/// .await?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", +/// writer.finish().await?.as_slice() +/// ); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteTriGWriter<W: AsyncWrite + Unpin> { + write: W, + writer: LowLevelTriGWriter, + buffer: Vec<u8>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteTriGWriter<W> { + /// Writes an extra quad. + pub async fn write_quad<'a>(&mut self, q: impl Into<QuadRef<'a>>) -> io::Result<()> { + self.writer.write_quad(q, &mut self.buffer)?; + self.write.write_all(&self.buffer).await?; + self.buffer.clear(); + Ok(()) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub async fn finish(mut self) -> io::Result<W> { + self.writer.finish(&mut self.buffer)?; + self.write.write_all(&self.buffer).await?; + self.buffer.clear(); + Ok(self.write) + } +} + +/// Writes a TriG file by using a low-level API. Can be built using [`TriGSerializer::serialize`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, QuadRef}; +/// use oxttl::TriGSerializer; +/// +/// let mut buf = Vec::new(); +/// let mut writer = TriGSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize(); +/// writer.write_quad( +/// QuadRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// NamedNodeRef::new("http://example.com")?, +/// ), +/// &mut buf, +/// )?; +/// writer.finish(&mut buf)?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com> {\n\t<http://example.com#me> a schema:Person .\n}\n", +/// buf.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelTriGWriter { + prefixes: BTreeMap<String, String>, + prelude_written: bool, + current_graph_name: GraphName, + current_subject_predicate: Option<(Subject, NamedNode)>, +} + +impl LowLevelTriGWriter { + /// Writes an extra quad. + pub fn write_quad<'a>( + &mut self, + q: impl Into<QuadRef<'a>>, + mut write: impl Write, + ) -> io::Result<()> { + if !self.prelude_written { + self.prelude_written = true; + for (prefix_iri, prefix_name) in &self.prefixes { + writeln!(write, "@prefix {prefix_name}: <{prefix_iri}> .")?; + } + } + let q = q.into(); + if q.graph_name == self.current_graph_name.as_ref() { + if let Some((current_subject, current_predicate)) = + self.current_subject_predicate.take() + { + if q.subject == current_subject.as_ref() { + if q.predicate == current_predicate { + self.current_subject_predicate = Some((current_subject, current_predicate)); + write!(write, " , {}", self.term(q.object)) + } else { + self.current_subject_predicate = + Some((current_subject, q.predicate.into_owned())); + writeln!(write, " ;")?; + if !self.current_graph_name.is_default_graph() { + write!(write, "\t")?; + } + write!( + write, + "\t{} {}", + self.predicate(q.predicate), + self.term(q.object) + ) + } + } else { + self.current_subject_predicate = + Some((q.subject.into_owned(), q.predicate.into_owned())); + writeln!(write, " .")?; + if !self.current_graph_name.is_default_graph() { + write!(write, "\t")?; + } + write!( + write, + "{} {} {}", + self.term(q.subject), + self.predicate(q.predicate), + self.term(q.object) + ) + } + } else { + self.current_subject_predicate = + Some((q.subject.into_owned(), q.predicate.into_owned())); + if !self.current_graph_name.is_default_graph() { + write!(write, "\t")?; + } + write!( + write, + "{} {} {}", + self.term(q.subject), + self.predicate(q.predicate), + self.term(q.object) + ) + } + } else { + if self.current_subject_predicate.is_some() { + writeln!(write, " .")?; + } + if !self.current_graph_name.is_default_graph() { + writeln!(write, "}}")?; + } + self.current_graph_name = q.graph_name.into_owned(); + self.current_subject_predicate = + Some((q.subject.into_owned(), q.predicate.into_owned())); + match self.current_graph_name.as_ref() { + GraphNameRef::NamedNode(g) => { + writeln!(write, "{} {{", self.term(g))?; + write!(write, "\t")?; + } + GraphNameRef::BlankNode(g) => { + writeln!(write, "{} {{", self.term(g))?; + write!(write, "\t")?; + } + GraphNameRef::DefaultGraph => (), + } + + write!( + write, + "{} {} {}", + self.term(q.subject), + self.predicate(q.predicate), + self.term(q.object) + ) + } + } + + fn predicate<'a>(&'a self, named_node: impl Into<NamedNodeRef<'a>>) -> TurtlePredicate<'a> { + TurtlePredicate { + named_node: named_node.into(), + prefixes: &self.prefixes, + } + } + + fn term<'a>(&'a self, term: impl Into<TermRef<'a>>) -> TurtleTerm<'a> { + TurtleTerm { + term: term.into(), + prefixes: &self.prefixes, + } + } + + /// Finishes to write the file. + pub fn finish(&mut self, mut write: impl Write) -> io::Result<()> { + if self.current_subject_predicate.is_some() { + writeln!(write, " .")?; + } + if !self.current_graph_name.is_default_graph() { + writeln!(write, "}}")?; + } + Ok(()) + } +} + +struct TurtlePredicate<'a> { + named_node: NamedNodeRef<'a>, + prefixes: &'a BTreeMap<String, String>, +} + +impl<'a> fmt::Display for TurtlePredicate<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if self.named_node == rdf::TYPE { + f.write_str("a") + } else { + TurtleTerm { + term: self.named_node.into(), + prefixes: self.prefixes, + } + .fmt(f) + } + } +} + +struct TurtleTerm<'a> { + term: TermRef<'a>, + prefixes: &'a BTreeMap<String, String>, +} + +impl<'a> fmt::Display for TurtleTerm<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self.term { + TermRef::NamedNode(v) => { + for (prefix_iri, prefix_name) in self.prefixes { + if let Some(local_name) = v.as_str().strip_prefix(prefix_iri) { + if let Some(escaped_local_name) = escape_local_name(local_name) { + return write!(f, "{prefix_name}:{escaped_local_name}"); + } + } + } + write!(f, "{v}") + } + TermRef::BlankNode(v) => write!(f, "{v}"), + TermRef::Literal(v) => { + let value = v.value(); + let inline = match v.datatype() { + xsd::BOOLEAN => is_turtle_boolean(value), + xsd::INTEGER => is_turtle_integer(value), + xsd::DECIMAL => is_turtle_decimal(value), + xsd::DOUBLE => is_turtle_double(value), + _ => false, + }; + if inline { + f.write_str(value) + } else if v.is_plain() { + write!(f, "{v}") + } else { + write!( + f, + "{}^^{}", + LiteralRef::new_simple_literal(v.value()), + TurtleTerm { + term: v.datatype().into(), + prefixes: self.prefixes + } + ) + } + } + #[cfg(feature = "rdf-star")] + TermRef::Triple(t) => { + write!( + f, + "<< {} {} {} >>", + TurtleTerm { + term: t.subject.as_ref().into(), + prefixes: self.prefixes + }, + TurtleTerm { + term: t.predicate.as_ref().into(), + prefixes: self.prefixes + }, + TurtleTerm { + term: t.object.as_ref(), + prefixes: self.prefixes + } + ) + } + } + } +} + +fn is_turtle_boolean(value: &str) -> bool { + matches!(value, "true" | "false") +} + +fn is_turtle_integer(value: &str) -> bool { + // [19] INTEGER ::= [+-]? [0-9]+ + let mut value = value.as_bytes(); + if let Some(v) = value.strip_prefix(b"+") { + value = v; + } else if let Some(v) = value.strip_prefix(b"-") { + value = v; + } + !value.is_empty() && value.iter().all(u8::is_ascii_digit) +} + +fn is_turtle_decimal(value: &str) -> bool { + // [20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+ + let mut value = value.as_bytes(); + if let Some(v) = value.strip_prefix(b"+") { + value = v; + } else if let Some(v) = value.strip_prefix(b"-") { + value = v; + } + while value.first().map_or(false, u8::is_ascii_digit) { + value = &value[1..]; + } + let Some(value) = value.strip_prefix(b".") else { + return false; + }; + !value.is_empty() && value.iter().all(u8::is_ascii_digit) +} + +fn is_turtle_double(value: &str) -> bool { + // [21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT) + // [154s] EXPONENT ::= [eE] [+-]? [0-9]+ + let mut value = value.as_bytes(); + if let Some(v) = value.strip_prefix(b"+") { + value = v; + } else if let Some(v) = value.strip_prefix(b"-") { + value = v; + } + let mut with_before = false; + while value.first().map_or(false, u8::is_ascii_digit) { + value = &value[1..]; + with_before = true; + } + let mut with_after = false; + if let Some(v) = value.strip_prefix(b".") { + value = v; + while value.first().map_or(false, u8::is_ascii_digit) { + value = &value[1..]; + with_after = true; + } + } + if let Some(v) = value.strip_prefix(b"e") { + value = v; + } else if let Some(v) = value.strip_prefix(b"E") { + value = v; + } else { + return false; + } + if let Some(v) = value.strip_prefix(b"+") { + value = v; + } else if let Some(v) = value.strip_prefix(b"-") { + value = v; + } + (with_before || with_after) && !value.is_empty() && value.iter().all(u8::is_ascii_digit) +} + +fn escape_local_name(value: &str) -> Option<String> { + // TODO: PLX + // [168s] PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))? + let mut output = String::with_capacity(value.len()); + let mut chars = value.chars(); + let first = chars.next()?; + if N3Lexer::is_possible_pn_chars_u(first) || first == ':' || first.is_ascii_digit() { + output.push(first); + } else if can_be_escaped_in_local_name(first) { + output.push('\\'); + output.push(first); + } else { + return None; + } + + while let Some(c) = chars.next() { + if N3Lexer::is_possible_pn_chars(c) || c == ':' || (c == '.' && !chars.as_str().is_empty()) + { + output.push(c); + } else if can_be_escaped_in_local_name(c) { + output.push('\\'); + output.push(c); + } else { + return None; + } + } + + Some(output) +} + +fn can_be_escaped_in_local_name(c: char) -> bool { + matches!( + c, + '_' | '~' + | '.' + | '-' + | '!' + | '$' + | '&' + | '\'' + | '(' + | ')' + | '*' + | '+' + | ',' + | ';' + | '=' + | '/' + | '?' + | '#' + | '@' + | '%' + ) +} + +#[cfg(test)] +mod tests { + #![allow(clippy::panic_in_result_fn)] + + use super::*; + use oxrdf::vocab::xsd; + use oxrdf::{BlankNodeRef, GraphNameRef, LiteralRef, NamedNodeRef}; + + #[test] + fn test_write() -> io::Result<()> { + let mut writer = TriGSerializer::new() + .with_prefix("ex", "http://example.com/") + .unwrap() + .serialize_to_write(Vec::new()); + writer.write_quad(QuadRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p"), + NamedNodeRef::new_unchecked("http://example.com/o."), + NamedNodeRef::new_unchecked("http://example.com/g"), + ))?; + writer.write_quad(QuadRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p"), + NamedNodeRef::new_unchecked("http://example.com/o{o}"), + NamedNodeRef::new_unchecked("http://example.com/g"), + ))?; + writer.write_quad(QuadRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p"), + LiteralRef::new_simple_literal("foo"), + NamedNodeRef::new_unchecked("http://example.com/g"), + ))?; + writer.write_quad(QuadRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p2"), + LiteralRef::new_language_tagged_literal_unchecked("foo", "en"), + NamedNodeRef::new_unchecked("http://example.com/g"), + ))?; + writer.write_quad(QuadRef::new( + BlankNodeRef::new_unchecked("b"), + NamedNodeRef::new_unchecked("http://example.com/p2"), + BlankNodeRef::new_unchecked("b2"), + NamedNodeRef::new_unchecked("http://example.com/g"), + ))?; + writer.write_quad(QuadRef::new( + BlankNodeRef::new_unchecked("b"), + NamedNodeRef::new_unchecked("http://example.com/p2"), + LiteralRef::new_typed_literal("true", xsd::BOOLEAN), + GraphNameRef::DefaultGraph, + ))?; + writer.write_quad(QuadRef::new( + BlankNodeRef::new_unchecked("b"), + NamedNodeRef::new_unchecked("http://example.org/p2"), + LiteralRef::new_typed_literal("false", xsd::BOOLEAN), + NamedNodeRef::new_unchecked("http://example.com/g2"), + ))?; + assert_eq!( + String::from_utf8(writer.finish()?).unwrap(), + "@prefix ex: <http://example.com/> .\nex:g {\n\tex:s ex:p ex:o\\. , <http://example.com/o{o}> , \"foo\" ;\n\t\tex:p2 \"foo\"@en .\n\t_:b ex:p2 _:b2 .\n}\n_:b ex:p2 true .\nex:g2 {\n\t_:b <http://example.org/p2> false .\n}\n" + ); + Ok(()) + } +} diff --git a/lib/oxttl/src/turtle.rs b/lib/oxttl/src/turtle.rs new file mode 100644 index 00000000..eb972224 --- /dev/null +++ b/lib/oxttl/src/turtle.rs @@ -0,0 +1,879 @@ +//! A [Turtle](https://www.w3.org/TR/turtle/) streaming parser implemented by [`TurtleParser`] +//! and a serializer implemented by [`TurtleSerializer`]. + +use crate::terse::TriGRecognizer; +#[cfg(feature = "async-tokio")] +use crate::toolkit::FromTokioAsyncReadIterator; +use crate::toolkit::{FromReadIterator, Parser, TurtleParseError, TurtleSyntaxError}; +#[cfg(feature = "async-tokio")] +use crate::trig::ToTokioAsyncWriteTriGWriter; +use crate::trig::{LowLevelTriGWriter, ToWriteTriGWriter, TriGSerializer}; +use oxiri::{Iri, IriParseError}; +use oxrdf::{GraphNameRef, Triple, TripleRef}; +use std::collections::hash_map::Iter; +use std::collections::HashMap; +use std::io::{self, Read, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncWrite}; + +/// A [Turtle](https://www.w3.org/TR/turtle/) streaming parser. +/// +/// Support for [Turtle-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#turtle-star) is available behind the `rdf-star` feature and the [`TurtleParser::with_quoted_triples`] option. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TurtleParser; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in TurtleParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct TurtleParser { + unchecked: bool, + base: Option<Iri<String>>, + prefixes: HashMap<String, Iri<String>>, + #[cfg(feature = "rdf-star")] + with_quoted_triples: bool, +} + +impl TurtleParser { + /// Builds a new [`TurtleParser`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Assumes the file is valid to make parsing faster. + /// + /// It will skip some validations. + /// + /// Note that if the file is actually not valid, then broken RDF might be emitted by the parser. + #[inline] + pub fn unchecked(mut self) -> Self { + self.unchecked = true; + self + } + + #[inline] + pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { + self.base = Some(Iri::parse(base_iri.into())?); + Ok(self) + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.prefixes + .insert(prefix_name.into(), Iri::parse(prefix_iri.into())?); + Ok(self) + } + + /// Enables [Turtle-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#turtle-star). + #[cfg(feature = "rdf-star")] + #[inline] + pub fn with_quoted_triples(mut self) -> Self { + self.with_quoted_triples = true; + self + } + + /// Parses a Turtle file from a [`Read`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TurtleParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// for triple in TurtleParser::new().parse_read(file.as_ref()) { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse_read<R: Read>(self, read: R) -> FromReadTurtleReader<R> { + FromReadTurtleReader { + inner: self.parse().parser.parse_read(read), + } + } + + /// Parses a Turtle file from a [`AsyncRead`] implementation. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TurtleParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" . + /// <bar> a schema:Person ; + /// schema:name "Bar" ."#; + /// + /// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); + /// let mut count = 0; + /// let mut parser = TurtleParser::new().parse_tokio_async_read(file.as_ref()); + /// while let Some(triple) = parser.next().await { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// assert_eq!(2, count); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn parse_tokio_async_read<R: AsyncRead + Unpin>( + self, + read: R, + ) -> FromTokioAsyncReadTurtleReader<R> { + FromTokioAsyncReadTurtleReader { + inner: self.parse().parser.parse_tokio_async_read(read), + } + } + + /// Allows to parse a Turtle file by using a low-level API. + /// + /// Count the number of people: + /// ``` + /// use oxrdf::vocab::rdf; + /// use oxrdf::NamedNodeRef; + /// use oxttl::TurtleParser; + /// + /// let file: [&[u8]; 5] = [ + /// b"@base <http://example.com/>", + /// b". @prefix schema: <http://schema.org/> .", + /// b"<foo> a schema:Person", + /// b" ; schema:name \"Foo\" . <bar>", + /// b" a schema:Person ; schema:name \"Bar\" .", + /// ]; + /// + /// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; + /// let mut count = 0; + /// let mut parser = TurtleParser::new().parse(); + /// let mut file_chunks = file.iter(); + /// while !parser.is_end() { + /// // We feed more data to the parser + /// if let Some(chunk) = file_chunks.next() { + /// parser.extend_from_slice(chunk); + /// } else { + /// parser.end(); // It's finished + /// } + /// // We read as many triples from the parser as possible + /// while let Some(triple) = parser.read_next() { + /// let triple = triple?; + /// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { + /// count += 1; + /// } + /// } + /// } + /// assert_eq!(2, count); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn parse(self) -> LowLevelTurtleReader { + LowLevelTurtleReader { + parser: TriGRecognizer::new_parser( + false, + #[cfg(feature = "rdf-star")] + self.with_quoted_triples, + self.unchecked, + self.base, + self.prefixes, + ), + } + } +} + +/// Parses a Turtle file from a [`Read`] implementation. Can be built using [`TurtleParser::parse_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TurtleParser; +/// +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// for triple in TurtleParser::new().parse_read(file.as_ref()) { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct FromReadTurtleReader<R: Read> { + inner: FromReadIterator<R, TriGRecognizer>, +} + +impl<R: Read> FromReadTurtleReader<R> { + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse_read(file.as_ref()); + /// assert!(reader.prefixes().collect::<Vec<_>>().is_empty()); // No prefix at the beginning + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> TurtlePrefixesIter<'_> { + TurtlePrefixesIter { + inner: self.inner.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base at the beginning because none has been given to the parser. + /// + /// reader.next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI. + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +impl<R: Read> Iterator for FromReadTurtleReader<R> { + type Item = Result<Triple, TurtleParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some(self.inner.next()?.map(Into::into)) + } +} + +/// Parses a Turtle file from a [`AsyncRead`] implementation. Can be built using [`TurtleParser::parse_tokio_async_read`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TurtleParser; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), oxttl::TurtleParseError> { +/// let file = br#"@base <http://example.com/> . +/// @prefix schema: <http://schema.org/> . +/// <foo> a schema:Person ; +/// schema:name "Foo" . +/// <bar> a schema:Person ; +/// schema:name "Bar" ."#; +/// +/// let schema_person = NamedNodeRef::new_unchecked("http://schema.org/Person"); +/// let mut count = 0; +/// let mut parser = TurtleParser::new().parse_tokio_async_read(file.as_ref()); +/// while let Some(triple) = parser.next().await { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// assert_eq!(2, count); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct FromTokioAsyncReadTurtleReader<R: AsyncRead + Unpin> { + inner: FromTokioAsyncReadIterator<R, TriGRecognizer>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadTurtleReader<R> { + /// Reads the next triple or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<Triple, TurtleParseError>> { + Some(self.inner.next().await?.map(Into::into)) + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse_tokio_async_read(file.as_ref()); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Ok(()) + /// # } + /// ``` + pub fn prefixes(&self) -> TurtlePrefixesIter<'_> { + TurtlePrefixesIter { + inner: self.inner.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), oxttl::TurtleParseError> { + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse_tokio_async_read(file.as_ref()); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.next().await.unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Ok(()) + /// # } + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.inner + .parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +/// Parses a Turtle file by using a low-level API. Can be built using [`TurtleParser::parse`]. +/// +/// Count the number of people: +/// ``` +/// use oxrdf::vocab::rdf; +/// use oxrdf::NamedNodeRef; +/// use oxttl::TurtleParser; +/// +/// let file: [&[u8]; 5] = [ +/// b"@base <http://example.com/>", +/// b". @prefix schema: <http://schema.org/> .", +/// b"<foo> a schema:Person", +/// b" ; schema:name \"Foo\" . <bar>", +/// b" a schema:Person ; schema:name \"Bar\" .", +/// ]; +/// +/// let schema_person = NamedNodeRef::new("http://schema.org/Person")?; +/// let mut count = 0; +/// let mut parser = TurtleParser::new().parse(); +/// let mut file_chunks = file.iter(); +/// while !parser.is_end() { +/// // We feed more data to the parser +/// if let Some(chunk) = file_chunks.next() { +/// parser.extend_from_slice(chunk); +/// } else { +/// parser.end(); // It's finished +/// } +/// // We read as many triples from the parser as possible +/// while let Some(triple) = parser.read_next() { +/// let triple = triple?; +/// if triple.predicate == rdf::TYPE && triple.object == schema_person.into() { +/// count += 1; +/// } +/// } +/// } +/// assert_eq!(2, count); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelTurtleReader { + parser: Parser<TriGRecognizer>, +} + +impl LowLevelTurtleReader { + /// Adds some extra bytes to the parser. Should be called when [`read_next`](Self::read_next) returns [`None`] and there is still unread data. + pub fn extend_from_slice(&mut self, other: &[u8]) { + self.parser.extend_from_slice(other) + } + + /// Tell the parser that the file is finished. + /// + /// This triggers the parsing of the final bytes and might lead [`read_next`](Self::read_next) to return some extra values. + pub fn end(&mut self) { + self.parser.end() + } + + /// Returns if the parsing is finished i.e. [`end`](Self::end) has been called and [`read_next`](Self::read_next) is always going to return `None`. + pub fn is_end(&self) -> bool { + self.parser.is_end() + } + + /// Attempt to parse a new triple from the already provided data. + /// + /// Returns [`None`] if the parsing is finished or more data is required. + /// If it is the case more data should be fed using [`extend_from_slice`](Self::extend_from_slice). + pub fn read_next(&mut self) -> Option<Result<Triple, TurtleSyntaxError>> { + Some(self.parser.read_next()?.map(Into::into)) + } + + /// The list of IRI prefixes considered at the current step of the parsing. + /// + /// This method returns (prefix name, prefix value) tuples. + /// It is empty at the beginning of the parsing and gets updated when prefixes are encountered. + /// It should be full at the end of the parsing (but if a prefix is overridden, only the latest version will be returned). + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse(); + /// reader.extend_from_slice(file); + /// assert_eq!(reader.prefixes().collect::<Vec<_>>(), []); // No prefix at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!( + /// reader.prefixes().collect::<Vec<_>>(), + /// [("schema", "http://schema.org/")] + /// ); // There are now prefixes + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn prefixes(&self) -> TurtlePrefixesIter<'_> { + TurtlePrefixesIter { + inner: self.parser.context.prefixes(), + } + } + + /// The base IRI considered at the current step of the parsing. + /// + /// ``` + /// use oxttl::TurtleParser; + /// + /// let file = br#"@base <http://example.com/> . + /// @prefix schema: <http://schema.org/> . + /// <foo> a schema:Person ; + /// schema:name "Foo" ."#; + /// + /// let mut reader = TurtleParser::new().parse(); + /// reader.extend_from_slice(file); + /// assert!(reader.base_iri().is_none()); // No base IRI at the beginning + /// + /// reader.read_next().unwrap()?; // We read the first triple + /// assert_eq!(reader.base_iri(), Some("http://example.com/")); // There is now a base IRI + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn base_iri(&self) -> Option<&str> { + self.parser + .context + .lexer_options + .base_iri + .as_ref() + .map(Iri::as_str) + } +} + +/// Iterator on the file prefixes. +/// +/// See [`LowLevelTurtleReader::prefixes`]. +pub struct TurtlePrefixesIter<'a> { + inner: Iter<'a, String, Iri<String>>, +} + +impl<'a> Iterator for TurtlePrefixesIter<'a> { + type Item = (&'a str, &'a str); + + #[inline] + fn next(&mut self) -> Option<Self::Item> { + let (key, value) = self.inner.next()?; + Some((key.as_str(), value.as_str())) + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.inner.size_hint() + } +} + +/// A [Turtle](https://www.w3.org/TR/turtle/) serializer. +/// +/// Support for [Turtle-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#turtle-star) is available behind the `rdf-star` feature. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::TurtleSerializer; +/// +/// let mut writer = TurtleSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[derive(Default)] +#[must_use] +pub struct TurtleSerializer { + inner: TriGSerializer, +} + +impl TurtleSerializer { + /// Builds a new [`TurtleSerializer`]. + #[inline] + pub fn new() -> Self { + Self::default() + } + + #[inline] + pub fn with_prefix( + mut self, + prefix_name: impl Into<String>, + prefix_iri: impl Into<String>, + ) -> Result<Self, IriParseError> { + self.inner = self.inner.with_prefix(prefix_name, prefix_iri)?; + Ok(self) + } + + /// Writes a Turtle file to a [`Write`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::TurtleSerializer; + /// + /// let mut writer = TurtleSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize_to_write(Vec::new()); + /// writer.write_triple(TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// ))?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", + /// writer.finish()?.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize_to_write<W: Write>(self, write: W) -> ToWriteTurtleWriter<W> { + ToWriteTurtleWriter { + inner: self.inner.serialize_to_write(write), + } + } + + /// Writes a Turtle file to a [`AsyncWrite`] implementation. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::TurtleSerializer; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(),Box<dyn std::error::Error>> { + /// let mut writer = TurtleSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize_to_tokio_async_write(Vec::new()); + /// writer + /// .write_triple(TripleRef::new( + /// NamedNodeRef::new_unchecked("http://example.com#me"), + /// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), + /// NamedNodeRef::new_unchecked("http://schema.org/Person"), + /// )) + /// .await?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", + /// writer.finish().await?.as_slice() + /// ); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub fn serialize_to_tokio_async_write<W: AsyncWrite + Unpin>( + self, + write: W, + ) -> ToTokioAsyncWriteTurtleWriter<W> { + ToTokioAsyncWriteTurtleWriter { + inner: self.inner.serialize_to_tokio_async_write(write), + } + } + + /// Builds a low-level Turtle writer. + /// + /// ``` + /// use oxrdf::{NamedNodeRef, TripleRef}; + /// use oxttl::TurtleSerializer; + /// + /// let mut buf = Vec::new(); + /// let mut writer = TurtleSerializer::new() + /// .with_prefix("schema", "http://schema.org/")? + /// .serialize(); + /// writer.write_triple( + /// TripleRef::new( + /// NamedNodeRef::new("http://example.com#me")?, + /// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, + /// NamedNodeRef::new("http://schema.org/Person")?, + /// ), + /// &mut buf, + /// )?; + /// writer.finish(&mut buf)?; + /// assert_eq!( + /// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", + /// buf.as_slice() + /// ); + /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) + /// ``` + pub fn serialize(self) -> LowLevelTurtleWriter { + LowLevelTurtleWriter { + inner: self.inner.serialize(), + } + } +} + +/// Writes a Turtle file to a [`Write`] implementation. Can be built using [`TurtleSerializer::serialize_to_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::TurtleSerializer; +/// +/// let mut writer = TurtleSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_write(Vec::new()); +/// writer.write_triple(TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ))?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", +/// writer.finish()?.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteTurtleWriter<W: Write> { + inner: ToWriteTriGWriter<W>, +} + +impl<W: Write> ToWriteTurtleWriter<W> { + /// Writes an extra triple. + pub fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.inner + .write_quad(t.into().in_graph(GraphNameRef::DefaultGraph)) + } + + /// Ends the write process and returns the underlying [`Write`]. + pub fn finish(self) -> io::Result<W> { + self.inner.finish() + } +} + +/// Writes a Turtle file to a [`AsyncWrite`] implementation. Can be built using [`TurtleSerializer::serialize_to_tokio_async_write`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::TurtleSerializer; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), Box<dyn std::error::Error>> { +/// let mut writer = TurtleSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize_to_tokio_async_write(Vec::new()); +/// writer +/// .write_triple(TripleRef::new( +/// NamedNodeRef::new_unchecked("http://example.com#me"), +/// NamedNodeRef::new_unchecked("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), +/// NamedNodeRef::new_unchecked("http://schema.org/Person"), +/// )) +/// .await?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", +/// writer.finish().await?.as_slice() +/// ); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteTurtleWriter<W: AsyncWrite + Unpin> { + inner: ToTokioAsyncWriteTriGWriter<W>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteTurtleWriter<W> { + /// Writes an extra triple. + pub async fn write_triple<'a>(&mut self, t: impl Into<TripleRef<'a>>) -> io::Result<()> { + self.inner + .write_quad(t.into().in_graph(GraphNameRef::DefaultGraph)) + .await + } + + /// Ends the write process and returns the underlying [`Write`]. + pub async fn finish(self) -> io::Result<W> { + self.inner.finish().await + } +} + +/// Writes a Turtle file by using a low-level API. Can be built using [`TurtleSerializer::serialize`]. +/// +/// ``` +/// use oxrdf::{NamedNodeRef, TripleRef}; +/// use oxttl::TurtleSerializer; +/// +/// let mut buf = Vec::new(); +/// let mut writer = TurtleSerializer::new() +/// .with_prefix("schema", "http://schema.org/")? +/// .serialize(); +/// writer.write_triple( +/// TripleRef::new( +/// NamedNodeRef::new("http://example.com#me")?, +/// NamedNodeRef::new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")?, +/// NamedNodeRef::new("http://schema.org/Person")?, +/// ), +/// &mut buf, +/// )?; +/// writer.finish(&mut buf)?; +/// assert_eq!( +/// b"@prefix schema: <http://schema.org/> .\n<http://example.com#me> a schema:Person .\n", +/// buf.as_slice() +/// ); +/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) +/// ``` +pub struct LowLevelTurtleWriter { + inner: LowLevelTriGWriter, +} + +impl LowLevelTurtleWriter { + /// Writes an extra triple. + pub fn write_triple<'a>( + &mut self, + t: impl Into<TripleRef<'a>>, + write: impl Write, + ) -> io::Result<()> { + self.inner + .write_quad(t.into().in_graph(GraphNameRef::DefaultGraph), write) + } + + /// Finishes to write the file. + pub fn finish(&mut self, write: impl Write) -> io::Result<()> { + self.inner.finish(write) + } +} + +#[cfg(test)] +mod tests { + #![allow(clippy::panic_in_result_fn)] + + use super::*; + use oxrdf::{BlankNodeRef, LiteralRef, NamedNodeRef}; + + #[test] + fn test_write() -> io::Result<()> { + let mut writer = TurtleSerializer::new().serialize_to_write(Vec::new()); + writer.write_triple(TripleRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p"), + NamedNodeRef::new_unchecked("http://example.com/o"), + ))?; + writer.write_triple(TripleRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p"), + LiteralRef::new_simple_literal("foo"), + ))?; + writer.write_triple(TripleRef::new( + NamedNodeRef::new_unchecked("http://example.com/s"), + NamedNodeRef::new_unchecked("http://example.com/p2"), + LiteralRef::new_language_tagged_literal_unchecked("foo", "en"), + ))?; + writer.write_triple(TripleRef::new( + BlankNodeRef::new_unchecked("b"), + NamedNodeRef::new_unchecked("http://example.com/p2"), + BlankNodeRef::new_unchecked("b2"), + ))?; + assert_eq!(String::from_utf8(writer.finish()?).unwrap(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> , \"foo\" ;\n\t<http://example.com/p2> \"foo\"@en .\n_:b <http://example.com/p2> _:b2 .\n"); + Ok(()) + } +} diff --git a/lib/sparesults/Cargo.toml b/lib/sparesults/Cargo.toml index 2ca9d325..5eae3746 100644 --- a/lib/sparesults/Cargo.toml +++ b/lib/sparesults/Cargo.toml @@ -1,27 +1,37 @@ [package] name = "sparesults" -version = "0.1.8" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +version = "0.2.0-alpha.2" +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["SPARQL"] repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/sparesults" -homepage = "https://oxigraph.org/" description = """ SPARQL query results formats parsers and serializers """ documentation = "https://docs.rs/sparesults" -edition = "2021" -rust-version = "1.60" +edition.workspace = true +rust-version.workspace = true [features] default = [] rdf-star = ["oxrdf/rdf-star"] +async-tokio = ["dep:tokio", "quick-xml/async-tokio", "json-event-parser/async-tokio"] [dependencies] -json-event-parser = "0.1" -oxrdf = { version = "0.1.6", path="../oxrdf" } -quick-xml = "0.28" +json-event-parser.workspace = true +memchr.workspace = true +oxrdf.workspace = true +quick-xml.workspace = true +thiserror.workspace = true +tokio = { workspace = true, optional = true, features = ["io-util"] } + +[dev-dependencies] +tokio = { workspace = true, features = ["rt", "macros"] } + +[lints] +workspace = true [package.metadata.docs.rs] all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/sparesults/README.md b/lib/sparesults/README.md index 73ccea36..df5a0fb3 100644 --- a/lib/sparesults/README.md +++ b/lib/sparesults/README.md @@ -5,7 +5,7 @@ Sparesults [](https://docs.rs/sparesults) [](https://crates.io/crates/sparesults) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) Sparesults is a set of parsers and serializers for [SPARQL](https://www.w3.org/TR/sparql11-overview/) query results formats. @@ -15,28 +15,29 @@ Support for [SPARQL-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html This crate is intended to be a building piece for SPARQL client and server implementations in Rust like [Oxigraph](https://oxigraph.org). -Usage example converting a JSON result file into a TSV result file: +The entry points of this library are the two [`QueryResultsParser`] and [`QueryResultsSerializer`] structs. +Usage example converting a JSON result file into a TSV result file: ```rust -use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader, QueryResultsSerializer}; +use sparesults::{QueryResultsFormat, QueryResultsParser, FromReadQueryResultsReader, QueryResultsSerializer}; use std::io::Result; fn convert_json_to_tsv(json_file: &[u8]) -> Result<Vec<u8>> { let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); let tsv_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Tsv); // We start to read the JSON file and see which kind of results it is - match json_parser.read_results(json_file)? { - QueryResultsReader::Boolean(value) => { + match json_parser.parse_read(json_file)? { + FromReadQueryResultsReader::Boolean(value) => { // it's a boolean result, we copy it in TSV to the output buffer - tsv_serializer.write_boolean_result(Vec::new(), value) + tsv_serializer.serialize_boolean_to_write(Vec::new(), value) }, - QueryResultsReader::Solutions(solutions_reader) => { + FromReadQueryResultsReader::Solutions(solutions_reader) => { // it's a set of solutions, we create a writer and we write to it while reading in streaming from the JSON file - let mut solutions_writer = tsv_serializer.solutions_writer(Vec::new(), solutions_reader.variables().to_vec())?; + let mut serialize_solutions_to_write = tsv_serializer.serialize_solutions_to_write(Vec::new(), solutions_reader.variables().to_vec())?; for solution in solutions_reader { - solutions_writer.write(&solution?)?; + serialize_solutions_to_write.write(&solution?)?; } - solutions_writer.finish() + serialize_solutions_to_write.finish() } } } diff --git a/lib/sparesults/src/csv.rs b/lib/sparesults/src/csv.rs index b365c4ac..02f4df9b 100644 --- a/lib/sparesults/src/csv.rs +++ b/lib/sparesults/src/csv.rs @@ -1,40 +1,128 @@ //! Implementation of [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/) -use crate::error::{ParseError, SyntaxError, SyntaxErrorKind}; -use oxrdf::Variable; -use oxrdf::{vocab::xsd, *}; -use std::io::{self, BufRead, Write}; -use std::str::FromStr; - -pub fn write_boolean_csv_result<W: Write>(mut sink: W, value: bool) -> io::Result<W> { - sink.write_all(if value { b"true" } else { b"false" })?; - Ok(sink) +use crate::error::{ + QueryResultsParseError, QueryResultsSyntaxError, SyntaxErrorKind, TextPosition, +}; +use memchr::memchr; +use oxrdf::vocab::xsd; +use oxrdf::*; +use std::io::{self, Read, Write}; +use std::str::{self, FromStr}; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncWrite, AsyncWriteExt}; + +const MAX_BUFFER_SIZE: usize = 4096 * 4096; + +pub fn write_boolean_csv_result<W: Write>(mut write: W, value: bool) -> io::Result<W> { + write.write_all(if value { b"true" } else { b"false" })?; + Ok(write) } -pub struct CsvSolutionsWriter<W: Write> { - sink: W, +#[cfg(feature = "async-tokio")] +pub async fn tokio_async_write_boolean_csv_result<W: AsyncWrite + Unpin>( + mut write: W, + value: bool, +) -> io::Result<W> { + write + .write_all(if value { b"true" } else { b"false" }) + .await?; + Ok(write) +} + +pub struct ToWriteCsvSolutionsWriter<W: Write> { + inner: InnerCsvSolutionsWriter, + write: W, + buffer: String, +} + +impl<W: Write> ToWriteCsvSolutionsWriter<W> { + pub fn start(mut write: W, variables: Vec<Variable>) -> io::Result<Self> { + let mut buffer = String::new(); + let inner = InnerCsvSolutionsWriter::start(&mut buffer, variables); + write.write_all(buffer.as_bytes())?; + buffer.clear(); + Ok(Self { + inner, + write, + buffer, + }) + } + + pub fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) -> io::Result<()> { + self.inner.write(&mut self.buffer, solution); + self.write.write_all(self.buffer.as_bytes())?; + self.buffer.clear(); + Ok(()) + } + + pub fn finish(self) -> W { + self.write + } +} + +#[cfg(feature = "async-tokio")] +pub struct ToTokioAsyncWriteCsvSolutionsWriter<W: AsyncWrite + Unpin> { + inner: InnerCsvSolutionsWriter, + write: W, + buffer: String, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteCsvSolutionsWriter<W> { + pub async fn start(mut write: W, variables: Vec<Variable>) -> io::Result<Self> { + let mut buffer = String::new(); + let inner = InnerCsvSolutionsWriter::start(&mut buffer, variables); + write.write_all(buffer.as_bytes()).await?; + buffer.clear(); + Ok(Self { + inner, + write, + buffer, + }) + } + + pub async fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) -> io::Result<()> { + self.inner.write(&mut self.buffer, solution); + self.write.write_all(self.buffer.as_bytes()).await?; + self.buffer.clear(); + Ok(()) + } + + pub fn finish(self) -> W { + self.write + } +} + +struct InnerCsvSolutionsWriter { variables: Vec<Variable>, } -impl<W: Write> CsvSolutionsWriter<W> { - pub fn start(mut sink: W, variables: Vec<Variable>) -> io::Result<Self> { +impl InnerCsvSolutionsWriter { + fn start(output: &mut String, variables: Vec<Variable>) -> Self { let mut start_vars = true; for variable in &variables { if start_vars { start_vars = false; } else { - sink.write_all(b",")?; + output.push(','); } - sink.write_all(variable.as_str().as_bytes())?; + output.push_str(variable.as_str()); } - sink.write_all(b"\r\n")?; - Ok(Self { sink, variables }) + output.push_str("\r\n"); + Self { variables } } - pub fn write<'a>( - &mut self, + fn write<'a>( + &self, + output: &mut String, solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, - ) -> io::Result<()> { + ) { let mut values = vec![None; self.variables.len()]; for (variable, value) in solution { if let Some(position) = self.variables.iter().position(|v| *v == variable) { @@ -46,86 +134,147 @@ impl<W: Write> CsvSolutionsWriter<W> { if start_binding { start_binding = false; } else { - self.sink.write_all(b",")?; + output.push(','); } if let Some(value) = value { - write_csv_term(value, &mut self.sink)?; + write_csv_term(output, value); } } - self.sink.write_all(b"\r\n") - } - - pub fn finish(mut self) -> io::Result<W> { - self.sink.flush()?; - Ok(self.sink) + output.push_str("\r\n"); } } -fn write_csv_term<'a>(term: impl Into<TermRef<'a>>, sink: &mut impl Write) -> io::Result<()> { +fn write_csv_term<'a>(output: &mut String, term: impl Into<TermRef<'a>>) { match term.into() { - TermRef::NamedNode(uri) => sink.write_all(uri.as_str().as_bytes()), + TermRef::NamedNode(uri) => output.push_str(uri.as_str()), TermRef::BlankNode(bnode) => { - sink.write_all(b"_:")?; - sink.write_all(bnode.as_str().as_bytes()) + output.push_str("_:"); + output.push_str(bnode.as_str()) } - TermRef::Literal(literal) => write_escaped_csv_string(literal.value(), sink), + TermRef::Literal(literal) => write_escaped_csv_string(output, literal.value()), #[cfg(feature = "rdf-star")] TermRef::Triple(triple) => { - write_csv_term(&triple.subject, sink)?; - sink.write_all(b" ")?; - write_csv_term(&triple.predicate, sink)?; - sink.write_all(b" ")?; - write_csv_term(&triple.object, sink) + write_csv_term(output, &triple.subject); + output.push(' '); + write_csv_term(output, &triple.predicate); + output.push(' '); + write_csv_term(output, &triple.object) } } } -fn write_escaped_csv_string(s: &str, sink: &mut impl Write) -> io::Result<()> { +fn write_escaped_csv_string(output: &mut String, s: &str) { if s.bytes().any(|c| matches!(c, b'"' | b',' | b'\n' | b'\r')) { - sink.write_all(b"\"")?; - for c in s.bytes() { - if c == b'\"' { - sink.write_all(b"\"\"") + output.push('"'); + for c in s.chars() { + if c == '"' { + output.push('"'); + output.push('"'); } else { - sink.write_all(&[c]) - }?; + output.push(c) + }; } - sink.write_all(b"\"") + output.push('"'); } else { - sink.write_all(s.as_bytes()) + output.push_str(s) + } +} + +pub struct ToWriteTsvSolutionsWriter<W: Write> { + inner: InnerTsvSolutionsWriter, + write: W, + buffer: String, +} + +impl<W: Write> ToWriteTsvSolutionsWriter<W> { + pub fn start(mut write: W, variables: Vec<Variable>) -> io::Result<Self> { + let mut buffer = String::new(); + let inner = InnerTsvSolutionsWriter::start(&mut buffer, variables); + write.write_all(buffer.as_bytes())?; + buffer.clear(); + Ok(Self { + inner, + write, + buffer, + }) + } + + pub fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) -> io::Result<()> { + self.inner.write(&mut self.buffer, solution); + self.write.write_all(self.buffer.as_bytes())?; + self.buffer.clear(); + Ok(()) + } + + pub fn finish(self) -> W { + self.write } } -pub fn write_boolean_tsv_result<W: Write>(mut sink: W, value: bool) -> io::Result<W> { - sink.write_all(if value { b"true" } else { b"false" })?; - Ok(sink) +#[cfg(feature = "async-tokio")] +pub struct ToTokioAsyncWriteTsvSolutionsWriter<W: AsyncWrite + Unpin> { + inner: InnerTsvSolutionsWriter, + write: W, + buffer: String, } -pub struct TsvSolutionsWriter<W: Write> { - sink: W, +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteTsvSolutionsWriter<W> { + pub async fn start(mut write: W, variables: Vec<Variable>) -> io::Result<Self> { + let mut buffer = String::new(); + let inner = InnerTsvSolutionsWriter::start(&mut buffer, variables); + write.write_all(buffer.as_bytes()).await?; + buffer.clear(); + Ok(Self { + inner, + write, + buffer, + }) + } + + pub async fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) -> io::Result<()> { + self.inner.write(&mut self.buffer, solution); + self.write.write_all(self.buffer.as_bytes()).await?; + self.buffer.clear(); + Ok(()) + } + + pub fn finish(self) -> W { + self.write + } +} + +struct InnerTsvSolutionsWriter { variables: Vec<Variable>, } -impl<W: Write> TsvSolutionsWriter<W> { - pub fn start(mut sink: W, variables: Vec<Variable>) -> io::Result<Self> { +impl InnerTsvSolutionsWriter { + fn start(output: &mut String, variables: Vec<Variable>) -> Self { let mut start_vars = true; for variable in &variables { if start_vars { start_vars = false; } else { - sink.write_all(b"\t")?; + output.push('\t'); } - sink.write_all(b"?")?; - sink.write_all(variable.as_str().as_bytes())?; + output.push('?'); + output.push_str(variable.as_str()); } - sink.write_all(b"\n")?; - Ok(Self { sink, variables }) + output.push('\n'); + Self { variables } } - pub fn write<'a>( - &mut self, + fn write<'a>( + &self, + output: &mut String, solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, - ) -> io::Result<()> { + ) { let mut values = vec![None; self.variables.len()]; for (variable, value) in solution { if let Some(position) = self.variables.iter().position(|v| *v == variable) { @@ -137,71 +286,74 @@ impl<W: Write> TsvSolutionsWriter<W> { if start_binding { start_binding = false; } else { - self.sink.write_all(b"\t")?; + output.push('\t'); } if let Some(value) = value { - write_tsv_term(value, &mut self.sink)?; + write_tsv_term(output, value); } } - self.sink.write_all(b"\n") - } - - pub fn finish(mut self) -> io::Result<W> { - self.sink.flush()?; - Ok(self.sink) + output.push('\n'); } } -fn write_tsv_term<'a>(term: impl Into<TermRef<'a>>, sink: &mut impl Write) -> io::Result<()> { +fn write_tsv_term<'a>(output: &mut String, term: impl Into<TermRef<'a>>) { match term.into() { - TermRef::NamedNode(node) => write!(sink, "<{}>", node.as_str()), - TermRef::BlankNode(node) => write!(sink, "_:{}", node.as_str()), + TermRef::NamedNode(node) => { + output.push('<'); + output.push_str(node.as_str()); + output.push('>'); + } + TermRef::BlankNode(node) => { + output.push_str("_:"); + output.push_str(node.as_str()); + } TermRef::Literal(literal) => { let value = literal.value(); if let Some(language) = literal.language() { - write_tsv_quoted_str(value, sink)?; - write!(sink, "@{language}") + write_tsv_quoted_str(output, value); + output.push('@'); + output.push_str(language); } else { match literal.datatype() { - xsd::BOOLEAN if is_turtle_boolean(value) => sink.write_all(value.as_bytes()), - xsd::INTEGER if is_turtle_integer(value) => sink.write_all(value.as_bytes()), - xsd::DECIMAL if is_turtle_decimal(value) => sink.write_all(value.as_bytes()), - xsd::DOUBLE if is_turtle_double(value) => sink.write_all(value.as_bytes()), - xsd::STRING => write_tsv_quoted_str(value, sink), + xsd::BOOLEAN if is_turtle_boolean(value) => output.push_str(value), + xsd::INTEGER if is_turtle_integer(value) => output.push_str(value), + xsd::DECIMAL if is_turtle_decimal(value) => output.push_str(value), + xsd::DOUBLE if is_turtle_double(value) => output.push_str(value), + xsd::STRING => write_tsv_quoted_str(output, value), datatype => { - write_tsv_quoted_str(value, sink)?; - write!(sink, "^^<{}>", datatype.as_str()) + write_tsv_quoted_str(output, value); + output.push_str("^^"); + write_tsv_term(output, datatype); } } } } #[cfg(feature = "rdf-star")] TermRef::Triple(triple) => { - sink.write_all(b"<< ")?; - write_tsv_term(&triple.subject, sink)?; - sink.write_all(b" ")?; - write_tsv_term(&triple.predicate, sink)?; - sink.write_all(b" ")?; - write_tsv_term(&triple.object, sink)?; - sink.write_all(b" >>")?; - Ok(()) + output.push_str("<< "); + write_tsv_term(output, &triple.subject); + output.push(' '); + write_tsv_term(output, &triple.predicate); + output.push(' '); + write_tsv_term(output, &triple.object); + output.push_str(" >>"); } } } -fn write_tsv_quoted_str(string: &str, f: &mut impl Write) -> io::Result<()> { - f.write_all(b"\"")?; - for c in string.bytes() { +fn write_tsv_quoted_str(output: &mut String, string: &str) { + output.push('"'); + for c in string.chars() { match c { - b'\t' => f.write_all(b"\\t"), - b'\n' => f.write_all(b"\\n"), - b'\r' => f.write_all(b"\\r"), - b'"' => f.write_all(b"\\\""), - b'\\' => f.write_all(b"\\\\"), - c => f.write_all(&[c]), - }?; - } - f.write_all(b"\"") + '\t' => output.push_str("\\t"), + '\n' => output.push_str("\\n"), + '\r' => output.push_str("\\r"), + '"' => output.push_str("\\\""), + '\\' => output.push_str("\\\\"), + _ => output.push(c), + }; + } + output.push('"'); } fn is_turtle_boolean(value: &str) -> bool { @@ -209,7 +361,7 @@ fn is_turtle_boolean(value: &str) -> bool { } fn is_turtle_integer(value: &str) -> bool { - // [19] INTEGER ::= [+-]? [0-9]+ + // [19] INTEGER ::= [+-]? [0-9]+ let mut value = value.as_bytes(); if let Some(v) = value.strip_prefix(b"+") { value = v; @@ -220,7 +372,7 @@ fn is_turtle_integer(value: &str) -> bool { } fn is_turtle_decimal(value: &str) -> bool { - // [20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+ + // [20] DECIMAL ::= [+-]? [0-9]* '.' [0-9]+ let mut value = value.as_bytes(); if let Some(v) = value.strip_prefix(b"+") { value = v; @@ -230,17 +382,15 @@ fn is_turtle_decimal(value: &str) -> bool { while value.first().map_or(false, u8::is_ascii_digit) { value = &value[1..]; } - if let Some(v) = value.strip_prefix(b".") { - value = v; - } else { + let Some(value) = value.strip_prefix(b".") else { return false; - } + }; !value.is_empty() && value.iter().all(u8::is_ascii_digit) } fn is_turtle_double(value: &str) -> bool { - // [21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT) - // [154s] EXPONENT ::= [eE] [+-]? [0-9]+ + // [21] DOUBLE ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT) + // [154s] EXPONENT ::= [eE] [+-]? [0-9]+ let mut value = value.as_bytes(); if let Some(v) = value.strip_prefix(b"+") { value = v; @@ -275,7 +425,7 @@ fn is_turtle_double(value: &str) -> bool { (with_before || with_after) && !value.is_empty() && value.iter().all(u8::is_ascii_digit) } -pub enum TsvQueryResultsReader<R: BufRead> { +pub enum TsvQueryResultsReader<R: Read> { Solutions { variables: Vec<Variable>, solutions: TsvSolutionsReader<R>, @@ -283,14 +433,14 @@ pub enum TsvQueryResultsReader<R: BufRead> { Boolean(bool), } -impl<R: BufRead> TsvQueryResultsReader<R> { - pub fn read(mut source: R) -> Result<Self, ParseError> { - let mut buffer = String::new(); +impl<R: Read> TsvQueryResultsReader<R> { + pub fn read(mut read: R) -> Result<Self, QueryResultsParseError> { + let mut reader = LineReader::new(); + let mut buffer = Vec::new(); // We read the header - source.read_line(&mut buffer)?; - let line = buffer - .as_str() + let line = reader + .next_line(&mut buffer, &mut read)? .trim_matches(|c| matches!(c, ' ' | '\r' | '\n')); if line.eq_ignore_ascii_case("true") { return Ok(Self::Boolean(true)); @@ -303,13 +453,13 @@ impl<R: BufRead> TsvQueryResultsReader<R> { for v in line.split('\t') { let v = v.trim(); if v.is_empty() { - return Err(SyntaxError::msg("Empty column on the first row. The first row should be a list of variables like ?foo or $bar").into()); + return Err(QueryResultsSyntaxError::msg("Empty column on the first row. The first row should be a list of variables like ?foo or $bar").into()); } let variable = Variable::from_str(v).map_err(|e| { - SyntaxError::msg(format!("Invalid variable declaration '{v}': {e}")) + QueryResultsSyntaxError::msg(format!("Invalid variable declaration '{v}': {e}")) })?; if variables.contains(&variable) { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "The variable {variable} is declared twice" )) .into()); @@ -321,63 +471,163 @@ impl<R: BufRead> TsvQueryResultsReader<R> { Ok(Self::Solutions { variables, solutions: TsvSolutionsReader { - source, + read, buffer, + reader, column_len, }, }) } } -pub struct TsvSolutionsReader<R: BufRead> { - source: R, - buffer: String, +pub struct TsvSolutionsReader<R: Read> { + read: R, + buffer: Vec<u8>, + reader: LineReader, column_len: usize, } -impl<R: BufRead> TsvSolutionsReader<R> { - pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, ParseError> { - self.buffer.clear(); - if self.source.read_line(&mut self.buffer)? == 0 { - return Ok(None); +impl<R: Read> TsvSolutionsReader<R> { + #[allow(clippy::unwrap_in_result)] + pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, QueryResultsParseError> { + let line = self.reader.next_line(&mut self.buffer, &mut self.read)?; + if line.is_empty() { + return Ok(None); // EOF } - let elements = self - .buffer + let elements = line .split('\t') - .map(|v| { + .enumerate() + .map(|(i, v)| { let v = v.trim(); if v.is_empty() { Ok(None) } else { - Ok(Some(Term::from_str(v).map_err(|e| SyntaxError { - inner: SyntaxErrorKind::Term(e), + Ok(Some(Term::from_str(v).map_err(|e| { + let start_position_char = line + .split('\t') + .take(i) + .map(|c| c.chars().count() + 1) + .sum::<usize>(); + let start_position_bytes = + line.split('\t').take(i).map(|c| c.len() + 1).sum::<usize>(); + QueryResultsSyntaxError(SyntaxErrorKind::Term { + error: e, + term: v.into(), + location: TextPosition { + line: self.reader.line_count - 1, + column: start_position_char.try_into().unwrap(), + offset: self.reader.last_line_start + + u64::try_from(start_position_bytes).unwrap(), + }..TextPosition { + line: self.reader.line_count - 1, + column: (start_position_char + v.chars().count()) + .try_into() + .unwrap(), + offset: self.reader.last_line_start + + u64::try_from(start_position_bytes + v.len()).unwrap(), + }, + }) })?)) } }) - .collect::<Result<Vec<_>, ParseError>>()?; + .collect::<Result<Vec<_>, QueryResultsParseError>>()?; if elements.len() == self.column_len { Ok(Some(elements)) } else if self.column_len == 0 && elements == [None] { Ok(Some(Vec::new())) // Zero columns case } else { - Err(SyntaxError::msg(format!( - "This TSV files has {} columns but we found a row with {} columns: {:?}", - self.column_len, - elements.len(), - self.buffer - )) + Err(QueryResultsSyntaxError::located_message( + format!( + "This TSV files has {} columns but we found a row on line {} with {} columns: {}", + self.column_len, + self.reader.line_count - 1, + elements.len(), + line + ), + TextPosition { + line: self.reader.line_count - 1, + column: 0, + offset: self.reader.last_line_start, + }..TextPosition { + line: self.reader.line_count - 1, + column: line.chars().count().try_into().unwrap(), + offset: self.reader.last_line_end, + }, + ) .into()) } } } +struct LineReader { + buffer_start: usize, + buffer_end: usize, + line_count: u64, + last_line_start: u64, + last_line_end: u64, +} + +impl LineReader { + fn new() -> Self { + Self { + buffer_start: 0, + buffer_end: 0, + line_count: 0, + last_line_start: 0, + last_line_end: 0, + } + } + + #[allow(clippy::unwrap_in_result)] + fn next_line<'a>( + &mut self, + buffer: &'a mut Vec<u8>, + read: &mut impl Read, + ) -> io::Result<&'a str> { + let line_end = loop { + if let Some(eol) = memchr(b'\n', &buffer[self.buffer_start..self.buffer_end]) { + break self.buffer_start + eol + 1; + } + if self.buffer_start > 0 { + buffer.copy_within(self.buffer_start..self.buffer_end, 0); + self.buffer_end -= self.buffer_start; + self.buffer_start = 0; + } + if self.buffer_end + 1024 > buffer.len() { + if self.buffer_end + 1024 > MAX_BUFFER_SIZE { + return Err(io::Error::new( + io::ErrorKind::OutOfMemory, + format!("Reached the buffer maximal size of {MAX_BUFFER_SIZE}"), + )); + } + buffer.resize(self.buffer_end + 1024, b'\0'); + } + let read = read.read(&mut buffer[self.buffer_end..])?; + if read == 0 { + break self.buffer_end; + } + self.buffer_end += read; + }; + let result = str::from_utf8(&buffer[self.buffer_start..line_end]).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Invalid UTF-8 in the TSV file: {e}"), + ) + }); + self.line_count += 1; + self.last_line_start = self.last_line_end; + self.last_line_end += u64::try_from(line_end - self.buffer_start).unwrap(); + self.buffer_start = line_end; + result + } +} + #[cfg(test)] mod tests { + #![allow(clippy::panic_in_result_fn)] + use super::*; use std::error::Error; - use std::io::Cursor; - use std::rc::Rc; - use std::str; fn build_example() -> (Vec<Variable>, Vec<Vec<Option<Term>>>) { ( @@ -427,21 +677,20 @@ mod tests { } #[test] - fn test_csv_serialization() -> io::Result<()> { + fn test_csv_serialization() { let (variables, solutions) = build_example(); - let mut writer = CsvSolutionsWriter::start(Vec::new(), variables.clone())?; - let variables = Rc::new(variables); + let mut buffer = String::new(); + let writer = InnerCsvSolutionsWriter::start(&mut buffer, variables.clone()); for solution in solutions { writer.write( + &mut buffer, variables .iter() .zip(&solution) .filter_map(|(v, s)| s.as_ref().map(|s| (v.as_ref(), s.as_ref()))), - )?; + ); } - let result = writer.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "x,literal\r\nhttp://example/x,String\r\nhttp://example/x,\"String-with-dquote\"\"\"\r\n_:b0,Blank node\r\n,Missing 'x'\r\n,\r\nhttp://example/x,\r\n_:b1,String-with-lang\r\n_:b1,123\r\n,\"escape,\t\r\n\"\r\n"); - Ok(()) + assert_eq!(buffer, "x,literal\r\nhttp://example/x,String\r\nhttp://example/x,\"String-with-dquote\"\"\"\r\n_:b0,Blank node\r\n,Missing 'x'\r\n,\r\nhttp://example/x,\r\n_:b1,String-with-lang\r\n_:b1,123\r\n,\"escape,\t\r\n\"\r\n"); } #[test] @@ -449,24 +698,24 @@ mod tests { let (variables, solutions) = build_example(); // Write - let mut writer = TsvSolutionsWriter::start(Vec::new(), variables.clone())?; - let variables = Rc::new(variables); + let mut buffer = String::new(); + let writer = InnerTsvSolutionsWriter::start(&mut buffer, variables.clone()); for solution in &solutions { writer.write( + &mut buffer, variables .iter() .zip(solution) .filter_map(|(v, s)| s.as_ref().map(|s| (v.as_ref(), s.as_ref()))), - )?; + ); } - let result = writer.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "?x\t?literal\n<http://example/x>\t\"String\"\n<http://example/x>\t\"String-with-dquote\\\"\"\n_:b0\t\"Blank node\"\n\t\"Missing 'x'\"\n\t\n<http://example/x>\t\n_:b1\t\"String-with-lang\"@en\n_:b1\t123\n\t\"escape,\\t\\r\\n\"\n"); + assert_eq!(buffer, "?x\t?literal\n<http://example/x>\t\"String\"\n<http://example/x>\t\"String-with-dquote\\\"\"\n_:b0\t\"Blank node\"\n\t\"Missing 'x'\"\n\t\n<http://example/x>\t\n_:b1\t\"String-with-lang\"@en\n_:b1\t123\n\t\"escape,\\t\\r\\n\"\n"); // Read if let TsvQueryResultsReader::Solutions { solutions: mut solutions_iter, variables: actual_variables, - } = TsvQueryResultsReader::read(Cursor::new(result))? + } = TsvQueryResultsReader::read(buffer.as_bytes())? { assert_eq!(actual_variables.as_slice(), variables.as_slice()); let mut rows = Vec::new(); @@ -499,7 +748,7 @@ mod tests { bad_tsvs.push(&a_lot_of_strings); for bad_tsv in bad_tsvs { if let Ok(TsvQueryResultsReader::Solutions { mut solutions, .. }) = - TsvQueryResultsReader::read(Cursor::new(bad_tsv)) + TsvQueryResultsReader::read(bad_tsv.as_bytes()) { while let Ok(Some(_)) = solutions.read_next() {} } @@ -507,21 +756,19 @@ mod tests { } #[test] - fn test_no_columns_csv_serialization() -> io::Result<()> { - let mut writer = CsvSolutionsWriter::start(Vec::new(), Vec::new())?; - writer.write([])?; - let result = writer.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "\r\n\r\n"); - Ok(()) + fn test_no_columns_csv_serialization() { + let mut buffer = String::new(); + let writer = InnerCsvSolutionsWriter::start(&mut buffer, Vec::new()); + writer.write(&mut buffer, []); + assert_eq!(buffer, "\r\n\r\n"); } #[test] - fn test_no_columns_tsv_serialization() -> io::Result<()> { - let mut writer = TsvSolutionsWriter::start(Vec::new(), Vec::new())?; - writer.write([])?; - let result = writer.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "\n\n"); - Ok(()) + fn test_no_columns_tsv_serialization() { + let mut buffer = String::new(); + let writer = InnerTsvSolutionsWriter::start(&mut buffer, Vec::new()); + writer.write(&mut buffer, []); + assert_eq!(buffer, "\n\n"); } #[test] @@ -541,19 +788,17 @@ mod tests { } #[test] - fn test_no_results_csv_serialization() -> io::Result<()> { - let result = - CsvSolutionsWriter::start(Vec::new(), vec![Variable::new_unchecked("a")])?.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "a\r\n"); - Ok(()) + fn test_no_results_csv_serialization() { + let mut buffer = String::new(); + InnerCsvSolutionsWriter::start(&mut buffer, vec![Variable::new_unchecked("a")]); + assert_eq!(buffer, "a\r\n"); } #[test] - fn test_no_results_tsv_serialization() -> io::Result<()> { - let result = - TsvSolutionsWriter::start(Vec::new(), vec![Variable::new_unchecked("a")])?.finish()?; - assert_eq!(str::from_utf8(&result).unwrap(), "?a\n"); - Ok(()) + fn test_no_results_tsv_serialization() { + let mut buffer = String::new(); + InnerTsvSolutionsWriter::start(&mut buffer, vec![Variable::new_unchecked("a")]); + assert_eq!(buffer, "?a\n"); } #[test] diff --git a/lib/sparesults/src/error.rs b/lib/sparesults/src/error.rs index 24ed05fa..f26a3349 100644 --- a/lib/sparesults/src/error.rs +++ b/lib/sparesults/src/error.rs @@ -1,130 +1,151 @@ use oxrdf::TermParseError; -use std::error::Error; -use std::{fmt, io}; +use std::io; +use std::ops::Range; +use std::sync::Arc; /// Error returned during SPARQL result formats format parsing. -#[derive(Debug)] -pub enum ParseError { +#[derive(Debug, thiserror::Error)] +pub enum QueryResultsParseError { /// I/O error during parsing (file not found...). - Io(io::Error), + #[error(transparent)] + Io(#[from] io::Error), /// An error in the file syntax. - Syntax(SyntaxError), + #[error(transparent)] + Syntax(#[from] QueryResultsSyntaxError), } -impl fmt::Display for ParseError { +impl From<QueryResultsParseError> for io::Error { #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Io(e) => e.fmt(f), - Self::Syntax(e) => e.fmt(f), - } - } -} - -impl Error for ParseError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::Io(e) => Some(e), - Self::Syntax(e) => Some(e), + fn from(error: QueryResultsParseError) -> Self { + match error { + QueryResultsParseError::Io(error) => error, + QueryResultsParseError::Syntax(error) => error.into(), } } } -impl From<io::Error> for ParseError { - #[inline] - fn from(error: io::Error) -> Self { - Self::Io(error) - } -} - -impl From<SyntaxError> for ParseError { - #[inline] - fn from(error: SyntaxError) -> Self { - Self::Syntax(error) - } -} - -impl From<ParseError> for io::Error { - #[inline] - fn from(error: ParseError) -> Self { +impl From<json_event_parser::ParseError> for QueryResultsParseError { + fn from(error: json_event_parser::ParseError) -> Self { match error { - ParseError::Io(error) => error, - ParseError::Syntax(error) => error.into(), + json_event_parser::ParseError::Syntax(error) => { + QueryResultsSyntaxError::from(error).into() + } + json_event_parser::ParseError::Io(error) => error.into(), } } } -impl From<quick_xml::Error> for ParseError { +impl From<quick_xml::Error> for QueryResultsParseError { #[inline] fn from(error: quick_xml::Error) -> Self { match error { - quick_xml::Error::Io(error) => Self::Io(io::Error::new(error.kind(), error)), - error => Self::Syntax(SyntaxError { - inner: SyntaxErrorKind::Xml(error), - }), + quick_xml::Error::Io(error) => { + Self::Io(Arc::try_unwrap(error).unwrap_or_else(|e| io::Error::new(e.kind(), e))) + } + _ => Self::Syntax(QueryResultsSyntaxError(SyntaxErrorKind::Xml(error))), } } } /// An error in the syntax of the parsed file. -#[derive(Debug)] -pub struct SyntaxError { - pub(crate) inner: SyntaxErrorKind, -} +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct QueryResultsSyntaxError(#[from] pub(crate) SyntaxErrorKind); -#[derive(Debug)] -pub enum SyntaxErrorKind { - Xml(quick_xml::Error), - Term(TermParseError), - Msg { msg: String }, +#[derive(Debug, thiserror::Error)] +pub(crate) enum SyntaxErrorKind { + #[error(transparent)] + Json(#[from] json_event_parser::SyntaxError), + #[error(transparent)] + Xml(#[from] quick_xml::Error), + #[error("Error {error} on '{term}' in line {}", location.start.line + 1)] + Term { + #[source] + error: TermParseError, + term: String, + location: Range<TextPosition>, + }, + #[error("{msg}")] + Msg { + msg: String, + location: Option<Range<TextPosition>>, + }, } -impl SyntaxError { +impl QueryResultsSyntaxError { /// Builds an error from a printable error message. #[inline] pub(crate) fn msg(msg: impl Into<String>) -> Self { - Self { - inner: SyntaxErrorKind::Msg { msg: msg.into() }, - } + Self(SyntaxErrorKind::Msg { + msg: msg.into(), + location: None, + }) } -} -impl fmt::Display for SyntaxError { + /// Builds an error from a printable error message and a location #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.inner { - SyntaxErrorKind::Xml(e) => e.fmt(f), - SyntaxErrorKind::Term(e) => e.fmt(f), - SyntaxErrorKind::Msg { msg } => f.write_str(msg), - } + pub(crate) fn located_message(msg: impl Into<String>, location: Range<TextPosition>) -> Self { + Self(SyntaxErrorKind::Msg { + msg: msg.into(), + location: Some(location), + }) } -} -impl Error for SyntaxError { + /// The location of the error inside of the file. #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match &self.inner { - SyntaxErrorKind::Xml(e) => Some(e), - SyntaxErrorKind::Term(e) => Some(e), - SyntaxErrorKind::Msg { .. } => None, + pub fn location(&self) -> Option<Range<TextPosition>> { + match &self.0 { + SyntaxErrorKind::Json(e) => { + let location = e.location(); + Some( + TextPosition { + line: location.start.line, + column: location.start.column, + offset: location.start.offset, + }..TextPosition { + line: location.end.line, + column: location.end.column, + offset: location.end.offset, + }, + ) + } + SyntaxErrorKind::Term { location, .. } => Some(location.clone()), + SyntaxErrorKind::Msg { location, .. } => location.clone(), + SyntaxErrorKind::Xml(_) => None, } } } -impl From<SyntaxError> for io::Error { +impl From<QueryResultsSyntaxError> for io::Error { #[inline] - fn from(error: SyntaxError) -> Self { - match error.inner { + fn from(error: QueryResultsSyntaxError) -> Self { + match error.0 { + SyntaxErrorKind::Json(error) => Self::new(io::ErrorKind::InvalidData, error), SyntaxErrorKind::Xml(error) => match error { - quick_xml::Error::Io(error) => Self::new(error.kind(), error), + quick_xml::Error::Io(error) => { + Arc::try_unwrap(error).unwrap_or_else(|e| Self::new(e.kind(), e)) + } quick_xml::Error::UnexpectedEof(error) => { Self::new(io::ErrorKind::UnexpectedEof, error) } - error => Self::new(io::ErrorKind::InvalidData, error), + _ => Self::new(io::ErrorKind::InvalidData, error), }, - SyntaxErrorKind::Term(error) => Self::new(io::ErrorKind::InvalidData, error), - SyntaxErrorKind::Msg { msg } => Self::new(io::ErrorKind::InvalidData, msg), + SyntaxErrorKind::Term { .. } => Self::new(io::ErrorKind::InvalidData, error), + SyntaxErrorKind::Msg { msg, .. } => Self::new(io::ErrorKind::InvalidData, msg), } } } + +impl From<json_event_parser::SyntaxError> for QueryResultsSyntaxError { + fn from(error: json_event_parser::SyntaxError) -> Self { + Self(SyntaxErrorKind::Json(error)) + } +} + +/// A position in a text i.e. a `line` number starting from 0, a `column` number starting from 0 (in number of code points) and a global file `offset` starting from 0 (in number of bytes). +#[derive(Eq, PartialEq, Debug, Clone, Copy)] +pub struct TextPosition { + pub line: u64, + pub column: u64, + pub offset: u64, +} diff --git a/lib/sparesults/src/format.rs b/lib/sparesults/src/format.rs new file mode 100644 index 00000000..982ff11f --- /dev/null +++ b/lib/sparesults/src/format.rs @@ -0,0 +1,176 @@ +use std::fmt; + +/// [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. +#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] +#[non_exhaustive] +pub enum QueryResultsFormat { + /// [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) + Xml, + /// [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) + Json, + /// [SPARQL Query Results CSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) + Csv, + /// [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) + Tsv, +} + +impl QueryResultsFormat { + /// The format canonical IRI according to the [Unique URIs for file formats registry](https://www.w3.org/ns/formats/). + /// + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!( + /// QueryResultsFormat::Json.iri(), + /// "http://www.w3.org/ns/formats/SPARQL_Results_JSON" + /// ) + /// ``` + #[inline] + pub fn iri(self) -> &'static str { + match self { + Self::Xml => "http://www.w3.org/ns/formats/SPARQL_Results_XML", + Self::Json => "http://www.w3.org/ns/formats/SPARQL_Results_JSON", + Self::Csv => "http://www.w3.org/ns/formats/SPARQL_Results_CSV", + Self::Tsv => "http://www.w3.org/ns/formats/SPARQL_Results_TSV", + } + } + + /// The format [IANA media type](https://tools.ietf.org/html/rfc2046). + /// + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!( + /// QueryResultsFormat::Json.media_type(), + /// "application/sparql-results+json" + /// ) + /// ``` + #[inline] + pub fn media_type(self) -> &'static str { + match self { + Self::Xml => "application/sparql-results+xml", + Self::Json => "application/sparql-results+json", + Self::Csv => "text/csv; charset=utf-8", + Self::Tsv => "text/tab-separated-values; charset=utf-8", + } + } + + /// The format [IANA-registered](https://tools.ietf.org/html/rfc2046) file extension. + /// + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!(QueryResultsFormat::Json.file_extension(), "srj") + /// ``` + #[inline] + pub fn file_extension(self) -> &'static str { + match self { + Self::Xml => "srx", + Self::Json => "srj", + Self::Csv => "csv", + Self::Tsv => "tsv", + } + } + + /// The format name. + /// + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!(QueryResultsFormat::Json.name(), "SPARQL Results in JSON") + /// ``` + #[inline] + pub const fn name(self) -> &'static str { + match self { + Self::Xml => "SPARQL Results in XML", + Self::Json => "SPARQL Results in JSON", + Self::Csv => "SPARQL Results in CSV", + Self::Tsv => "SPARQL Results in TSV", + } + } + + /// Looks for a known format from a media type. + /// + /// It supports some media type aliases. + /// For example, "application/xml" is going to return `Xml` even if it is not its canonical media type. + /// + /// Example: + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!( + /// QueryResultsFormat::from_media_type("application/sparql-results+json; charset=utf-8"), + /// Some(QueryResultsFormat::Json) + /// ) + /// ``` + #[inline] + pub fn from_media_type(media_type: &str) -> Option<Self> { + const MEDIA_SUBTYPES: [(&str, QueryResultsFormat); 8] = [ + ("csv", QueryResultsFormat::Csv), + ("json", QueryResultsFormat::Json), + ("plain", QueryResultsFormat::Csv), + ("sparql-results+json", QueryResultsFormat::Json), + ("sparql-results+xml", QueryResultsFormat::Xml), + ("tab-separated-values", QueryResultsFormat::Tsv), + ("tsv", QueryResultsFormat::Tsv), + ("xml", QueryResultsFormat::Xml), + ]; + + let (r#type, subtype) = media_type + .split_once(';') + .unwrap_or((media_type, "")) + .0 + .trim() + .split_once('/')?; + let r#type = r#type.trim(); + if !r#type.eq_ignore_ascii_case("application") && !r#type.eq_ignore_ascii_case("text") { + return None; + } + let subtype = subtype.trim(); + let subtype = subtype.strip_prefix("x-").unwrap_or(subtype); + for (candidate_subtype, candidate_id) in MEDIA_SUBTYPES { + if candidate_subtype.eq_ignore_ascii_case(subtype) { + return Some(candidate_id); + } + } + None + } + + /// Looks for a known format from an extension. + /// + /// It supports some aliases. + /// + /// Example: + /// ``` + /// use sparesults::QueryResultsFormat; + /// + /// assert_eq!( + /// QueryResultsFormat::from_extension("json"), + /// Some(QueryResultsFormat::Json) + /// ) + /// ``` + #[inline] + pub fn from_extension(extension: &str) -> Option<Self> { + const MEDIA_TYPES: [(&str, QueryResultsFormat); 7] = [ + ("csv", QueryResultsFormat::Csv), + ("json", QueryResultsFormat::Json), + ("srj", QueryResultsFormat::Json), + ("srx", QueryResultsFormat::Xml), + ("tsv", QueryResultsFormat::Tsv), + ("txt", QueryResultsFormat::Csv), + ("xml", QueryResultsFormat::Xml), + ]; + for (candidate_extension, candidate_id) in MEDIA_TYPES { + if candidate_extension.eq_ignore_ascii_case(extension) { + return Some(candidate_id); + } + } + None + } +} + +impl fmt::Display for QueryResultsFormat { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.name()) + } +} diff --git a/lib/sparesults/src/json.rs b/lib/sparesults/src/json.rs index cacc4c59..efed124a 100644 --- a/lib/sparesults/src/json.rs +++ b/lib/sparesults/src/json.rs @@ -1,604 +1,1101 @@ //! Implementation of [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) -use crate::error::{ParseError, SyntaxError}; -use json_event_parser::{JsonEvent, JsonReader, JsonWriter}; +use crate::error::{QueryResultsParseError, QueryResultsSyntaxError}; +use json_event_parser::{FromReadJsonReader, JsonEvent, ToWriteJsonWriter}; +#[cfg(feature = "async-tokio")] +use json_event_parser::{FromTokioAsyncReadJsonReader, ToTokioAsyncWriteJsonWriter}; use oxrdf::vocab::rdf; -use oxrdf::Variable; use oxrdf::*; use std::collections::BTreeMap; -use std::io::{self, BufRead, Write}; +use std::io::{self, Read, Write}; use std::mem::take; +#[cfg(feature = "async-tokio")] +use tokio::io::{AsyncRead, AsyncWrite}; -/// This limit is set in order to avoid stack overflow error when parsing nested triples due to too many recursive calls. -/// The actual limit value is a wet finger compromise between not failing to parse valid files and avoiding to trigger stack overflow errors. -const MAX_NUMBER_OF_NESTED_TRIPLES: usize = 128; - -pub fn write_boolean_json_result<W: Write>(sink: W, value: bool) -> io::Result<W> { - let mut writer = JsonWriter::from_writer(sink); - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("head"))?; - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::EndObject)?; - writer.write_event(JsonEvent::ObjectKey("boolean"))?; - writer.write_event(JsonEvent::Boolean(value))?; - writer.write_event(JsonEvent::EndObject)?; - Ok(writer.into_inner()) -} - -pub struct JsonSolutionsWriter<W: Write> { - writer: JsonWriter<W>, -} - -impl<W: Write> JsonSolutionsWriter<W> { - pub fn start(sink: W, variables: &[Variable]) -> io::Result<Self> { - let mut writer = JsonWriter::from_writer(sink); - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("head"))?; - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("vars"))?; - writer.write_event(JsonEvent::StartArray)?; - for variable in variables { - writer.write_event(JsonEvent::String(variable.as_str()))?; - } - writer.write_event(JsonEvent::EndArray)?; - writer.write_event(JsonEvent::EndObject)?; - writer.write_event(JsonEvent::ObjectKey("results"))?; - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("bindings"))?; - writer.write_event(JsonEvent::StartArray)?; - Ok(Self { writer }) +pub fn write_boolean_json_result<W: Write>(write: W, value: bool) -> io::Result<W> { + let mut writer = ToWriteJsonWriter::new(write); + for event in inner_write_boolean_json_result(value) { + writer.write_event(event)?; + } + writer.finish() +} + +#[cfg(feature = "async-tokio")] +pub async fn tokio_async_write_boolean_json_result<W: AsyncWrite + Unpin>( + write: W, + value: bool, +) -> io::Result<W> { + let mut writer = ToTokioAsyncWriteJsonWriter::new(write); + for event in inner_write_boolean_json_result(value) { + writer.write_event(event).await?; + } + writer.finish() +} + +fn inner_write_boolean_json_result(value: bool) -> [JsonEvent<'static>; 7] { + [ + JsonEvent::StartObject, + JsonEvent::ObjectKey("head".into()), + JsonEvent::StartObject, + JsonEvent::EndObject, + JsonEvent::ObjectKey("boolean".into()), + JsonEvent::Boolean(value), + JsonEvent::EndObject, + ] +} + +pub struct ToWriteJsonSolutionsWriter<W: Write> { + inner: InnerJsonSolutionsWriter, + writer: ToWriteJsonWriter<W>, +} + +impl<W: Write> ToWriteJsonSolutionsWriter<W> { + pub fn start(write: W, variables: &[Variable]) -> io::Result<Self> { + let mut writer = ToWriteJsonWriter::new(write); + let mut buffer = Vec::with_capacity(48); + let inner = InnerJsonSolutionsWriter::start(&mut buffer, variables); + Self::do_write(&mut writer, buffer)?; + Ok(Self { inner, writer }) } pub fn write<'a>( &mut self, solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, ) -> io::Result<()> { - self.writer.write_event(JsonEvent::StartObject)?; - for (variable, value) in solution { - self.writer - .write_event(JsonEvent::ObjectKey(variable.as_str()))?; - write_json_term(value, &mut self.writer)?; + let mut buffer = Vec::with_capacity(48); + self.inner.write(&mut buffer, solution); + Self::do_write(&mut self.writer, buffer) + } + + pub fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::with_capacity(4); + self.inner.finish(&mut buffer); + Self::do_write(&mut self.writer, buffer)?; + self.writer.finish() + } + + fn do_write(writer: &mut ToWriteJsonWriter<W>, output: Vec<JsonEvent<'_>>) -> io::Result<()> { + for event in output { + writer.write_event(event)?; } - self.writer.write_event(JsonEvent::EndObject)?; Ok(()) } +} - pub fn finish(mut self) -> io::Result<W> { - self.writer.write_event(JsonEvent::EndArray)?; - self.writer.write_event(JsonEvent::EndObject)?; - self.writer.write_event(JsonEvent::EndObject)?; - let mut inner = self.writer.into_inner(); - inner.flush()?; - Ok(inner) +#[cfg(feature = "async-tokio")] +pub struct ToTokioAsyncWriteJsonSolutionsWriter<W: AsyncWrite + Unpin> { + inner: InnerJsonSolutionsWriter, + writer: ToTokioAsyncWriteJsonWriter<W>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteJsonSolutionsWriter<W> { + pub async fn start(write: W, variables: &[Variable]) -> io::Result<Self> { + let mut writer = ToTokioAsyncWriteJsonWriter::new(write); + let mut buffer = Vec::with_capacity(48); + let inner = InnerJsonSolutionsWriter::start(&mut buffer, variables); + Self::do_write(&mut writer, buffer).await?; + Ok(Self { inner, writer }) + } + + pub async fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) -> io::Result<()> { + let mut buffer = Vec::with_capacity(48); + self.inner.write(&mut buffer, solution); + Self::do_write(&mut self.writer, buffer).await + } + + pub async fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::with_capacity(4); + self.inner.finish(&mut buffer); + Self::do_write(&mut self.writer, buffer).await?; + self.writer.finish() + } + + async fn do_write( + writer: &mut ToTokioAsyncWriteJsonWriter<W>, + output: Vec<JsonEvent<'_>>, + ) -> io::Result<()> { + for event in output { + writer.write_event(event).await?; + } + Ok(()) + } +} + +struct InnerJsonSolutionsWriter; + +impl InnerJsonSolutionsWriter { + fn start<'a>(output: &mut Vec<JsonEvent<'a>>, variables: &'a [Variable]) -> Self { + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("head".into())); + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("vars".into())); + output.push(JsonEvent::StartArray); + for variable in variables { + output.push(JsonEvent::String(variable.as_str().into())); + } + output.push(JsonEvent::EndArray); + output.push(JsonEvent::EndObject); + output.push(JsonEvent::ObjectKey("results".into())); + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("bindings".into())); + output.push(JsonEvent::StartArray); + Self {} + } + + #[allow(clippy::unused_self)] + fn write<'a>( + &self, + output: &mut Vec<JsonEvent<'a>>, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) { + output.push(JsonEvent::StartObject); + for (variable, value) in solution { + output.push(JsonEvent::ObjectKey(variable.as_str().into())); + write_json_term(output, value); + } + output.push(JsonEvent::EndObject); + } + + #[allow(clippy::unused_self)] + fn finish(self, output: &mut Vec<JsonEvent<'_>>) { + output.push(JsonEvent::EndArray); + output.push(JsonEvent::EndObject); + output.push(JsonEvent::EndObject); } } -fn write_json_term(term: TermRef<'_>, writer: &mut JsonWriter<impl Write>) -> io::Result<()> { +fn write_json_term<'a>(output: &mut Vec<JsonEvent<'a>>, term: TermRef<'a>) { match term { TermRef::NamedNode(uri) => { - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("type"))?; - writer.write_event(JsonEvent::String("uri"))?; - writer.write_event(JsonEvent::ObjectKey("value"))?; - writer.write_event(JsonEvent::String(uri.as_str()))?; - writer.write_event(JsonEvent::EndObject)?; + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("type".into())); + output.push(JsonEvent::String("uri".into())); + output.push(JsonEvent::ObjectKey("value".into())); + output.push(JsonEvent::String(uri.as_str().into())); + output.push(JsonEvent::EndObject); } TermRef::BlankNode(bnode) => { - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("type"))?; - writer.write_event(JsonEvent::String("bnode"))?; - writer.write_event(JsonEvent::ObjectKey("value"))?; - writer.write_event(JsonEvent::String(bnode.as_str()))?; - writer.write_event(JsonEvent::EndObject)?; + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("type".into())); + output.push(JsonEvent::String("bnode".into())); + output.push(JsonEvent::ObjectKey("value".into())); + output.push(JsonEvent::String(bnode.as_str().into())); + output.push(JsonEvent::EndObject); } TermRef::Literal(literal) => { - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("type"))?; - writer.write_event(JsonEvent::String("literal"))?; - writer.write_event(JsonEvent::ObjectKey("value"))?; - writer.write_event(JsonEvent::String(literal.value()))?; + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("type".into())); + output.push(JsonEvent::String("literal".into())); + output.push(JsonEvent::ObjectKey("value".into())); + output.push(JsonEvent::String(literal.value().into())); if let Some(language) = literal.language() { - writer.write_event(JsonEvent::ObjectKey("xml:lang"))?; - writer.write_event(JsonEvent::String(language))?; + output.push(JsonEvent::ObjectKey("xml:lang".into())); + output.push(JsonEvent::String(language.into())); } else if !literal.is_plain() { - writer.write_event(JsonEvent::ObjectKey("datatype"))?; - writer.write_event(JsonEvent::String(literal.datatype().as_str()))?; + output.push(JsonEvent::ObjectKey("datatype".into())); + output.push(JsonEvent::String(literal.datatype().as_str().into())); } - writer.write_event(JsonEvent::EndObject)?; + output.push(JsonEvent::EndObject); } #[cfg(feature = "rdf-star")] TermRef::Triple(triple) => { - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("type"))?; - writer.write_event(JsonEvent::String("triple"))?; - writer.write_event(JsonEvent::ObjectKey("value"))?; - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("subject"))?; - write_json_term(triple.subject.as_ref().into(), writer)?; - writer.write_event(JsonEvent::ObjectKey("predicate"))?; - write_json_term(triple.predicate.as_ref().into(), writer)?; - writer.write_event(JsonEvent::ObjectKey("object"))?; - write_json_term(triple.object.as_ref(), writer)?; - writer.write_event(JsonEvent::EndObject)?; - writer.write_event(JsonEvent::EndObject)?; + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("type".into())); + output.push(JsonEvent::String("triple".into())); + output.push(JsonEvent::ObjectKey("value".into())); + output.push(JsonEvent::StartObject); + output.push(JsonEvent::ObjectKey("subject".into())); + write_json_term(output, triple.subject.as_ref().into()); + output.push(JsonEvent::ObjectKey("predicate".into())); + write_json_term(output, triple.predicate.as_ref().into()); + output.push(JsonEvent::ObjectKey("object".into())); + write_json_term(output, triple.object.as_ref()); + output.push(JsonEvent::EndObject); + output.push(JsonEvent::EndObject); } } - Ok(()) } -pub enum JsonQueryResultsReader<R: BufRead> { +pub enum FromReadJsonQueryResultsReader<R: Read> { Solutions { variables: Vec<Variable>, - solutions: JsonSolutionsReader<R>, + solutions: FromReadJsonSolutionsReader<R>, }, Boolean(bool), } -impl<R: BufRead> JsonQueryResultsReader<R> { - pub fn read(source: R) -> Result<Self, ParseError> { - let mut reader = JsonReader::from_reader(source); - let mut buffer = Vec::default(); - let mut variables = None; - let mut buffered_bindings: Option<Vec<_>> = None; - let mut output_iter = None; +impl<R: Read> FromReadJsonQueryResultsReader<R> { + pub fn read(read: R) -> Result<Self, QueryResultsParseError> { + let mut reader = FromReadJsonReader::new(read); + let mut inner = JsonInnerReader::new(); + loop { + if let Some(result) = inner.read_event(reader.read_next_event()?)? { + return match result { + JsonInnerQueryResults::Solutions { + variables, + solutions, + } => Ok(Self::Solutions { + variables, + solutions: FromReadJsonSolutionsReader { + inner: solutions, + reader, + }, + }), + JsonInnerQueryResults::Boolean(value) => Ok(Self::Boolean(value)), + }; + } + } + } +} - if reader.read_event(&mut buffer)? != JsonEvent::StartObject { - return Err(SyntaxError::msg("SPARQL JSON results should be an object").into()); +pub struct FromReadJsonSolutionsReader<R: Read> { + inner: JsonInnerSolutions, + reader: FromReadJsonReader<R>, +} + +impl<R: Read> FromReadJsonSolutionsReader<R> { + pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, QueryResultsParseError> { + match &mut self.inner { + JsonInnerSolutions::Reader(reader) => loop { + let event = self.reader.read_next_event()?; + if event == JsonEvent::Eof { + return Ok(None); + } + if let Some(result) = reader.read_event(event)? { + return Ok(Some(result)); + } + }, + JsonInnerSolutions::Iterator(iter) => iter.next(), } + } +} + +#[cfg(feature = "async-tokio")] +pub enum FromTokioAsyncReadJsonQueryResultsReader<R: AsyncRead + Unpin> { + Solutions { + variables: Vec<Variable>, + solutions: FromTokioAsyncReadJsonSolutionsReader<R>, + }, + Boolean(bool), +} +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadJsonQueryResultsReader<R> { + pub async fn read(read: R) -> Result<Self, QueryResultsParseError> { + let mut reader = FromTokioAsyncReadJsonReader::new(read); + let mut inner = JsonInnerReader::new(); loop { - let event = reader.read_event(&mut buffer)?; - match event { - JsonEvent::ObjectKey(key) => match key { + if let Some(result) = inner.read_event(reader.read_next_event().await?)? { + return match result { + JsonInnerQueryResults::Solutions { + variables, + solutions, + } => Ok(Self::Solutions { + variables, + solutions: FromTokioAsyncReadJsonSolutionsReader { + inner: solutions, + reader, + }, + }), + JsonInnerQueryResults::Boolean(value) => Ok(Self::Boolean(value)), + }; + } + } + } +} + +#[cfg(feature = "async-tokio")] +pub struct FromTokioAsyncReadJsonSolutionsReader<R: AsyncRead + Unpin> { + inner: JsonInnerSolutions, + reader: FromTokioAsyncReadJsonReader<R>, +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadJsonSolutionsReader<R> { + pub async fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, QueryResultsParseError> { + match &mut self.inner { + JsonInnerSolutions::Reader(reader) => loop { + let event = self.reader.read_next_event().await?; + if event == JsonEvent::Eof { + return Ok(None); + } + if let Some(result) = reader.read_event(event)? { + return Ok(Some(result)); + } + }, + JsonInnerSolutions::Iterator(iter) => iter.next(), + } + } +} + +enum JsonInnerQueryResults { + Solutions { + variables: Vec<Variable>, + solutions: JsonInnerSolutions, + }, + Boolean(bool), +} + +enum JsonInnerSolutions { + Reader(JsonInnerSolutionsReader), + Iterator(JsonBufferedSolutionsIterator), +} + +struct JsonInnerReader { + state: JsonInnerReaderState, + variables: Vec<Variable>, + current_solution_variables: Vec<String>, + current_solution_values: Vec<Term>, + solutions: Vec<(Vec<String>, Vec<Term>)>, + vars_read: bool, + solutions_read: bool, +} + +enum JsonInnerReaderState { + Start, + InRootObject, + BeforeHead, + InHead, + BeforeVars, + InVars, + BeforeLinks, + InLinks, + BeforeResults, + InResults, + BeforeBindings, + BeforeSolution, + BetweenSolutionTerms, + Term { + reader: JsonInnerTermReader, + variable: String, + }, + AfterBindings, + BeforeBoolean, + Ignore { + level: usize, + after: JsonInnerReaderStateAfterIgnore, + }, +} + +#[allow(clippy::enum_variant_names)] +#[derive(Clone, Copy)] +enum JsonInnerReaderStateAfterIgnore { + InRootObject, + InHead, + InResults, + AfterBindings, +} + +impl JsonInnerReader { + fn new() -> Self { + Self { + state: JsonInnerReaderState::Start, + variables: Vec::new(), + current_solution_variables: Vec::new(), + current_solution_values: Vec::new(), + solutions: Vec::new(), + vars_read: false, + solutions_read: false, + } + } + + fn read_event( + &mut self, + event: JsonEvent<'_>, + ) -> Result<Option<JsonInnerQueryResults>, QueryResultsSyntaxError> { + match &mut self.state { + JsonInnerReaderState::Start => { + if event == JsonEvent::StartObject { + self.state = JsonInnerReaderState::InRootObject; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results must be an object", + )) + } + } + JsonInnerReaderState::InRootObject => match event { + JsonEvent::ObjectKey(key) => match key.as_ref() { "head" => { - let extracted_variables = read_head(&mut reader, &mut buffer)?; - if let Some(buffered_bindings) = buffered_bindings.take() { - let mut mapping = BTreeMap::default(); - for (i, var) in extracted_variables.iter().enumerate() { - mapping.insert(var.as_str().to_owned(), i); - } - output_iter = Some(Self::Solutions { - variables: extracted_variables, - solutions: JsonSolutionsReader { - kind: JsonSolutionsReaderKind::Buffered { - bindings: buffered_bindings.into_iter(), - }, - mapping, - }, - }); - } else { - variables = Some(extracted_variables); - } + self.state = JsonInnerReaderState::BeforeHead; + Ok(None) } "results" => { - if reader.read_event(&mut buffer)? != JsonEvent::StartObject { - return Err(SyntaxError::msg("'results' should be an object").into()); - } - loop { - match reader.read_event(&mut buffer)? { - JsonEvent::ObjectKey("bindings") => break, // Found - JsonEvent::ObjectKey(_) => ignore_value(&mut reader, &mut buffer)?, - _ => { - return Err(SyntaxError::msg( - "'results' should contain a 'bindings' key", - ) - .into()) - } - } - } - if reader.read_event(&mut buffer)? != JsonEvent::StartArray { - return Err(SyntaxError::msg("'bindings' should be an object").into()); - } - if let Some(variables) = variables { - let mut mapping = BTreeMap::default(); - for (i, var) in variables.iter().enumerate() { - mapping.insert(var.as_str().to_owned(), i); - } - return Ok(Self::Solutions { - variables, - solutions: JsonSolutionsReader { - kind: JsonSolutionsReaderKind::Streaming { reader, buffer }, - mapping, - }, - }); - } - // We buffer all results before being able to read the header - let mut bindings = Vec::new(); - let mut variables = Vec::new(); - let mut values = Vec::new(); - loop { - match reader.read_event(&mut buffer)? { - JsonEvent::StartObject => (), - JsonEvent::EndObject => { - bindings.push((take(&mut variables), take(&mut values))); - } - JsonEvent::EndArray | JsonEvent::Eof => { - buffered_bindings = Some(bindings); - break; - } - JsonEvent::ObjectKey(key) => { - variables.push(key.to_owned()); - values.push(read_value(&mut reader, &mut buffer, 0)?); - } - _ => { - return Err( - SyntaxError::msg("Invalid result serialization").into() - ) - } - } - } + self.state = JsonInnerReaderState::BeforeResults; + Ok(None) } "boolean" => { - return if let JsonEvent::Boolean(v) = reader.read_event(&mut buffer)? { - Ok(Self::Boolean(v)) - } else { - Err(SyntaxError::msg("Unexpected boolean value").into()) - } + self.state = JsonInnerReaderState::BeforeBoolean; + Ok(None) } _ => { - return Err(SyntaxError::msg(format!( - "Expecting head or result key, found {key}" - )) - .into()); + self.state = JsonInnerReaderState::Ignore { + level: 0, + after: JsonInnerReaderStateAfterIgnore::InRootObject, + }; + Ok(None) + } + }, + JsonEvent::EndObject => Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results must contain a 'boolean' or a 'results' key", + )), + _ => unreachable!(), + }, + JsonInnerReaderState::BeforeHead => { + if event == JsonEvent::StartObject { + self.state = JsonInnerReaderState::InHead; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results head must be an object", + )) + } + } + JsonInnerReaderState::InHead => match event { + JsonEvent::ObjectKey(key) => match key.as_ref() { + "vars" => { + self.state = JsonInnerReaderState::BeforeVars; + self.vars_read = true; + Ok(None) + } + "links" => { + self.state = JsonInnerReaderState::BeforeLinks; + Ok(None) + } + _ => { + self.state = JsonInnerReaderState::Ignore { + level: 0, + after: JsonInnerReaderStateAfterIgnore::InHead, + }; + Ok(None) + } + }, + JsonEvent::EndObject => { + self.state = JsonInnerReaderState::InRootObject; + Ok(None) + } + _ => unreachable!(), + }, + JsonInnerReaderState::BeforeVars => { + if event == JsonEvent::StartArray { + self.state = JsonInnerReaderState::InVars; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results vars must be an array", + )) + } + } + JsonInnerReaderState::InVars => match event { + JsonEvent::String(variable) => match Variable::new(variable.clone()) { + Ok(var) => { + if self.variables.contains(&var) { + return Err(QueryResultsSyntaxError::msg(format!( + "The variable {var} is declared twice" + ))); + } + self.variables.push(var); + Ok(None) } + Err(e) => Err(QueryResultsSyntaxError::msg(format!( + "Invalid variable name '{variable}': {e}" + ))), }, - JsonEvent::EndObject => (), - JsonEvent::Eof => { - return if let Some(output_iter) = output_iter { - Ok(output_iter) + JsonEvent::EndArray => { + if self.solutions_read { + let mut mapping = BTreeMap::default(); + for (i, var) in self.variables.iter().enumerate() { + mapping.insert(var.as_str().to_owned(), i); + } + Ok(Some(JsonInnerQueryResults::Solutions { + variables: take(&mut self.variables), + solutions: JsonInnerSolutions::Iterator( + JsonBufferedSolutionsIterator { + mapping, + bindings: take(&mut self.solutions).into_iter(), + }, + ), + })) + } else { + self.state = JsonInnerReaderState::InHead; + Ok(None) + } + } + _ => Err(QueryResultsSyntaxError::msg( + "Variables name in the vars array must be strings", + )), + }, + JsonInnerReaderState::BeforeLinks => { + if event == JsonEvent::StartArray { + self.state = JsonInnerReaderState::InLinks; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results links must be an array", + )) + } + } + JsonInnerReaderState::InLinks => match event { + JsonEvent::String(_) => Ok(None), + JsonEvent::EndArray => { + self.state = JsonInnerReaderState::InHead; + Ok(None) + } + _ => Err(QueryResultsSyntaxError::msg( + "Links in the links array must be strings", + )), + }, + JsonInnerReaderState::BeforeResults => { + if event == JsonEvent::StartObject { + self.state = JsonInnerReaderState::InResults; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results result must be an object", + )) + } + } + JsonInnerReaderState::InResults => match event { + JsonEvent::ObjectKey(key) => { + if key == "bindings" { + self.state = JsonInnerReaderState::BeforeBindings; + Ok(None) } else { - Err(SyntaxError::msg( - "Unexpected end of JSON object without 'results' or 'boolean' key", - ) - .into()) + self.state = JsonInnerReaderState::Ignore { + level: 0, + after: JsonInnerReaderStateAfterIgnore::InResults, + }; + Ok(None) } } - _ => return Err(SyntaxError::msg("Invalid SPARQL results serialization").into()), + JsonEvent::EndObject => Err(QueryResultsSyntaxError::msg( + "The results object must contains a 'bindings' key", + )), + _ => unreachable!(), + }, + JsonInnerReaderState::BeforeBindings => { + if event == JsonEvent::StartArray { + self.solutions_read = true; + if self.vars_read { + let mut mapping = BTreeMap::default(); + for (i, var) in self.variables.iter().enumerate() { + mapping.insert(var.as_str().to_owned(), i); + } + Ok(Some(JsonInnerQueryResults::Solutions { + variables: take(&mut self.variables), + solutions: JsonInnerSolutions::Reader(JsonInnerSolutionsReader { + state: JsonInnerSolutionsReaderState::BeforeSolution, + mapping, + new_bindings: Vec::new(), + }), + })) + } else { + self.state = JsonInnerReaderState::BeforeSolution; + Ok(None) + } + } else { + Err(QueryResultsSyntaxError::msg( + "SPARQL JSON results bindings must be an array", + )) + } + } + JsonInnerReaderState::BeforeSolution => match event { + JsonEvent::StartObject => { + self.state = JsonInnerReaderState::BetweenSolutionTerms; + Ok(None) + } + JsonEvent::EndArray => { + self.state = JsonInnerReaderState::AfterBindings; + Ok(None) + } + _ => Err(QueryResultsSyntaxError::msg( + "Expecting a new solution object", + )), + }, + JsonInnerReaderState::BetweenSolutionTerms => match event { + JsonEvent::ObjectKey(key) => { + self.state = JsonInnerReaderState::Term { + reader: JsonInnerTermReader::default(), + variable: key.into(), + }; + Ok(None) + } + JsonEvent::EndObject => { + self.state = JsonInnerReaderState::BeforeSolution; + self.solutions.push(( + take(&mut self.current_solution_variables), + take(&mut self.current_solution_values), + )); + Ok(None) + } + _ => unreachable!(), + }, + JsonInnerReaderState::Term { + ref mut reader, + variable, + } => { + let result = reader.read_event(event); + if let Some(term) = result? { + self.current_solution_variables.push(take(variable)); + self.current_solution_values.push(term); + self.state = JsonInnerReaderState::BetweenSolutionTerms; + } + Ok(None) + } + JsonInnerReaderState::AfterBindings => { + if event == JsonEvent::EndObject { + self.state = JsonInnerReaderState::InRootObject; + } else { + self.state = JsonInnerReaderState::Ignore { + level: 0, + after: JsonInnerReaderStateAfterIgnore::AfterBindings, + } + } + Ok(None) + } + JsonInnerReaderState::BeforeBoolean => { + if let JsonEvent::Boolean(v) = event { + Ok(Some(JsonInnerQueryResults::Boolean(v))) + } else { + Err(QueryResultsSyntaxError::msg("Unexpected boolean value")) + } + } + #[allow(clippy::ref_patterns)] + JsonInnerReaderState::Ignore { level, ref after } => { + let level = match event { + JsonEvent::StartArray | JsonEvent::StartObject => *level + 1, + JsonEvent::EndArray | JsonEvent::EndObject => *level - 1, + JsonEvent::String(_) + | JsonEvent::Number(_) + | JsonEvent::Boolean(_) + | JsonEvent::Null + | JsonEvent::ObjectKey(_) + | JsonEvent::Eof => *level, + }; + self.state = if level == 0 { + match after { + JsonInnerReaderStateAfterIgnore::InRootObject => { + JsonInnerReaderState::InRootObject + } + JsonInnerReaderStateAfterIgnore::InHead => JsonInnerReaderState::InHead, + JsonInnerReaderStateAfterIgnore::InResults => { + JsonInnerReaderState::InResults + } + JsonInnerReaderStateAfterIgnore::AfterBindings => { + JsonInnerReaderState::AfterBindings + } + } + } else { + JsonInnerReaderState::Ignore { + level, + after: *after, + } + }; + Ok(None) } } } } -pub struct JsonSolutionsReader<R: BufRead> { +struct JsonInnerSolutionsReader { + state: JsonInnerSolutionsReaderState, mapping: BTreeMap<String, usize>, - kind: JsonSolutionsReaderKind<R>, + new_bindings: Vec<Option<Term>>, } -enum JsonSolutionsReaderKind<R: BufRead> { - Streaming { - reader: JsonReader<R>, - buffer: Vec<u8>, - }, - Buffered { - bindings: std::vec::IntoIter<(Vec<String>, Vec<Term>)>, +enum JsonInnerSolutionsReaderState { + BeforeSolution, + BetweenSolutionTerms, + Term { + reader: JsonInnerTermReader, + key: usize, }, + AfterEnd, } -impl<R: BufRead> JsonSolutionsReader<R> { - pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, ParseError> { - match &mut self.kind { - JsonSolutionsReaderKind::Streaming { reader, buffer } => { - let mut new_bindings = vec![None; self.mapping.len()]; - loop { - match reader.read_event(buffer)? { - JsonEvent::StartObject => (), - JsonEvent::EndObject => return Ok(Some(new_bindings)), - JsonEvent::EndArray | JsonEvent::Eof => return Ok(None), - JsonEvent::ObjectKey(key) => { - let k = *self.mapping.get(key).ok_or_else(|| { - SyntaxError::msg(format!( - "The variable {key} has not been defined in the header" - )) - })?; - new_bindings[k] = Some(read_value(reader, buffer, 0)?) - } - _ => return Err(SyntaxError::msg("Invalid result serialization").into()), - } +impl JsonInnerSolutionsReader { + fn read_event( + &mut self, + event: JsonEvent<'_>, + ) -> Result<Option<Vec<Option<Term>>>, QueryResultsSyntaxError> { + match &mut self.state { + JsonInnerSolutionsReaderState::BeforeSolution => match event { + JsonEvent::StartObject => { + self.state = JsonInnerSolutionsReaderState::BetweenSolutionTerms; + self.new_bindings = vec![None; self.mapping.len()]; + Ok(None) + } + JsonEvent::EndArray => { + self.state = JsonInnerSolutionsReaderState::AfterEnd; + Ok(None) + } + _ => Err(QueryResultsSyntaxError::msg( + "Expecting a new solution object", + )), + }, + JsonInnerSolutionsReaderState::BetweenSolutionTerms => match event { + JsonEvent::ObjectKey(key) => { + let key = *self.mapping.get(key.as_ref()).ok_or_else(|| { + QueryResultsSyntaxError::msg(format!( + "The variable {key} has not been defined in the header" + )) + })?; + self.state = JsonInnerSolutionsReaderState::Term { + reader: JsonInnerTermReader::default(), + key, + }; + Ok(None) + } + JsonEvent::EndObject => { + self.state = JsonInnerSolutionsReaderState::BeforeSolution; + Ok(Some(take(&mut self.new_bindings))) } + _ => unreachable!(), + }, + JsonInnerSolutionsReaderState::Term { + ref mut reader, + key, + } => { + let result = reader.read_event(event); + if let Some(term) = result? { + self.new_bindings[*key] = Some(term); + self.state = JsonInnerSolutionsReaderState::BetweenSolutionTerms; + } + Ok(None) } - JsonSolutionsReaderKind::Buffered { bindings } => { - Ok(if let Some((variables, values)) = bindings.next() { - let mut new_bindings = vec![None; self.mapping.len()]; - for (variable, value) in variables.into_iter().zip(values) { - let k = *self.mapping.get(&variable).ok_or_else(|| { - SyntaxError::msg(format!( - "The variable {variable} has not been defined in the header" - )) - })?; - new_bindings[k] = Some(value) - } - Some(new_bindings) + JsonInnerSolutionsReaderState::AfterEnd => { + if event == JsonEvent::EndObject { + Ok(None) } else { - None - }) + Err(QueryResultsSyntaxError::msg( + "Unexpected JSON after the end of the bindings array", + )) + } } } } } -fn read_value<R: BufRead>( - reader: &mut JsonReader<R>, - buffer: &mut Vec<u8>, - number_of_recursive_calls: usize, -) -> Result<Term, ParseError> { - enum Type { - Uri, - BNode, - Literal, - #[cfg(feature = "rdf-star")] - Triple, - } - #[derive(Eq, PartialEq)] - enum State { - Type, - Value, - Lang, - Datatype, - } +#[derive(Default)] +struct JsonInnerTermReader { + state: JsonInnerTermReaderState, + term_type: Option<TermType>, + value: Option<String>, + lang: Option<String>, + datatype: Option<NamedNode>, + #[cfg(feature = "rdf-star")] + subject: Option<Term>, + #[cfg(feature = "rdf-star")] + predicate: Option<Term>, + #[cfg(feature = "rdf-star")] + object: Option<Term>, +} - if number_of_recursive_calls == MAX_NUMBER_OF_NESTED_TRIPLES { - return Err(SyntaxError::msg(format!( - "Too many nested triples ({MAX_NUMBER_OF_NESTED_TRIPLES}). The parser fails here to avoid a stack overflow." - )) - .into()); - } - let mut state = None; - let mut t = None; - let mut value = None; - let mut lang = None; - let mut datatype = None; +#[derive(Default)] +enum JsonInnerTermReaderState { + #[default] + Start, + Middle, + TermType, + Value, + Lang, + Datatype, #[cfg(feature = "rdf-star")] - let mut subject = None; + InValue, #[cfg(feature = "rdf-star")] - let mut predicate = None; + Subject(Box<JsonInnerTermReader>), #[cfg(feature = "rdf-star")] - let mut object = None; - if reader.read_event(buffer)? != JsonEvent::StartObject { - return Err(SyntaxError::msg("Term serializations should be an object").into()); - } - loop { - match reader.read_event(buffer)? { - JsonEvent::ObjectKey(key) => match key { - "type" => state = Some(State::Type), - "value" => state = Some(State::Value), - "xml:lang" => state = Some(State::Lang), - "datatype" => state = Some(State::Datatype), - #[cfg(feature = "rdf-star")] - "subject" => { - subject = Some(read_value(reader, buffer, number_of_recursive_calls + 1)?) - } - #[cfg(feature = "rdf-star")] - "predicate" => { - predicate = Some(read_value(reader, buffer, number_of_recursive_calls + 1)?) - } - #[cfg(feature = "rdf-star")] - "object" => { - object = Some(read_value(reader, buffer, number_of_recursive_calls + 1)?) - } - _ => { - return Err(SyntaxError::msg(format!( - "Unexpected key in term serialization: '{key}'" + Predicate(Box<JsonInnerTermReader>), + #[cfg(feature = "rdf-star")] + Object(Box<JsonInnerTermReader>), +} + +enum TermType { + Uri, + BNode, + Literal, + #[cfg(feature = "rdf-star")] + Triple, +} + +impl JsonInnerTermReader { + fn read_event( + &mut self, + event: JsonEvent<'_>, + ) -> Result<Option<Term>, QueryResultsSyntaxError> { + match &mut self.state { + JsonInnerTermReaderState::Start => { + if event == JsonEvent::StartObject { + self.state = JsonInnerTermReaderState::Middle; + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg( + "RDF terms must be encoded using objects", )) - .into()) - } - }, - JsonEvent::StartObject => { - if state != Some(State::Value) { - return Err( - SyntaxError::msg("Unexpected nested object in term serialization").into(), - ); } } - JsonEvent::String(s) => match state { - Some(State::Type) => { - match s { - "uri" => t = Some(Type::Uri), - "bnode" => t = Some(Type::BNode), - "literal" | "typed-literal" => t = Some(Type::Literal), - #[cfg(feature = "rdf-star")] - "triple" => t = Some(Type::Triple), + JsonInnerTermReaderState::Middle => match event { + JsonEvent::ObjectKey(object_key) => { + self.state = match object_key.as_ref() { + "type" => JsonInnerTermReaderState::TermType, + "value" => JsonInnerTermReaderState::Value, + "datatype" => JsonInnerTermReaderState::Datatype, + "xml:lang" => JsonInnerTermReaderState::Lang, _ => { - return Err( - SyntaxError::msg(format!("Unexpected term type: '{s}'")).into() - ) + return Err(QueryResultsSyntaxError::msg(format!( + "Unsupported term key: {object_key}" + ))); } }; - state = None; - } - Some(State::Value) => { - value = Some(s.to_owned()); - state = None; - } - Some(State::Lang) => { - lang = Some(s.to_owned()); - state = None; + Ok(None) } - Some(State::Datatype) => { - datatype = Some( - NamedNode::new(s) - .map_err(|e| SyntaxError::msg(format!("Invalid datatype IRI: {e}")))?, - ); - state = None; - } - _ => (), // impossible - }, - JsonEvent::EndObject => { - if let Some(s) = state { - if s == State::Value { - state = None; //End of triple - } else { - return Err( - SyntaxError::msg("Term description values should be string").into() - ); - } - } else { - return match t { - None => Err(SyntaxError::msg( + JsonEvent::EndObject => { + self.state = JsonInnerTermReaderState::Start; + match self.term_type.take() { + None => Err(QueryResultsSyntaxError::msg( "Term serialization should have a 'type' key", - ) - .into()), - Some(Type::Uri) => Ok(NamedNode::new(value.ok_or_else(|| { - SyntaxError::msg("uri serialization should have a 'value' key") - })?) - .map_err(|e| SyntaxError::msg(format!("Invalid uri value: {e}")))? - .into()), - Some(Type::BNode) => Ok(BlankNode::new(value.ok_or_else(|| { - SyntaxError::msg("bnode serialization should have a 'value' key") - })?) - .map_err(|e| SyntaxError::msg(format!("Invalid bnode value: {e}")))? - .into()), - Some(Type::Literal) => { - let value = value.ok_or_else(|| { - SyntaxError::msg("literal serialization should have a 'value' key") + )), + Some(TermType::Uri) => Ok(Some( + NamedNode::new(self.value.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "uri serialization should have a 'value' key", + ) + })?) + .map_err(|e| { + QueryResultsSyntaxError::msg(format!("Invalid uri value: {e}")) + })? + .into(), + )), + Some(TermType::BNode) => Ok(Some( + BlankNode::new(self.value.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "bnode serialization should have a 'value' key", + ) + })?) + .map_err(|e| { + QueryResultsSyntaxError::msg(format!("Invalid bnode value: {e}")) + })? + .into(), + )), + Some(TermType::Literal) => { + let value = self.value.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "literal serialization should have a 'value' key", + ) })?; - Ok(match lang { - Some(lang) => { - if let Some(datatype) = datatype { - if datatype.as_ref() != rdf::LANG_STRING { - return Err(SyntaxError::msg(format!( - "xml:lang value '{lang}' provided with the datatype {datatype}" - )).into()) + Ok(Some(match self.lang.take() { + Some(lang) => { + if let Some(datatype) = &self.datatype { + if datatype.as_ref() != rdf::LANG_STRING { + return Err(QueryResultsSyntaxError::msg(format!( + "xml:lang value '{lang}' provided with the datatype {datatype}" + ))); + } + } + Literal::new_language_tagged_literal(value, &*lang) + .map_err(|e| { + QueryResultsSyntaxError::msg(format!( + "Invalid xml:lang value '{lang}': {e}" + )) + })? + } + None => { + if let Some(datatype) = self.datatype.take() { + Literal::new_typed_literal(value, datatype) + } else { + Literal::new_simple_literal(value) } } - Literal::new_language_tagged_literal(value, &lang).map_err(|e| { - SyntaxError::msg(format!("Invalid xml:lang value '{lang}': {e}")) - })? - } - None => if let Some(datatype) = datatype { - Literal::new_typed_literal(value, datatype) - } else { - Literal::new_simple_literal(value) - } - } - .into()) + }.into())) } #[cfg(feature = "rdf-star")] - Some(Type::Triple) => Ok(Triple::new( - match subject.ok_or_else(|| { - SyntaxError::msg("triple serialization should have a 'subject' key") - })? { - Term::NamedNode(subject) => subject.into(), - Term::BlankNode(subject) => subject.into(), - Term::Triple(subject) => Subject::Triple(subject), - Term::Literal(_) => { - return Err(SyntaxError::msg( - "The 'subject' value should not be a literal", + Some(TermType::Triple) => Ok(Some( + Triple::new( + match self.subject.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "triple serialization should have a 'subject' key", ) - .into()) - } - }, - match predicate.ok_or_else(|| { - SyntaxError::msg( - "triple serialization should have a 'predicate' key", - ) - })? { - Term::NamedNode(predicate) => predicate, - _ => { - return Err(SyntaxError::msg( - "The 'predicate' value should be a uri", + })? { + Term::NamedNode(subject) => subject.into(), + Term::BlankNode(subject) => subject.into(), + Term::Triple(subject) => Subject::Triple(subject), + Term::Literal(_) => { + return Err(QueryResultsSyntaxError::msg( + "The 'subject' value should not be a literal", + )); + } + }, + match self.predicate.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "triple serialization should have a 'predicate' key", ) - .into()) - } - }, - object.ok_or_else(|| { - SyntaxError::msg("triple serialization should have a 'object' key") - })?, - ) - .into()), - }; - } - } - _ => return Err(SyntaxError::msg("Invalid term serialization").into()), - } - } -} - -fn read_head<R: BufRead>( - reader: &mut JsonReader<R>, - buffer: &mut Vec<u8>, -) -> Result<Vec<Variable>, ParseError> { - if reader.read_event(buffer)? != JsonEvent::StartObject { - return Err(SyntaxError::msg("head should be an object").into()); - } - let mut variables = Vec::new(); - loop { - match reader.read_event(buffer)? { - JsonEvent::ObjectKey(key) => match key { - "vars" => { - if reader.read_event(buffer)? != JsonEvent::StartArray { - return Err(SyntaxError::msg("Variable list should be an array").into()); + })? { + Term::NamedNode(predicate) => predicate, + _ => { + return Err(QueryResultsSyntaxError::msg( + "The 'predicate' value should be a uri", + )); + } + }, + self.object.take().ok_or_else(|| { + QueryResultsSyntaxError::msg( + "triple serialization should have a 'object' key", + ) + })?, + ) + .into(), + )), } - loop { - match reader.read_event(buffer)? { - JsonEvent::String(s) => { - let new_var = Variable::new(s).map_err(|e| { - SyntaxError::msg(format!( - "Invalid variable declaration '{s}': {e}" - )) - })?; - if variables.contains(&new_var) { - return Err(SyntaxError::msg(format!( - "The variable {new_var} is declared twice" - )) - .into()); - } - variables.push(new_var); - } - JsonEvent::EndArray => break, - _ => { - return Err( - SyntaxError::msg("Variable names should be strings").into() - ) - } + } + _ => unreachable!(), + }, + JsonInnerTermReaderState::TermType => { + self.state = JsonInnerTermReaderState::Middle; + if let JsonEvent::String(value) = event { + match value.as_ref() { + "uri" => { + self.term_type = Some(TermType::Uri); + Ok(None) + } + "bnode" => { + self.term_type = Some(TermType::BNode); + Ok(None) } + "literal" | "typed-literal" => { + self.term_type = Some(TermType::Literal); + Ok(None) + } + #[cfg(feature = "rdf-star")] + "triple" => { + self.term_type = Some(TermType::Triple); + Ok(None) + } + _ => Err(QueryResultsSyntaxError::msg(format!( + "Unexpected term type: '{value}'" + ))), } + } else { + Err(QueryResultsSyntaxError::msg("Term type must be a string")) } - "link" => { - if reader.read_event(buffer)? != JsonEvent::StartArray { - return Err(SyntaxError::msg("Variable list should be an array").into()); - } - loop { - match reader.read_event(buffer)? { - JsonEvent::String(_) => (), - JsonEvent::EndArray => break, - _ => { - return Err(SyntaxError::msg("Link names should be strings").into()) - } + } + JsonInnerTermReaderState::Value => match event { + JsonEvent::String(value) => { + self.value = Some(value.into_owned()); + self.state = JsonInnerTermReaderState::Middle; + Ok(None) + } + #[cfg(feature = "rdf-star")] + JsonEvent::StartObject => { + self.state = JsonInnerTermReaderState::InValue; + Ok(None) + } + _ => { + self.state = JsonInnerTermReaderState::Middle; + + Err(QueryResultsSyntaxError::msg("Term value must be a string")) + } + }, + JsonInnerTermReaderState::Lang => { + let result = if let JsonEvent::String(value) = event { + self.lang = Some(value.into_owned()); + Ok(None) + } else { + Err(QueryResultsSyntaxError::msg("Term lang must be strings")) + }; + self.state = JsonInnerTermReaderState::Middle; + + result + } + JsonInnerTermReaderState::Datatype => { + let result = if let JsonEvent::String(value) = event { + match NamedNode::new(value) { + Ok(datatype) => { + self.datatype = Some(datatype); + Ok(None) } + Err(e) => Err(QueryResultsSyntaxError::msg(format!( + "Invalid datatype: {e}" + ))), } + } else { + Err(QueryResultsSyntaxError::msg("Term lang must be strings")) + }; + self.state = JsonInnerTermReaderState::Middle; + + result + } + #[cfg(feature = "rdf-star")] + JsonInnerTermReaderState::InValue => match event { + JsonEvent::ObjectKey(object_key) => { + self.state = match object_key.as_ref() { + "subject" => JsonInnerTermReaderState::Subject(Box::default()), + "predicate" => JsonInnerTermReaderState::Predicate(Box::default()), + "object" => JsonInnerTermReaderState::Object(Box::default()), + _ => { + return Err(QueryResultsSyntaxError::msg(format!( + "Unsupported value key: {object_key}" + ))); + } + }; + Ok(None) + } + JsonEvent::EndObject => { + self.state = JsonInnerTermReaderState::Middle; + Ok(None) } - _ => ignore_value(reader, buffer)?, + _ => unreachable!(), }, - JsonEvent::EndObject => return Ok(variables), - _ => return Err(SyntaxError::msg("Invalid head serialization").into()), - } - } -} - -fn ignore_value<R: BufRead>( - reader: &mut JsonReader<R>, - buffer: &mut Vec<u8>, -) -> Result<(), ParseError> { - let mut nesting = 0; - loop { - match reader.read_event(buffer)? { - JsonEvent::Boolean(_) - | JsonEvent::Null - | JsonEvent::Number(_) - | JsonEvent::String(_) => { - if nesting == 0 { - return Ok(()); + #[cfg(feature = "rdf-star")] + JsonInnerTermReaderState::Subject(ref mut inner_state) => { + if let Some(term) = inner_state.read_event(event)? { + self.state = JsonInnerTermReaderState::InValue; + self.subject = Some(term); } + Ok(None) } - JsonEvent::ObjectKey(_) => (), - JsonEvent::StartArray | JsonEvent::StartObject => nesting += 1, - JsonEvent::EndArray | JsonEvent::EndObject => { - nesting -= 1; - if nesting == 0 { - return Ok(()); + #[cfg(feature = "rdf-star")] + JsonInnerTermReaderState::Predicate(ref mut inner_state) => { + if let Some(term) = inner_state.read_event(event)? { + self.state = JsonInnerTermReaderState::InValue; + self.predicate = Some(term); } + Ok(None) } - JsonEvent::Eof => return Err(SyntaxError::msg("Unexpected end of file").into()), + #[cfg(feature = "rdf-star")] + JsonInnerTermReaderState::Object(ref mut inner_state) => { + if let Some(term) = inner_state.read_event(event)? { + self.state = JsonInnerTermReaderState::InValue; + self.object = Some(term); + } + Ok(None) + } + } + } +} + +pub struct JsonBufferedSolutionsIterator { + mapping: BTreeMap<String, usize>, + bindings: std::vec::IntoIter<(Vec<String>, Vec<Term>)>, +} + +impl JsonBufferedSolutionsIterator { + fn next(&mut self) -> Result<Option<Vec<Option<Term>>>, QueryResultsParseError> { + let Some((variables, values)) = self.bindings.next() else { + return Ok(None); + }; + let mut new_bindings = vec![None; self.mapping.len()]; + for (variable, value) in variables.into_iter().zip(values) { + let k = *self.mapping.get(&variable).ok_or_else(|| { + QueryResultsSyntaxError::msg(format!( + "The variable {variable} has not been defined in the header" + )) + })?; + new_bindings[k] = Some(value); } + Ok(Some(new_bindings)) } } diff --git a/lib/sparesults/src/lib.rs b/lib/sparesults/src/lib.rs index 223dcaa8..bfe45051 100644 --- a/lib/sparesults/src/lib.rs +++ b/lib/sparesults/src/lib.rs @@ -6,493 +6,19 @@ mod csv; mod error; +mod format; mod json; +mod parser; +mod serializer; pub mod solution; mod xml; -use crate::csv::*; -pub use crate::error::{ParseError, SyntaxError}; -use crate::json::*; +pub use crate::error::{QueryResultsParseError, QueryResultsSyntaxError, TextPosition}; +pub use crate::format::QueryResultsFormat; +pub use crate::parser::{FromReadQueryResultsReader, FromReadSolutionsReader, QueryResultsParser}; +#[cfg(feature = "async-tokio")] +pub use crate::parser::{FromTokioAsyncReadQueryResultsReader, FromTokioAsyncReadSolutionsReader}; +#[cfg(feature = "async-tokio")] +pub use crate::serializer::ToTokioAsyncWriteSolutionsWriter; +pub use crate::serializer::{QueryResultsSerializer, ToWriteSolutionsWriter}; pub use crate::solution::QuerySolution; -use crate::xml::*; -use oxrdf::{TermRef, Variable, VariableRef}; -use std::io::{self, BufRead, Write}; -use std::rc::Rc; - -/// [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. -#[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] -#[non_exhaustive] -pub enum QueryResultsFormat { - /// [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) - Xml, - /// [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) - Json, - /// [SPARQL Query Results CSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) - Csv, - /// [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) - Tsv, -} - -impl QueryResultsFormat { - /// The format canonical IRI according to the [Unique URIs for file formats registry](https://www.w3.org/ns/formats/). - /// - /// ``` - /// use sparesults::QueryResultsFormat; - /// - /// assert_eq!(QueryResultsFormat::Json.iri(), "http://www.w3.org/ns/formats/SPARQL_Results_JSON") - /// ``` - #[inline] - pub fn iri(self) -> &'static str { - match self { - Self::Xml => "http://www.w3.org/ns/formats/SPARQL_Results_XML", - Self::Json => "http://www.w3.org/ns/formats/SPARQL_Results_JSON", - Self::Csv => "http://www.w3.org/ns/formats/SPARQL_Results_CSV", - Self::Tsv => "http://www.w3.org/ns/formats/SPARQL_Results_TSV", - } - } - /// The format [IANA media type](https://tools.ietf.org/html/rfc2046). - /// - /// ``` - /// use sparesults::QueryResultsFormat; - /// - /// assert_eq!(QueryResultsFormat::Json.media_type(), "application/sparql-results+json") - /// ``` - #[inline] - pub fn media_type(self) -> &'static str { - match self { - Self::Xml => "application/sparql-results+xml", - Self::Json => "application/sparql-results+json", - Self::Csv => "text/csv; charset=utf-8", - Self::Tsv => "text/tab-separated-values; charset=utf-8", - } - } - - /// The format [IANA-registered](https://tools.ietf.org/html/rfc2046) file extension. - /// - /// ``` - /// use sparesults::QueryResultsFormat; - /// - /// assert_eq!(QueryResultsFormat::Json.file_extension(), "srj") - /// ``` - #[inline] - pub fn file_extension(self) -> &'static str { - match self { - Self::Xml => "srx", - Self::Json => "srj", - Self::Csv => "csv", - Self::Tsv => "tsv", - } - } - - /// Looks for a known format from a media type. - /// - /// It supports some media type aliases. - /// For example, "application/xml" is going to return `Xml` even if it is not its canonical media type. - /// - /// Example: - /// ``` - /// use sparesults::QueryResultsFormat; - /// - /// assert_eq!(QueryResultsFormat::from_media_type("application/sparql-results+json; charset=utf-8"), Some(QueryResultsFormat::Json)) - /// ``` - #[inline] - pub fn from_media_type(media_type: &str) -> Option<Self> { - match media_type.split(';').next()?.trim() { - "application/sparql-results+xml" | "application/xml" | "text/xml" => Some(Self::Xml), - "application/sparql-results+json" | "application/json" | "text/json" => { - Some(Self::Json) - } - "text/csv" => Some(Self::Csv), - "text/tab-separated-values" | "text/tsv" => Some(Self::Tsv), - _ => None, - } - } - - /// Looks for a known format from an extension. - /// - /// It supports some aliases. - /// - /// Example: - /// ``` - /// use sparesults::QueryResultsFormat; - /// - /// assert_eq!(QueryResultsFormat::from_extension("json"), Some(QueryResultsFormat::Json)) - /// ``` - #[inline] - pub fn from_extension(extension: &str) -> Option<Self> { - match extension { - "srx" | "xml" => Some(Self::Xml), - "srj" | "json" => Some(Self::Json), - "csv" | "txt" => Some(Self::Csv), - "tsv" => Some(Self::Tsv), - _ => None, - } - } -} - -/// Parsers for [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. -/// -/// It currently supports the following formats: -/// * [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) ([`QueryResultsFormat::Xml`](QueryResultsFormat::Xml)). -/// * [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) ([`QueryResultsFormat::Json`](QueryResultsFormat::Json)). -/// * [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Tsv`](QueryResultsFormat::Tsv)). -/// -/// Example in JSON (the API is the same for XML and TSV): -/// ``` -/// use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader}; -/// use oxrdf::{Literal, Variable}; -/// -/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); -/// // boolean -/// if let QueryResultsReader::Boolean(v) = json_parser.read_results(b"{\"boolean\":true}".as_slice())? { -/// assert_eq!(v, true); -/// } -/// // solutions -/// if let QueryResultsReader::Solutions(solutions) = json_parser.read_results(b"{\"head\":{\"vars\":[\"foo\",\"bar\"]},\"results\":{\"bindings\":[{\"foo\":{\"type\":\"literal\",\"value\":\"test\"}}]}}".as_slice())? { -/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); -/// for solution in solutions { -/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); -/// } -/// } -/// # Result::<(),sparesults::ParseError>::Ok(()) -/// ``` -pub struct QueryResultsParser { - format: QueryResultsFormat, -} - -impl QueryResultsParser { - /// Builds a parser for the given format. - #[inline] - pub fn from_format(format: QueryResultsFormat) -> Self { - Self { format } - } - - /// Reads a result file. - /// - /// Example in XML (the API is the same for JSON and TSV): - /// ``` - /// use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader}; - /// use oxrdf::{Literal, Variable}; - /// - /// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Xml); - /// - /// // boolean - /// if let QueryResultsReader::Boolean(v) = json_parser.read_results(b"<sparql xmlns=\"http://www.w3.org/2005/sparql-results#\"><head/><boolean>true</boolean></sparql>".as_slice())? { - /// assert_eq!(v, true); - /// } - /// - /// // solutions - /// if let QueryResultsReader::Solutions(solutions) = json_parser.read_results(b"<sparql xmlns=\"http://www.w3.org/2005/sparql-results#\"><head><variable name=\"foo\"/><variable name=\"bar\"/></head><results><result><binding name=\"foo\"><literal>test</literal></binding></result></results></sparql>".as_slice())? { - /// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); - /// for solution in solutions { - /// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); - /// } - /// } - /// # Result::<(),sparesults::ParseError>::Ok(()) - /// ``` - pub fn read_results<R: BufRead>(&self, reader: R) -> Result<QueryResultsReader<R>, ParseError> { - Ok(match self.format { - QueryResultsFormat::Xml => match XmlQueryResultsReader::read(reader)? { - XmlQueryResultsReader::Boolean(r) => QueryResultsReader::Boolean(r), - XmlQueryResultsReader::Solutions { - solutions, - variables, - } => QueryResultsReader::Solutions(SolutionsReader { - variables: Rc::new(variables), - solutions: SolutionsReaderKind::Xml(solutions), - }), - }, - QueryResultsFormat::Json => match JsonQueryResultsReader::read(reader)? { - JsonQueryResultsReader::Boolean(r) => QueryResultsReader::Boolean(r), - JsonQueryResultsReader::Solutions { - solutions, - variables, - } => QueryResultsReader::Solutions(SolutionsReader { - variables: Rc::new(variables), - solutions: SolutionsReaderKind::Json(solutions), - }), - }, - QueryResultsFormat::Csv => return Err(SyntaxError::msg("CSV SPARQL results syntax is lossy and can't be parsed to a proper RDF representation").into()), - QueryResultsFormat::Tsv => match TsvQueryResultsReader::read(reader)? { - TsvQueryResultsReader::Boolean(r) => QueryResultsReader::Boolean(r), - TsvQueryResultsReader::Solutions { - solutions, - variables, - } => QueryResultsReader::Solutions(SolutionsReader { - variables: Rc::new(variables), - solutions: SolutionsReaderKind::Tsv(solutions), - }), - }, - }) - } -} - -/// The reader for a given read of a results file. -/// -/// It is either a read boolean ([`bool`]) or a streaming reader of a set of solutions ([`SolutionsReader`]). -/// -/// Example in TSV (the API is the same for JSON and XML): -/// ``` -/// use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader}; -/// use oxrdf::{Literal, Variable}; -/// -/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); -/// -/// // boolean -/// if let QueryResultsReader::Boolean(v) = json_parser.read_results(b"true".as_slice())? { -/// assert_eq!(v, true); -/// } -/// -/// // solutions -/// if let QueryResultsReader::Solutions(solutions) = json_parser.read_results(b"?foo\t?bar\n\"test\"\t".as_slice())? { -/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); -/// for solution in solutions { -/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); -/// } -/// } -/// # Result::<(),sparesults::ParseError>::Ok(()) -/// ``` -pub enum QueryResultsReader<R: BufRead> { - Solutions(SolutionsReader<R>), - Boolean(bool), -} - -/// A streaming reader of a set of [`QuerySolution`] solutions. -/// -/// It implements the [`Iterator`] API to iterate over the solutions. -/// -/// Example in JSON (the API is the same for XML and TSV): -/// ``` -/// use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader}; -/// use oxrdf::{Literal, Variable}; -/// -/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); -/// if let QueryResultsReader::Solutions(solutions) = json_parser.read_results(b"{\"head\":{\"vars\":[\"foo\",\"bar\"]},\"results\":{\"bindings\":[{\"foo\":{\"type\":\"literal\",\"value\":\"test\"}}]}}".as_slice())? { -/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); -/// for solution in solutions { -/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); -/// } -/// } -/// # Result::<(),sparesults::ParseError>::Ok(()) -/// ``` -#[allow(clippy::rc_buffer)] -pub struct SolutionsReader<R: BufRead> { - variables: Rc<Vec<Variable>>, - solutions: SolutionsReaderKind<R>, -} - -enum SolutionsReaderKind<R: BufRead> { - Xml(XmlSolutionsReader<R>), - Json(JsonSolutionsReader<R>), - Tsv(TsvSolutionsReader<R>), -} - -impl<R: BufRead> SolutionsReader<R> { - /// Ordered list of the declared variables at the beginning of the results. - /// - /// Example in TSV (the API is the same for JSON and XML): - /// ``` - /// use sparesults::{QueryResultsFormat, QueryResultsParser, QueryResultsReader}; - /// use oxrdf::Variable; - /// - /// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); - /// if let QueryResultsReader::Solutions(solutions) = json_parser.read_results(b"?foo\t?bar\n\"ex1\"\t\"ex2\"".as_slice())? { - /// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); - /// } - /// # Result::<(),sparesults::ParseError>::Ok(()) - /// ``` - #[inline] - pub fn variables(&self) -> &[Variable] { - &self.variables - } -} - -impl<R: BufRead> Iterator for SolutionsReader<R> { - type Item = Result<QuerySolution, ParseError>; - - fn next(&mut self) -> Option<Result<QuerySolution, ParseError>> { - Some( - match &mut self.solutions { - SolutionsReaderKind::Xml(reader) => reader.read_next(), - SolutionsReaderKind::Json(reader) => reader.read_next(), - SolutionsReaderKind::Tsv(reader) => reader.read_next(), - } - .transpose()? - .map(|values| (Rc::clone(&self.variables), values).into()), - ) - } -} - -/// A serializer for [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. -/// -/// It currently supports the following formats: -/// * [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) ([`QueryResultsFormat::Xml`](QueryResultsFormat::Xml)) -/// * [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) ([`QueryResultsFormat::Json`](QueryResultsFormat::Json)) -/// * [SPARQL Query Results CSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Csv`](QueryResultsFormat::Csv)) -/// * [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Tsv`](QueryResultsFormat::Tsv)) -/// -/// Example in JSON (the API is the same for XML and TSV): -/// ``` -/// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; -/// use oxrdf::{LiteralRef, Variable, VariableRef}; -/// use std::iter::once; -/// -/// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); -/// -/// // boolean -/// let mut buffer = Vec::new(); -/// json_serializer.write_boolean_result(&mut buffer, true)?; -/// assert_eq!(buffer, b"{\"head\":{},\"boolean\":true}"); -/// -/// // solutions -/// let mut buffer = Vec::new(); -/// let mut writer = json_serializer.solutions_writer(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; -/// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; -/// writer.finish()?; -/// assert_eq!(buffer, b"{\"head\":{\"vars\":[\"foo\",\"bar\"]},\"results\":{\"bindings\":[{\"foo\":{\"type\":\"literal\",\"value\":\"test\"}}]}}"); -/// # std::io::Result::Ok(()) -/// ``` -pub struct QueryResultsSerializer { - format: QueryResultsFormat, -} - -impl QueryResultsSerializer { - /// Builds a serializer for the given format. - #[inline] - pub fn from_format(format: QueryResultsFormat) -> Self { - Self { format } - } - - /// Write a boolean query result (from an `ASK` query) into the given [`Write`] implementation. - /// - /// Example in XML (the API is the same for JSON and TSV): - /// ``` - /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; - /// - /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Xml); - /// let mut buffer = Vec::new(); - /// json_serializer.write_boolean_result(&mut buffer, true)?; - /// assert_eq!(buffer, b"<?xml version=\"1.0\"?><sparql xmlns=\"http://www.w3.org/2005/sparql-results#\"><head></head><boolean>true</boolean></sparql>"); - /// # std::io::Result::Ok(()) - /// ``` - pub fn write_boolean_result<W: Write>(&self, writer: W, value: bool) -> io::Result<W> { - match self.format { - QueryResultsFormat::Xml => write_boolean_xml_result(writer, value), - QueryResultsFormat::Json => write_boolean_json_result(writer, value), - QueryResultsFormat::Csv => write_boolean_csv_result(writer, value), - QueryResultsFormat::Tsv => write_boolean_tsv_result(writer, value), - } - } - - /// Returns a `SolutionsWriter` allowing writing query solutions into the given [`Write`] implementation. - /// - /// Example in XML (the API is the same for JSON and TSV): - /// ``` - /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; - /// use oxrdf::{LiteralRef, Variable, VariableRef}; - /// use std::iter::once; - /// - /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Xml); - /// let mut buffer = Vec::new(); - /// let mut writer = json_serializer.solutions_writer(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; - /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; - /// writer.finish()?; - /// assert_eq!(buffer, b"<?xml version=\"1.0\"?><sparql xmlns=\"http://www.w3.org/2005/sparql-results#\"><head><variable name=\"foo\"/><variable name=\"bar\"/></head><results><result><binding name=\"foo\"><literal>test</literal></binding></result></results></sparql>"); - /// # std::io::Result::Ok(()) - /// ``` - pub fn solutions_writer<W: Write>( - &self, - writer: W, - variables: Vec<Variable>, - ) -> io::Result<SolutionsWriter<W>> { - Ok(SolutionsWriter { - formatter: match self.format { - QueryResultsFormat::Xml => { - SolutionsWriterKind::Xml(XmlSolutionsWriter::start(writer, &variables)?) - } - QueryResultsFormat::Json => { - SolutionsWriterKind::Json(JsonSolutionsWriter::start(writer, &variables)?) - } - QueryResultsFormat::Csv => { - SolutionsWriterKind::Csv(CsvSolutionsWriter::start(writer, variables)?) - } - QueryResultsFormat::Tsv => { - SolutionsWriterKind::Tsv(TsvSolutionsWriter::start(writer, variables)?) - } - }, - }) - } -} - -/// Allows writing query results. -/// Could be built using a [`QueryResultsSerializer`]. -/// -/// Warning: Do not forget to run the [`finish`](SolutionsWriter::finish()) method to properly write the last bytes of the file. -/// -/// Example in TSV (the API is the same for JSON and XML): -/// ``` -/// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; -/// use oxrdf::{LiteralRef, Variable, VariableRef}; -/// use std::iter::once; -/// -/// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Tsv); -/// let mut buffer = Vec::new(); -/// let mut writer = json_serializer.solutions_writer(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; -/// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; -/// writer.finish()?; -/// assert_eq!(buffer, b"?foo\t?bar\n\"test\"\t\n"); -/// # std::io::Result::Ok(()) -/// ``` -#[must_use] -pub struct SolutionsWriter<W: Write> { - formatter: SolutionsWriterKind<W>, -} - -enum SolutionsWriterKind<W: Write> { - Xml(XmlSolutionsWriter<W>), - Json(JsonSolutionsWriter<W>), - Csv(CsvSolutionsWriter<W>), - Tsv(TsvSolutionsWriter<W>), -} - -impl<W: Write> SolutionsWriter<W> { - /// Writes a solution. - /// - /// Example in JSON (the API is the same for XML and TSV): - /// ``` - /// use sparesults::{QueryResultsFormat, QueryResultsSerializer, QuerySolution}; - /// use oxrdf::{Literal, LiteralRef, Variable, VariableRef}; - /// use std::iter::once; - /// - /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); - /// let mut buffer = Vec::new(); - /// let mut writer = json_serializer.solutions_writer(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; - /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; - /// writer.write(&QuerySolution::from((vec![Variable::new_unchecked("bar")], vec![Some(Literal::from("test").into())])))?; - /// writer.finish()?; - /// assert_eq!(buffer, b"{\"head\":{\"vars\":[\"foo\",\"bar\"]},\"results\":{\"bindings\":[{\"foo\":{\"type\":\"literal\",\"value\":\"test\"}},{\"bar\":{\"type\":\"literal\",\"value\":\"test\"}}]}}"); - /// # std::io::Result::Ok(()) - /// ``` - pub fn write<'a>( - &mut self, - solution: impl IntoIterator<Item = (impl Into<VariableRef<'a>>, impl Into<TermRef<'a>>)>, - ) -> io::Result<()> { - let solution = solution.into_iter().map(|(v, s)| (v.into(), s.into())); - match &mut self.formatter { - SolutionsWriterKind::Xml(writer) => writer.write(solution), - SolutionsWriterKind::Json(writer) => writer.write(solution), - SolutionsWriterKind::Csv(writer) => writer.write(solution), - SolutionsWriterKind::Tsv(writer) => writer.write(solution), - } - } - - /// Writes the last bytes of the file. - pub fn finish(self) -> io::Result<W> { - match self.formatter { - SolutionsWriterKind::Xml(write) => write.finish(), - SolutionsWriterKind::Json(write) => write.finish(), - SolutionsWriterKind::Csv(write) => write.finish(), - SolutionsWriterKind::Tsv(write) => write.finish(), - } - } -} diff --git a/lib/sparesults/src/parser.rs b/lib/sparesults/src/parser.rs new file mode 100644 index 00000000..602a5e61 --- /dev/null +++ b/lib/sparesults/src/parser.rs @@ -0,0 +1,430 @@ +use crate::csv::{TsvQueryResultsReader, TsvSolutionsReader}; +use crate::error::{QueryResultsParseError, QueryResultsSyntaxError}; +use crate::format::QueryResultsFormat; +use crate::json::{FromReadJsonQueryResultsReader, FromReadJsonSolutionsReader}; +#[cfg(feature = "async-tokio")] +use crate::json::{ + FromTokioAsyncReadJsonQueryResultsReader, FromTokioAsyncReadJsonSolutionsReader, +}; +use crate::solution::QuerySolution; +use crate::xml::{XmlQueryResultsReader, XmlSolutionsReader}; +use oxrdf::Variable; +use std::io::Read; +use std::sync::Arc; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncRead; + +/// Parsers for [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. +/// +/// It currently supports the following formats: +/// * [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) ([`QueryResultsFormat::Xml`](QueryResultsFormat::Xml)). +/// * [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) ([`QueryResultsFormat::Json`](QueryResultsFormat::Json)). +/// * [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Tsv`](QueryResultsFormat::Tsv)). +/// +/// Example in JSON (the API is the same for XML and TSV): +/// ``` +/// use sparesults::{QueryResultsFormat, QueryResultsParser, FromReadQueryResultsReader}; +/// use oxrdf::{Literal, Variable}; +/// +/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); +/// // boolean +/// if let FromReadQueryResultsReader::Boolean(v) = json_parser.parse_read(br#"{"boolean":true}"#.as_slice())? { +/// assert_eq!(v, true); +/// } +/// // solutions +/// if let FromReadQueryResultsReader::Solutions(solutions) = json_parser.parse_read(br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#.as_slice())? { +/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); +/// for solution in solutions { +/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); +/// } +/// } +/// # Result::<(),sparesults::QueryResultsParseError>::Ok(()) +/// ``` +pub struct QueryResultsParser { + format: QueryResultsFormat, +} + +impl QueryResultsParser { + /// Builds a parser for the given format. + #[inline] + pub fn from_format(format: QueryResultsFormat) -> Self { + Self { format } + } + + /// Reads a result file from a [`Read`] implementation. + /// + /// Reads are automatically buffered. + /// + /// Example in XML (the API is the same for JSON and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsParser, FromReadQueryResultsReader}; + /// use oxrdf::{Literal, Variable}; + /// + /// let xml_parser = QueryResultsParser::from_format(QueryResultsFormat::Xml); + /// + /// // boolean + /// if let FromReadQueryResultsReader::Boolean(v) = xml_parser.parse_read(br#"<sparql xmlns="http://www.w3.org/2005/sparql-results#"><head/><boolean>true</boolean></sparql>"#.as_slice())? { + /// assert_eq!(v, true); + /// } + /// + /// // solutions + /// if let FromReadQueryResultsReader::Solutions(solutions) = xml_parser.parse_read(br#"<sparql xmlns="http://www.w3.org/2005/sparql-results#"><head><variable name="foo"/><variable name="bar"/></head><results><result><binding name="foo"><literal>test</literal></binding></result></results></sparql>"#.as_slice())? { + /// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); + /// for solution in solutions { + /// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); + /// } + /// } + /// # Result::<(),sparesults::QueryResultsParseError>::Ok(()) + /// ``` + pub fn parse_read<R: Read>( + &self, + reader: R, + ) -> Result<FromReadQueryResultsReader<R>, QueryResultsParseError> { + Ok(match self.format { + QueryResultsFormat::Xml => match XmlQueryResultsReader::read(reader)? { + XmlQueryResultsReader::Boolean(r) => FromReadQueryResultsReader::Boolean(r), + XmlQueryResultsReader::Solutions { + solutions, + variables, + } => FromReadQueryResultsReader::Solutions(FromReadSolutionsReader { + variables: variables.into(), + solutions: FromReadSolutionsReaderKind::Xml(solutions), + }), + }, + QueryResultsFormat::Json => match FromReadJsonQueryResultsReader::read(reader)? { + FromReadJsonQueryResultsReader::Boolean(r) => FromReadQueryResultsReader::Boolean(r), + FromReadJsonQueryResultsReader::Solutions { + solutions, + variables, + } => FromReadQueryResultsReader::Solutions(FromReadSolutionsReader { + variables: variables.into(), + solutions: FromReadSolutionsReaderKind::Json(solutions), + }), + }, + QueryResultsFormat::Csv => return Err(QueryResultsSyntaxError::msg("CSV SPARQL results syntax is lossy and can't be parsed to a proper RDF representation").into()), + QueryResultsFormat::Tsv => match TsvQueryResultsReader::read(reader)? { + TsvQueryResultsReader::Boolean(r) => FromReadQueryResultsReader::Boolean(r), + TsvQueryResultsReader::Solutions { + solutions, + variables, + } => FromReadQueryResultsReader::Solutions(FromReadSolutionsReader { + variables: variables.into(), + solutions: FromReadSolutionsReaderKind::Tsv(solutions), + }), + }, + }) + } + + #[deprecated(note = "use parse_read", since = "0.4.0")] + pub fn read_results<R: Read>( + &self, + reader: R, + ) -> Result<FromReadQueryResultsReader<R>, QueryResultsParseError> { + self.parse_read(reader) + } + + /// Reads a result file from a Tokio [`AsyncRead`] implementation. + /// + /// Reads are automatically buffered. + /// + /// Example in XML (the API is the same for JSON and TSV): + /// ```no_run + /// use sparesults::{QueryResultsFormat, QueryResultsParser, FromTokioAsyncReadQueryResultsReader}; + /// use oxrdf::{Literal, Variable}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), sparesults::QueryResultsParseError> { + /// let xml_parser = QueryResultsParser::from_format(QueryResultsFormat::Xml); + /// + /// // boolean + /// if let FromTokioAsyncReadQueryResultsReader::Boolean(v) = xml_parser.parse_tokio_async_read(br#"<sparql xmlns="http://www.w3.org/2005/sparql-results#"><head/><boolean>true</boolean></sparql>"#.as_slice()).await? { + /// assert_eq!(v, true); + /// } + /// + /// // solutions + /// if let FromTokioAsyncReadQueryResultsReader::Solutions(mut solutions) = xml_parser.parse_tokio_async_read(br#"<sparql xmlns="http://www.w3.org/2005/sparql-results#"><head><variable name="foo"/><variable name="bar"/></head><results><result><binding name="foo"><literal>test</literal></binding></result></results></sparql>"#.as_slice()).await? { + /// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); + /// while let Some(solution) = solutions.next().await { + /// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); + /// } + /// } + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub async fn parse_tokio_async_read<R: AsyncRead + Unpin>( + &self, + reader: R, + ) -> Result<FromTokioAsyncReadQueryResultsReader<R>, QueryResultsParseError> { + Ok(match self.format { + QueryResultsFormat::Xml => return Err(QueryResultsSyntaxError::msg("The XML query results parser does not support Tokio AsyncRead yet").into()), + QueryResultsFormat::Json => match FromTokioAsyncReadJsonQueryResultsReader::read(reader).await? { + FromTokioAsyncReadJsonQueryResultsReader::Boolean(r) => FromTokioAsyncReadQueryResultsReader::Boolean(r), + FromTokioAsyncReadJsonQueryResultsReader::Solutions { + solutions, + variables, + } => FromTokioAsyncReadQueryResultsReader::Solutions(FromTokioAsyncReadSolutionsReader { + variables: variables.into(), + solutions: FromTokioAsyncReadSolutionsReaderKind::Json(solutions), + }), + }, + QueryResultsFormat::Csv => return Err(QueryResultsSyntaxError::msg("CSV SPARQL results syntax is lossy and can't be parsed to a proper RDF representation").into()), + QueryResultsFormat::Tsv => return Err(QueryResultsSyntaxError::msg("The TSV query results parser does not support Tokio AsyncRead yet").into()), + }) + } +} + +impl From<QueryResultsFormat> for QueryResultsParser { + fn from(format: QueryResultsFormat) -> Self { + Self::from_format(format) + } +} + +/// The reader for a given read of a results file. +/// +/// It is either a read boolean ([`bool`]) or a streaming reader of a set of solutions ([`FromReadSolutionsReader`]). +/// +/// Example in TSV (the API is the same for JSON and XML): +/// ``` +/// use oxrdf::{Literal, Variable}; +/// use sparesults::{FromReadQueryResultsReader, QueryResultsFormat, QueryResultsParser}; +/// +/// let tsv_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); +/// +/// // boolean +/// if let FromReadQueryResultsReader::Boolean(v) = tsv_parser.parse_read(b"true".as_slice())? { +/// assert_eq!(v, true); +/// } +/// +/// // solutions +/// if let FromReadQueryResultsReader::Solutions(solutions) = +/// tsv_parser.parse_read(b"?foo\t?bar\n\"test\"\t".as_slice())? +/// { +/// assert_eq!( +/// solutions.variables(), +/// &[ +/// Variable::new_unchecked("foo"), +/// Variable::new_unchecked("bar") +/// ] +/// ); +/// for solution in solutions { +/// assert_eq!( +/// solution?.iter().collect::<Vec<_>>(), +/// vec![( +/// &Variable::new_unchecked("foo"), +/// &Literal::from("test").into() +/// )] +/// ); +/// } +/// } +/// # Result::<(),sparesults::QueryResultsParseError>::Ok(()) +/// ``` +pub enum FromReadQueryResultsReader<R: Read> { + Solutions(FromReadSolutionsReader<R>), + Boolean(bool), +} + +/// A streaming reader of a set of [`QuerySolution`] solutions. +/// +/// It implements the [`Iterator`] API to iterate over the solutions. +/// +/// Example in JSON (the API is the same for XML and TSV): +/// ``` +/// use sparesults::{QueryResultsFormat, QueryResultsParser, FromReadQueryResultsReader}; +/// use oxrdf::{Literal, Variable}; +/// +/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); +/// if let FromReadQueryResultsReader::Solutions(solutions) = json_parser.parse_read(br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#.as_slice())? { +/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); +/// for solution in solutions { +/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); +/// } +/// } +/// # Result::<(),sparesults::QueryResultsParseError>::Ok(()) +/// ``` +pub struct FromReadSolutionsReader<R: Read> { + variables: Arc<[Variable]>, + solutions: FromReadSolutionsReaderKind<R>, +} + +enum FromReadSolutionsReaderKind<R: Read> { + Xml(XmlSolutionsReader<R>), + Json(FromReadJsonSolutionsReader<R>), + Tsv(TsvSolutionsReader<R>), +} + +impl<R: Read> FromReadSolutionsReader<R> { + /// Ordered list of the declared variables at the beginning of the results. + /// + /// Example in TSV (the API is the same for JSON and XML): + /// ``` + /// use oxrdf::Variable; + /// use sparesults::{FromReadQueryResultsReader, QueryResultsFormat, QueryResultsParser}; + /// + /// let tsv_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); + /// if let FromReadQueryResultsReader::Solutions(solutions) = + /// tsv_parser.parse_read(b"?foo\t?bar\n\"ex1\"\t\"ex2\"".as_slice())? + /// { + /// assert_eq!( + /// solutions.variables(), + /// &[ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar") + /// ] + /// ); + /// } + /// # Result::<(),sparesults::QueryResultsParseError>::Ok(()) + /// ``` + #[inline] + pub fn variables(&self) -> &[Variable] { + &self.variables + } +} + +impl<R: Read> Iterator for FromReadSolutionsReader<R> { + type Item = Result<QuerySolution, QueryResultsParseError>; + + fn next(&mut self) -> Option<Self::Item> { + Some( + match &mut self.solutions { + FromReadSolutionsReaderKind::Xml(reader) => reader.read_next(), + FromReadSolutionsReaderKind::Json(reader) => reader.read_next(), + FromReadSolutionsReaderKind::Tsv(reader) => reader.read_next(), + } + .transpose()? + .map(|values| (Arc::clone(&self.variables), values).into()), + ) + } +} + +/// The reader for a given read of a results file. +/// +/// It is either a read boolean ([`bool`]) or a streaming reader of a set of solutions ([`FromReadSolutionsReader`]). +/// +/// Example in TSV (the API is the same for JSON and XML): +/// ```no_run +/// use oxrdf::{Literal, Variable}; +/// use sparesults::{ +/// FromTokioAsyncReadQueryResultsReader, QueryResultsFormat, QueryResultsParser, +/// }; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), sparesults::QueryResultsParseError> { +/// let tsv_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); +/// +/// // boolean +/// if let FromTokioAsyncReadQueryResultsReader::Boolean(v) = tsv_parser +/// .parse_tokio_async_read(b"true".as_slice()) +/// .await? +/// { +/// assert_eq!(v, true); +/// } +/// +/// // solutions +/// if let FromTokioAsyncReadQueryResultsReader::Solutions(mut solutions) = tsv_parser +/// .parse_tokio_async_read(b"?foo\t?bar\n\"test\"\t".as_slice()) +/// .await? +/// { +/// assert_eq!( +/// solutions.variables(), +/// &[ +/// Variable::new_unchecked("foo"), +/// Variable::new_unchecked("bar") +/// ] +/// ); +/// while let Some(solution) = solutions.next().await { +/// assert_eq!( +/// solution?.iter().collect::<Vec<_>>(), +/// vec![( +/// &Variable::new_unchecked("foo"), +/// &Literal::from("test").into() +/// )] +/// ); +/// } +/// } +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +pub enum FromTokioAsyncReadQueryResultsReader<R: AsyncRead + Unpin> { + Solutions(FromTokioAsyncReadSolutionsReader<R>), + Boolean(bool), +} + +/// A streaming reader of a set of [`QuerySolution`] solutions. +/// +/// It implements the [`Iterator`] API to iterate over the solutions. +/// +/// Example in JSON (the API is the same for XML and TSV): +/// ``` +/// use sparesults::{QueryResultsFormat, QueryResultsParser, FromTokioAsyncReadQueryResultsReader}; +/// use oxrdf::{Literal, Variable}; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> Result<(), sparesults::QueryResultsParseError> { +/// let json_parser = QueryResultsParser::from_format(QueryResultsFormat::Json); +/// if let FromTokioAsyncReadQueryResultsReader::Solutions(mut solutions) = json_parser.parse_tokio_async_read(br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#.as_slice()).await? { +/// assert_eq!(solutions.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); +/// while let Some(solution) = solutions.next().await { +/// assert_eq!(solution?.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from("test").into())]); +/// } +/// } +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +pub struct FromTokioAsyncReadSolutionsReader<R: AsyncRead + Unpin> { + variables: Arc<[Variable]>, + solutions: FromTokioAsyncReadSolutionsReaderKind<R>, +} + +#[cfg(feature = "async-tokio")] +enum FromTokioAsyncReadSolutionsReaderKind<R: AsyncRead + Unpin> { + Json(FromTokioAsyncReadJsonSolutionsReader<R>), +} + +#[cfg(feature = "async-tokio")] +impl<R: AsyncRead + Unpin> FromTokioAsyncReadSolutionsReader<R> { + /// Ordered list of the declared variables at the beginning of the results. + /// + /// Example in TSV (the API is the same for JSON and XML): + /// ```no_run + /// use oxrdf::Variable; + /// use sparesults::{ + /// FromTokioAsyncReadQueryResultsReader, QueryResultsFormat, QueryResultsParser, + /// }; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> Result<(), sparesults::QueryResultsParseError> { + /// let tsv_parser = QueryResultsParser::from_format(QueryResultsFormat::Tsv); + /// if let FromTokioAsyncReadQueryResultsReader::Solutions(solutions) = tsv_parser + /// .parse_tokio_async_read(b"?foo\t?bar\n\"ex1\"\t\"ex2\"".as_slice()) + /// .await? + /// { + /// assert_eq!( + /// solutions.variables(), + /// &[ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar") + /// ] + /// ); + /// } + /// # Ok(()) + /// # } + /// ``` + #[inline] + pub fn variables(&self) -> &[Variable] { + &self.variables + } + + /// Reads the next solution or returns `None` if the file is finished. + pub async fn next(&mut self) -> Option<Result<QuerySolution, QueryResultsParseError>> { + Some( + match &mut self.solutions { + FromTokioAsyncReadSolutionsReaderKind::Json(reader) => reader.read_next().await, + } + .transpose()? + .map(|values| (Arc::clone(&self.variables), values).into()), + ) + } +} diff --git a/lib/sparesults/src/serializer.rs b/lib/sparesults/src/serializer.rs new file mode 100644 index 00000000..ecc730cd --- /dev/null +++ b/lib/sparesults/src/serializer.rs @@ -0,0 +1,421 @@ +#[cfg(feature = "async-tokio")] +use crate::csv::{ + tokio_async_write_boolean_csv_result, ToTokioAsyncWriteCsvSolutionsWriter, + ToTokioAsyncWriteTsvSolutionsWriter, +}; +use crate::csv::{write_boolean_csv_result, ToWriteCsvSolutionsWriter, ToWriteTsvSolutionsWriter}; +use crate::format::QueryResultsFormat; +#[cfg(feature = "async-tokio")] +use crate::json::{tokio_async_write_boolean_json_result, ToTokioAsyncWriteJsonSolutionsWriter}; +use crate::json::{write_boolean_json_result, ToWriteJsonSolutionsWriter}; +#[cfg(feature = "async-tokio")] +use crate::xml::{tokio_async_write_boolean_xml_result, ToTokioAsyncWriteXmlSolutionsWriter}; +use crate::xml::{write_boolean_xml_result, ToWriteXmlSolutionsWriter}; +use oxrdf::{TermRef, Variable, VariableRef}; +use std::io::{self, Write}; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncWrite; + +/// A serializer for [SPARQL query](https://www.w3.org/TR/sparql11-query/) results serialization formats. +/// +/// It currently supports the following formats: +/// * [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) ([`QueryResultsFormat::Xml`](QueryResultsFormat::Xml)) +/// * [SPARQL Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/) ([`QueryResultsFormat::Json`](QueryResultsFormat::Json)) +/// * [SPARQL Query Results CSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Csv`](QueryResultsFormat::Csv)) +/// * [SPARQL Query Results TSV Format](https://www.w3.org/TR/sparql11-results-csv-tsv/) ([`QueryResultsFormat::Tsv`](QueryResultsFormat::Tsv)) +/// +/// Example in JSON (the API is the same for XML, CSV and TSV): +/// ``` +/// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; +/// use oxrdf::{LiteralRef, Variable, VariableRef}; +/// use std::iter::once; +/// +/// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); +/// +/// // boolean +/// let mut buffer = Vec::new(); +/// json_serializer.serialize_boolean_to_write(&mut buffer, true)?; +/// assert_eq!(buffer, br#"{"head":{},"boolean":true}"#); +/// +/// // solutions +/// let mut buffer = Vec::new(); +/// let mut writer = json_serializer.serialize_solutions_to_write(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; +/// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; +/// writer.finish()?; +/// assert_eq!(buffer, br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#); +/// # std::io::Result::Ok(()) +/// ``` +pub struct QueryResultsSerializer { + format: QueryResultsFormat, +} + +impl QueryResultsSerializer { + /// Builds a serializer for the given format. + #[inline] + pub fn from_format(format: QueryResultsFormat) -> Self { + Self { format } + } + + /// Write a boolean query result (from an `ASK` query) into the given [`Write`] implementation. + /// + /// Example in XML (the API is the same for JSON, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; + /// + /// let xml_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Xml); + /// let mut buffer = Vec::new(); + /// xml_serializer.serialize_boolean_to_write(&mut buffer, true)?; + /// assert_eq!(buffer, br#"<?xml version="1.0"?><sparql xmlns="http://www.w3.org/2005/sparql-results#"><head></head><boolean>true</boolean></sparql>"#); + /// # std::io::Result::Ok(()) + /// ``` + pub fn serialize_boolean_to_write<W: Write>(&self, write: W, value: bool) -> io::Result<W> { + match self.format { + QueryResultsFormat::Xml => write_boolean_xml_result(write, value), + QueryResultsFormat::Json => write_boolean_json_result(write, value), + QueryResultsFormat::Csv | QueryResultsFormat::Tsv => { + write_boolean_csv_result(write, value) + } + } + } + + /// Write a boolean query result (from an `ASK` query) into the given [`AsyncWrite`] implementation. + /// + /// Example in JSON (the API is the same for XML, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); + /// let mut buffer = Vec::new(); + /// json_serializer + /// .serialize_boolean_to_tokio_async_write(&mut buffer, false) + /// .await?; + /// assert_eq!(buffer, br#"{"head":{},"boolean":false}"#); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub async fn serialize_boolean_to_tokio_async_write<W: AsyncWrite + Unpin>( + &self, + write: W, + value: bool, + ) -> io::Result<W> { + match self.format { + QueryResultsFormat::Xml => tokio_async_write_boolean_xml_result(write, value).await, + QueryResultsFormat::Json => tokio_async_write_boolean_json_result(write, value).await, + QueryResultsFormat::Csv | QueryResultsFormat::Tsv => { + tokio_async_write_boolean_csv_result(write, value).await + } + } + } + + #[deprecated(note = "use serialize_boolean_to_write", since = "0.4.0")] + pub fn write_boolean_result<W: Write>(&self, writer: W, value: bool) -> io::Result<W> { + self.serialize_boolean_to_write(writer, value) + } + + /// Returns a `SolutionsWriter` allowing writing query solutions into the given [`Write`] implementation. + /// + /// <div class="warning"> + /// + /// Do not forget to run the [`finish`](ToWriteSolutionsWriter::finish()) method to properly write the last bytes of the file.</div> + /// + /// <div class="warning"> + /// + /// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> + /// + /// Example in XML (the API is the same for JSON, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; + /// use oxrdf::{LiteralRef, Variable, VariableRef}; + /// use std::iter::once; + /// + /// let xml_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Xml); + /// let mut buffer = Vec::new(); + /// let mut writer = xml_serializer.serialize_solutions_to_write(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; + /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; + /// writer.finish()?; + /// assert_eq!(buffer, br#"<?xml version="1.0"?><sparql xmlns="http://www.w3.org/2005/sparql-results#"><head><variable name="foo"/><variable name="bar"/></head><results><result><binding name="foo"><literal>test</literal></binding></result></results></sparql>"#); + /// # std::io::Result::Ok(()) + /// ``` + pub fn serialize_solutions_to_write<W: Write>( + &self, + write: W, + variables: Vec<Variable>, + ) -> io::Result<ToWriteSolutionsWriter<W>> { + Ok(ToWriteSolutionsWriter { + formatter: match self.format { + QueryResultsFormat::Xml => ToWriteSolutionsWriterKind::Xml( + ToWriteXmlSolutionsWriter::start(write, &variables)?, + ), + QueryResultsFormat::Json => ToWriteSolutionsWriterKind::Json( + ToWriteJsonSolutionsWriter::start(write, &variables)?, + ), + QueryResultsFormat::Csv => ToWriteSolutionsWriterKind::Csv( + ToWriteCsvSolutionsWriter::start(write, variables)?, + ), + QueryResultsFormat::Tsv => ToWriteSolutionsWriterKind::Tsv( + ToWriteTsvSolutionsWriter::start(write, variables)?, + ), + }, + }) + } + + /// Returns a `SolutionsWriter` allowing writing query solutions into the given [`Write`] implementation. + /// + /// <div class="warning"> + /// + /// Do not forget to run the [`finish`](ToWriteSolutionsWriter::finish()) method to properly write the last bytes of the file.</div> + /// + /// <div class="warning"> + /// + /// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> + /// + /// Example in XML (the API is the same for JSON, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; + /// use oxrdf::{LiteralRef, Variable, VariableRef}; + /// use std::iter::once; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); + /// let mut buffer = Vec::new(); + /// let mut writer = json_serializer.serialize_solutions_to_tokio_async_write(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]).await?; + /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test")))).await?; + /// writer.finish().await?; + /// assert_eq!(buffer, br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}}]}}"#); + /// # Ok(()) + /// # } + /// ``` + #[cfg(feature = "async-tokio")] + pub async fn serialize_solutions_to_tokio_async_write<W: AsyncWrite + Unpin>( + &self, + write: W, + variables: Vec<Variable>, + ) -> io::Result<ToTokioAsyncWriteSolutionsWriter<W>> { + Ok(ToTokioAsyncWriteSolutionsWriter { + formatter: match self.format { + QueryResultsFormat::Xml => ToTokioAsyncWriteSolutionsWriterKind::Xml( + ToTokioAsyncWriteXmlSolutionsWriter::start(write, &variables).await?, + ), + QueryResultsFormat::Json => ToTokioAsyncWriteSolutionsWriterKind::Json( + ToTokioAsyncWriteJsonSolutionsWriter::start(write, &variables).await?, + ), + QueryResultsFormat::Csv => ToTokioAsyncWriteSolutionsWriterKind::Csv( + ToTokioAsyncWriteCsvSolutionsWriter::start(write, variables).await?, + ), + QueryResultsFormat::Tsv => ToTokioAsyncWriteSolutionsWriterKind::Tsv( + ToTokioAsyncWriteTsvSolutionsWriter::start(write, variables).await?, + ), + }, + }) + } + + #[deprecated(note = "use serialize_solutions_to_write", since = "0.4.0")] + pub fn solutions_writer<W: Write>( + &self, + writer: W, + variables: Vec<Variable>, + ) -> io::Result<ToWriteSolutionsWriter<W>> { + self.serialize_solutions_to_write(writer, variables) + } +} + +impl From<QueryResultsFormat> for QueryResultsSerializer { + fn from(format: QueryResultsFormat) -> Self { + Self::from_format(format) + } +} + +/// Allows writing query results into a [`Write`] implementation. +/// +/// Could be built using a [`QueryResultsSerializer`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](ToWriteSolutionsWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// <div class="warning"> +/// +/// This writer does unbuffered writes. You might want to use [`BufWriter`](io::BufWriter) to avoid that.</div> +/// +/// Example in TSV (the API is the same for JSON, XML and CSV): +/// ``` +/// use oxrdf::{LiteralRef, Variable, VariableRef}; +/// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; +/// use std::iter::once; +/// +/// let tsv_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Tsv); +/// let mut buffer = Vec::new(); +/// let mut writer = tsv_serializer.serialize_solutions_to_write( +/// &mut buffer, +/// vec![ +/// Variable::new_unchecked("foo"), +/// Variable::new_unchecked("bar"), +/// ], +/// )?; +/// writer.write(once(( +/// VariableRef::new_unchecked("foo"), +/// LiteralRef::from("test"), +/// )))?; +/// writer.finish()?; +/// assert_eq!(buffer, b"?foo\t?bar\n\"test\"\t\n"); +/// # std::io::Result::Ok(()) +/// ``` +#[must_use] +pub struct ToWriteSolutionsWriter<W: Write> { + formatter: ToWriteSolutionsWriterKind<W>, +} + +enum ToWriteSolutionsWriterKind<W: Write> { + Xml(ToWriteXmlSolutionsWriter<W>), + Json(ToWriteJsonSolutionsWriter<W>), + Csv(ToWriteCsvSolutionsWriter<W>), + Tsv(ToWriteTsvSolutionsWriter<W>), +} + +impl<W: Write> ToWriteSolutionsWriter<W> { + /// Writes a solution. + /// + /// Example in JSON (the API is the same for XML, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer, QuerySolution}; + /// use oxrdf::{Literal, LiteralRef, Variable, VariableRef}; + /// use std::iter::once; + /// + /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); + /// let mut buffer = Vec::new(); + /// let mut writer = json_serializer.serialize_solutions_to_write(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")])?; + /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test"))))?; + /// writer.write(&QuerySolution::from((vec![Variable::new_unchecked("bar")], vec![Some(Literal::from("test").into())])))?; + /// writer.finish()?; + /// assert_eq!(buffer, br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}},{"bar":{"type":"literal","value":"test"}}]}}"#); + /// # std::io::Result::Ok(()) + /// ``` + pub fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (impl Into<VariableRef<'a>>, impl Into<TermRef<'a>>)>, + ) -> io::Result<()> { + let solution = solution.into_iter().map(|(v, s)| (v.into(), s.into())); + match &mut self.formatter { + ToWriteSolutionsWriterKind::Xml(writer) => writer.write(solution), + ToWriteSolutionsWriterKind::Json(writer) => writer.write(solution), + ToWriteSolutionsWriterKind::Csv(writer) => writer.write(solution), + ToWriteSolutionsWriterKind::Tsv(writer) => writer.write(solution), + } + } + + /// Writes the last bytes of the file. + pub fn finish(self) -> io::Result<W> { + match self.formatter { + ToWriteSolutionsWriterKind::Xml(write) => write.finish(), + ToWriteSolutionsWriterKind::Json(write) => write.finish(), + ToWriteSolutionsWriterKind::Csv(write) => Ok(write.finish()), + ToWriteSolutionsWriterKind::Tsv(write) => Ok(write.finish()), + } + } +} + +/// Allows writing query results into an [`AsyncWrite`] implementation. + +/// Could be built using a [`QueryResultsSerializer`]. +/// +/// <div class="warning"> +/// +/// Do not forget to run the [`finish`](ToTokioAsyncWriteSolutionsWriter::finish()) method to properly write the last bytes of the file.</div> +/// +/// <div class="warning"> +/// +/// This writer does unbuffered writes. You might want to use [`BufWriter`](tokio::io::BufWriter) to avoid that.</div> +/// +/// Example in TSV (the API is the same for JSON, CSV and XML): +/// ``` +/// use oxrdf::{LiteralRef, Variable, VariableRef}; +/// use sparesults::{QueryResultsFormat, QueryResultsSerializer}; +/// use std::iter::once; +/// +/// # #[tokio::main(flavor = "current_thread")] +/// # async fn main() -> std::io::Result<()> { +/// let tsv_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Tsv); +/// let mut buffer = Vec::new(); +/// let mut writer = tsv_serializer +/// .serialize_solutions_to_tokio_async_write( +/// &mut buffer, +/// vec![ +/// Variable::new_unchecked("foo"), +/// Variable::new_unchecked("bar"), +/// ], +/// ) +/// .await?; +/// writer +/// .write(once(( +/// VariableRef::new_unchecked("foo"), +/// LiteralRef::from("test"), +/// ))) +/// .await?; +/// writer.finish().await?; +/// assert_eq!(buffer, b"?foo\t?bar\n\"test\"\t\n"); +/// # Ok(()) +/// # } +/// ``` +#[cfg(feature = "async-tokio")] +#[must_use] +pub struct ToTokioAsyncWriteSolutionsWriter<W: AsyncWrite + Unpin> { + formatter: ToTokioAsyncWriteSolutionsWriterKind<W>, +} + +#[cfg(feature = "async-tokio")] +enum ToTokioAsyncWriteSolutionsWriterKind<W: AsyncWrite + Unpin> { + Xml(ToTokioAsyncWriteXmlSolutionsWriter<W>), + Json(ToTokioAsyncWriteJsonSolutionsWriter<W>), + Csv(ToTokioAsyncWriteCsvSolutionsWriter<W>), + Tsv(ToTokioAsyncWriteTsvSolutionsWriter<W>), +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteSolutionsWriter<W> { + /// Writes a solution. + /// + /// Example in JSON (the API is the same for XML, CSV and TSV): + /// ``` + /// use sparesults::{QueryResultsFormat, QueryResultsSerializer, QuerySolution}; + /// use oxrdf::{Literal, LiteralRef, Variable, VariableRef}; + /// use std::iter::once; + /// + /// # #[tokio::main(flavor = "current_thread")] + /// # async fn main() -> std::io::Result<()> { + /// let json_serializer = QueryResultsSerializer::from_format(QueryResultsFormat::Json); + /// let mut buffer = Vec::new(); + /// let mut writer = json_serializer.serialize_solutions_to_tokio_async_write(&mut buffer, vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]).await?; + /// writer.write(once((VariableRef::new_unchecked("foo"), LiteralRef::from("test")))).await?; + /// writer.write(&QuerySolution::from((vec![Variable::new_unchecked("bar")], vec![Some(Literal::from("test").into())]))).await?; + /// writer.finish().await?; + /// assert_eq!(buffer, br#"{"head":{"vars":["foo","bar"]},"results":{"bindings":[{"foo":{"type":"literal","value":"test"}},{"bar":{"type":"literal","value":"test"}}]}}"#); + /// # Ok(()) + /// # } + /// ``` + pub async fn write<'a>( + &mut self, + solution: impl IntoIterator<Item = (impl Into<VariableRef<'a>>, impl Into<TermRef<'a>>)>, + ) -> io::Result<()> { + let solution = solution.into_iter().map(|(v, s)| (v.into(), s.into())); + match &mut self.formatter { + ToTokioAsyncWriteSolutionsWriterKind::Xml(writer) => writer.write(solution).await, + ToTokioAsyncWriteSolutionsWriterKind::Json(writer) => writer.write(solution).await, + ToTokioAsyncWriteSolutionsWriterKind::Csv(writer) => writer.write(solution).await, + ToTokioAsyncWriteSolutionsWriterKind::Tsv(writer) => writer.write(solution).await, + } + } + + /// Writes the last bytes of the file. + pub async fn finish(self) -> io::Result<W> { + match self.formatter { + ToTokioAsyncWriteSolutionsWriterKind::Xml(write) => write.finish().await, + ToTokioAsyncWriteSolutionsWriterKind::Json(write) => write.finish().await, + ToTokioAsyncWriteSolutionsWriterKind::Csv(write) => Ok(write.finish()), + ToTokioAsyncWriteSolutionsWriterKind::Tsv(write) => Ok(write.finish()), + } + } +} diff --git a/lib/sparesults/src/solution.rs b/lib/sparesults/src/solution.rs index a8059204..a1364861 100644 --- a/lib/sparesults/src/solution.rs +++ b/lib/sparesults/src/solution.rs @@ -4,7 +4,7 @@ use oxrdf::{Term, Variable, VariableRef}; use std::fmt; use std::iter::Zip; use std::ops::Index; -use std::rc::Rc; +use std::sync::Arc; /// Tuple associating variables and terms that are the result of a SPARQL query. /// @@ -18,9 +18,8 @@ use std::rc::Rc; /// assert_eq!(solution.get("foo"), Some(&Literal::from(1).into())); // Get the value of the variable ?foo if it exists (here yes). /// assert_eq!(solution.get(1), None); // Get the value of the second column if it exists (here no). /// ``` -#[allow(clippy::rc_buffer)] pub struct QuerySolution { - variables: Rc<Vec<Variable>>, + variables: Arc<[Variable]>, values: Vec<Option<Term>>, } @@ -45,10 +44,16 @@ impl QuerySolution { /// It is also the number of columns in the solutions table. /// /// ``` + /// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; - /// use oxrdf::{Variable, Literal}; /// - /// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); + /// let solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![Some(Literal::from(1).into()), None], + /// )); /// assert_eq!(solution.len(), 2); /// ``` #[inline] @@ -59,13 +64,25 @@ impl QuerySolution { /// Is there any variable bound in the table? /// /// ``` + /// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; - /// use oxrdf::{Variable, Literal}; /// - /// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); + /// let solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![Some(Literal::from(1).into()), None], + /// )); /// assert!(!solution.is_empty()); /// - /// let empty_solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![None, None])); + /// let empty_solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![None, None], + /// )); /// assert!(empty_solution.is_empty()); /// ``` #[inline] @@ -76,11 +93,20 @@ impl QuerySolution { /// Returns an iterator over bound variables. /// /// ``` + /// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; - /// use oxrdf::{Variable, Literal}; /// - /// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); - /// assert_eq!(solution.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from(1).into())]); + /// let solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![Some(Literal::from(1).into()), None], + /// )); + /// assert_eq!( + /// solution.iter().collect::<Vec<_>>(), + /// vec![(&Variable::new_unchecked("foo"), &Literal::from(1).into())] + /// ); /// ``` #[inline] pub fn iter(&self) -> impl Iterator<Item = (&Variable, &Term)> { @@ -90,10 +116,16 @@ impl QuerySolution { /// Returns the ordered slice of variable values. /// /// ``` + /// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; - /// use oxrdf::{Variable, Literal}; /// - /// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); + /// let solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![Some(Literal::from(1).into()), None], + /// )); /// assert_eq!(solution.values(), &[Some(Literal::from(1).into()), None]); /// ``` #[inline] @@ -104,11 +136,23 @@ impl QuerySolution { /// Returns the ordered slice of the solution variables, bound or not. /// /// ``` + /// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; - /// use oxrdf::{Variable, Literal}; /// - /// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); - /// assert_eq!(solution.variables(), &[Variable::new_unchecked("foo"), Variable::new_unchecked("bar")]); + /// let solution = QuerySolution::from(( + /// vec![ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar"), + /// ], + /// vec![Some(Literal::from(1).into()), None], + /// )); + /// assert_eq!( + /// solution.variables(), + /// &[ + /// Variable::new_unchecked("foo"), + /// Variable::new_unchecked("bar") + /// ] + /// ); /// ``` #[inline] pub fn variables(&self) -> &[Variable] { @@ -116,7 +160,7 @@ impl QuerySolution { } } -impl<V: Into<Rc<Vec<Variable>>>, S: Into<Vec<Option<Term>>>> From<(V, S)> for QuerySolution { +impl<V: Into<Arc<[Variable]>>, S: Into<Vec<Option<Term>>>> From<(V, S)> for QuerySolution { #[inline] fn from((v, s): (V, S)) -> Self { Self { @@ -131,7 +175,7 @@ impl<'a> IntoIterator for &'a QuerySolution { type IntoIter = Iter<'a>; #[inline] - fn into_iter(self) -> Iter<'a> { + fn into_iter(self) -> Self::IntoIter { Iter { inner: self.variables.iter().zip(&self.values), } @@ -141,8 +185,9 @@ impl<'a> IntoIterator for &'a QuerySolution { impl Index<usize> for QuerySolution { type Output = Term; + #[allow(clippy::panic)] #[inline] - fn index(&self, index: usize) -> &Term { + fn index(&self, index: usize) -> &Self::Output { self.get(index) .unwrap_or_else(|| panic!("The column {index} is not set in this solution")) } @@ -151,8 +196,9 @@ impl Index<usize> for QuerySolution { impl Index<&str> for QuerySolution { type Output = Term; + #[allow(clippy::panic)] #[inline] - fn index(&self, index: &str) -> &Term { + fn index(&self, index: &str) -> &Self::Output { self.get(index) .unwrap_or_else(|| panic!("The variable ?{index} is not set in this solution")) } @@ -161,8 +207,9 @@ impl Index<&str> for QuerySolution { impl Index<VariableRef<'_>> for QuerySolution { type Output = Term; + #[allow(clippy::panic)] #[inline] - fn index(&self, index: VariableRef<'_>) -> &Term { + fn index(&self, index: VariableRef<'_>) -> &Self::Output { self.get(index) .unwrap_or_else(|| panic!("The variable {index} is not set in this solution")) } @@ -171,7 +218,7 @@ impl Index<Variable> for QuerySolution { type Output = Term; #[inline] - fn index(&self, index: Variable) -> &Term { + fn index(&self, index: Variable) -> &Self::Output { self.index(index.as_ref()) } } @@ -180,7 +227,7 @@ impl Index<&Variable> for QuerySolution { type Output = Term; #[inline] - fn index(&self, index: &Variable) -> &Term { + fn index(&self, index: &Variable) -> &Self::Output { self.index(index.as_ref()) } } @@ -212,11 +259,20 @@ impl fmt::Debug for QuerySolution { /// An iterator over [`QuerySolution`] bound variables. /// /// ``` +/// use oxrdf::{Literal, Variable}; /// use sparesults::QuerySolution; -/// use oxrdf::{Variable, Literal}; /// -/// let solution = QuerySolution::from((vec![Variable::new_unchecked("foo"), Variable::new_unchecked("bar")], vec![Some(Literal::from(1).into()), None])); -/// assert_eq!(solution.iter().collect::<Vec<_>>(), vec![(&Variable::new_unchecked("foo"), &Literal::from(1).into())]); +/// let solution = QuerySolution::from(( +/// vec![ +/// Variable::new_unchecked("foo"), +/// Variable::new_unchecked("bar"), +/// ], +/// vec![Some(Literal::from(1).into()), None], +/// )); +/// assert_eq!( +/// solution.iter().collect::<Vec<_>>(), +/// vec![(&Variable::new_unchecked("foo"), &Literal::from(1).into())] +/// ); /// ``` pub struct Iter<'a> { inner: Zip<std::slice::Iter<'a, Variable>, std::slice::Iter<'a, Option<Term>>>, @@ -226,7 +282,7 @@ impl<'a> Iterator for Iter<'a> { type Item = (&'a Variable, &'a Term); #[inline] - fn next(&mut self) -> Option<(&'a Variable, &'a Term)> { + fn next(&mut self) -> Option<Self::Item> { for (variable, value) in &mut self.inner { if let Some(value) = value { return Some((variable, value)); diff --git a/lib/sparesults/src/xml.rs b/lib/sparesults/src/xml.rs index dbc17242..6eb861e2 100644 --- a/lib/sparesults/src/xml.rs +++ b/lib/sparesults/src/xml.rs @@ -1,164 +1,224 @@ //! Implementation of [SPARQL Query Results XML Format](https://www.w3.org/TR/rdf-sparql-XMLres/) -use crate::error::{ParseError, SyntaxError}; +use crate::error::{QueryResultsParseError, QueryResultsSyntaxError}; use oxrdf::vocab::rdf; -use oxrdf::Variable; use oxrdf::*; use quick_xml::events::{BytesDecl, BytesEnd, BytesStart, BytesText, Event}; use quick_xml::{Reader, Writer}; use std::borrow::Cow; use std::collections::BTreeMap; -use std::io::{self, BufRead, Write}; +use std::io::{self, BufReader, Read, Write}; use std::str; +use std::sync::Arc; +#[cfg(feature = "async-tokio")] +use tokio::io::AsyncWrite; -pub fn write_boolean_xml_result<W: Write>(sink: W, value: bool) -> io::Result<W> { - do_write_boolean_xml_result(sink, value).map_err(map_xml_error) +pub fn write_boolean_xml_result<W: Write>(write: W, value: bool) -> io::Result<W> { + let mut writer = Writer::new(write); + for event in inner_write_boolean_xml_result(value) { + writer.write_event(event).map_err(map_xml_error)?; + } + Ok(writer.into_inner()) } -fn do_write_boolean_xml_result<W: Write>(sink: W, value: bool) -> Result<W, quick_xml::Error> { - let mut writer = Writer::new(sink); - writer.write_event(Event::Decl(BytesDecl::new("1.0", None, None)))?; - writer - .create_element("sparql") - .with_attribute(("xmlns", "http://www.w3.org/2005/sparql-results#")) - .write_inner_content(|writer| { - writer - .create_element("head") - .write_text_content(BytesText::new(""))? - .create_element("boolean") - .write_text_content(BytesText::new(if value { "true" } else { "false" }))?; - Ok(()) - })?; +#[cfg(feature = "async-tokio")] +pub async fn tokio_async_write_boolean_xml_result<W: AsyncWrite + Unpin>( + write: W, + value: bool, +) -> io::Result<W> { + let mut writer = Writer::new(write); + for event in inner_write_boolean_xml_result(value) { + writer + .write_event_async(event) + .await + .map_err(map_xml_error)?; + } Ok(writer.into_inner()) } -pub struct XmlSolutionsWriter<W: Write> { - writer: Writer<W>, +fn inner_write_boolean_xml_result(value: bool) -> [Event<'static>; 8] { + [ + Event::Decl(BytesDecl::new("1.0", None, None)), + Event::Start( + BytesStart::new("sparql") + .with_attributes([("xmlns", "http://www.w3.org/2005/sparql-results#")]), + ), + Event::Start(BytesStart::new("head")), + Event::End(BytesEnd::new("head")), + Event::Start(BytesStart::new("boolean")), + Event::Text(BytesText::new(if value { "true" } else { "false" })), + Event::End(BytesEnd::new("boolean")), + Event::End(BytesEnd::new("sparql")), + ] } -impl<W: Write> XmlSolutionsWriter<W> { - pub fn start(sink: W, variables: &[Variable]) -> io::Result<Self> { - Self::do_start(sink, variables).map_err(map_xml_error) - } +pub struct ToWriteXmlSolutionsWriter<W: Write> { + inner: InnerXmlSolutionsWriter, + writer: Writer<W>, +} - fn do_start(sink: W, variables: &[Variable]) -> Result<Self, quick_xml::Error> { - let mut writer = Writer::new(sink); - writer.write_event(Event::Decl(BytesDecl::new("1.0", None, None)))?; - let mut sparql_open = BytesStart::new("sparql"); - sparql_open.push_attribute(("xmlns", "http://www.w3.org/2005/sparql-results#")); - writer.write_event(Event::Start(sparql_open))?; - writer - .create_element("head") - .write_inner_content(|writer| { - for variable in variables { - writer - .create_element("variable") - .with_attribute(("name", variable.as_str())) - .write_empty()?; - } - Ok(()) - })?; - writer.write_event(Event::Start(BytesStart::new("results")))?; - Ok(Self { writer }) +impl<W: Write> ToWriteXmlSolutionsWriter<W> { + pub fn start(write: W, variables: &[Variable]) -> io::Result<Self> { + let mut writer = Writer::new(write); + let mut buffer = Vec::with_capacity(48); + let inner = InnerXmlSolutionsWriter::start(&mut buffer, variables); + Self::do_write(&mut writer, buffer)?; + Ok(Self { inner, writer }) } pub fn write<'a>( &mut self, solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, ) -> io::Result<()> { - self.do_write(solution).map_err(map_xml_error) + let mut buffer = Vec::with_capacity(48); + self.inner.write(&mut buffer, solution); + Self::do_write(&mut self.writer, buffer) } - fn do_write<'a>( + pub fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::with_capacity(4); + self.inner.finish(&mut buffer); + Self::do_write(&mut self.writer, buffer)?; + Ok(self.writer.into_inner()) + } + + fn do_write(writer: &mut Writer<W>, output: Vec<Event<'_>>) -> io::Result<()> { + for event in output { + writer.write_event(event).map_err(map_xml_error)?; + } + Ok(()) + } +} + +#[cfg(feature = "async-tokio")] +pub struct ToTokioAsyncWriteXmlSolutionsWriter<W: AsyncWrite + Unpin> { + inner: InnerXmlSolutionsWriter, + writer: Writer<W>, +} + +#[cfg(feature = "async-tokio")] +impl<W: AsyncWrite + Unpin> ToTokioAsyncWriteXmlSolutionsWriter<W> { + pub async fn start(write: W, variables: &[Variable]) -> io::Result<Self> { + let mut writer = Writer::new(write); + let mut buffer = Vec::with_capacity(48); + let inner = InnerXmlSolutionsWriter::start(&mut buffer, variables); + Self::do_write(&mut writer, buffer).await?; + Ok(Self { inner, writer }) + } + + pub async fn write<'a>( &mut self, solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, - ) -> Result<(), quick_xml::Error> { - self.writer - .create_element("result") - .write_inner_content(|writer| { - for (variable, value) in solution { - writer - .create_element("binding") - .with_attribute(("name", variable.as_str())) - .write_inner_content(|writer| { - write_xml_term(value, writer)?; - Ok(()) - })?; - } - Ok(()) - })?; + ) -> io::Result<()> { + let mut buffer = Vec::with_capacity(48); + self.inner.write(&mut buffer, solution); + Self::do_write(&mut self.writer, buffer).await + } + + pub async fn finish(mut self) -> io::Result<W> { + let mut buffer = Vec::with_capacity(4); + self.inner.finish(&mut buffer); + Self::do_write(&mut self.writer, buffer).await?; + Ok(self.writer.into_inner()) + } + + async fn do_write(writer: &mut Writer<W>, output: Vec<Event<'_>>) -> io::Result<()> { + for event in output { + writer + .write_event_async(event) + .await + .map_err(map_xml_error)?; + } Ok(()) } +} + +struct InnerXmlSolutionsWriter; - pub fn finish(self) -> io::Result<W> { - let mut inner = self.do_finish().map_err(map_xml_error)?; - inner.flush()?; - Ok(inner) +impl InnerXmlSolutionsWriter { + fn start<'a>(output: &mut Vec<Event<'a>>, variables: &'a [Variable]) -> Self { + output.push(Event::Decl(BytesDecl::new("1.0", None, None))); + output.push(Event::Start(BytesStart::new("sparql").with_attributes([( + "xmlns", + "http://www.w3.org/2005/sparql-results#", + )]))); + output.push(Event::Start(BytesStart::new("head"))); + for variable in variables { + output.push(Event::Empty( + BytesStart::new("variable").with_attributes([("name", variable.as_str())]), + )); + } + output.push(Event::End(BytesEnd::new("head"))); + output.push(Event::Start(BytesStart::new("results"))); + Self {} } - fn do_finish(mut self) -> Result<W, quick_xml::Error> { - self.writer - .write_event(Event::End(BytesEnd::new("results")))?; - self.writer - .write_event(Event::End(BytesEnd::new("sparql")))?; - Ok(self.writer.into_inner()) + #[allow(clippy::unused_self)] + + fn write<'a>( + &self, + output: &mut Vec<Event<'a>>, + solution: impl IntoIterator<Item = (VariableRef<'a>, TermRef<'a>)>, + ) { + output.push(Event::Start(BytesStart::new("result"))); + for (variable, value) in solution { + output.push(Event::Start( + BytesStart::new("binding").with_attributes([("name", variable.as_str())]), + )); + write_xml_term(output, value); + output.push(Event::End(BytesEnd::new("binding"))); + } + output.push(Event::End(BytesEnd::new("result"))); + } + + #[allow(clippy::unused_self)] + fn finish(self, output: &mut Vec<Event<'_>>) { + output.push(Event::End(BytesEnd::new("results"))); + output.push(Event::End(BytesEnd::new("sparql"))); } } -fn write_xml_term( - term: TermRef<'_>, - writer: &mut Writer<impl Write>, -) -> Result<(), quick_xml::Error> { +fn write_xml_term<'a>(output: &mut Vec<Event<'a>>, term: TermRef<'a>) { match term { TermRef::NamedNode(uri) => { - writer - .create_element("uri") - .write_text_content(BytesText::new(uri.as_str()))?; + output.push(Event::Start(BytesStart::new("uri"))); + output.push(Event::Text(BytesText::new(uri.as_str()))); + output.push(Event::End(BytesEnd::new("uri"))); } TermRef::BlankNode(bnode) => { - writer - .create_element("bnode") - .write_text_content(BytesText::new(bnode.as_str()))?; + output.push(Event::Start(BytesStart::new("bnode"))); + output.push(Event::Text(BytesText::new(bnode.as_str()))); + output.push(Event::End(BytesEnd::new("bnode"))); } TermRef::Literal(literal) => { - let element = writer.create_element("literal"); - let element = if let Some(language) = literal.language() { - element.with_attribute(("xml:lang", language)) + let mut start = BytesStart::new("literal"); + if let Some(language) = literal.language() { + start.push_attribute(("xml:lang", language)); } else if !literal.is_plain() { - element.with_attribute(("datatype", literal.datatype().as_str())) - } else { - element - }; - element.write_text_content(BytesText::new(literal.value()))?; + start.push_attribute(("datatype", literal.datatype().as_str())) + } + output.push(Event::Start(start)); + output.push(Event::Text(BytesText::new(literal.value()))); + output.push(Event::End(BytesEnd::new("literal"))); } #[cfg(feature = "rdf-star")] TermRef::Triple(triple) => { - writer - .create_element("triple") - .write_inner_content(|writer| { - writer - .create_element("subject") - .write_inner_content(|writer| { - write_xml_term(triple.subject.as_ref().into(), writer) - })?; - writer - .create_element("predicate") - .write_inner_content(|writer| { - write_xml_term(triple.predicate.as_ref().into(), writer) - })?; - writer - .create_element("object") - .write_inner_content(|writer| { - write_xml_term(triple.object.as_ref(), writer) - })?; - Ok(()) - })?; + output.push(Event::Start(BytesStart::new("triple"))); + output.push(Event::Start(BytesStart::new("subject"))); + write_xml_term(output, triple.subject.as_ref().into()); + output.push(Event::End(BytesEnd::new("subject"))); + output.push(Event::Start(BytesStart::new("predicate"))); + write_xml_term(output, triple.predicate.as_ref().into()); + output.push(Event::End(BytesEnd::new("predicate"))); + output.push(Event::Start(BytesStart::new("object"))); + write_xml_term(output, triple.object.as_ref()); + output.push(Event::End(BytesEnd::new("object"))); + output.push(Event::End(BytesEnd::new("triple"))); } } - Ok(()) } -pub enum XmlQueryResultsReader<R: BufRead> { +pub enum XmlQueryResultsReader<R: Read> { Solutions { variables: Vec<Variable>, solutions: XmlSolutionsReader<R>, @@ -166,8 +226,8 @@ pub enum XmlQueryResultsReader<R: BufRead> { Boolean(bool), } -impl<R: BufRead> XmlQueryResultsReader<R> { - pub fn read(source: R) -> Result<Self, ParseError> { +impl<R: Read> XmlQueryResultsReader<R> { + pub fn read(source: R) -> Result<Self, QueryResultsParseError> { enum State { Start, Sparql, @@ -176,7 +236,7 @@ impl<R: BufRead> XmlQueryResultsReader<R> { Boolean, } - let mut reader = Reader::from_reader(source); + let mut reader = Reader::from_reader(BufReader::new(source)); reader.trim_text(true); reader.expand_empty_elements(true); @@ -184,7 +244,7 @@ impl<R: BufRead> XmlQueryResultsReader<R> { let mut variables = Vec::default(); let mut state = State::Start; - //Read header + // Read header loop { buffer.clear(); let event = reader.read_event_into(&mut buffer)?; @@ -194,14 +254,14 @@ impl<R: BufRead> XmlQueryResultsReader<R> { if event.local_name().as_ref() == b"sparql" { state = State::Sparql; } else { - return Err(SyntaxError::msg(format!("Expecting <sparql> tag, found <{}>", decode(&reader, &event.name())?)).into()); + return Err(QueryResultsSyntaxError::msg(format!("Expecting <sparql> tag, found <{}>", decode(&reader, &event.name())?)).into()); } } State::Sparql => { if event.local_name().as_ref() == b"head" { state = State::Head; } else { - return Err(SyntaxError::msg(format!("Expecting <head> tag, found <{}>",decode(&reader, &event.name())?)).into()); + return Err(QueryResultsSyntaxError::msg(format!("Expecting <head> tag, found <{}>", decode(&reader, &event.name())?)).into()); } } State::Head => { @@ -209,11 +269,11 @@ impl<R: BufRead> XmlQueryResultsReader<R> { let name = event.attributes() .filter_map(Result::ok) .find(|attr| attr.key.local_name().as_ref() == b"name") - .ok_or_else(|| SyntaxError::msg("No name attribute found for the <variable> tag"))? + .ok_or_else(|| QueryResultsSyntaxError::msg("No name attribute found for the <variable> tag"))? .decode_and_unescape_value(&reader)?; - let variable = Variable::new(name).map_err(|e| SyntaxError::msg(format!("Invalid variable name: {e}")))?; + let variable = Variable::new(name).map_err(|e| QueryResultsSyntaxError::msg(format!("Invalid variable name: {e}")))?; if variables.contains(&variable) { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "The variable {variable} is declared twice" )) .into()); @@ -222,7 +282,7 @@ impl<R: BufRead> XmlQueryResultsReader<R> { } else if event.local_name().as_ref() == b"link" { // no op } else { - return Err(SyntaxError::msg(format!("Expecting <variable> or <link> tag, found <{}>", decode(&reader, &event.name())?)).into()); + return Err(QueryResultsSyntaxError::msg(format!("Expecting <variable> or <link> tag, found <{}>", decode(&reader, &event.name())?)).into()); } } State::AfterHead => { @@ -244,10 +304,10 @@ impl<R: BufRead> XmlQueryResultsReader<R> { object_stack: Vec::new(), }}); } else if event.local_name().as_ref() != b"link" && event.local_name().as_ref() != b"results" && event.local_name().as_ref() != b"boolean" { - return Err(SyntaxError::msg(format!("Expecting sparql tag, found <{}>", decode(&reader, &event.name())?)).into()); + return Err(QueryResultsSyntaxError::msg(format!("Expecting sparql tag, found <{}>", decode(&reader, &event.name())?)).into()); } } - State::Boolean => return Err(SyntaxError::msg(format!("Unexpected tag inside of <boolean> tag: <{}>", decode(&reader, &event.name())?)).into()) + State::Boolean => return Err(QueryResultsSyntaxError::msg(format!("Unexpected tag inside of <boolean> tag: <{}>", decode(&reader, &event.name())?)).into()) }, Event::Text(event) => { let value = event.unescape()?; @@ -258,10 +318,10 @@ impl<R: BufRead> XmlQueryResultsReader<R> { } else if value == "false" { Ok(Self::Boolean(false)) } else { - Err(SyntaxError::msg(format!("Unexpected boolean value. Found '{value}'")).into()) + Err(QueryResultsSyntaxError::msg(format!("Unexpected boolean value. Found '{value}'")).into()) }; } - _ => Err(SyntaxError::msg(format!("Unexpected textual value found: '{value}'")).into()) + _ => Err(QueryResultsSyntaxError::msg(format!("Unexpected textual value found: '{value}'")).into()) }; }, Event::End(event) => { @@ -270,10 +330,10 @@ impl<R: BufRead> XmlQueryResultsReader<R> { state = State::AfterHead } } else { - return Err(SyntaxError::msg("Unexpected early file end. All results file should have a <head> and a <result> or <boolean> tag").into()); + return Err(QueryResultsSyntaxError::msg("Unexpected early file end. All results file should have a <head> and a <result> or <boolean> tag").into()); } }, - Event::Eof => return Err(SyntaxError::msg("Unexpected early file end. All results file should have a <head> and a <result> or <boolean> tag").into()), + Event::Eof => return Err(QueryResultsSyntaxError::msg("Unexpected early file end. All results file should have a <head> and a <result> or <boolean> tag").into()), _ => (), } } @@ -294,8 +354,8 @@ enum State { End, } -pub struct XmlSolutionsReader<R: BufRead> { - reader: Reader<R>, +pub struct XmlSolutionsReader<R: Read> { + reader: Reader<BufReader<R>>, buffer: Vec<u8>, mapping: BTreeMap<String, usize>, stack: Vec<State>, @@ -304,8 +364,8 @@ pub struct XmlSolutionsReader<R: BufRead> { object_stack: Vec<Term>, } -impl<R: BufRead> XmlSolutionsReader<R> { - pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, ParseError> { +impl<R: Read> XmlSolutionsReader<R> { + pub fn read_next(&mut self) -> Result<Option<Vec<Option<Term>>>, QueryResultsParseError> { let mut state = State::Start; let mut new_bindings = vec![None; self.mapping.len()]; @@ -323,7 +383,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { if event.local_name().as_ref() == b"result" { state = State::Result; } else { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "Expecting <result>, found <{}>", decode(&self.reader, &event.name())? )) @@ -343,7 +403,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { ) } None => { - return Err(SyntaxError::msg( + return Err(QueryResultsSyntaxError::msg( "No name attribute found for the <binding> tag", ) .into()); @@ -351,7 +411,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { } state = State::Binding; } else { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "Expecting <binding>, found <{}>", decode(&self.reader, &event.name())? )) @@ -360,7 +420,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { } State::Binding | State::Subject | State::Predicate | State::Object => { if term.is_some() { - return Err(SyntaxError::msg( + return Err(QueryResultsSyntaxError::msg( "There is already a value for the current binding", ) .into()); @@ -371,7 +431,8 @@ impl<R: BufRead> XmlSolutionsReader<R> { } else if event.local_name().as_ref() == b"bnode" { state = State::BNode; } else if event.local_name().as_ref() == b"literal" { - for attr in event.attributes().flatten() { + for attr in event.attributes() { + let attr = attr.map_err(quick_xml::Error::from)?; if attr.key.as_ref() == b"xml:lang" { lang = Some( attr.decode_and_unescape_value(&self.reader)?.to_string(), @@ -380,7 +441,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { let iri = attr.decode_and_unescape_value(&self.reader)?; datatype = Some(NamedNode::new(iri.to_string()).map_err(|e| { - SyntaxError::msg(format!( + QueryResultsSyntaxError::msg(format!( "Invalid datatype IRI '{iri}': {e}" )) })?); @@ -390,7 +451,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { } else if event.local_name().as_ref() == b"triple" { state = State::Triple; } else { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "Expecting <uri>, <bnode> or <literal> found <{}>", decode(&self.reader, &event.name())? )) @@ -405,7 +466,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { } else if event.local_name().as_ref() == b"object" { state = State::Object } else { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "Expecting <subject>, <predicate> or <object> found <{}>", decode(&self.reader, &event.name())? )) @@ -421,7 +482,9 @@ impl<R: BufRead> XmlSolutionsReader<R> { term = Some( NamedNode::new(data.to_string()) .map_err(|e| { - SyntaxError::msg(format!("Invalid IRI value '{data}': {e}")) + QueryResultsSyntaxError::msg(format!( + "Invalid IRI value '{data}': {e}" + )) })? .into(), ) @@ -430,7 +493,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { term = Some( BlankNode::new(data.to_string()) .map_err(|e| { - SyntaxError::msg(format!( + QueryResultsSyntaxError::msg(format!( "Invalid blank node value '{data}': {e}" )) })? @@ -441,7 +504,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { term = Some(build_literal(data, lang.take(), datatype.take())?.into()); } _ => { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "Unexpected textual value found: {data}" )) .into()); @@ -457,11 +520,14 @@ impl<R: BufRead> XmlSolutionsReader<R> { new_bindings[*var] = term.take() } else { return Err( - SyntaxError::msg(format!("The variable '{var}' is used in a binding but not declared in the variables list")).into() + QueryResultsSyntaxError::msg(format!("The variable '{var}' is used in a binding but not declared in the variables list")).into() ); } } else { - return Err(SyntaxError::msg("No name found for <binding> tag").into()); + return Err(QueryResultsSyntaxError::msg( + "No name found for <binding> tag", + ) + .into()); } state = State::Result; } @@ -487,27 +553,27 @@ impl<R: BufRead> XmlSolutionsReader<R> { state = self .stack .pop() - .ok_or_else(|| SyntaxError::msg("Empty stack"))? + .ok_or_else(|| QueryResultsSyntaxError::msg("Empty stack"))? } State::BNode => { if term.is_none() { - //We default to a random bnode + // We default to a random bnode term = Some(BlankNode::default().into()) } state = self .stack .pop() - .ok_or_else(|| SyntaxError::msg("Empty stack"))? + .ok_or_else(|| QueryResultsSyntaxError::msg("Empty stack"))? } State::Literal => { if term.is_none() { - //We default to the empty literal + // We default to the empty literal term = Some(build_literal("", lang.take(), datatype.take())?.into()) } state = self .stack .pop() - .ok_or_else(|| SyntaxError::msg("Empty stack"))?; + .ok_or_else(|| QueryResultsSyntaxError::msg("Empty stack"))?; } State::Triple => { #[cfg(feature = "rdf-star")] @@ -523,7 +589,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { Term::BlankNode(subject) => subject.into(), Term::Triple(subject) => Subject::Triple(subject), Term::Literal(_) => { - return Err(SyntaxError::msg( + return Err(QueryResultsSyntaxError::msg( "The <subject> value should not be a <literal>", ) .into()) @@ -532,7 +598,7 @@ impl<R: BufRead> XmlSolutionsReader<R> { match predicate { Term::NamedNode(predicate) => predicate, _ => { - return Err(SyntaxError::msg( + return Err(QueryResultsSyntaxError::msg( "The <predicate> value should be an <uri>", ) .into()) @@ -545,15 +611,15 @@ impl<R: BufRead> XmlSolutionsReader<R> { state = self .stack .pop() - .ok_or_else(|| SyntaxError::msg("Empty stack"))?; + .ok_or_else(|| QueryResultsSyntaxError::msg("Empty stack"))?; } else { return Err( - SyntaxError::msg("A <triple> should contain a <subject>, a <predicate> and an <object>").into() + QueryResultsSyntaxError::msg("A <triple> should contain a <subject>, a <predicate> and an <object>").into() ); } #[cfg(not(feature = "rdf-star"))] { - return Err(SyntaxError::msg( + return Err(QueryResultsSyntaxError::msg( "The <triple> tag is only supported with RDF-star", ) .into()); @@ -572,19 +638,19 @@ fn build_literal( value: impl Into<String>, lang: Option<String>, datatype: Option<NamedNode>, -) -> Result<Literal, ParseError> { +) -> Result<Literal, QueryResultsParseError> { match lang { Some(lang) => { if let Some(datatype) = datatype { if datatype.as_ref() != rdf::LANG_STRING { - return Err(SyntaxError::msg(format!( + return Err(QueryResultsSyntaxError::msg(format!( "xml:lang value '{lang}' provided with the datatype {datatype}" )) .into()); } } Literal::new_language_tagged_literal(value, &lang).map_err(|e| { - SyntaxError::msg(format!("Invalid xml:lang value '{lang}': {e}")).into() + QueryResultsSyntaxError::msg(format!("Invalid xml:lang value '{lang}': {e}")).into() }) } None => Ok(if let Some(datatype) = datatype { @@ -598,13 +664,15 @@ fn build_literal( fn decode<'a, T>( reader: &Reader<T>, data: &'a impl AsRef<[u8]>, -) -> Result<Cow<'a, str>, ParseError> { +) -> Result<Cow<'a, str>, QueryResultsParseError> { Ok(reader.decoder().decode(data.as_ref())?) } fn map_xml_error(error: quick_xml::Error) -> io::Error { match error { - quick_xml::Error::Io(error) => io::Error::new(error.kind(), error), + quick_xml::Error::Io(error) => { + Arc::try_unwrap(error).unwrap_or_else(|error| io::Error::new(error.kind(), error)) + } quick_xml::Error::UnexpectedEof(_) => io::Error::new(io::ErrorKind::UnexpectedEof, error), _ => io::Error::new(io::ErrorKind::InvalidData, error), } diff --git a/lib/spargebra/Cargo.toml b/lib/spargebra/Cargo.toml index dd48edb9..f367c57c 100644 --- a/lib/spargebra/Cargo.toml +++ b/lib/spargebra/Cargo.toml @@ -1,18 +1,17 @@ [package] name = "spargebra" -version = "0.2.8" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +version = "0.3.0-alpha.2" +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["SPARQL"] repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/spargebra" -homepage = "https://oxigraph.org/" documentation = "https://docs.rs/spargebra" description = """ A SPARQL parser """ -edition = "2021" -rust-version = "1.60" +edition.workspace = true +rust-version.workspace = true [features] default = [] @@ -21,11 +20,16 @@ sep-0002 = [] sep-0006 = [] [dependencies] -peg = "0.8" -rand = "0.8" -oxiri = "0.2" -oxilangtag = "0.1" -oxrdf = { version = "0.1.6", path="../oxrdf" } +oxilangtag.workspace = true +oxiri.workspace = true +oxrdf.workspace = true +peg.workspace = true +rand.workspace = true +thiserror.workspace = true + +[lints] +workspace = true [package.metadata.docs.rs] all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/spargebra/README.md b/lib/spargebra/README.md index 275fb5f0..313d8758 100644 --- a/lib/spargebra/README.md +++ b/lib/spargebra/README.md @@ -5,7 +5,7 @@ Spargebra [](https://docs.rs/spargebra) [](https://crates.io/crates/spargebra) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) Spargebra is a [SPARQL](https://www.w3.org/TR/sparql11-overview/) parser. diff --git a/lib/spargebra/src/algebra.rs b/lib/spargebra/src/algebra.rs index d694ba53..a261b2dc 100644 --- a/lib/spargebra/src/algebra.rs +++ b/lib/spargebra/src/algebra.rs @@ -23,45 +23,45 @@ impl PropertyPathExpression { match self { Self::NamedNode(p) => write!(f, "{p}"), Self::Reverse(p) => { - write!(f, "(reverse ")?; + f.write_str("(reverse ")?; p.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Alternative(a, b) => { - write!(f, "(alt ")?; + f.write_str("(alt ")?; a.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; b.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Sequence(a, b) => { - write!(f, "(seq ")?; + f.write_str("(seq ")?; a.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; b.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::ZeroOrMore(p) => { - write!(f, "(path* ")?; + f.write_str("(path* ")?; p.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::OneOrMore(p) => { - write!(f, "(path+ ")?; + f.write_str("(path+ ")?; p.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::ZeroOrOne(p) => { - write!(f, "(path? ")?; + f.write_str("(path? ")?; p.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::NegatedPropertySet(p) => { - write!(f, "(notoneof")?; + f.write_str("(notoneof")?; for p in p { write!(f, " {p}")?; } - write!(f, ")") + f.write_str(")") } } } @@ -78,14 +78,14 @@ impl fmt::Display for PropertyPathExpression { Self::OneOrMore(p) => write!(f, "({p})+"), Self::ZeroOrOne(p) => write!(f, "({p})?"), Self::NegatedPropertySet(p) => { - write!(f, "!(")?; + f.write_str("!(")?; for (i, c) in p.iter().enumerate() { if i > 0 { - write!(f, " | ")?; + f.write_str(" | ")?; } write!(f, "{c}")?; } - write!(f, ")") + f.write_str(")") } } } @@ -161,13 +161,13 @@ impl Expression { Self::Less(a, b) => fmt_sse_binary_expression(f, "<", a, b), Self::LessOrEqual(a, b) => fmt_sse_binary_expression(f, "<=", a, b), Self::In(a, b) => { - write!(f, "(in ")?; + f.write_str("(in ")?; a.fmt_sse(f)?; for p in b { - write!(f, " ")?; + f.write_str(" ")?; p.fmt_sse(f)?; } - write!(f, ")") + f.write_str(")") } Self::Add(a, b) => fmt_sse_binary_expression(f, "+", a, b), Self::Subtract(a, b) => fmt_sse_binary_expression(f, "-", a, b), @@ -177,38 +177,38 @@ impl Expression { Self::UnaryMinus(e) => fmt_sse_unary_expression(f, "-", e), Self::Not(e) => fmt_sse_unary_expression(f, "!", e), Self::FunctionCall(function, parameters) => { - write!(f, "( ")?; + f.write_str("( ")?; function.fmt_sse(f)?; for p in parameters { - write!(f, " ")?; + f.write_str(" ")?; p.fmt_sse(f)?; } - write!(f, ")") + f.write_str(")") } Self::Exists(p) => { - write!(f, "(exists ")?; + f.write_str("(exists ")?; p.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Bound(v) => { write!(f, "(bound {v})") } Self::If(a, b, c) => { - write!(f, "(if ")?; + f.write_str("(if ")?; a.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; b.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; c.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Coalesce(parameters) => { - write!(f, "(coalesce")?; + f.write_str("(coalesce")?; for p in parameters { - write!(f, " ")?; + f.write_str(" ")?; p.fmt_sse(f)?; } - write!(f, ")") + f.write_str(")") } } } @@ -239,7 +239,7 @@ impl fmt::Display for Expression { Self::In(a, b) => { write!(f, "({a} IN ")?; write_arg_list(b, f)?; - write!(f, ")") + f.write_str(")") } Self::Add(a, b) => { write!(f, "{a} + {b}") @@ -267,7 +267,7 @@ impl fmt::Display for Expression { Self::Exists(p) => write!(f, "EXISTS {{ {p} }}"), Self::If(a, b, c) => write!(f, "IF({a}, {b}, {c})"), Self::Coalesce(parameters) => { - write!(f, "COALESCE")?; + f.write_str("COALESCE")?; write_arg_list(parameters, f) } } @@ -305,16 +305,16 @@ fn write_arg_list( params: impl IntoIterator<Item = impl fmt::Display>, f: &mut fmt::Formatter<'_>, ) -> fmt::Result { - write!(f, "(")?; + f.write_str("(")?; let mut cont = false; for p in params { if cont { - write!(f, ", ")?; + f.write_str(", ")?; } p.fmt(f)?; cont = true; } - write!(f, ")") + f.write_str(")") } /// A function name. @@ -385,64 +385,64 @@ impl Function { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { - Self::Str => write!(f, "str"), - Self::Lang => write!(f, "lang"), - Self::LangMatches => write!(f, "langmatches"), - Self::Datatype => write!(f, "datatype"), - Self::Iri => write!(f, "iri"), - Self::BNode => write!(f, "bnode"), - Self::Rand => write!(f, "rand"), - Self::Abs => write!(f, "abs"), - Self::Ceil => write!(f, "ceil"), - Self::Floor => write!(f, "floor"), - Self::Round => write!(f, "round"), - Self::Concat => write!(f, "concat"), - Self::SubStr => write!(f, "substr"), - Self::StrLen => write!(f, "strlen"), - Self::Replace => write!(f, "replace"), - Self::UCase => write!(f, "ucase"), - Self::LCase => write!(f, "lcase"), - Self::EncodeForUri => write!(f, "encode_for_uri"), - Self::Contains => write!(f, "contains"), - Self::StrStarts => write!(f, "strstarts"), - Self::StrEnds => write!(f, "strends"), - Self::StrBefore => write!(f, "strbefore"), - Self::StrAfter => write!(f, "strafter"), - Self::Year => write!(f, "year"), - Self::Month => write!(f, "month"), - Self::Day => write!(f, "day"), - Self::Hours => write!(f, "hours"), - Self::Minutes => write!(f, "minutes"), - Self::Seconds => write!(f, "seconds"), - Self::Timezone => write!(f, "timezone"), - Self::Tz => write!(f, "tz"), - Self::Now => write!(f, "now"), - Self::Uuid => write!(f, "uuid"), - Self::StrUuid => write!(f, "struuid"), - Self::Md5 => write!(f, "md5"), - Self::Sha1 => write!(f, "sha1"), - Self::Sha256 => write!(f, "sha256"), - Self::Sha384 => write!(f, "sha384"), - Self::Sha512 => write!(f, "sha512"), - Self::StrLang => write!(f, "strlang"), - Self::StrDt => write!(f, "strdt"), - Self::IsIri => write!(f, "isiri"), - Self::IsBlank => write!(f, "isblank"), - Self::IsLiteral => write!(f, "isliteral"), - Self::IsNumeric => write!(f, "isnumeric"), - Self::Regex => write!(f, "regex"), + Self::Str => f.write_str("str"), + Self::Lang => f.write_str("lang"), + Self::LangMatches => f.write_str("langmatches"), + Self::Datatype => f.write_str("datatype"), + Self::Iri => f.write_str("iri"), + Self::BNode => f.write_str("bnode"), + Self::Rand => f.write_str("rand"), + Self::Abs => f.write_str("abs"), + Self::Ceil => f.write_str("ceil"), + Self::Floor => f.write_str("floor"), + Self::Round => f.write_str("round"), + Self::Concat => f.write_str("concat"), + Self::SubStr => f.write_str("substr"), + Self::StrLen => f.write_str("strlen"), + Self::Replace => f.write_str("replace"), + Self::UCase => f.write_str("ucase"), + Self::LCase => f.write_str("lcase"), + Self::EncodeForUri => f.write_str("encode_for_uri"), + Self::Contains => f.write_str("contains"), + Self::StrStarts => f.write_str("strstarts"), + Self::StrEnds => f.write_str("strends"), + Self::StrBefore => f.write_str("strbefore"), + Self::StrAfter => f.write_str("strafter"), + Self::Year => f.write_str("year"), + Self::Month => f.write_str("month"), + Self::Day => f.write_str("day"), + Self::Hours => f.write_str("hours"), + Self::Minutes => f.write_str("minutes"), + Self::Seconds => f.write_str("seconds"), + Self::Timezone => f.write_str("timezone"), + Self::Tz => f.write_str("tz"), + Self::Now => f.write_str("now"), + Self::Uuid => f.write_str("uuid"), + Self::StrUuid => f.write_str("struuid"), + Self::Md5 => f.write_str("md5"), + Self::Sha1 => f.write_str("sha1"), + Self::Sha256 => f.write_str("sha256"), + Self::Sha384 => f.write_str("sha384"), + Self::Sha512 => f.write_str("sha512"), + Self::StrLang => f.write_str("strlang"), + Self::StrDt => f.write_str("strdt"), + Self::IsIri => f.write_str("isiri"), + Self::IsBlank => f.write_str("isblank"), + Self::IsLiteral => f.write_str("isliteral"), + Self::IsNumeric => f.write_str("isnumeric"), + Self::Regex => f.write_str("regex"), #[cfg(feature = "rdf-star")] - Self::Triple => write!(f, "triple"), + Self::Triple => f.write_str("triple"), #[cfg(feature = "rdf-star")] - Self::Subject => write!(f, "subject"), + Self::Subject => f.write_str("subject"), #[cfg(feature = "rdf-star")] - Self::Predicate => write!(f, "predicate"), + Self::Predicate => f.write_str("predicate"), #[cfg(feature = "rdf-star")] - Self::Object => write!(f, "object"), + Self::Object => f.write_str("object"), #[cfg(feature = "rdf-star")] - Self::IsTriple => write!(f, "istriple"), + Self::IsTriple => f.write_str("istriple"), #[cfg(feature = "sep-0002")] - Self::Adjust => write!(f, "adjust"), + Self::Adjust => f.write_str("adjust"), Self::Custom(iri) => write!(f, "{iri}"), } } @@ -451,64 +451,64 @@ impl Function { impl fmt::Display for Function { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::Str => write!(f, "STR"), - Self::Lang => write!(f, "LANG"), - Self::LangMatches => write!(f, "LANGMATCHES"), - Self::Datatype => write!(f, "DATATYPE"), - Self::Iri => write!(f, "IRI"), - Self::BNode => write!(f, "BNODE"), - Self::Rand => write!(f, "RAND"), - Self::Abs => write!(f, "ABS"), - Self::Ceil => write!(f, "CEIL"), - Self::Floor => write!(f, "FLOOR"), - Self::Round => write!(f, "ROUND"), - Self::Concat => write!(f, "CONCAT"), - Self::SubStr => write!(f, "SUBSTR"), - Self::StrLen => write!(f, "STRLEN"), - Self::Replace => write!(f, "REPLACE"), - Self::UCase => write!(f, "UCASE"), - Self::LCase => write!(f, "LCASE"), - Self::EncodeForUri => write!(f, "ENCODE_FOR_URI"), - Self::Contains => write!(f, "CONTAINS"), - Self::StrStarts => write!(f, "STRSTARTS"), - Self::StrEnds => write!(f, "STRENDS"), - Self::StrBefore => write!(f, "STRBEFORE"), - Self::StrAfter => write!(f, "STRAFTER"), - Self::Year => write!(f, "YEAR"), - Self::Month => write!(f, "MONTH"), - Self::Day => write!(f, "DAY"), - Self::Hours => write!(f, "HOURS"), - Self::Minutes => write!(f, "MINUTES"), - Self::Seconds => write!(f, "SECONDS"), - Self::Timezone => write!(f, "TIMEZONE"), - Self::Tz => write!(f, "TZ"), - Self::Now => write!(f, "NOW"), - Self::Uuid => write!(f, "UUID"), - Self::StrUuid => write!(f, "STRUUID"), - Self::Md5 => write!(f, "MD5"), - Self::Sha1 => write!(f, "SHA1"), - Self::Sha256 => write!(f, "SHA256"), - Self::Sha384 => write!(f, "SHA384"), - Self::Sha512 => write!(f, "SHA512"), - Self::StrLang => write!(f, "STRLANG"), - Self::StrDt => write!(f, "STRDT"), - Self::IsIri => write!(f, "isIRI"), - Self::IsBlank => write!(f, "isBLANK"), - Self::IsLiteral => write!(f, "isLITERAL"), - Self::IsNumeric => write!(f, "isNUMERIC"), - Self::Regex => write!(f, "REGEX"), + Self::Str => f.write_str("STR"), + Self::Lang => f.write_str("LANG"), + Self::LangMatches => f.write_str("LANGMATCHES"), + Self::Datatype => f.write_str("DATATYPE"), + Self::Iri => f.write_str("IRI"), + Self::BNode => f.write_str("BNODE"), + Self::Rand => f.write_str("RAND"), + Self::Abs => f.write_str("ABS"), + Self::Ceil => f.write_str("CEIL"), + Self::Floor => f.write_str("FLOOR"), + Self::Round => f.write_str("ROUND"), + Self::Concat => f.write_str("CONCAT"), + Self::SubStr => f.write_str("SUBSTR"), + Self::StrLen => f.write_str("STRLEN"), + Self::Replace => f.write_str("REPLACE"), + Self::UCase => f.write_str("UCASE"), + Self::LCase => f.write_str("LCASE"), + Self::EncodeForUri => f.write_str("ENCODE_FOR_URI"), + Self::Contains => f.write_str("CONTAINS"), + Self::StrStarts => f.write_str("STRSTARTS"), + Self::StrEnds => f.write_str("STRENDS"), + Self::StrBefore => f.write_str("STRBEFORE"), + Self::StrAfter => f.write_str("STRAFTER"), + Self::Year => f.write_str("YEAR"), + Self::Month => f.write_str("MONTH"), + Self::Day => f.write_str("DAY"), + Self::Hours => f.write_str("HOURS"), + Self::Minutes => f.write_str("MINUTES"), + Self::Seconds => f.write_str("SECONDS"), + Self::Timezone => f.write_str("TIMEZONE"), + Self::Tz => f.write_str("TZ"), + Self::Now => f.write_str("NOW"), + Self::Uuid => f.write_str("UUID"), + Self::StrUuid => f.write_str("STRUUID"), + Self::Md5 => f.write_str("MD5"), + Self::Sha1 => f.write_str("SHA1"), + Self::Sha256 => f.write_str("SHA256"), + Self::Sha384 => f.write_str("SHA384"), + Self::Sha512 => f.write_str("SHA512"), + Self::StrLang => f.write_str("STRLANG"), + Self::StrDt => f.write_str("STRDT"), + Self::IsIri => f.write_str("isIRI"), + Self::IsBlank => f.write_str("isBLANK"), + Self::IsLiteral => f.write_str("isLITERAL"), + Self::IsNumeric => f.write_str("isNUMERIC"), + Self::Regex => f.write_str("REGEX"), #[cfg(feature = "rdf-star")] - Self::Triple => write!(f, "TRIPLE"), + Self::Triple => f.write_str("TRIPLE"), #[cfg(feature = "rdf-star")] - Self::Subject => write!(f, "SUBJECT"), + Self::Subject => f.write_str("SUBJECT"), #[cfg(feature = "rdf-star")] - Self::Predicate => write!(f, "PREDICATE"), + Self::Predicate => f.write_str("PREDICATE"), #[cfg(feature = "rdf-star")] - Self::Object => write!(f, "OBJECT"), + Self::Object => f.write_str("OBJECT"), #[cfg(feature = "rdf-star")] - Self::IsTriple => write!(f, "isTRIPLE"), + Self::IsTriple => f.write_str("isTRIPLE"), #[cfg(feature = "sep-0002")] - Self::Adjust => write!(f, "ADJUST"), + Self::Adjust => f.write_str("ADJUST"), Self::Custom(iri) => iri.fmt(f), } } @@ -640,7 +640,7 @@ impl fmt::Display for GraphPattern { Self::Filter { expr, inner } => { write!(f, "{inner} FILTER({expr})") } - Self::Union { left, right } => write!(f, "{{ {left} }} UNION {{ {right} }}",), + Self::Union { left, right } => write!(f, "{{ {left} }} UNION {{ {right} }}"), Self::Graph { name, inner } => { write!(f, "GRAPH {name} {{ {inner} }}") } @@ -665,29 +665,29 @@ impl fmt::Display for GraphPattern { variables, bindings, } => { - write!(f, "VALUES ( ")?; + f.write_str("VALUES ( ")?; for var in variables { write!(f, "{var} ")?; } - write!(f, ") {{ ")?; + f.write_str(") { ")?; for row in bindings { - write!(f, "( ")?; + f.write_str("( ")?; for val in row { match val { Some(val) => write!(f, "{val} "), - None => write!(f, "UNDEF "), + None => f.write_str("UNDEF "), }?; } - write!(f, ") ")?; + f.write_str(") ")?; } - write!(f, " }}") + f.write_str(" }") } Self::Group { inner, variables, aggregates, } => { - write!(f, "{{SELECT")?; + f.write_str("{SELECT")?; for (a, v) in aggregates { write!(f, " ({v} AS {a})")?; } @@ -696,12 +696,12 @@ impl fmt::Display for GraphPattern { } write!(f, " WHERE {{ {inner} }}")?; if !variables.is_empty() { - write!(f, " GROUP BY")?; + f.write_str(" GROUP BY")?; for v in variables { write!(f, " {v}")?; } } - write!(f, "}}") + f.write_str("}") } p => write!( f, @@ -728,76 +728,76 @@ impl GraphPattern { pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { Self::Bgp { patterns } => { - write!(f, "(bgp")?; + f.write_str("(bgp")?; for pattern in patterns { - write!(f, " ")?; + f.write_str(" ")?; pattern.fmt_sse(f)?; } - write!(f, ")") + f.write_str(")") } Self::Path { subject, path, object, } => { - write!(f, "(path ")?; + f.write_str("(path ")?; subject.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; path.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; object.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Join { left, right } => { - write!(f, "(join ")?; + f.write_str("(join ")?; left.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; right.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::LeftJoin { left, right, expression, } => { - write!(f, "(leftjoin ")?; + f.write_str("(leftjoin ")?; left.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; right.fmt_sse(f)?; if let Some(expr) = expression { - write!(f, " ")?; + f.write_str(" ")?; expr.fmt_sse(f)?; } - write!(f, ")") + f.write_str(")") } #[cfg(feature = "sep-0006")] Self::Lateral { left, right } => { - write!(f, "(lateral ")?; + f.write_str("(lateral ")?; left.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; right.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Filter { expr, inner } => { - write!(f, "(filter ")?; + f.write_str("(filter ")?; expr.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Union { left, right } => { - write!(f, "(union ")?; + f.write_str("(union ")?; left.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; right.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Graph { name, inner } => { - write!(f, "(graph ")?; + f.write_str("(graph ")?; name.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Extend { inner, @@ -806,109 +806,109 @@ impl GraphPattern { } => { write!(f, "(extend (({variable} ")?; expression.fmt_sse(f)?; - write!(f, ")) ")?; + f.write_str(")) ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Minus { left, right } => { - write!(f, "(minus ")?; + f.write_str("(minus ")?; left.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; right.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Service { name, inner, silent, } => { - write!(f, "(service ")?; + f.write_str("(service ")?; if *silent { - write!(f, "silent ")?; + f.write_str("silent ")?; } name.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Group { inner, variables, aggregates, } => { - write!(f, "(group (")?; + f.write_str("(group (")?; for (i, v) in variables.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } write!(f, "{v}")?; } - write!(f, ") (")?; + f.write_str(") (")?; for (i, (v, a)) in aggregates.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } - write!(f, "(")?; + f.write_str("(")?; a.fmt_sse(f)?; write!(f, " {v})")?; } - write!(f, ") ")?; + f.write_str(") ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Values { variables, bindings, } => { - write!(f, "(table (vars")?; + f.write_str("(table (vars")?; for var in variables { write!(f, " {var}")?; } - write!(f, ")")?; + f.write_str(")")?; for row in bindings { - write!(f, " (row")?; + f.write_str(" (row")?; for (value, var) in row.iter().zip(variables) { if let Some(value) = value { write!(f, " ({var} {value})")?; } } - write!(f, ")")?; + f.write_str(")")?; } - write!(f, ")") + f.write_str(")") } Self::OrderBy { inner, expression } => { - write!(f, "(order (")?; + f.write_str("(order (")?; for (i, c) in expression.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } c.fmt_sse(f)?; } - write!(f, ") ")?; + f.write_str(") ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Project { inner, variables } => { - write!(f, "(project (")?; + f.write_str("(project (")?; for (i, v) in variables.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } write!(f, "{v}")?; } - write!(f, ") ")?; + f.write_str(") ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Distinct { inner } => { - write!(f, "(distinct ")?; + f.write_str("(distinct ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Reduced { inner } => { - write!(f, "(reduced ")?; + f.write_str("(reduced ")?; inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Slice { inner, @@ -921,7 +921,7 @@ impl GraphPattern { write!(f, "(slice {start} _ ")?; } inner.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } } @@ -969,7 +969,7 @@ impl GraphPattern { right.lookup_in_scope_variables(callback); } Self::Graph { name, inner } => { - if let NamedNodePattern::Variable(ref g) = name { + if let NamedNodePattern::Variable(g) = &name { callback(g); } inner.lookup_in_scope_variables(callback); @@ -1074,15 +1074,15 @@ impl<'a> fmt::Display for SparqlGraphRootPattern<'a> { child = inner; } p => { - write!(f, "SELECT")?; + f.write_str("SELECT")?; if distinct { - write!(f, " DISTINCT")?; + f.write_str(" DISTINCT")?; } if reduced { - write!(f, " REDUCED")?; + f.write_str(" REDUCED")?; } if project.is_empty() { - write!(f, " *")?; + f.write_str(" *")?; } else { for v in project { write!(f, " {v}")?; @@ -1093,7 +1093,7 @@ impl<'a> fmt::Display for SparqlGraphRootPattern<'a> { } write!(f, " WHERE {{ {p} }}")?; if let Some(order) = order { - write!(f, " ORDER BY")?; + f.write_str(" ORDER BY")?; for c in order { write!(f, " {c}")?; } @@ -1114,46 +1114,11 @@ impl<'a> fmt::Display for SparqlGraphRootPattern<'a> { /// A set function used in aggregates (c.f. [`GraphPattern::Group`]). #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub enum AggregateExpression { - /// [Count](https://www.w3.org/TR/sparql11-query/#defn_aggCount). - Count { - expr: Option<Box<Expression>>, - distinct: bool, - }, - /// [Sum](https://www.w3.org/TR/sparql11-query/#defn_aggSum). - Sum { - expr: Box<Expression>, - distinct: bool, - }, - /// [Avg](https://www.w3.org/TR/sparql11-query/#defn_aggAvg). - Avg { - expr: Box<Expression>, - distinct: bool, - }, - /// [Min](https://www.w3.org/TR/sparql11-query/#defn_aggMin). - Min { - expr: Box<Expression>, - distinct: bool, - }, - /// [Max](https://www.w3.org/TR/sparql11-query/#defn_aggMax). - Max { - expr: Box<Expression>, - distinct: bool, - }, - /// [GroupConcat](https://www.w3.org/TR/sparql11-query/#defn_aggGroupConcat). - GroupConcat { - expr: Box<Expression>, - distinct: bool, - separator: Option<String>, - }, - /// [Sample](https://www.w3.org/TR/sparql11-query/#defn_aggSample). - Sample { - expr: Box<Expression>, - distinct: bool, - }, - /// Custom function. - Custom { - name: NamedNode, - expr: Box<Expression>, + /// [Count](https://www.w3.org/TR/sparql11-query/#defn_aggCount) with *. + CountSolutions { distinct: bool }, + FunctionCall { + name: AggregateFunction, + expr: Expression, distinct: bool, }, } @@ -1162,84 +1127,41 @@ impl AggregateExpression { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { - Self::Count { expr, distinct } => { - write!(f, "(sum")?; + Self::CountSolutions { distinct } => { + f.write_str("(count")?; if *distinct { - write!(f, " distinct")?; - } - if let Some(expr) = expr { - write!(f, " ")?; - expr.fmt_sse(f)?; + f.write_str(" distinct")?; } - write!(f, ")") + f.write_str(")") } - Self::Sum { expr, distinct } => { - write!(f, "(sum ")?; - if *distinct { - write!(f, "distinct ")?; - } - expr.fmt_sse(f)?; - write!(f, ")") - } - Self::Avg { expr, distinct } => { - write!(f, "(avg ")?; - if *distinct { - write!(f, "distinct ")?; - } - expr.fmt_sse(f)?; - write!(f, ")") - } - Self::Min { expr, distinct } => { - write!(f, "(min ")?; - if *distinct { - write!(f, "distinct ")?; - } - expr.fmt_sse(f)?; - write!(f, ")") - } - Self::Max { expr, distinct } => { - write!(f, "(max ")?; - if *distinct { - write!(f, "distinct ")?; - } - expr.fmt_sse(f)?; - write!(f, ")") - } - Self::Sample { expr, distinct } => { - write!(f, "(sample ")?; - if *distinct { - write!(f, "distinct ")?; - } - expr.fmt_sse(f)?; - write!(f, ")") - } - Self::GroupConcat { + Self::FunctionCall { + name: + AggregateFunction::GroupConcat { + separator: Some(separator), + }, expr, distinct, - separator, } => { - write!(f, "(group_concat ")?; + f.write_str("(group_concat ")?; if *distinct { - write!(f, "distinct ")?; + f.write_str("distinct ")?; } expr.fmt_sse(f)?; - if let Some(separator) = separator { - write!(f, " {}", LiteralRef::new_simple_literal(separator))?; - } - write!(f, ")") + write!(f, " {})", LiteralRef::new_simple_literal(separator)) } - Self::Custom { + Self::FunctionCall { name, expr, distinct, } => { - write!(f, "({name}")?; + f.write_str("(")?; + name.fmt_sse(f)?; + f.write_str(" ")?; if *distinct { - write!(f, " distinct")?; + f.write_str("distinct ")?; } - write!(f, " ")?; expr.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } } @@ -1248,82 +1170,38 @@ impl AggregateExpression { impl fmt::Display for AggregateExpression { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::Count { expr, distinct } => { + Self::CountSolutions { distinct } => { if *distinct { - if let Some(expr) = expr { - write!(f, "COUNT(DISTINCT {expr})") - } else { - write!(f, "COUNT(DISTINCT *)") - } - } else if let Some(expr) = expr { - write!(f, "COUNT({expr})") - } else { - write!(f, "COUNT(*)") - } - } - Self::Sum { expr, distinct } => { - if *distinct { - write!(f, "SUM(DISTINCT {expr})") + f.write_str("COUNT(DISTINCT *)") } else { - write!(f, "SUM({expr})") + f.write_str("COUNT(*)") } } - Self::Min { expr, distinct } => { - if *distinct { - write!(f, "MIN(DISTINCT {expr})") - } else { - write!(f, "MIN({expr})") - } - } - Self::Max { expr, distinct } => { - if *distinct { - write!(f, "MAX(DISTINCT {expr})") - } else { - write!(f, "MAX({expr})") - } - } - Self::Avg { expr, distinct } => { - if *distinct { - write!(f, "AVG(DISTINCT {expr})") - } else { - write!(f, "AVG({expr})") - } - } - Self::Sample { expr, distinct } => { - if *distinct { - write!(f, "SAMPLE(DISTINCT {expr})") - } else { - write!(f, "SAMPLE({expr})") - } - } - Self::GroupConcat { + Self::FunctionCall { + name: + AggregateFunction::GroupConcat { + separator: Some(separator), + }, expr, distinct, - separator, } => { if *distinct { - if let Some(separator) = separator { - write!( - f, - "GROUP_CONCAT(DISTINCT {}; SEPARATOR = {})", - expr, - LiteralRef::new_simple_literal(separator) - ) - } else { - write!(f, "GROUP_CONCAT(DISTINCT {expr})") - } - } else if let Some(separator) = separator { write!( f, - "GROUP_CONCAT({}; SEPARATOR = {})", + "GROUP_CONCAT(DISTINCT {}; SEPARATOR = {})", expr, LiteralRef::new_simple_literal(separator) ) } else { - write!(f, "GROUP_CONCAT({expr})") + write!( + f, + "GROUP_CONCAT({}; SEPARATOR = {})", + expr, + LiteralRef::new_simple_literal(separator) + ) } } - Self::Custom { + Self::FunctionCall { name, expr, distinct, @@ -1338,6 +1216,59 @@ impl fmt::Display for AggregateExpression { } } +/// An aggregate function name. +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum AggregateFunction { + /// [Count](https://www.w3.org/TR/sparql11-query/#defn_aggCount) with *. + Count, + /// [Sum](https://www.w3.org/TR/sparql11-query/#defn_aggSum). + Sum, + /// [Avg](https://www.w3.org/TR/sparql11-query/#defn_aggAvg). + Avg, + /// [Min](https://www.w3.org/TR/sparql11-query/#defn_aggMin). + Min, + /// [Max](https://www.w3.org/TR/sparql11-query/#defn_aggMax). + Max, + /// [GroupConcat](https://www.w3.org/TR/sparql11-query/#defn_aggGroupConcat). + GroupConcat { + separator: Option<String>, + }, + /// [Sample](https://www.w3.org/TR/sparql11-query/#defn_aggSample). + Sample, + Custom(NamedNode), +} + +impl AggregateFunction { + /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). + pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { + match self { + Self::Count => f.write_str("count"), + Self::Sum => f.write_str("sum"), + Self::Avg => f.write_str("avg"), + Self::Min => f.write_str("min"), + Self::Max => f.write_str("max"), + Self::GroupConcat { .. } => f.write_str("group_concat"), + Self::Sample => f.write_str("sample"), + Self::Custom(iri) => write!(f, "{iri}"), + } + } +} + +impl fmt::Display for AggregateFunction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Count => f.write_str("COUNT"), + Self::Sum => f.write_str("SUM"), + Self::Avg => f.write_str("AVG"), + Self::Min => f.write_str("MIN"), + Self::Max => f.write_str("MAX"), + Self::GroupConcat { .. } => f.write_str("GROUP_CONCAT"), + Self::Sample => f.write_str("SAMPLE"), + Self::Custom(iri) => iri.fmt(f), + } + } +} + /// An ordering comparator used by [`GraphPattern::OrderBy`]. #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub enum OrderExpression { @@ -1352,14 +1283,14 @@ impl OrderExpression { pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { Self::Asc(e) => { - write!(f, "(asc ")?; + f.write_str("(asc ")?; e.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Desc(e) => { - write!(f, "(desc ")?; + f.write_str("(desc ")?; e.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } } @@ -1384,22 +1315,22 @@ pub struct QueryDataset { impl QueryDataset { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { - write!(f, "(")?; + f.write_str("(")?; for (i, graph_name) in self.default.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } write!(f, "{graph_name}")?; } if let Some(named) = &self.named { for (i, graph_name) in named.iter().enumerate() { if !self.default.is_empty() || i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } write!(f, "(named {graph_name})")?; } } - write!(f, ")") + f.write_str(")") } } @@ -1433,9 +1364,9 @@ impl GraphTarget { pub(crate) fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { Self::NamedNode(node) => write!(f, "{node}"), - Self::DefaultGraph => write!(f, "default"), - Self::NamedGraphs => write!(f, "named"), - Self::AllGraphs => write!(f, "all"), + Self::DefaultGraph => f.write_str("default"), + Self::NamedGraphs => f.write_str("named"), + Self::AllGraphs => f.write_str("all"), } } } @@ -1444,9 +1375,9 @@ impl fmt::Display for GraphTarget { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::NamedNode(node) => write!(f, "GRAPH {node}"), - Self::DefaultGraph => write!(f, "DEFAULT"), - Self::NamedGraphs => write!(f, "NAMED"), - Self::AllGraphs => write!(f, "ALL"), + Self::DefaultGraph => f.write_str("DEFAULT"), + Self::NamedGraphs => f.write_str("NAMED"), + Self::AllGraphs => f.write_str("ALL"), } } } @@ -1470,7 +1401,7 @@ impl From<GraphName> for GraphTarget { fn fmt_sse_unary_expression(f: &mut impl fmt::Write, name: &str, e: &Expression) -> fmt::Result { write!(f, "({name} ")?; e.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } #[inline] @@ -1482,7 +1413,7 @@ fn fmt_sse_binary_expression( ) -> fmt::Result { write!(f, "({name} ")?; a.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; b.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } diff --git a/lib/spargebra/src/lib.rs b/lib/spargebra/src/lib.rs index e2d093f3..654de4ee 100644 --- a/lib/spargebra/src/lib.rs +++ b/lib/spargebra/src/lib.rs @@ -10,6 +10,6 @@ mod query; pub mod term; mod update; -pub use parser::ParseError; +pub use parser::SparqlSyntaxError; pub use query::*; pub use update::*; diff --git a/lib/spargebra/src/parser.rs b/lib/spargebra/src/parser.rs index ea1f9b7f..38496387 100644 --- a/lib/spargebra/src/parser.rs +++ b/lib/spargebra/src/parser.rs @@ -1,3 +1,4 @@ +#![allow(clippy::ignored_unit_patterns)] use crate::algebra::*; use crate::query::*; use crate::term::*; @@ -8,57 +9,22 @@ use oxrdf::vocab::{rdf, xsd}; use peg::parser; use peg::str::LineCol; use rand::random; -use std::borrow::Cow; +use std::char; use std::collections::{HashMap, HashSet}; -use std::error::Error; use std::mem::take; -use std::str::Chars; use std::str::FromStr; -use std::{char, fmt}; /// Parses a SPARQL query with an optional base IRI to resolve relative IRIs in the query. -pub fn parse_query(query: &str, base_iri: Option<&str>) -> Result<Query, ParseError> { - let mut state = ParserState { - base_iri: if let Some(base_iri) = base_iri { - Some(Iri::parse(base_iri.to_owned()).map_err(|e| ParseError { - inner: ParseErrorKind::InvalidBaseIri(e), - })?) - } else { - None - }, - namespaces: HashMap::default(), - used_bnodes: HashSet::default(), - currently_used_bnodes: HashSet::default(), - aggregates: Vec::new(), - }; - - parser::QueryUnit(&unescape_unicode_codepoints(query), &mut state).map_err(|e| ParseError { - inner: ParseErrorKind::Parser(e), - }) +pub fn parse_query(query: &str, base_iri: Option<&str>) -> Result<Query, SparqlSyntaxError> { + let mut state = ParserState::from_base_iri(base_iri)?; + parser::QueryUnit(query, &mut state).map_err(|e| SparqlSyntaxError(ParseErrorKind::Syntax(e))) } /// Parses a SPARQL update with an optional base IRI to resolve relative IRIs in the query. -pub fn parse_update(update: &str, base_iri: Option<&str>) -> Result<Update, ParseError> { - let mut state = ParserState { - base_iri: if let Some(base_iri) = base_iri { - Some(Iri::parse(base_iri.to_owned()).map_err(|e| ParseError { - inner: ParseErrorKind::InvalidBaseIri(e), - })?) - } else { - None - }, - namespaces: HashMap::default(), - used_bnodes: HashSet::default(), - currently_used_bnodes: HashSet::default(), - aggregates: Vec::new(), - }; - - let operations = - parser::UpdateInit(&unescape_unicode_codepoints(update), &mut state).map_err(|e| { - ParseError { - inner: ParseErrorKind::Parser(e), - } - })?; +pub fn parse_update(update: &str, base_iri: Option<&str>) -> Result<Update, SparqlSyntaxError> { + let mut state = ParserState::from_base_iri(base_iri)?; + let operations = parser::UpdateInit(update, &mut state) + .map_err(|e| SparqlSyntaxError(ParseErrorKind::Syntax(e)))?; Ok(Update { operations, base_iri: state.base_iri, @@ -66,37 +32,16 @@ pub fn parse_update(update: &str, base_iri: Option<&str>) -> Result<Update, Pars } /// Error returned during SPARQL parsing. -#[derive(Debug)] -pub struct ParseError { - inner: ParseErrorKind, -} +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct SparqlSyntaxError(#[from] ParseErrorKind); -#[derive(Debug)] +#[derive(Debug, thiserror::Error)] enum ParseErrorKind { - InvalidBaseIri(IriParseError), - Parser(peg::error::ParseError<LineCol>), -} - -impl fmt::Display for ParseError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.inner { - ParseErrorKind::InvalidBaseIri(e) => { - write!(f, "Invalid SPARQL base IRI provided: {e}") - } - ParseErrorKind::Parser(e) => e.fmt(f), - } - } -} - -impl Error for ParseError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self.inner { - ParseErrorKind::InvalidBaseIri(ref e) => Some(e), - ParseErrorKind::Parser(ref e) => Some(e), - } - } + #[error("Invalid SPARQL base IRI provided: {0}")] + InvalidBaseIri(#[from] IriParseError), + #[error(transparent)] + Syntax(#[from] peg::error::ParseError<LineCol>), } struct AnnotatedTerm { @@ -369,7 +314,7 @@ enum PartialGraphPattern { } fn new_join(l: GraphPattern, r: GraphPattern) -> GraphPattern { - //Avoid to output empty BGPs + // Avoid to output empty BGPs if let GraphPattern::Bgp { patterns: pl } = &l { if pl.is_empty() { return r; @@ -453,7 +398,7 @@ fn build_select( let mut p = r#where; let mut with_aggregate = false; - //GROUP BY + // GROUP BY let aggregates = state.aggregates.pop().unwrap_or_default(); if group.is_none() && !aggregates.is_empty() { group = Some((vec![], vec![])); @@ -475,7 +420,7 @@ fn build_select( with_aggregate = true; } - //HAVING + // HAVING if let Some(expr) = having { p = GraphPattern::Filter { expr, @@ -483,12 +428,12 @@ fn build_select( }; } - //VALUES + // VALUES if let Some(data) = values { p = new_join(p, data); } - //SELECT + // SELECT let mut pv = Vec::new(); let with_project = match select.variables { SelectionVariables::Explicit(sel_items) => { @@ -537,7 +482,7 @@ fn build_select( if with_aggregate { return Err("SELECT * is not authorized with GROUP BY"); } - //TODO: is it really useful to do a projection? + // TODO: is it really useful to do a projection? p.on_in_scope_variable(|v| { if !pv.contains(v) { pv.push(v.clone()); @@ -551,7 +496,7 @@ fn build_select( let mut m = p; - //ORDER BY + // ORDER BY if let Some(expression) = order_by { m = GraphPattern::OrderBy { inner: Box::new(m), @@ -559,7 +504,7 @@ fn build_select( }; } - //PROJECT + // PROJECT if with_project { m = GraphPattern::Project { inner: Box::new(m), @@ -572,7 +517,7 @@ fn build_select( SelectionOption::Default => (), } - //OFFSET LIMIT + // OFFSET LIMIT if let Some((start, length)) = offset_limit { m = GraphPattern::Slice { inner: Box::new(m), @@ -724,11 +669,28 @@ pub struct ParserState { } impl ParserState { - fn parse_iri(&self, iri: &str) -> Result<Iri<String>, IriParseError> { + pub(crate) fn from_base_iri(base_iri: Option<&str>) -> Result<Self, SparqlSyntaxError> { + Ok(Self { + base_iri: if let Some(base_iri) = base_iri { + Some( + Iri::parse(base_iri.to_owned()) + .map_err(|e| SparqlSyntaxError(ParseErrorKind::InvalidBaseIri(e)))?, + ) + } else { + None + }, + namespaces: HashMap::default(), + used_bnodes: HashSet::default(), + currently_used_bnodes: HashSet::default(), + aggregates: Vec::new(), + }) + } + + fn parse_iri(&self, iri: String) -> Result<Iri<String>, IriParseError> { if let Some(base_iri) = &self.base_iri { - base_iri.resolve(iri) + base_iri.resolve(&iri) } else { - Iri::parse(iri.to_owned()) + Iri::parse(iri) } } @@ -736,7 +698,7 @@ impl ParserState { let aggregates = self.aggregates.last_mut().ok_or("Unexpected aggregate")?; Ok(aggregates .iter() - .find_map(|(v, a)| (a == &agg).then(|| v)) + .find_map(|(v, a)| (a == &agg).then_some(v)) .cloned() .unwrap_or_else(|| { let new_var = variable(); @@ -746,211 +708,69 @@ impl ParserState { } } -pub fn unescape_unicode_codepoints(input: &str) -> Cow<'_, str> { - if needs_unescape_unicode_codepoints(input) { - UnescapeUnicodeCharIterator::new(input).collect() - } else { - input.into() - } -} - -fn needs_unescape_unicode_codepoints(input: &str) -> bool { - let bytes = input.as_bytes(); - for i in 1..bytes.len() { - if (bytes[i] == b'u' || bytes[i] == b'U') && bytes[i - 1] == b'\\' { - return true; - } +fn unescape_iriref(mut input: &str) -> Result<String, &'static str> { + let mut output = String::with_capacity(input.len()); + while let Some((before, after)) = input.split_once('\\') { + output.push_str(before); + let mut after = after.chars(); + let (escape, after) = match after.next() { + Some('u') => read_hex_char::<4>(after.as_str())?, + Some('U') => read_hex_char::<8>(after.as_str())?, + Some(_) => { + return Err( + "IRIs are only allowed to contain escape sequences \\uXXXX and \\UXXXXXXXX", + ) + } + None => return Err("IRIs are not allowed to end with a '\'"), + }; + output.push(escape); + input = after; } - false + output.push_str(input); + Ok(output) } -struct UnescapeUnicodeCharIterator<'a> { - iter: Chars<'a>, - buffer: String, -} - -impl<'a> UnescapeUnicodeCharIterator<'a> { - fn new(string: &'a str) -> Self { - Self { - iter: string.chars(), - buffer: String::with_capacity(9), - } +fn unescape_string(mut input: &str) -> Result<String, &'static str> { + let mut output = String::with_capacity(input.len()); + while let Some((before, after)) = input.split_once('\\') { + output.push_str(before); + let mut after = after.chars(); + let (escape, after) = match after.next() { + Some('t') => ('\u{0009}', after.as_str()), + Some('b') => ('\u{0008}', after.as_str()), + Some('n') => ('\u{000A}', after.as_str()), + Some('r') => ('\u{000D}', after.as_str()), + Some('f') => ('\u{000C}', after.as_str()), + Some('"') => ('\u{0022}', after.as_str()), + Some('\'') => ('\u{0027}', after.as_str()), + Some('\\') => ('\u{005C}', after.as_str()), + Some('u') => read_hex_char::<4>(after.as_str())?, + Some('U') => read_hex_char::<8>(after.as_str())?, + Some(_) => return Err("The character that can be escaped in strings are tbnrf\"'\\"), + None => return Err("strings are not allowed to end with a '\'"), + }; + output.push(escape); + input = after; } + output.push_str(input); + Ok(output) } -impl<'a> Iterator for UnescapeUnicodeCharIterator<'a> { - type Item = char; - - fn next(&mut self) -> Option<char> { - if !self.buffer.is_empty() { - return Some(self.buffer.remove(0)); - } - match self.iter.next()? { - '\\' => match self.iter.next() { - Some('u') => { - self.buffer.push('u'); - for _ in 0..4 { - if let Some(c) = self.iter.next() { - self.buffer.push(c); - } else { - return Some('\\'); - } - } - if let Some(c) = u32::from_str_radix(&self.buffer[1..], 16) - .ok() - .and_then(char::from_u32) - { - self.buffer.clear(); - Some(c) - } else { - Some('\\') - } - } - Some('U') => { - self.buffer.push('U'); - for _ in 0..8 { - if let Some(c) = self.iter.next() { - self.buffer.push(c); - } else { - return Some('\\'); - } - } - if let Some(c) = u32::from_str_radix(&self.buffer[1..], 16) - .ok() - .and_then(char::from_u32) - { - self.buffer.clear(); - Some(c) - } else { - Some('\\') - } - } - Some(c) => { - self.buffer.push(c); - Some('\\') - } - None => Some('\\'), - }, - c => Some(c), +fn read_hex_char<const SIZE: usize>(input: &str) -> Result<(char, &str), &'static str> { + if let Some(escape) = input.get(..SIZE) { + if let Some(char) = u32::from_str_radix(escape, 16) + .ok() + .and_then(char::from_u32) + { + Ok((char, &input[SIZE..])) + } else { + Err("\\u escape sequence should be followed by hexadecimal digits") } - } -} - -pub fn unescape_characters<'a>( - input: &'a str, - characters: &'static [u8], - replacement: &'static StaticCharSliceMap, -) -> Cow<'a, str> { - if needs_unescape_characters(input, characters) { - UnescapeCharsIterator::new(input, replacement).collect() } else { - input.into() - } -} - -fn needs_unescape_characters(input: &str, characters: &[u8]) -> bool { - let bytes = input.as_bytes(); - for i in 1..bytes.len() { - if bytes[i - 1] == b'\\' && characters.contains(&bytes[i]) { - return true; - } - } - false -} - -struct UnescapeCharsIterator<'a> { - iter: Chars<'a>, - buffer: Option<char>, - replacement: &'static StaticCharSliceMap, -} - -impl<'a> UnescapeCharsIterator<'a> { - fn new(string: &'a str, replacement: &'static StaticCharSliceMap) -> Self { - Self { - iter: string.chars(), - buffer: None, - replacement, - } - } -} - -impl<'a> Iterator for UnescapeCharsIterator<'a> { - type Item = char; - - fn next(&mut self) -> Option<char> { - if let Some(ch) = self.buffer { - self.buffer = None; - return Some(ch); - } - match self.iter.next()? { - '\\' => match self.iter.next() { - Some(ch) => { - if let Some(replace) = self.replacement.get(ch) { - Some(replace) - } else { - self.buffer = Some(ch); - Some('\\') - } - } - None => Some('\\'), - }, - c => Some(c), - } + Err("\\u escape sequence should be followed by hexadecimal digits") } } -pub struct StaticCharSliceMap { - keys: &'static [char], - values: &'static [char], -} - -impl StaticCharSliceMap { - pub const fn new(keys: &'static [char], values: &'static [char]) -> Self { - Self { keys, values } - } - - pub fn get(&self, key: char) -> Option<char> { - for i in 0..self.keys.len() { - if self.keys[i] == key { - return Some(self.values[i]); - } - } - None - } -} - -const UNESCAPE_CHARACTERS: [u8; 8] = [b't', b'b', b'n', b'r', b'f', b'"', b'\'', b'\\']; -const UNESCAPE_REPLACEMENT: StaticCharSliceMap = StaticCharSliceMap::new( - &['t', 'b', 'n', 'r', 'f', '"', '\'', '\\'], - &[ - '\u{0009}', '\u{0008}', '\u{000A}', '\u{000D}', '\u{000C}', '\u{0022}', '\u{0027}', - '\u{005C}', - ], -); - -fn unescape_echars(input: &str) -> Cow<'_, str> { - unescape_characters(input, &UNESCAPE_CHARACTERS, &UNESCAPE_REPLACEMENT) -} - -const UNESCAPE_PN_CHARACTERS: [u8; 20] = [ - b'_', b'~', b'.', b'-', b'!', b'$', b'&', b'\'', b'(', b')', b'*', b'+', b',', b';', b'=', - b'/', b'?', b'#', b'@', b'%', -]; -const UNESCAPE_PN_REPLACEMENT: StaticCharSliceMap = StaticCharSliceMap::new( - &[ - '_', '~', '.', '-', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', '/', '?', '#', - '@', '%', - ], - &[ - '_', '~', '.', '-', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', '/', '?', '#', - '@', '%', - ], -); - -pub fn unescape_pn_local(input: &str) -> Cow<'_, str> { - unescape_characters(input, &UNESCAPE_PN_CHARACTERS, &UNESCAPE_PN_REPLACEMENT) -} - fn variable() -> Variable { Variable::new_unchecked(format!("{:x}", random::<u128>())) } @@ -1219,7 +1039,7 @@ parser! { GraphNamePattern::Variable(graph_name) => GraphPattern::Graph { name: graph_name.clone().into(), inner: Box::new(bgp) }, } }).reduce(new_join).unwrap_or_default(); - let delete = d.into_iter().map(GroundQuadPattern::try_from).collect::<Result<Vec<_>,_>>().map_err(|_| "Blank nodes are not allowed in DELETE WHERE")?; + let delete = d.into_iter().map(GroundQuadPattern::try_from).collect::<Result<Vec<_>,_>>().map_err(|()| "Blank nodes are not allowed in DELETE WHERE")?; Ok(vec![GraphUpdateOperation::DeleteInsert { delete, insert: Vec::new(), @@ -1232,6 +1052,7 @@ parser! { let (delete, insert) = c; let mut delete = delete.unwrap_or_default(); let mut insert = insert.unwrap_or_default(); + #[allow(clippy::shadow_same)] let mut pattern = pattern; let mut using = if u.is_empty() { @@ -1296,7 +1117,7 @@ parser! { } rule DeleteClause() -> Vec<GroundQuadPattern> = i("DELETE") _ q:QuadPattern() {? - q.into_iter().map(GroundQuadPattern::try_from).collect::<Result<Vec<_>,_>>().map_err(|_| "Blank nodes are not allowed in DELETE WHERE") + q.into_iter().map(GroundQuadPattern::try_from).collect::<Result<Vec<_>,_>>().map_err(|()| "Blank nodes are not allowed in DELETE WHERE") } rule InsertClause() -> Vec<QuadPattern> = i("INSERT") _ q:QuadPattern() { q } @@ -1325,10 +1146,10 @@ parser! { rule QuadPattern() -> Vec<QuadPattern> = "{" _ q:Quads() _ "}" { q } rule QuadData() -> Vec<Quad> = "{" _ q:Quads() _ "}" {? - q.into_iter().map(Quad::try_from).collect::<Result<Vec<_>, ()>>().map_err(|_| "Variables are not allowed in INSERT DATA") + q.into_iter().map(Quad::try_from).collect::<Result<Vec<_>, ()>>().map_err(|()| "Variables are not allowed in INSERT DATA") } rule GroundQuadData() -> Vec<GroundQuad> = "{" _ q:Quads() _ "}" {? - q.into_iter().map(|q| GroundQuad::try_from(Quad::try_from(q)?)).collect::<Result<Vec<_>, ()>>().map_err(|_| "Variables and blank nodes are not allowed in DELETE DATA") + q.into_iter().map(|q| GroundQuad::try_from(Quad::try_from(q)?)).collect::<Result<Vec<_>, ()>>().map_err(|()| "Variables and blank nodes are not allowed in DELETE DATA") } rule Quads() -> Vec<QuadPattern> = q:(Quads_TriplesTemplate() / Quads_QuadsNotTriples()) ** (_) { @@ -1849,7 +1670,7 @@ parser! { rule QuotedTripleData() -> GroundTriple = "<<" _ s:DataValueTerm() _ p:QuotedTripleData_p() _ o:DataValueTerm() _ ">>" {? Ok(GroundTriple { - subject: s.try_into().map_err(|_| "Literals are not allowed in subject position of nested patterns")?, + subject: s.try_into().map_err(|()| "Literals are not allowed in subject position of nested patterns")?, predicate: p, object: o }) @@ -2064,26 +1885,26 @@ parser! { rule NotExistsFunc() -> Expression = i("NOT") _ i("EXISTS") _ p:GroupGraphPattern() { Expression::Not(Box::new(Expression::Exists(Box::new(p)))) } rule Aggregate() -> AggregateExpression = - i("COUNT") _ "(" _ i("DISTINCT") _ "*" _ ")" { AggregateExpression::Count { expr: None, distinct: true } } / - i("COUNT") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Count { expr: Some(Box::new(e)), distinct: true } } / - i("COUNT") _ "(" _ "*" _ ")" { AggregateExpression::Count { expr: None, distinct: false } } / - i("COUNT") _ "(" _ e:Expression() _ ")" { AggregateExpression::Count { expr: Some(Box::new(e)), distinct: false } } / - i("SUM") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Sum { expr: Box::new(e), distinct: true } } / - i("SUM") _ "(" _ e:Expression() _ ")" { AggregateExpression::Sum { expr: Box::new(e), distinct: false } } / - i("MIN") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Min { expr: Box::new(e), distinct: true } } / - i("MIN") _ "(" _ e:Expression() _ ")" { AggregateExpression::Min { expr: Box::new(e), distinct: false } } / - i("MAX") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Max { expr: Box::new(e), distinct: true } } / - i("MAX") _ "(" _ e:Expression() _ ")" { AggregateExpression::Max { expr: Box::new(e), distinct: false } } / - i("AVG") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Avg { expr: Box::new(e), distinct: true } } / - i("AVG") _ "(" _ e:Expression() _ ")" { AggregateExpression::Avg { expr: Box::new(e), distinct: false } } / - i("SAMPLE") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Sample { expr: Box::new(e), distinct: true } } / - i("SAMPLE") _ "(" _ e:Expression() _ ")" { AggregateExpression::Sample { expr: Box::new(e), distinct: false } } / - i("GROUP_CONCAT") _ "(" _ i("DISTINCT") _ e:Expression() _ ";" _ i("SEPARATOR") _ "=" _ s:String() _ ")" { AggregateExpression::GroupConcat { expr: Box::new(e), distinct: true, separator: Some(s) } } / - i("GROUP_CONCAT") _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::GroupConcat { expr: Box::new(e), distinct: true, separator: None } } / - i("GROUP_CONCAT") _ "(" _ e:Expression() _ ";" _ i("SEPARATOR") _ "=" _ s:String() _ ")" { AggregateExpression::GroupConcat { expr: Box::new(e), distinct: true, separator: Some(s) } } / - i("GROUP_CONCAT") _ "(" _ e:Expression() _ ")" { AggregateExpression::GroupConcat { expr: Box::new(e), distinct: false, separator: None } } / - name:iri() _ "(" _ i("DISTINCT") _ e:Expression() _ ")" { AggregateExpression::Custom { name, expr: Box::new(e), distinct: true } } / - name:iri() _ "(" _ e:Expression() _ ")" { AggregateExpression::Custom { name, expr: Box::new(e), distinct: false } } + i("COUNT") _ "(" _ i("DISTINCT") _ "*" _ ")" { AggregateExpression::CountSolutions { distinct: true } } / + i("COUNT") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Count, expr, distinct: true } } / + i("COUNT") _ "(" _ "*" _ ")" { AggregateExpression::CountSolutions { distinct: false } } / + i("COUNT") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Count, expr, distinct: false } } / + i("SUM") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Sum, expr, distinct: true } } / + i("SUM") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Sum, expr, distinct: false } } / + i("MIN") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Min, expr, distinct: true } } / + i("MIN") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Min, expr, distinct: false } } / + i("MAX") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Max, expr, distinct: true } } / + i("MAX") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Max, expr, distinct: false } } / + i("AVG") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Avg, expr, distinct: true } } / + i("AVG") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Avg, expr, distinct: false } } / + i("SAMPLE") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Sample, expr, distinct: true } } / + i("SAMPLE") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Sample, expr, distinct: false } } / + i("GROUP_CONCAT") _ "(" _ i("DISTINCT") _ expr:Expression() _ ";" _ i("SEPARATOR") _ "=" _ s:String() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::GroupConcat { separator: Some(s) }, expr, distinct: true } } / + i("GROUP_CONCAT") _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::GroupConcat { separator: None }, expr, distinct: true } } / + i("GROUP_CONCAT") _ "(" _ expr:Expression() _ ";" _ i("SEPARATOR") _ "=" _ s:String() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::GroupConcat { separator: Some(s) }, expr, distinct: true } } / + i("GROUP_CONCAT") _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::GroupConcat { separator: None }, expr, distinct: false } } / + name:iri() _ "(" _ i("DISTINCT") _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Custom(name), expr, distinct: true } } / + name:iri() _ "(" _ expr:Expression() _ ")" { AggregateExpression::FunctionCall { name: AggregateFunction::Custom(name), expr, distinct: false } } rule iriOrFunction() -> Expression = i: iri() _ a: ArgList()? { match a { @@ -2122,7 +1943,7 @@ parser! { rule String() -> String = STRING_LITERAL_LONG1() / STRING_LITERAL_LONG2() / STRING_LITERAL1() / STRING_LITERAL2() rule iri() -> NamedNode = i:(IRIREF() / PrefixedName()) { - NamedNode::new_unchecked(i.into_inner()) + NamedNode::from(i) } rule PrefixedName() -> Iri<String> = PNAME_LN() / @@ -2143,7 +1964,7 @@ parser! { } / ANON() { BlankNode::default() } rule IRIREF() -> Iri<String> = "<" i:$((!['>'] [_])*) ">" {? - state.parse_iri(i).map_err(|_| "IRI parsing failed") + state.parse_iri(unescape_iriref(i)?).map_err(|_| "IRI parsing failed") } rule PNAME_NS() -> &'input str = ns:$(PN_PREFIX()?) ":" { @@ -2152,8 +1973,11 @@ parser! { rule PNAME_LN() -> Iri<String> = ns:PNAME_NS() local:$(PN_LOCAL()) {? if let Some(base) = state.namespaces.get(ns) { - let mut iri = base.clone(); - iri.push_str(&unescape_pn_local(local)); + let mut iri = String::with_capacity(base.len() + local.len()); + iri.push_str(base); + for chunk in local.split('\\') { // We remove \ + iri.push_str(chunk); + } Iri::parse(iri).map_err(|_| "IRI parsing failed") } else { Err("Prefix not found") @@ -2174,7 +1998,7 @@ parser! { rule INTEGER() = ['0'..='9']+ - rule DECIMAL() = ['0'..='9']+ "." ['0'..='9']* / ['0'..='9']* "." ['0'..='9']+ + rule DECIMAL() = ['0'..='9']* "." ['0'..='9']+ rule DOUBLE() = (['0'..='9']+ "." ['0'..='9']* / "." ['0'..='9']+ / ['0'..='9']+) EXPONENT() @@ -2192,38 +2016,40 @@ parser! { rule EXPONENT() = ['e' | 'E'] ['+' | '-']? ['0'..='9']+ - rule STRING_LITERAL1() -> String = "'" l:$((STRING_LITERAL1_simple_char() / ECHAR())*) "'" { - unescape_echars(l).to_string() + rule STRING_LITERAL1() -> String = "'" l:$((STRING_LITERAL1_simple_char() / ECHAR() / UCHAR())*) "'" {? + unescape_string(l) } - rule STRING_LITERAL1_simple_char() = !['\u{27}' | '\u{5C}' | '\u{A}' | '\u{D}'] [_] + rule STRING_LITERAL1_simple_char() = !['\u{27}' | '\u{5C}' | '\u{0A}' | '\u{0D}'] [_] - rule STRING_LITERAL2() -> String = "\"" l:$((STRING_LITERAL2_simple_char() / ECHAR())*) "\"" { - unescape_echars(l).to_string() + rule STRING_LITERAL2() -> String = "\"" l:$((STRING_LITERAL2_simple_char() / ECHAR() / UCHAR())*) "\"" {? + unescape_string(l) } - rule STRING_LITERAL2_simple_char() = !['\u{22}' | '\u{5C}' | '\u{A}' | '\u{D}'] [_] + rule STRING_LITERAL2_simple_char() = !['\u{22}' | '\u{5C}' | '\u{0A}' | '\u{0D}'] [_] - rule STRING_LITERAL_LONG1() -> String = "'''" l:$(STRING_LITERAL_LONG1_inner()*) "'''" { - unescape_echars(l).to_string() + rule STRING_LITERAL_LONG1() -> String = "'''" l:$(STRING_LITERAL_LONG1_inner()*) "'''" {? + unescape_string(l) } - rule STRING_LITERAL_LONG1_inner() = ("''" / "'")? (STRING_LITERAL_LONG1_simple_char() / ECHAR()) + rule STRING_LITERAL_LONG1_inner() = ("''" / "'")? (STRING_LITERAL_LONG1_simple_char() / ECHAR() / UCHAR()) rule STRING_LITERAL_LONG1_simple_char() = !['\'' | '\\'] [_] - rule STRING_LITERAL_LONG2() -> String = "\"\"\"" l:$(STRING_LITERAL_LONG2_inner()*) "\"\"\"" { - unescape_echars(l).to_string() + rule STRING_LITERAL_LONG2() -> String = "\"\"\"" l:$(STRING_LITERAL_LONG2_inner()*) "\"\"\"" {? + unescape_string(l) } - rule STRING_LITERAL_LONG2_inner() = ("\"\"" / "\"")? (STRING_LITERAL_LONG2_simple_char() / ECHAR()) + rule STRING_LITERAL_LONG2_inner() = ("\"\"" / "\"")? (STRING_LITERAL_LONG2_simple_char() / ECHAR() / UCHAR()) rule STRING_LITERAL_LONG2_simple_char() = !['"' | '\\'] [_] + rule UCHAR() = "\\u" HEX() HEX() HEX() HEX() / "\\U" HEX() HEX() HEX() HEX() HEX() HEX() HEX() HEX() + rule ECHAR() = "\\" ['t' | 'b' | 'n' | 'r' | 'f' | '"' |'\'' | '\\'] rule NIL() = "(" WS()* ")" - rule WS() = quiet! { ['\u{20}' | '\u{9}' | '\u{D}' | '\u{A}'] } + rule WS() = quiet! { ['\u{20}' | '\u{09}' | '\u{0D}' | '\u{0A}'] } rule ANON() = "[" WS()* "]" - rule PN_CHARS_BASE() = ['A' ..= 'Z' | 'a' ..= 'z' | '\u{00C0}' ..='\u{00D6}' | '\u{00D8}'..='\u{00F6}' | '\u{00F8}'..='\u{02FF}' | '\u{0370}'..='\u{037D}' | '\u{037F}'..='\u{1FFF}' | '\u{200C}'..='\u{200D}' | '\u{2070}'..='\u{218F}' | '\u{2C00}'..='\u{2FEF}' | '\u{3001}'..='\u{D7FF}' | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}'] + rule PN_CHARS_BASE() = ['A' ..= 'Z' | 'a' ..= 'z' | '\u{00C0}'..='\u{00D6}' | '\u{00D8}'..='\u{00F6}' | '\u{00F8}'..='\u{02FF}' | '\u{0370}'..='\u{037D}' | '\u{037F}'..='\u{1FFF}' | '\u{200C}'..='\u{200D}' | '\u{2070}'..='\u{218F}' | '\u{2C00}'..='\u{2FEF}' | '\u{3001}'..='\u{D7FF}' | '\u{F900}'..='\u{FDCF}' | '\u{FDF0}'..='\u{FFFD}'] rule PN_CHARS_U() = ['_'] / PN_CHARS_BASE() diff --git a/lib/spargebra/src/query.rs b/lib/spargebra/src/query.rs index 6cb7e57b..108221fa 100644 --- a/lib/spargebra/src/query.rs +++ b/lib/spargebra/src/query.rs @@ -1,5 +1,5 @@ use crate::algebra::*; -use crate::parser::{parse_query, ParseError}; +use crate::parser::{parse_query, SparqlSyntaxError}; use crate::term::*; use oxiri::Iri; use std::fmt; @@ -13,8 +13,11 @@ use std::str::FromStr; /// let query_str = "SELECT ?s ?p ?o WHERE { ?s ?p ?o . }"; /// let query = Query::parse(query_str, None)?; /// assert_eq!(query.to_string(), query_str); -/// assert_eq!(query.to_sse(), "(project (?s ?p ?o) (bgp (triple ?s ?p ?o)))"); -/// # Ok::<_, spargebra::ParseError>(()) +/// assert_eq!( +/// query.to_sse(), +/// "(project (?s ?p ?o) (bgp (triple ?s ?p ?o)))" +/// ); +/// # Ok::<_, spargebra::SparqlSyntaxError>(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub enum Query { @@ -60,7 +63,7 @@ pub enum Query { impl Query { /// Parses a SPARQL query with an optional base IRI to resolve relative IRIs in the query. - pub fn parse(query: &str, base_iri: Option<&str>) -> Result<Self, ParseError> { + pub fn parse(query: &str, base_iri: Option<&str>) -> Result<Self, SparqlSyntaxError> { parse_query(query, base_iri) } @@ -83,16 +86,16 @@ impl Query { write!(f, "(base <{base_iri}> ")?; } if let Some(dataset) = dataset { - write!(f, "(dataset ")?; + f.write_str("(dataset ")?; dataset.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; } pattern.fmt_sse(f)?; if dataset.is_some() { - write!(f, ")")?; + f.write_str(")")?; } if base_iri.is_some() { - write!(f, ")")?; + f.write_str(")")?; } Ok(()) } @@ -105,26 +108,26 @@ impl Query { if let Some(base_iri) = base_iri { write!(f, "(base <{base_iri}> ")?; } - write!(f, "(construct (")?; + f.write_str("(construct (")?; for (i, t) in template.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } t.fmt_sse(f)?; } - write!(f, ") ")?; + f.write_str(") ")?; if let Some(dataset) = dataset { - write!(f, "(dataset ")?; + f.write_str("(dataset ")?; dataset.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; } pattern.fmt_sse(f)?; if dataset.is_some() { - write!(f, ")")?; + f.write_str(")")?; } - write!(f, ")")?; + f.write_str(")")?; if base_iri.is_some() { - write!(f, ")")?; + f.write_str(")")?; } Ok(()) } @@ -136,19 +139,19 @@ impl Query { if let Some(base_iri) = base_iri { write!(f, "(base <{base_iri}> ")?; } - write!(f, "(describe ")?; + f.write_str("(describe ")?; if let Some(dataset) = dataset { - write!(f, "(dataset ")?; + f.write_str("(dataset ")?; dataset.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; } pattern.fmt_sse(f)?; if dataset.is_some() { - write!(f, ")")?; + f.write_str(")")?; } - write!(f, ")")?; + f.write_str(")")?; if base_iri.is_some() { - write!(f, ")")?; + f.write_str(")")?; } Ok(()) } @@ -160,19 +163,19 @@ impl Query { if let Some(base_iri) = base_iri { write!(f, "(base <{base_iri}> ")?; } - write!(f, "(ask ")?; + f.write_str("(ask ")?; if let Some(dataset) = dataset { - write!(f, "(dataset ")?; + f.write_str("(dataset ")?; dataset.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; } pattern.fmt_sse(f)?; if dataset.is_some() { - write!(f, ")")?; + f.write_str(")")?; } - write!(f, ")")?; + f.write_str(")")?; if base_iri.is_some() { - write!(f, ")")?; + f.write_str(")")?; } Ok(()) } @@ -209,11 +212,11 @@ impl fmt::Display for Query { if let Some(base_iri) = base_iri { writeln!(f, "BASE <{base_iri}>")?; } - write!(f, "CONSTRUCT {{ ")?; + f.write_str("CONSTRUCT { ")?; for triple in template { write!(f, "{triple} . ")?; } - write!(f, "}}")?; + f.write_str("}")?; if let Some(dataset) = dataset { dataset.fmt(f)?; } @@ -234,7 +237,7 @@ impl fmt::Display for Query { if let Some(base_iri) = base_iri { writeln!(f, "BASE <{}>", base_iri.as_str())?; } - write!(f, "DESCRIBE *")?; + f.write_str("DESCRIBE *")?; if let Some(dataset) = dataset { dataset.fmt(f)?; } @@ -255,7 +258,7 @@ impl fmt::Display for Query { if let Some(base_iri) = base_iri { writeln!(f, "BASE <{base_iri}>")?; } - write!(f, "ASK")?; + f.write_str("ASK")?; if let Some(dataset) = dataset { dataset.fmt(f)?; } @@ -273,25 +276,25 @@ impl fmt::Display for Query { } impl FromStr for Query { - type Err = ParseError; + type Err = SparqlSyntaxError; - fn from_str(query: &str) -> Result<Self, ParseError> { + fn from_str(query: &str) -> Result<Self, Self::Err> { Self::parse(query, None) } } impl<'a> TryFrom<&'a str> for Query { - type Error = ParseError; + type Error = SparqlSyntaxError; - fn try_from(query: &str) -> Result<Self, ParseError> { + fn try_from(query: &str) -> Result<Self, Self::Error> { Self::from_str(query) } } impl<'a> TryFrom<&'a String> for Query { - type Error = ParseError; + type Error = SparqlSyntaxError; - fn try_from(query: &String) -> Result<Self, ParseError> { + fn try_from(query: &String) -> Result<Self, Self::Error> { Self::from_str(query) } } diff --git a/lib/spargebra/src/term.rs b/lib/spargebra/src/term.rs index 3ef91f68..43a22efe 100644 --- a/lib/spargebra/src/term.rs +++ b/lib/spargebra/src/term.rs @@ -48,7 +48,7 @@ impl TryFrom<Subject> for GroundSubject { type Error = (); #[inline] - fn try_from(subject: Subject) -> Result<Self, ()> { + fn try_from(subject: Subject) -> Result<Self, Self::Error> { match subject { Subject::NamedNode(t) => Ok(t.into()), Subject::BlankNode(_) => Err(()), @@ -62,7 +62,7 @@ impl TryFrom<GroundTerm> for GroundSubject { type Error = (); #[inline] - fn try_from(term: GroundTerm) -> Result<Self, ()> { + fn try_from(term: GroundTerm) -> Result<Self, Self::Error> { match term { GroundTerm::NamedNode(t) => Ok(t.into()), GroundTerm::Literal(_) => Err(()), @@ -125,7 +125,7 @@ impl TryFrom<Term> for GroundTerm { type Error = (); #[inline] - fn try_from(term: Term) -> Result<Self, ()> { + fn try_from(term: Term) -> Result<Self, Self::Error> { match term { Term::NamedNode(t) => Ok(t.into()), Term::BlankNode(_) => Err(()), @@ -141,7 +141,7 @@ impl TryFrom<Term> for GroundTerm { /// The default string formatter is returning a N-Quads representation. /// /// ``` -/// use spargebra::term::{NamedNode, GroundTriple}; +/// use spargebra::term::{GroundTriple, NamedNode}; /// /// assert_eq!( /// "<http://example.com/s> <http://example.com/p> <http://example.com/o>", @@ -149,7 +149,8 @@ impl TryFrom<Term> for GroundTerm { /// subject: NamedNode::new("http://example.com/s")?.into(), /// predicate: NamedNode::new("http://example.com/p")?, /// object: NamedNode::new("http://example.com/o")?.into(), -/// }.to_string() +/// } +/// .to_string() /// ); /// # Result::<_,oxrdf::IriParseError>::Ok(()) /// ``` @@ -171,7 +172,7 @@ impl TryFrom<Triple> for GroundTriple { type Error = (); #[inline] - fn try_from(triple: Triple) -> Result<Self, ()> { + fn try_from(triple: Triple) -> Result<Self, Self::Error> { Ok(Self { subject: triple.subject.try_into()?, predicate: triple.predicate, @@ -183,9 +184,10 @@ impl TryFrom<Triple> for GroundTriple { /// A possible graph name. /// /// It is the union of [IRIs](https://www.w3.org/TR/rdf11-concepts/#dfn-iri) and the [default graph name](https://www.w3.org/TR/rdf11-concepts/#dfn-default-graph). -#[derive(Eq, PartialEq, Debug, Clone, Hash)] +#[derive(Eq, PartialEq, Debug, Clone, Hash, Default)] pub enum GraphName { NamedNode(NamedNode), + #[default] DefaultGraph, } @@ -194,7 +196,7 @@ impl GraphName { pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { match self { Self::NamedNode(node) => write!(f, "{node}"), - Self::DefaultGraph => write!(f, "default"), + Self::DefaultGraph => f.write_str("default"), } } } @@ -204,7 +206,7 @@ impl fmt::Display for GraphName { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::NamedNode(node) => node.fmt(f), - Self::DefaultGraph => write!(f, "DEFAULT"), + Self::DefaultGraph => f.write_str("DEFAULT"), } } } @@ -220,7 +222,7 @@ impl TryFrom<GraphNamePattern> for GraphName { type Error = (); #[inline] - fn try_from(pattern: GraphNamePattern) -> Result<Self, ()> { + fn try_from(pattern: GraphNamePattern) -> Result<Self, Self::Error> { match pattern { GraphNamePattern::NamedNode(t) => Ok(t.into()), GraphNamePattern::DefaultGraph => Ok(Self::DefaultGraph), @@ -259,9 +261,9 @@ impl Quad { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { if self.graph_name != GraphName::DefaultGraph { - write!(f, "(graph ")?; + f.write_str("(graph ")?; self.graph_name.fmt_sse(f)?; - write!(f, " (")?; + f.write_str(" (")?; } write!( f, @@ -269,7 +271,7 @@ impl Quad { self.subject, self.predicate, self.object )?; if self.graph_name != GraphName::DefaultGraph { - write!(f, "))")?; + f.write_str("))")?; } Ok(()) } @@ -294,7 +296,7 @@ impl TryFrom<QuadPattern> for Quad { type Error = (); #[inline] - fn try_from(quad: QuadPattern) -> Result<Self, ()> { + fn try_from(quad: QuadPattern) -> Result<Self, Self::Error> { Ok(Self { subject: quad.subject.try_into()?, predicate: quad.predicate.try_into()?, @@ -334,9 +336,9 @@ impl GroundQuad { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { if self.graph_name != GraphName::DefaultGraph { - write!(f, "(graph ")?; + f.write_str("(graph ")?; self.graph_name.fmt_sse(f)?; - write!(f, " (")?; + f.write_str(" (")?; } write!( f, @@ -344,7 +346,7 @@ impl GroundQuad { self.subject, self.predicate, self.object )?; if self.graph_name != GraphName::DefaultGraph { - write!(f, "))")?; + f.write_str("))")?; } Ok(()) } @@ -369,7 +371,7 @@ impl TryFrom<Quad> for GroundQuad { type Error = (); #[inline] - fn try_from(quad: Quad) -> Result<Self, ()> { + fn try_from(quad: Quad) -> Result<Self, Self::Error> { Ok(Self { subject: quad.subject.try_into()?, predicate: quad.predicate, @@ -424,7 +426,7 @@ impl TryFrom<NamedNodePattern> for NamedNode { type Error = (); #[inline] - fn try_from(pattern: NamedNodePattern) -> Result<Self, ()> { + fn try_from(pattern: NamedNodePattern) -> Result<Self, Self::Error> { match pattern { NamedNodePattern::NamedNode(t) => Ok(t), NamedNodePattern::Variable(_) => Err(()), @@ -541,11 +543,24 @@ impl From<NamedNodePattern> for TermPattern { } } +impl From<GroundTermPattern> for TermPattern { + #[inline] + fn from(element: GroundTermPattern) -> Self { + match element { + GroundTermPattern::NamedNode(node) => node.into(), + GroundTermPattern::Literal(literal) => literal.into(), + #[cfg(feature = "rdf-star")] + GroundTermPattern::Triple(t) => TriplePattern::from(*t).into(), + GroundTermPattern::Variable(variable) => variable.into(), + } + } +} + impl TryFrom<TermPattern> for Subject { type Error = (); #[inline] - fn try_from(term: TermPattern) -> Result<Self, ()> { + fn try_from(term: TermPattern) -> Result<Self, Self::Error> { match term { TermPattern::NamedNode(t) => Ok(t.into()), TermPattern::BlankNode(t) => Ok(t.into()), @@ -560,7 +575,7 @@ impl TryFrom<TermPattern> for Term { type Error = (); #[inline] - fn try_from(pattern: TermPattern) -> Result<Self, ()> { + fn try_from(pattern: TermPattern) -> Result<Self, Self::Error> { match pattern { TermPattern::NamedNode(t) => Ok(t.into()), TermPattern::BlankNode(t) => Ok(t.into()), @@ -672,7 +687,7 @@ impl TryFrom<TermPattern> for GroundTermPattern { type Error = (); #[inline] - fn try_from(pattern: TermPattern) -> Result<Self, ()> { + fn try_from(pattern: TermPattern) -> Result<Self, Self::Error> { Ok(match pattern { TermPattern::NamedNode(named_node) => named_node.into(), TermPattern::BlankNode(_) => return Err(()), @@ -697,7 +712,7 @@ impl GraphNamePattern { pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { match self { Self::NamedNode(node) => write!(f, "{node}"), - Self::DefaultGraph => write!(f, "default"), + Self::DefaultGraph => f.write_str("default"), Self::Variable(var) => write!(f, "{var}"), } } @@ -708,7 +723,7 @@ impl fmt::Display for GraphNamePattern { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::NamedNode(node) => node.fmt(f), - Self::DefaultGraph => write!(f, "DEFAULT"), + Self::DefaultGraph => f.write_str("DEFAULT"), Self::Variable(var) => var.fmt(f), } } @@ -771,13 +786,13 @@ impl TriplePattern { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { - write!(f, "(triple ")?; + f.write_str("(triple ")?; self.subject.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.predicate.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.object.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } @@ -799,11 +814,22 @@ impl From<Triple> for TriplePattern { } } +impl From<GroundTriplePattern> for TriplePattern { + #[inline] + fn from(triple: GroundTriplePattern) -> Self { + Self { + subject: triple.subject.into(), + predicate: triple.predicate, + object: triple.object.into(), + } + } +} + impl TryFrom<TriplePattern> for Triple { type Error = (); #[inline] - fn try_from(triple: TriplePattern) -> Result<Self, ()> { + fn try_from(triple: TriplePattern) -> Result<Self, Self::Error> { Ok(Self { subject: triple.subject.try_into()?, predicate: triple.predicate.try_into()?, @@ -824,13 +850,13 @@ impl GroundTriplePattern { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). #[allow(dead_code)] pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { - write!(f, "(triple ")?; + f.write_str("(triple ")?; self.subject.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.predicate.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.object.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } @@ -892,19 +918,19 @@ impl QuadPattern { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { if self.graph_name != GraphNamePattern::DefaultGraph { - write!(f, "(graph ")?; + f.write_str("(graph ")?; self.graph_name.fmt_sse(f)?; - write!(f, " (")?; + f.write_str(" (")?; } - write!(f, "(triple ")?; + f.write_str("(triple ")?; self.subject.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.predicate.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.object.fmt_sse(f)?; - write!(f, ")")?; + f.write_str(")")?; if self.graph_name != GraphNamePattern::DefaultGraph { - write!(f, "))")?; + f.write_str("))")?; } Ok(()) } @@ -938,19 +964,19 @@ impl GroundQuadPattern { /// Formats using the [SPARQL S-Expression syntax](https://jena.apache.org/documentation/notes/sse.html). pub(crate) fn fmt_sse(&self, f: &mut impl Write) -> fmt::Result { if self.graph_name != GraphNamePattern::DefaultGraph { - write!(f, "(graph ")?; + f.write_str("(graph ")?; self.graph_name.fmt_sse(f)?; - write!(f, " (")?; + f.write_str(" (")?; } - write!(f, "(triple ")?; + f.write_str("(triple ")?; self.subject.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.predicate.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; self.object.fmt_sse(f)?; - write!(f, ")")?; + f.write_str(")")?; if self.graph_name != GraphNamePattern::DefaultGraph { - write!(f, "))")?; + f.write_str("))")?; } Ok(()) } @@ -975,7 +1001,7 @@ impl TryFrom<QuadPattern> for GroundQuadPattern { type Error = (); #[inline] - fn try_from(pattern: QuadPattern) -> Result<Self, ()> { + fn try_from(pattern: QuadPattern) -> Result<Self, Self::Error> { Ok(Self { subject: pattern.subject.try_into()?, predicate: pattern.predicate, diff --git a/lib/spargebra/src/update.rs b/lib/spargebra/src/update.rs index e73b234e..8f57c985 100644 --- a/lib/spargebra/src/update.rs +++ b/lib/spargebra/src/update.rs @@ -1,5 +1,5 @@ use crate::algebra::*; -use crate::parser::{parse_update, ParseError}; +use crate::parser::{parse_update, SparqlSyntaxError}; use crate::term::*; use oxiri::Iri; use std::fmt; @@ -14,7 +14,7 @@ use std::str::FromStr; /// let update = Update::parse(update_str, None)?; /// assert_eq!(update.to_string().trim(), update_str); /// assert_eq!(update.to_sse(), "(update (clear all))"); -/// # Ok::<_, spargebra::ParseError>(()) +/// # Ok::<_, spargebra::SparqlSyntaxError>(()) /// ``` #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct Update { @@ -26,7 +26,7 @@ pub struct Update { impl Update { /// Parses a SPARQL update with an optional base IRI to resolve relative IRIs in the query. - pub fn parse(update: &str, base_iri: Option<&str>) -> Result<Self, ParseError> { + pub fn parse(update: &str, base_iri: Option<&str>) -> Result<Self, SparqlSyntaxError> { parse_update(update, base_iri) } @@ -42,14 +42,14 @@ impl Update { if let Some(base_iri) = &self.base_iri { write!(f, "(base <{base_iri}> ")?; } - write!(f, "(update")?; + f.write_str("(update")?; for op in &self.operations { - write!(f, " ")?; + f.write_str(" ")?; op.fmt_sse(f)?; } - write!(f, ")")?; + f.write_str(")")?; if self.base_iri.is_some() { - write!(f, ")")?; + f.write_str(")")?; } Ok(()) } @@ -68,25 +68,25 @@ impl fmt::Display for Update { } impl FromStr for Update { - type Err = ParseError; + type Err = SparqlSyntaxError; - fn from_str(update: &str) -> Result<Self, ParseError> { + fn from_str(update: &str) -> Result<Self, Self::Err> { Self::parse(update, None) } } impl<'a> TryFrom<&'a str> for Update { - type Error = ParseError; + type Error = SparqlSyntaxError; - fn try_from(update: &str) -> Result<Self, ParseError> { + fn try_from(update: &str) -> Result<Self, Self::Error> { Self::from_str(update) } } impl<'a> TryFrom<&'a String> for Update { - type Error = ParseError; + type Error = SparqlSyntaxError; - fn try_from(update: &String) -> Result<Self, ParseError> { + fn try_from(update: &String) -> Result<Self, Self::Error> { Self::from_str(update) } } @@ -124,24 +124,24 @@ impl GraphUpdateOperation { fn fmt_sse(&self, f: &mut impl fmt::Write) -> fmt::Result { match self { Self::InsertData { data } => { - write!(f, "(insertData (")?; + f.write_str("(insertData (")?; for (i, t) in data.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } t.fmt_sse(f)?; } - write!(f, "))") + f.write_str("))") } Self::DeleteData { data } => { - write!(f, "(deleteData (")?; + f.write_str("(deleteData (")?; for (i, t) in data.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } t.fmt_sse(f)?; } - write!(f, "))") + f.write_str("))") } Self::DeleteInsert { delete, @@ -149,73 +149,73 @@ impl GraphUpdateOperation { using, pattern, } => { - write!(f, "(modify ")?; + f.write_str("(modify ")?; if let Some(using) = using { - write!(f, " (using ")?; + f.write_str(" (using ")?; using.fmt_sse(f)?; - write!(f, " ")?; + f.write_str(" ")?; pattern.fmt_sse(f)?; - write!(f, ")")?; + f.write_str(")")?; } else { pattern.fmt_sse(f)?; } if !delete.is_empty() { - write!(f, " (delete (")?; + f.write_str(" (delete (")?; for (i, t) in delete.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } t.fmt_sse(f)?; } - write!(f, "))")?; + f.write_str("))")?; } if !insert.is_empty() { - write!(f, " (insert (")?; + f.write_str(" (insert (")?; for (i, t) in insert.iter().enumerate() { if i > 0 { - write!(f, " ")?; + f.write_str(" ")?; } t.fmt_sse(f)?; } - write!(f, "))")?; + f.write_str("))")?; } - write!(f, ")") + f.write_str(")") } Self::Load { silent, source, destination, } => { - write!(f, "(load ")?; + f.write_str("(load ")?; if *silent { - write!(f, "silent ")?; + f.write_str("silent ")?; } write!(f, "{source} ")?; destination.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Clear { silent, graph } => { - write!(f, "(clear ")?; + f.write_str("(clear ")?; if *silent { - write!(f, "silent ")?; + f.write_str("silent ")?; } graph.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } Self::Create { silent, graph } => { - write!(f, "(create ")?; + f.write_str("(create ")?; if *silent { - write!(f, "silent ")?; + f.write_str("silent ")?; } write!(f, "{graph})") } Self::Drop { silent, graph } => { - write!(f, "(drop ")?; + f.write_str("(drop ")?; if *silent { - write!(f, "silent ")?; + f.write_str("silent ")?; } graph.fmt_sse(f)?; - write!(f, ")") + f.write_str(")") } } } @@ -227,12 +227,12 @@ impl fmt::Display for GraphUpdateOperation { Self::InsertData { data } => { writeln!(f, "INSERT DATA {{")?; write_quads(data, f)?; - write!(f, "}}") + f.write_str("}") } Self::DeleteData { data } => { writeln!(f, "DELETE DATA {{")?; write_ground_quads(data, f)?; - write!(f, "}}") + f.write_str("}") } Self::DeleteInsert { delete, @@ -278,9 +278,9 @@ impl fmt::Display for GraphUpdateOperation { source, destination, } => { - write!(f, "LOAD ")?; + f.write_str("LOAD ")?; if *silent { - write!(f, "SILENT ")?; + f.write_str("SILENT ")?; } write!(f, "{source}")?; if destination != &GraphName::DefaultGraph { @@ -289,23 +289,23 @@ impl fmt::Display for GraphUpdateOperation { Ok(()) } Self::Clear { silent, graph } => { - write!(f, "CLEAR ")?; + f.write_str("CLEAR ")?; if *silent { - write!(f, "SILENT ")?; + f.write_str("SILENT ")?; } write!(f, "{graph}") } Self::Create { silent, graph } => { - write!(f, "CREATE ")?; + f.write_str("CREATE ")?; if *silent { - write!(f, "SILENT ")?; + f.write_str("SILENT ")?; } write!(f, "GRAPH {graph}") } Self::Drop { silent, graph } => { - write!(f, "DROP ")?; + f.write_str("DROP ")?; if *silent { - write!(f, "SILENT ")?; + f.write_str("SILENT ")?; } write!(f, "{graph}") } diff --git a/lib/sparopt/Cargo.toml b/lib/sparopt/Cargo.toml new file mode 100644 index 00000000..541e2ea3 --- /dev/null +++ b/lib/sparopt/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "sparopt" +version = "0.1.0-alpha.2" +authors.workspace = true +license.workspace = true +readme = "README.md" +keywords = ["SPARQL"] +repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/sparopt" +documentation = "https://docs.rs/sparopt" +description = """ +A SPARQL optimizer +""" +edition.workspace = true +rust-version.workspace = true + +[features] +default = [] +rdf-star = ["oxrdf/rdf-star", "spargebra/rdf-star"] +sep-0002 = ["spargebra/sep-0002"] +sep-0006 = ["spargebra/sep-0006"] + +[dependencies] +oxrdf.workspace = true +rand.workspace = true +spargebra.workspace = true + +[lints] +workspace = true + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/lib/sparopt/README.md b/lib/sparopt/README.md new file mode 100644 index 00000000..1a6e1c64 --- /dev/null +++ b/lib/sparopt/README.md @@ -0,0 +1,33 @@ +sparopt +======= + +[](https://crates.io/crates/sparopt) +[](https://docs.rs/sparopt) +[](https://crates.io/crates/sparopt) +[](https://github.com/oxigraph/oxigraph/actions) +[](https://gitter.im/oxigraph/community) + +sparopt is a work in progress [SPARQL Query](https://www.w3.org/TR/sparql11-query/) optimizer. + +It relies on the output of [spargebra](https://crates.io/crates/spargebra). + +Support for [SPARQL-star](https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#sparql-star) is also available behind the `rdf-star` feature. + +This crate is intended to be a building piece for SPARQL implementations in Rust like [Oxigraph](https://oxigraph.org). + + +## License + +This project is licensed under either of + +* Apache License, Version 2.0, ([LICENSE-APACHE](../LICENSE-APACHE) or + `<http://www.apache.org/licenses/LICENSE-2.0>`) +* MIT license ([LICENSE-MIT](../LICENSE-MIT) or + `<http://opensource.org/licenses/MIT>`) + +at your option. + + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Oxigraph by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. diff --git a/lib/sparopt/src/algebra.rs b/lib/sparopt/src/algebra.rs new file mode 100644 index 00000000..b9bb30f7 --- /dev/null +++ b/lib/sparopt/src/algebra.rs @@ -0,0 +1,1662 @@ +//! [SPARQL 1.1 Query Algebra](https://www.w3.org/TR/sparql11-query/#sparqlQuery) representation. + +use oxrdf::vocab::xsd; +use rand::random; +use spargebra::algebra::{ + AggregateExpression as AlAggregateExpression, AggregateFunction, Expression as AlExpression, + GraphPattern as AlGraphPattern, OrderExpression as AlOrderExpression, +}; +pub use spargebra::algebra::{Function, PropertyPathExpression}; +use spargebra::term::{BlankNode, GroundSubject, TermPattern, TriplePattern}; +pub use spargebra::term::{ + GroundTerm, GroundTermPattern, Literal, NamedNode, NamedNodePattern, Variable, +}; +#[cfg(feature = "rdf-star")] +use spargebra::term::{GroundTriple, GroundTriplePattern}; +use std::collections::hash_map::DefaultHasher; +use std::collections::{HashMap, HashSet}; +use std::hash::{Hash, Hasher}; +use std::ops::{Add, BitAnd, BitOr, Div, Mul, Neg, Not, Sub}; + +/// An [expression](https://www.w3.org/TR/sparql11-query/#expressions). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum Expression { + NamedNode(NamedNode), + Literal(Literal), + Variable(Variable), + /// [Logical-or](https://www.w3.org/TR/sparql11-query/#func-logical-or). + Or(Vec<Self>), + /// [Logical-and](https://www.w3.org/TR/sparql11-query/#func-logical-and). + And(Vec<Self>), + /// [RDFterm-equal](https://www.w3.org/TR/sparql11-query/#func-RDFterm-equal) and all the XSD equalities. + Equal(Box<Self>, Box<Self>), + /// [sameTerm](https://www.w3.org/TR/sparql11-query/#func-sameTerm). + SameTerm(Box<Self>, Box<Self>), + /// [op:numeric-greater-than](https://www.w3.org/TR/xpath-functions-31/#func-numeric-greater-than) and other XSD greater than operators. + Greater(Box<Self>, Box<Self>), + GreaterOrEqual(Box<Self>, Box<Self>), + /// [op:numeric-less-than](https://www.w3.org/TR/xpath-functions-31/#func-numeric-less-than) and other XSD greater than operators. + Less(Box<Self>, Box<Self>), + LessOrEqual(Box<Self>, Box<Self>), + /// [op:numeric-add](https://www.w3.org/TR/xpath-functions-31/#func-numeric-add) and other XSD additions. + Add(Box<Self>, Box<Self>), + /// [op:numeric-subtract](https://www.w3.org/TR/xpath-functions-31/#func-numeric-subtract) and other XSD subtractions. + Subtract(Box<Self>, Box<Self>), + /// [op:numeric-multiply](https://www.w3.org/TR/xpath-functions-31/#func-numeric-multiply) and other XSD multiplications. + Multiply(Box<Self>, Box<Self>), + /// [op:numeric-divide](https://www.w3.org/TR/xpath-functions-31/#func-numeric-divide) and other XSD divides. + Divide(Box<Self>, Box<Self>), + /// [op:numeric-unary-plus](https://www.w3.org/TR/xpath-functions-31/#func-numeric-unary-plus) and other XSD unary plus. + UnaryPlus(Box<Self>), + /// [op:numeric-unary-minus](https://www.w3.org/TR/xpath-functions-31/#func-numeric-unary-minus) and other XSD unary minus. + UnaryMinus(Box<Self>), + /// [fn:not](https://www.w3.org/TR/xpath-functions-31/#func-not). + Not(Box<Self>), + /// [EXISTS](https://www.w3.org/TR/sparql11-query/#func-filter-exists). + Exists(Box<GraphPattern>), + /// [BOUND](https://www.w3.org/TR/sparql11-query/#func-bound). + Bound(Variable), + /// [IF](https://www.w3.org/TR/sparql11-query/#func-if). + If(Box<Self>, Box<Self>, Box<Self>), + /// [COALESCE](https://www.w3.org/TR/sparql11-query/#func-coalesce). + Coalesce(Vec<Self>), + /// A regular function call. + FunctionCall(Function, Vec<Self>), +} + +impl Expression { + pub fn or_all(args: impl IntoIterator<Item = Self>) -> Self { + let args = args.into_iter(); + let mut all = Vec::with_capacity(args.size_hint().0); + for arg in args { + if let Some(ebv) = arg.effective_boolean_value() { + if ebv { + return true.into(); + } + // We ignore false values + } else if let Self::Or(args) = arg { + all.extend(args); + } else { + all.push(arg); + } + } + match all.len() { + 0 => false.into(), + 1 => { + let result = all.pop().unwrap(); + if result.returns_boolean() { + result // It's already casted to boolean + } else { + Self::And(vec![result]) + } + } + _ => Self::Or(order_vec(all)), + } + } + + pub fn and_all(args: impl IntoIterator<Item = Self>) -> Self { + let args = args.into_iter(); + let mut all = Vec::with_capacity(args.size_hint().0); + for arg in args { + if let Some(ebv) = arg.effective_boolean_value() { + if !ebv { + return false.into(); + } + // We ignore true values + } else if let Self::And(args) = arg { + all.extend(args); + } else { + all.push(arg); + } + } + match all.len() { + 0 => true.into(), + 1 => { + let result = all.pop().unwrap(); + if result.returns_boolean() { + result + } else { + Self::And(vec![result]) + } + } + _ => Self::And(order_vec(all)), + } + } + + pub fn equal(left: Self, right: Self) -> Self { + match (left, right) { + (Self::NamedNode(left), Self::NamedNode(right)) => (left == right).into(), + (Self::Literal(left), Self::Literal(right)) if left == right => true.into(), + (left, right) => { + let (left, right) = order_pair(left, right); + Self::Equal(Box::new(left), Box::new(right)) + } + } + } + + pub fn same_term(left: Self, right: Self) -> Self { + match (left, right) { + (Self::NamedNode(left), Self::NamedNode(right)) => (left == right).into(), + (Self::Literal(left), Self::Literal(right)) if left == right => true.into(), + (left, right) => { + let (left, right) = order_pair(left, right); + Self::SameTerm(Box::new(left), Box::new(right)) + } + } + } + + pub fn greater(left: Self, right: Self) -> Self { + Self::Greater(Box::new(left), Box::new(right)) + } + + pub fn greater_or_equal(left: Self, right: Self) -> Self { + Self::GreaterOrEqual(Box::new(left), Box::new(right)) + } + + pub fn less(left: Self, right: Self) -> Self { + Self::Less(Box::new(left), Box::new(right)) + } + + pub fn less_or_equal(left: Self, right: Self) -> Self { + Self::LessOrEqual(Box::new(left), Box::new(right)) + } + + pub fn unary_plus(inner: Self) -> Self { + Self::UnaryPlus(Box::new(inner)) + } + + pub fn exists(inner: GraphPattern) -> Self { + if inner.is_empty() { + return false.into(); + } + if inner.is_empty_singleton() { + return true.into(); + } + Self::Exists(Box::new(inner)) + } + + pub fn if_cond(cond: Self, then: Self, els: Self) -> Self { + match cond.effective_boolean_value() { + Some(true) => then, + Some(false) => els, + None => Self::If(Box::new(cond), Box::new(then), Box::new(els)), + } + } + + pub fn coalesce(args: Vec<Self>) -> Self { + Self::Coalesce(args) + } + + pub fn call(name: Function, args: Vec<Self>) -> Self { + Self::FunctionCall(name, args) + } + + pub fn effective_boolean_value(&self) -> Option<bool> { + if let Self::Literal(literal) = self { + match literal.datatype() { + xsd::BOOLEAN => match literal.value() { + "true" | "1" => Some(true), + "false" | "0" => Some(false), + _ => None, // TODO + }, + xsd::STRING => Some(!literal.value().is_empty()), + _ => None, // TODO + } + } else { + None + } + } + + pub fn used_variables(&self) -> HashSet<&Variable> { + let mut variables = HashSet::new(); + self.lookup_used_variables(&mut |v| { + variables.insert(v); + }); + variables + } + + pub fn lookup_used_variables<'a>(&'a self, callback: &mut impl FnMut(&'a Variable)) { + match self { + Self::NamedNode(_) | Self::Literal(_) => {} + Self::Variable(v) | Self::Bound(v) => callback(v), + Self::Or(inner) + | Self::And(inner) + | Self::Coalesce(inner) + | Self::FunctionCall(_, inner) => { + for i in inner { + i.lookup_used_variables(callback); + } + } + Self::Equal(a, b) + | Self::SameTerm(a, b) + | Self::Greater(a, b) + | Self::GreaterOrEqual(a, b) + | Self::Less(a, b) + | Self::LessOrEqual(a, b) + | Self::Add(a, b) + | Self::Subtract(a, b) + | Self::Multiply(a, b) + | Self::Divide(a, b) => { + a.lookup_used_variables(callback); + b.lookup_used_variables(callback); + } + Self::UnaryPlus(i) | Self::UnaryMinus(i) | Self::Not(i) => { + i.lookup_used_variables(callback) + } + Self::Exists(e) => e.lookup_used_variables(callback), + Self::If(a, b, c) => { + a.lookup_used_variables(callback); + b.lookup_used_variables(callback); + c.lookup_used_variables(callback); + } + } + } + + fn from_sparql_algebra( + expression: &AlExpression, + graph_name: Option<&NamedNodePattern>, + ) -> Self { + match expression { + AlExpression::NamedNode(node) => Self::NamedNode(node.clone()), + AlExpression::Literal(literal) => Self::Literal(literal.clone()), + AlExpression::Variable(variable) => Self::Variable(variable.clone()), + AlExpression::Or(left, right) => Self::Or(vec![ + Self::from_sparql_algebra(left, graph_name), + Self::from_sparql_algebra(right, graph_name), + ]), + AlExpression::And(left, right) => Self::And(vec![ + Self::from_sparql_algebra(left, graph_name), + Self::from_sparql_algebra(right, graph_name), + ]), + AlExpression::Equal(left, right) => Self::Equal( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::SameTerm(left, right) => Self::SameTerm( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::Greater(left, right) => Self::Greater( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::GreaterOrEqual(left, right) => Self::GreaterOrEqual( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::Less(left, right) => Self::Less( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::LessOrEqual(left, right) => Self::LessOrEqual( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::In(left, right) => { + let left = Self::from_sparql_algebra(left, graph_name); + match right.len() { + 0 => Self::if_cond(left, false.into(), false.into()), + 1 => Self::Equal( + Box::new(left), + Box::new(Self::from_sparql_algebra(&right[0], graph_name)), + ), + _ => Self::Or( + right + .iter() + .map(|e| { + Self::Equal( + Box::new(left.clone()), + Box::new(Self::from_sparql_algebra(e, graph_name)), + ) + }) + .collect(), + ), + } + } + AlExpression::Add(left, right) => Self::Add( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::Subtract(left, right) => Self::Subtract( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::Multiply(left, right) => Self::Multiply( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::Divide(left, right) => Self::Divide( + Box::new(Self::from_sparql_algebra(left, graph_name)), + Box::new(Self::from_sparql_algebra(right, graph_name)), + ), + AlExpression::UnaryPlus(inner) => { + Self::UnaryPlus(Box::new(Self::from_sparql_algebra(inner, graph_name))) + } + AlExpression::UnaryMinus(inner) => { + Self::UnaryMinus(Box::new(Self::from_sparql_algebra(inner, graph_name))) + } + AlExpression::Not(inner) => { + Self::Not(Box::new(Self::from_sparql_algebra(inner, graph_name))) + } + AlExpression::Exists(inner) => Self::Exists(Box::new( + GraphPattern::from_sparql_algebra(inner, graph_name, &mut HashMap::new()), + )), + AlExpression::Bound(variable) => Self::Bound(variable.clone()), + AlExpression::If(cond, yes, no) => Self::If( + Box::new(Self::from_sparql_algebra(cond, graph_name)), + Box::new(Self::from_sparql_algebra(yes, graph_name)), + Box::new(Self::from_sparql_algebra(no, graph_name)), + ), + AlExpression::Coalesce(inner) => Self::Coalesce( + inner + .iter() + .map(|e| Self::from_sparql_algebra(e, graph_name)) + .collect(), + ), + AlExpression::FunctionCall(name, args) => Self::FunctionCall( + name.clone(), + args.iter() + .map(|e| Self::from_sparql_algebra(e, graph_name)) + .collect(), + ), + } + } + + fn returns_boolean(&self) -> bool { + match self { + Self::Or(_) + | Self::And(_) + | Self::Equal(_, _) + | Self::SameTerm(_, _) + | Self::Greater(_, _) + | Self::GreaterOrEqual(_, _) + | Self::Less(_, _) + | Self::LessOrEqual(_, _) + | Self::Not(_) + | Self::Exists(_) + | Self::Bound(_) + | Self::FunctionCall( + Function::IsBlank | Function::IsIri | Function::IsLiteral | Function::IsNumeric, + _, + ) => true, + #[cfg(feature = "rdf-star")] + Self::FunctionCall(Function::IsTriple, _) => true, + Self::Literal(literal) => literal.datatype() == xsd::BOOLEAN, + Self::If(_, a, b) => a.returns_boolean() && b.returns_boolean(), + _ => false, + } + } +} + +impl From<NamedNode> for Expression { + fn from(value: NamedNode) -> Self { + Self::NamedNode(value) + } +} + +impl From<Literal> for Expression { + fn from(value: Literal) -> Self { + Self::Literal(value) + } +} + +impl From<GroundSubject> for Expression { + fn from(value: GroundSubject) -> Self { + match value { + GroundSubject::NamedNode(value) => value.into(), + #[cfg(feature = "rdf-star")] + GroundSubject::Triple(value) => (*value).into(), + } + } +} + +impl From<GroundTerm> for Expression { + fn from(value: GroundTerm) -> Self { + match value { + GroundTerm::NamedNode(value) => value.into(), + GroundTerm::Literal(value) => value.into(), + #[cfg(feature = "rdf-star")] + GroundTerm::Triple(value) => (*value).into(), + } + } +} + +impl From<NamedNodePattern> for Expression { + fn from(value: NamedNodePattern) -> Self { + match value { + NamedNodePattern::NamedNode(value) => value.into(), + NamedNodePattern::Variable(variable) => variable.into(), + } + } +} + +impl From<GroundTermPattern> for Expression { + fn from(value: GroundTermPattern) -> Self { + match value { + GroundTermPattern::NamedNode(value) => value.into(), + GroundTermPattern::Literal(value) => value.into(), + #[cfg(feature = "rdf-star")] + GroundTermPattern::Triple(value) => (*value).into(), + GroundTermPattern::Variable(variable) => variable.into(), + } + } +} + +#[cfg(feature = "rdf-star")] +impl From<GroundTriple> for Expression { + fn from(value: GroundTriple) -> Self { + Self::FunctionCall( + Function::Triple, + vec![ + value.subject.into(), + value.predicate.into(), + value.object.into(), + ], + ) + } +} + +#[cfg(feature = "rdf-star")] +impl From<GroundTriplePattern> for Expression { + fn from(value: GroundTriplePattern) -> Self { + Self::FunctionCall( + Function::Triple, + vec![ + value.subject.into(), + value.predicate.into(), + value.object.into(), + ], + ) + } +} + +impl From<Variable> for Expression { + fn from(value: Variable) -> Self { + Self::Variable(value) + } +} + +impl From<bool> for Expression { + fn from(value: bool) -> Self { + Literal::from(value).into() + } +} + +impl From<&Expression> for AlExpression { + fn from(expression: &Expression) -> Self { + match expression { + Expression::NamedNode(node) => Self::NamedNode(node.clone()), + Expression::Literal(literal) => Self::Literal(literal.clone()), + Expression::Variable(variable) => Self::Variable(variable.clone()), + Expression::Or(inner) => inner + .iter() + .map(Into::into) + .reduce(|a, b| Self::Or(Box::new(a), Box::new(b))) + .unwrap_or_else(|| Literal::from(false).into()), + Expression::And(inner) => inner + .iter() + .map(Into::into) + .reduce(|a, b| Self::And(Box::new(a), Box::new(b))) + .unwrap_or_else(|| Literal::from(true).into()), + Expression::Equal(left, right) => Self::Equal( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::SameTerm(left, right) => Self::SameTerm( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Greater(left, right) => Self::Greater( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::GreaterOrEqual(left, right) => Self::GreaterOrEqual( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Less(left, right) => Self::Less( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::LessOrEqual(left, right) => Self::LessOrEqual( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Add(left, right) => Self::Add( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Subtract(left, right) => Self::Subtract( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Multiply(left, right) => Self::Multiply( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::Divide(left, right) => Self::Divide( + Box::new(left.as_ref().into()), + Box::new(right.as_ref().into()), + ), + Expression::UnaryPlus(inner) => Self::UnaryPlus(Box::new(inner.as_ref().into())), + Expression::UnaryMinus(inner) => Self::UnaryMinus(Box::new(inner.as_ref().into())), + Expression::Not(inner) => Self::Not(Box::new(inner.as_ref().into())), + Expression::Exists(inner) => Self::Exists(Box::new(inner.as_ref().into())), + Expression::Bound(variable) => Self::Bound(variable.clone()), + Expression::If(cond, yes, no) => Self::If( + Box::new(cond.as_ref().into()), + Box::new(yes.as_ref().into()), + Box::new(no.as_ref().into()), + ), + Expression::Coalesce(inner) => Self::Coalesce(inner.iter().map(Into::into).collect()), + Expression::FunctionCall(name, args) => { + Self::FunctionCall(name.clone(), args.iter().map(Into::into).collect()) + } + } + } +} + +impl BitAnd for Expression { + type Output = Self; + + fn bitand(self, rhs: Self) -> Self::Output { + Self::and_all([self, rhs]) + } +} + +impl BitOr for Expression { + type Output = Self; + + fn bitor(self, rhs: Self) -> Self { + Self::or_all([self, rhs]) + } +} + +impl Not for Expression { + type Output = Self; + + fn not(self) -> Self { + if let Some(v) = self.effective_boolean_value() { + (!v).into() + } else if let Self::Not(v) = self { + if v.returns_boolean() { + *v + } else { + Self::And(vec![*v]) + } + } else { + Self::Not(Box::new(self)) + } + } +} + +impl Add for Expression { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + let (left, right) = order_pair(self, rhs); + Self::Add(Box::new(left), Box::new(right)) + } +} + +impl Sub for Expression { + type Output = Self; + + fn sub(self, rhs: Self) -> Self { + Self::Subtract(Box::new(self), Box::new(rhs)) + } +} + +impl Mul for Expression { + type Output = Self; + + fn mul(self, rhs: Self) -> Self { + let (left, right) = order_pair(self, rhs); + Self::Multiply(Box::new(left), Box::new(right)) + } +} + +impl Div for Expression { + type Output = Self; + + fn div(self, rhs: Self) -> Self { + Self::Divide(Box::new(self), Box::new(rhs)) + } +} + +impl Neg for Expression { + type Output = Self; + + fn neg(self) -> Self { + Self::UnaryMinus(Box::new(self)) + } +} + +/// A SPARQL query [graph pattern](https://www.w3.org/TR/sparql11-query/#sparqlQuery). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum GraphPattern { + /// A [basic graph pattern](https://www.w3.org/TR/sparql11-query/#defn_BasicGraphPattern). + QuadPattern { + subject: GroundTermPattern, + predicate: NamedNodePattern, + object: GroundTermPattern, + graph_name: Option<NamedNodePattern>, + }, + /// A [property path pattern](https://www.w3.org/TR/sparql11-query/#defn_evalPP_predicate). + Path { + subject: GroundTermPattern, + path: PropertyPathExpression, + object: GroundTermPattern, + graph_name: Option<NamedNodePattern>, + }, + /// [Join](https://www.w3.org/TR/sparql11-query/#defn_algJoin). + Join { + left: Box<Self>, + right: Box<Self>, + algorithm: JoinAlgorithm, + }, + /// [LeftJoin](https://www.w3.org/TR/sparql11-query/#defn_algLeftJoin). + LeftJoin { + left: Box<Self>, + right: Box<Self>, + expression: Expression, + algorithm: LeftJoinAlgorithm, + }, + /// Lateral join i.e. evaluate right for all result row of left + #[cfg(feature = "sep-0006")] + Lateral { left: Box<Self>, right: Box<Self> }, + /// [Filter](https://www.w3.org/TR/sparql11-query/#defn_algFilter). + Filter { + expression: Expression, + inner: Box<Self>, + }, + /// [Union](https://www.w3.org/TR/sparql11-query/#defn_algUnion). + Union { inner: Vec<Self> }, + /// [Extend](https://www.w3.org/TR/sparql11-query/#defn_extend). + Extend { + inner: Box<Self>, + variable: Variable, + expression: Expression, + }, + /// [Minus](https://www.w3.org/TR/sparql11-query/#defn_algMinus). + Minus { + left: Box<Self>, + right: Box<Self>, + algorithm: MinusAlgorithm, + }, + /// A table used to provide inline values + Values { + variables: Vec<Variable>, + bindings: Vec<Vec<Option<GroundTerm>>>, + }, + /// [OrderBy](https://www.w3.org/TR/sparql11-query/#defn_algOrdered). + OrderBy { + inner: Box<Self>, + expression: Vec<OrderExpression>, + }, + /// [Project](https://www.w3.org/TR/sparql11-query/#defn_algProjection). + Project { + inner: Box<Self>, + variables: Vec<Variable>, + }, + /// [Distinct](https://www.w3.org/TR/sparql11-query/#defn_algDistinct). + Distinct { inner: Box<Self> }, + /// [Reduced](https://www.w3.org/TR/sparql11-query/#defn_algReduced). + Reduced { inner: Box<Self> }, + /// [Slice](https://www.w3.org/TR/sparql11-query/#defn_algSlice). + Slice { + inner: Box<Self>, + start: usize, + length: Option<usize>, + }, + /// [Group](https://www.w3.org/TR/sparql11-query/#aggregateAlgebra). + Group { + inner: Box<Self>, + variables: Vec<Variable>, + aggregates: Vec<(Variable, AggregateExpression)>, + }, + /// [Service](https://www.w3.org/TR/sparql11-federated-query/#defn_evalService). + Service { + name: NamedNodePattern, + inner: Box<Self>, + silent: bool, + }, +} + +impl GraphPattern { + pub fn empty() -> Self { + Self::Values { + variables: Vec::new(), + bindings: Vec::new(), + } + } + + /// Check if the pattern is the empty table + fn is_empty(&self) -> bool { + if let Self::Values { bindings, .. } = self { + bindings.is_empty() + } else { + false + } + } + + pub fn empty_singleton() -> Self { + Self::Values { + variables: Vec::new(), + bindings: vec![Vec::new()], + } + } + + pub fn is_empty_singleton(&self) -> bool { + if let Self::Values { bindings, .. } = self { + bindings.len() == 1 && bindings.iter().all(|b| b.iter().all(Option::is_none)) + } else { + false + } + } + + pub fn join(left: Self, right: Self, algorithm: JoinAlgorithm) -> Self { + if left.is_empty() || right.is_empty() { + return Self::empty(); + } + if left.is_empty_singleton() { + return right; + } + if right.is_empty_singleton() { + return left; + } + Self::Join { + left: Box::new(left), + right: Box::new(right), + algorithm, + } + } + + #[cfg(feature = "sep-0006")] + pub fn lateral(left: Self, right: Self) -> Self { + if left.is_empty() || right.is_empty() { + return Self::empty(); + } + if left.is_empty_singleton() { + return right; + } + if right.is_empty_singleton() { + return left; + } + Self::Lateral { + left: Box::new(left), + right: Box::new(right), + } + } + + pub fn left_join( + left: Self, + right: Self, + expression: Expression, + algorithm: LeftJoinAlgorithm, + ) -> Self { + let expression_ebv = expression.effective_boolean_value(); + if left.is_empty() + || right.is_empty() + || right.is_empty_singleton() + || expression_ebv == Some(false) + { + return left; + } + Self::LeftJoin { + left: Box::new(left), + right: Box::new(right), + expression: if expression_ebv == Some(true) { + true.into() + } else { + expression + }, + algorithm, + } + } + + pub fn minus(left: Self, right: Self, algorithm: MinusAlgorithm) -> Self { + if left.is_empty() { + return Self::empty(); + } + if right.is_empty() { + return left; + } + Self::Minus { + left: Box::new(left), + right: Box::new(right), + algorithm, + } + } + + pub fn union(left: Self, right: Self) -> Self { + Self::union_all([left, right]) + } + + pub fn union_all(args: impl IntoIterator<Item = Self>) -> Self { + let args = args.into_iter(); + let mut all = Vec::with_capacity(args.size_hint().0); + for arg in args { + if arg.is_empty() { + continue; + } + if let Self::Union { inner } = arg { + all.extend(inner); + } else { + all.push(arg); + } + } + if all.is_empty() { + Self::empty() + } else { + Self::Union { + inner: order_vec(all), + } + } + } + + pub fn filter(inner: Self, expression: Expression) -> Self { + if inner.is_empty() { + return Self::empty(); + } + // We unwrap singleton And + let expression = match expression { + Expression::And(mut l) if l.len() == 1 => l.pop().unwrap(), + e => e, + }; + match expression.effective_boolean_value() { + Some(true) => inner, + Some(false) => Self::empty(), + None => match inner { + Self::Filter { + inner, + expression: e2, + } => Self::Filter { + inner, + expression: expression & e2, + }, + _ => Self::Filter { + inner: Box::new(inner), + expression, + }, + }, + } + } + + pub fn extend(inner: Self, variable: Variable, expression: Expression) -> Self { + if inner.is_empty() { + return Self::empty(); + } + Self::Extend { + inner: Box::new(inner), + variable, + expression, + } + } + + pub fn values( + mut variables: Vec<Variable>, + mut bindings: Vec<Vec<Option<GroundTerm>>>, + ) -> Self { + let empty_rows = (0..variables.len()) + .filter(|row| !bindings.iter().any(|binding| binding.get(*row).is_some())) + .collect::<Vec<_>>(); + if !empty_rows.is_empty() { + // We remove empty rows + variables = variables + .into_iter() + .enumerate() + .filter_map(|(i, v)| { + if empty_rows.contains(&i) { + None + } else { + Some(v) + } + }) + .collect(); + bindings = bindings + .into_iter() + .map(|binding| { + binding + .into_iter() + .enumerate() + .filter_map(|(i, v)| { + if empty_rows.contains(&i) { + None + } else { + Some(v) + } + }) + .collect() + }) + .collect(); + } + Self::Values { + variables, + bindings, + } + } + + pub fn order_by(inner: Self, expression: Vec<OrderExpression>) -> Self { + if inner.is_empty() { + return Self::empty(); + } + if expression.is_empty() { + return inner; + } + Self::OrderBy { + inner: Box::new(inner), + expression, + } + } + + pub fn project(inner: Self, variables: Vec<Variable>) -> Self { + Self::Project { + inner: Box::new(inner), + variables, + } + } + + pub fn distinct(inner: Self) -> Self { + if inner.is_empty() { + return Self::empty(); + } + Self::Distinct { + inner: Box::new(inner), + } + } + + pub fn reduced(inner: Self) -> Self { + if inner.is_empty() { + return Self::empty(); + } + Self::Reduced { + inner: Box::new(inner), + } + } + + pub fn slice(inner: Self, start: usize, length: Option<usize>) -> Self { + if inner.is_empty() { + return Self::empty(); + } + if start == 0 && length.is_none() { + return inner; + } + Self::Slice { + inner: Box::new(inner), + start, + length, + } + } + + pub fn group( + inner: Self, + variables: Vec<Variable>, + aggregates: Vec<(Variable, AggregateExpression)>, + ) -> Self { + if inner.is_empty() { + return Self::empty(); + } + Self::Group { + inner: Box::new(inner), + variables, + aggregates, + } + } + + pub fn service(inner: Self, name: NamedNodePattern, silent: bool) -> Self { + if inner.is_empty() { + return Self::empty(); + } + Self::Service { + inner: Box::new(inner), + name, + silent, + } + } + + pub fn lookup_used_variables<'a>(&'a self, callback: &mut impl FnMut(&'a Variable)) { + match self { + Self::Values { variables, .. } | Self::Project { variables, .. } => { + for v in variables { + callback(v); + } + } + Self::QuadPattern { + subject, + predicate, + object, + graph_name, + } => { + lookup_term_pattern_variables(subject, callback); + if let NamedNodePattern::Variable(v) = predicate { + callback(v); + } + lookup_term_pattern_variables(object, callback); + if let Some(NamedNodePattern::Variable(v)) = graph_name { + callback(v); + } + } + Self::Path { + subject, + object, + graph_name, + .. + } => { + lookup_term_pattern_variables(subject, callback); + lookup_term_pattern_variables(object, callback); + if let Some(NamedNodePattern::Variable(v)) = graph_name { + callback(v); + } + } + Self::Filter { inner, expression } => { + expression.lookup_used_variables(callback); + inner.lookup_used_variables(callback); + } + Self::Union { inner } => { + for child in inner { + child.lookup_used_variables(callback); + } + } + Self::Join { left, right, .. } | Self::Minus { left, right, .. } => { + left.lookup_used_variables(callback); + right.lookup_used_variables(callback); + } + #[cfg(feature = "sep-0006")] + Self::Lateral { left, right } => { + left.lookup_used_variables(callback); + right.lookup_used_variables(callback); + } + Self::LeftJoin { + left, + right, + expression, + .. + } => { + expression.lookup_used_variables(callback); + left.lookup_used_variables(callback); + right.lookup_used_variables(callback); + } + Self::Extend { + inner, + variable, + expression, + } => { + callback(variable); + expression.lookup_used_variables(callback); + inner.lookup_used_variables(callback); + } + Self::OrderBy { inner, .. } + | Self::Distinct { inner } + | Self::Reduced { inner } + | Self::Slice { inner, .. } => inner.lookup_used_variables(callback), + Self::Service { inner, name, .. } => { + if let NamedNodePattern::Variable(v) = name { + callback(v); + } + inner.lookup_used_variables(callback); + } + Self::Group { + variables, + aggregates, + .. + } => { + for v in variables { + callback(v); + } + for (v, _) in aggregates { + callback(v); + } + } + } + } + + fn from_sparql_algebra( + pattern: &AlGraphPattern, + graph_name: Option<&NamedNodePattern>, + blank_nodes: &mut HashMap<BlankNode, Variable>, + ) -> Self { + match pattern { + AlGraphPattern::Bgp { patterns } => patterns + .iter() + .map(|p| { + let (subject, predicate, object) = + Self::triple_pattern_from_algebra(p, blank_nodes); + Self::QuadPattern { + subject, + predicate, + object, + graph_name: graph_name.cloned(), + } + }) + .reduce(|a, b| Self::Join { + left: Box::new(a), + right: Box::new(b), + algorithm: JoinAlgorithm::default(), + }) + .unwrap_or_else(Self::empty_singleton), + AlGraphPattern::Path { + subject, + path, + object, + } => Self::Path { + subject: Self::term_pattern_from_algebra(subject, blank_nodes), + path: path.clone(), + object: Self::term_pattern_from_algebra(object, blank_nodes), + graph_name: graph_name.cloned(), + }, + AlGraphPattern::Join { left, right } => Self::Join { + left: Box::new(Self::from_sparql_algebra(left, graph_name, blank_nodes)), + right: Box::new(Self::from_sparql_algebra(right, graph_name, blank_nodes)), + algorithm: JoinAlgorithm::default(), + }, + AlGraphPattern::LeftJoin { + left, + right, + expression, + } => Self::LeftJoin { + left: Box::new(Self::from_sparql_algebra(left, graph_name, blank_nodes)), + right: Box::new(Self::from_sparql_algebra(right, graph_name, blank_nodes)), + expression: expression.as_ref().map_or_else( + || true.into(), + |e| Expression::from_sparql_algebra(e, graph_name), + ), + algorithm: LeftJoinAlgorithm::default(), + }, + #[cfg(feature = "sep-0006")] + AlGraphPattern::Lateral { left, right } => Self::Lateral { + left: Box::new(Self::from_sparql_algebra(left, graph_name, blank_nodes)), + right: Box::new(Self::from_sparql_algebra(right, graph_name, blank_nodes)), + }, + AlGraphPattern::Filter { inner, expr } => Self::Filter { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + expression: Expression::from_sparql_algebra(expr, graph_name), + }, + AlGraphPattern::Union { left, right } => Self::Union { + inner: vec![ + Self::from_sparql_algebra(left, graph_name, blank_nodes), + Self::from_sparql_algebra(right, graph_name, blank_nodes), + ], + }, + AlGraphPattern::Graph { inner, name } => { + Self::from_sparql_algebra(inner, Some(name), blank_nodes) + } + AlGraphPattern::Extend { + inner, + expression, + variable, + } => Self::Extend { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + expression: Expression::from_sparql_algebra(expression, graph_name), + variable: variable.clone(), + }, + AlGraphPattern::Minus { left, right } => Self::Minus { + left: Box::new(Self::from_sparql_algebra(left, graph_name, blank_nodes)), + right: Box::new(Self::from_sparql_algebra(right, graph_name, blank_nodes)), + algorithm: MinusAlgorithm::default(), + }, + AlGraphPattern::Values { + variables, + bindings, + } => Self::Values { + variables: variables.clone(), + bindings: bindings.clone(), + }, + AlGraphPattern::OrderBy { inner, expression } => Self::OrderBy { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + expression: expression + .iter() + .map(|e| OrderExpression::from_sparql_algebra(e, graph_name)) + .collect(), + }, + AlGraphPattern::Project { inner, variables } => { + let graph_name = if let Some(NamedNodePattern::Variable(graph_name)) = graph_name { + Some(NamedNodePattern::Variable( + if variables.contains(graph_name) { + graph_name.clone() + } else { + new_var() + }, + )) + } else { + graph_name.cloned() + }; + Self::Project { + inner: Box::new(Self::from_sparql_algebra( + inner, + graph_name.as_ref(), + &mut HashMap::new(), + )), + variables: variables.clone(), + } + } + AlGraphPattern::Distinct { inner } => Self::Distinct { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + }, + AlGraphPattern::Reduced { inner } => Self::Distinct { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + }, + AlGraphPattern::Slice { + inner, + start, + length, + } => Self::Slice { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + start: *start, + length: *length, + }, + AlGraphPattern::Group { + inner, + variables, + aggregates, + } => Self::Group { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + variables: variables.clone(), + aggregates: aggregates + .iter() + .map(|(var, expr)| { + ( + var.clone(), + AggregateExpression::from_sparql_algebra(expr, graph_name), + ) + }) + .collect(), + }, + AlGraphPattern::Service { + inner, + name, + silent, + } => Self::Service { + inner: Box::new(Self::from_sparql_algebra(inner, graph_name, blank_nodes)), + name: name.clone(), + silent: *silent, + }, + } + } + + fn triple_pattern_from_algebra( + pattern: &TriplePattern, + blank_nodes: &mut HashMap<BlankNode, Variable>, + ) -> (GroundTermPattern, NamedNodePattern, GroundTermPattern) { + ( + Self::term_pattern_from_algebra(&pattern.subject, blank_nodes), + pattern.predicate.clone(), + Self::term_pattern_from_algebra(&pattern.object, blank_nodes), + ) + } + + fn term_pattern_from_algebra( + pattern: &TermPattern, + blank_nodes: &mut HashMap<BlankNode, Variable>, + ) -> GroundTermPattern { + match pattern { + TermPattern::NamedNode(node) => node.clone().into(), + TermPattern::BlankNode(node) => blank_nodes + .entry(node.clone()) + .or_insert_with(new_var) + .clone() + .into(), + TermPattern::Literal(literal) => literal.clone().into(), + #[cfg(feature = "rdf-star")] + TermPattern::Triple(pattern) => { + let (subject, predicate, object) = + Self::triple_pattern_from_algebra(pattern, blank_nodes); + GroundTriplePattern { + subject, + predicate, + object, + } + .into() + } + TermPattern::Variable(variable) => variable.clone().into(), + } + } +} + +impl From<&AlGraphPattern> for GraphPattern { + fn from(pattern: &AlGraphPattern) -> Self { + Self::from_sparql_algebra(pattern, None, &mut HashMap::new()) + } +} + +impl From<&GraphPattern> for AlGraphPattern { + fn from(pattern: &GraphPattern) -> Self { + match pattern { + GraphPattern::QuadPattern { + subject, + predicate, + object, + graph_name, + } => { + let pattern = Self::Bgp { + patterns: vec![TriplePattern { + subject: subject.clone().into(), + predicate: predicate.clone(), + object: object.clone().into(), + }], + }; + if let Some(graph_name) = graph_name { + Self::Graph { + inner: Box::new(pattern), + name: graph_name.clone(), + } + } else { + pattern + } + } + GraphPattern::Path { + subject, + path, + object, + graph_name, + } => { + let pattern = Self::Path { + subject: subject.clone().into(), + path: path.clone(), + object: object.clone().into(), + }; + if let Some(graph_name) = graph_name { + Self::Graph { + inner: Box::new(pattern), + name: graph_name.clone(), + } + } else { + pattern + } + } + GraphPattern::Join { left, right, .. } => { + match (left.as_ref().into(), right.as_ref().into()) { + (Self::Bgp { patterns: mut left }, Self::Bgp { patterns: right }) => { + left.extend(right); + Self::Bgp { patterns: left } + } + (left, right) => Self::Join { + left: Box::new(left), + right: Box::new(right), + }, + } + } + GraphPattern::LeftJoin { + left, + right, + expression, + .. + } => { + let empty_expr = if let Expression::Literal(l) = expression { + l.datatype() == xsd::BOOLEAN && l.value() == "true" + } else { + false + }; + Self::LeftJoin { + left: Box::new(left.as_ref().into()), + right: Box::new(right.as_ref().into()), + expression: if empty_expr { + None + } else { + Some(expression.into()) + }, + } + } + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + match (left.as_ref().into(), right.as_ref().into()) { + (Self::Bgp { patterns: mut left }, Self::Bgp { patterns: right }) => { + left.extend(right); + Self::Bgp { patterns: left } + } + (left, right) => Self::Lateral { + left: Box::new(left), + right: Box::new(right), + }, + } + } + GraphPattern::Filter { inner, expression } => Self::Filter { + inner: Box::new(inner.as_ref().into()), + expr: expression.into(), + }, + GraphPattern::Union { inner } => inner + .iter() + .map(Into::into) + .reduce(|a, b| Self::Union { + left: Box::new(a), + right: Box::new(b), + }) + .unwrap_or_else(|| Self::Values { + variables: Vec::new(), + bindings: Vec::new(), + }), + GraphPattern::Extend { + inner, + expression, + variable, + } => Self::Extend { + inner: Box::new(inner.as_ref().into()), + expression: expression.into(), + variable: variable.clone(), + }, + GraphPattern::Minus { left, right, .. } => Self::Minus { + left: Box::new(left.as_ref().into()), + right: Box::new(right.as_ref().into()), + }, + GraphPattern::Values { + variables, + bindings, + } => Self::Values { + variables: variables.clone(), + bindings: bindings.clone(), + }, + GraphPattern::OrderBy { inner, expression } => Self::OrderBy { + inner: Box::new(inner.as_ref().into()), + expression: expression.iter().map(Into::into).collect(), + }, + GraphPattern::Project { inner, variables } => Self::Project { + inner: Box::new(inner.as_ref().into()), + variables: variables.clone(), + }, + GraphPattern::Distinct { inner } => Self::Distinct { + inner: Box::new(inner.as_ref().into()), + }, + GraphPattern::Reduced { inner } => Self::Distinct { + inner: Box::new(inner.as_ref().into()), + }, + GraphPattern::Slice { + inner, + start, + length, + } => Self::Slice { + inner: Box::new(inner.as_ref().into()), + start: *start, + length: *length, + }, + GraphPattern::Group { + inner, + variables, + aggregates, + } => Self::Group { + inner: Box::new(inner.as_ref().into()), + variables: variables.clone(), + aggregates: aggregates + .iter() + .map(|(var, expr)| (var.clone(), expr.into())) + .collect(), + }, + GraphPattern::Service { + inner, + name, + silent, + } => Self::Service { + inner: Box::new(inner.as_ref().into()), + name: name.clone(), + silent: *silent, + }, + } + } +} + +/// The join algorithm used (c.f. [`GraphPattern::Join`]). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum JoinAlgorithm { + HashBuildLeftProbeRight { keys: Vec<Variable> }, +} + +impl Default for JoinAlgorithm { + fn default() -> Self { + Self::HashBuildLeftProbeRight { + keys: Vec::default(), + } + } +} + +/// The left join algorithm used (c.f. [`GraphPattern::LeftJoin`]). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum LeftJoinAlgorithm { + HashBuildRightProbeLeft { keys: Vec<Variable> }, +} + +impl Default for LeftJoinAlgorithm { + fn default() -> Self { + Self::HashBuildRightProbeLeft { + keys: Vec::default(), + } + } +} + +/// The left join algorithm used (c.f. [`GraphPattern::Minus`]). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum MinusAlgorithm { + HashBuildRightProbeLeft { keys: Vec<Variable> }, +} + +impl Default for MinusAlgorithm { + fn default() -> Self { + Self::HashBuildRightProbeLeft { + keys: Vec::default(), + } + } +} + +/// A set function used in aggregates (c.f. [`GraphPattern::Group`]). +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum AggregateExpression { + CountSolutions { + distinct: bool, + }, + FunctionCall { + name: AggregateFunction, + expr: Expression, + distinct: bool, + }, +} + +impl AggregateExpression { + fn from_sparql_algebra( + expression: &AlAggregateExpression, + graph_name: Option<&NamedNodePattern>, + ) -> Self { + match expression { + AlAggregateExpression::CountSolutions { distinct } => Self::CountSolutions { + distinct: *distinct, + }, + AlAggregateExpression::FunctionCall { + name, + expr, + distinct, + } => Self::FunctionCall { + name: name.clone(), + expr: Expression::from_sparql_algebra(expr, graph_name), + distinct: *distinct, + }, + } + } +} + +impl From<&AggregateExpression> for AlAggregateExpression { + fn from(expression: &AggregateExpression) -> Self { + match expression { + AggregateExpression::CountSolutions { distinct } => Self::CountSolutions { + distinct: *distinct, + }, + AggregateExpression::FunctionCall { + name, + expr, + distinct, + } => Self::FunctionCall { + name: name.clone(), + expr: expr.into(), + distinct: *distinct, + }, + } + } +} + +/// An ordering comparator used by [`GraphPattern::OrderBy`]. +#[derive(Eq, PartialEq, Debug, Clone, Hash)] +pub enum OrderExpression { + /// Ascending order + Asc(Expression), + /// Descending order + Desc(Expression), +} + +impl OrderExpression { + fn from_sparql_algebra( + expression: &AlOrderExpression, + graph_name: Option<&NamedNodePattern>, + ) -> Self { + match expression { + AlOrderExpression::Asc(e) => Self::Asc(Expression::from_sparql_algebra(e, graph_name)), + AlOrderExpression::Desc(e) => { + Self::Desc(Expression::from_sparql_algebra(e, graph_name)) + } + } + } +} + +impl From<&OrderExpression> for AlOrderExpression { + fn from(expression: &OrderExpression) -> Self { + match expression { + OrderExpression::Asc(e) => Self::Asc(e.into()), + OrderExpression::Desc(e) => Self::Desc(e.into()), + } + } +} + +fn new_var() -> Variable { + Variable::new_unchecked(format!("{:x}", random::<u128>())) +} + +fn order_pair<T: Hash>(a: T, b: T) -> (T, T) { + if hash(&a) <= hash(&b) { + (a, b) + } else { + (b, a) + } +} + +fn order_vec<T: Hash>(mut vec: Vec<T>) -> Vec<T> { + vec.sort_unstable_by_key(|a| hash(a)); + vec +} + +fn hash(v: impl Hash) -> u64 { + let mut hasher = DefaultHasher::new(); + v.hash(&mut hasher); + hasher.finish() +} + +fn lookup_term_pattern_variables<'a>( + pattern: &'a GroundTermPattern, + callback: &mut impl FnMut(&'a Variable), +) { + if let GroundTermPattern::Variable(v) = pattern { + callback(v); + } + #[cfg(feature = "rdf-star")] + if let GroundTermPattern::Triple(t) = pattern { + lookup_term_pattern_variables(&t.subject, callback); + if let NamedNodePattern::Variable(v) = &t.predicate { + callback(v); + } + lookup_term_pattern_variables(&t.object, callback); + } +} diff --git a/lib/sparopt/src/lib.rs b/lib/sparopt/src/lib.rs new file mode 100644 index 00000000..2182ff1e --- /dev/null +++ b/lib/sparopt/src/lib.rs @@ -0,0 +1,11 @@ +#![doc = include_str!("../README.md")] +#![doc(test(attr(deny(warnings))))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] + +pub use crate::optimizer::Optimizer; + +pub mod algebra; +mod optimizer; +mod type_inference; diff --git a/lib/sparopt/src/optimizer.rs b/lib/sparopt/src/optimizer.rs new file mode 100644 index 00000000..facc5b0c --- /dev/null +++ b/lib/sparopt/src/optimizer.rs @@ -0,0 +1,1083 @@ +use crate::algebra::{ + Expression, GraphPattern, JoinAlgorithm, LeftJoinAlgorithm, MinusAlgorithm, OrderExpression, +}; +use crate::type_inference::{ + infer_expression_type, infer_graph_pattern_types, VariableType, VariableTypes, +}; +use oxrdf::Variable; +use spargebra::algebra::PropertyPathExpression; +use spargebra::term::{GroundTermPattern, NamedNodePattern}; +use std::cmp::{max, min}; + +pub struct Optimizer; + +impl Optimizer { + pub fn optimize_graph_pattern(pattern: GraphPattern) -> GraphPattern { + let pattern = Self::normalize_pattern(pattern, &VariableTypes::default()); + let pattern = Self::reorder_joins(pattern, &VariableTypes::default()); + Self::push_filters(pattern, Vec::new(), &VariableTypes::default()) + } + + /// Normalize the pattern, discarding any join ordering information + fn normalize_pattern(pattern: GraphPattern, input_types: &VariableTypes) -> GraphPattern { + match pattern { + GraphPattern::QuadPattern { + subject, + predicate, + object, + graph_name, + } => GraphPattern::QuadPattern { + subject, + predicate, + object, + graph_name, + }, + GraphPattern::Path { + subject, + path, + object, + graph_name, + } => GraphPattern::Path { + subject, + path, + object, + graph_name, + }, + GraphPattern::Join { + left, + right, + algorithm, + } => GraphPattern::join( + Self::normalize_pattern(*left, input_types), + Self::normalize_pattern(*right, input_types), + algorithm, + ), + GraphPattern::LeftJoin { + left, + right, + expression, + algorithm, + } => { + let left = Self::normalize_pattern(*left, input_types); + let right = Self::normalize_pattern(*right, input_types); + let mut inner_types = infer_graph_pattern_types(&left, input_types.clone()); + inner_types.intersect_with(infer_graph_pattern_types(&right, input_types.clone())); + GraphPattern::left_join( + left, + right, + Self::normalize_expression(expression, &inner_types), + algorithm, + ) + } + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + let left = Self::normalize_pattern(*left, input_types); + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let right = Self::normalize_pattern(*right, &left_types); + GraphPattern::lateral(left, right) + } + GraphPattern::Filter { inner, expression } => { + let inner = Self::normalize_pattern(*inner, input_types); + let inner_types = infer_graph_pattern_types(&inner, input_types.clone()); + let expression = Self::normalize_expression(expression, &inner_types); + let expression_type = infer_expression_type(&expression, &inner_types); + if expression_type == VariableType::UNDEF { + GraphPattern::empty() + } else { + GraphPattern::filter(inner, expression) + } + } + GraphPattern::Union { inner } => GraphPattern::union_all( + inner + .into_iter() + .map(|e| Self::normalize_pattern(e, input_types)), + ), + GraphPattern::Extend { + inner, + variable, + expression, + } => { + let inner = Self::normalize_pattern(*inner, input_types); + let inner_types = infer_graph_pattern_types(&inner, input_types.clone()); + let expression = Self::normalize_expression(expression, &inner_types); + let expression_type = infer_expression_type(&expression, &inner_types); + if expression_type == VariableType::UNDEF { + // TODO: valid? + inner + } else { + GraphPattern::extend(inner, variable, expression) + } + } + GraphPattern::Minus { + left, + right, + algorithm, + } => GraphPattern::minus( + Self::normalize_pattern(*left, input_types), + Self::normalize_pattern(*right, input_types), + algorithm, + ), + GraphPattern::Values { + variables, + bindings, + } => GraphPattern::values(variables, bindings), + GraphPattern::OrderBy { inner, expression } => { + let inner = Self::normalize_pattern(*inner, input_types); + let inner_types = infer_graph_pattern_types(&inner, input_types.clone()); + GraphPattern::order_by( + inner, + expression + .into_iter() + .map(|e| match e { + OrderExpression::Asc(e) => { + OrderExpression::Asc(Self::normalize_expression(e, &inner_types)) + } + OrderExpression::Desc(e) => { + OrderExpression::Desc(Self::normalize_expression(e, &inner_types)) + } + }) + .collect(), + ) + } + GraphPattern::Project { inner, variables } => { + GraphPattern::project(Self::normalize_pattern(*inner, input_types), variables) + } + GraphPattern::Distinct { inner } => { + GraphPattern::distinct(Self::normalize_pattern(*inner, input_types)) + } + GraphPattern::Reduced { inner } => { + GraphPattern::reduced(Self::normalize_pattern(*inner, input_types)) + } + GraphPattern::Slice { + inner, + start, + length, + } => GraphPattern::slice(Self::normalize_pattern(*inner, input_types), start, length), + GraphPattern::Group { + inner, + variables, + aggregates, + } => { + // TODO: min, max and sample don't care about DISTINCT + GraphPattern::group( + Self::normalize_pattern(*inner, input_types), + variables, + aggregates, + ) + } + GraphPattern::Service { + name, + inner, + silent, + } => GraphPattern::service(Self::normalize_pattern(*inner, input_types), name, silent), + } + } + + fn normalize_expression(expression: Expression, types: &VariableTypes) -> Expression { + match expression { + Expression::NamedNode(node) => node.into(), + Expression::Literal(literal) => literal.into(), + Expression::Variable(variable) => variable.into(), + Expression::Or(inner) => Expression::or_all( + inner + .into_iter() + .map(|e| Self::normalize_expression(e, types)), + ), + Expression::And(inner) => Expression::and_all( + inner + .into_iter() + .map(|e| Self::normalize_expression(e, types)), + ), + Expression::Equal(left, right) => { + let left = Self::normalize_expression(*left, types); + let left_types = infer_expression_type(&left, types); + let right = Self::normalize_expression(*right, types); + let right_types = infer_expression_type(&right, types); + #[allow(unused_mut)] + let mut must_use_equal = left_types.literal && right_types.literal; + #[cfg(feature = "rdf-star")] + { + must_use_equal = must_use_equal || left_types.triple && right_types.triple; + } + if must_use_equal { + Expression::equal(left, right) + } else { + Expression::same_term(left, right) + } + } + Expression::SameTerm(left, right) => Expression::same_term( + Self::normalize_expression(*left, types), + Self::normalize_expression(*right, types), + ), + Expression::Greater(left, right) => Expression::greater( + Self::normalize_expression(*left, types), + Self::normalize_expression(*right, types), + ), + Expression::GreaterOrEqual(left, right) => Expression::greater_or_equal( + Self::normalize_expression(*left, types), + Self::normalize_expression(*right, types), + ), + Expression::Less(left, right) => Expression::less( + Self::normalize_expression(*left, types), + Self::normalize_expression(*right, types), + ), + Expression::LessOrEqual(left, right) => Expression::less_or_equal( + Self::normalize_expression(*left, types), + Self::normalize_expression(*right, types), + ), + Expression::Add(left, right) => { + Self::normalize_expression(*left, types) + Self::normalize_expression(*right, types) + } + Expression::Subtract(left, right) => { + Self::normalize_expression(*left, types) - Self::normalize_expression(*right, types) + } + Expression::Multiply(left, right) => { + Self::normalize_expression(*left, types) * Self::normalize_expression(*right, types) + } + Expression::Divide(left, right) => { + Self::normalize_expression(*left, types) / Self::normalize_expression(*right, types) + } + Expression::UnaryPlus(inner) => { + Expression::unary_plus(Self::normalize_expression(*inner, types)) + } + Expression::UnaryMinus(inner) => -Self::normalize_expression(*inner, types), + Expression::Not(inner) => !Self::normalize_expression(*inner, types), + Expression::Exists(inner) => Expression::exists(Self::normalize_pattern(*inner, types)), + Expression::Bound(variable) => { + let t = types.get(&variable); + if !t.undef { + true.into() + } else if t == VariableType::UNDEF { + false.into() + } else { + Expression::Bound(variable) + } + } + Expression::If(cond, then, els) => Expression::if_cond( + Self::normalize_expression(*cond, types), + Self::normalize_expression(*then, types), + Self::normalize_expression(*els, types), + ), + Expression::Coalesce(inners) => Expression::coalesce( + inners + .into_iter() + .map(|e| Self::normalize_expression(e, types)) + .collect(), + ), + Expression::FunctionCall(name, args) => Expression::call( + name, + args.into_iter() + .map(|e| Self::normalize_expression(e, types)) + .collect(), + ), + } + } + + fn push_filters( + pattern: GraphPattern, + mut filters: Vec<Expression>, + input_types: &VariableTypes, + ) -> GraphPattern { + match pattern { + GraphPattern::QuadPattern { .. } + | GraphPattern::Path { .. } + | GraphPattern::Values { .. } => { + GraphPattern::filter(pattern, Expression::and_all(filters)) + } + GraphPattern::Join { + left, + right, + algorithm, + } => { + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let right_types = infer_graph_pattern_types(&right, input_types.clone()); + let mut left_filters = Vec::new(); + let mut right_filters = Vec::new(); + let mut final_filters = Vec::new(); + for filter in filters { + let push_left = are_all_expression_variables_bound(&filter, &left_types); + let push_right = are_all_expression_variables_bound(&filter, &right_types); + if push_left { + if push_right { + left_filters.push(filter.clone()); + right_filters.push(filter); + } else { + left_filters.push(filter); + } + } else if push_right { + right_filters.push(filter); + } else { + final_filters.push(filter); + } + } + GraphPattern::filter( + GraphPattern::join( + Self::push_filters(*left, left_filters, input_types), + Self::push_filters(*right, right_filters, input_types), + algorithm, + ), + Expression::and_all(final_filters), + ) + } + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let mut left_filters = Vec::new(); + let mut right_filters = Vec::new(); + for filter in filters { + let push_left = are_all_expression_variables_bound(&filter, &left_types); + if push_left { + left_filters.push(filter); + } else { + right_filters.push(filter); + } + } + let left = Self::push_filters(*left, left_filters, input_types); + let right = Self::push_filters(*right, right_filters, &left_types); + if let GraphPattern::Filter { + inner: right, + expression, + } = right + { + // We prefer to have filter out of the lateral rather than inside the right part + GraphPattern::filter(GraphPattern::lateral(left, *right), expression) + } else { + GraphPattern::lateral(left, right) + } + } + GraphPattern::LeftJoin { + left, + right, + expression, + algorithm, + } => { + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let right_types = infer_graph_pattern_types(&right, input_types.clone()); + let mut left_filters = Vec::new(); + let mut right_filters = Vec::new(); + let mut final_filters = Vec::new(); + for filter in filters { + let push_left = are_all_expression_variables_bound(&filter, &left_types); + if push_left { + left_filters.push(filter); + } else { + final_filters.push(filter); + } + } + let expression = if expression.effective_boolean_value().is_none() + && (are_all_expression_variables_bound(&expression, &right_types) + || are_no_expression_variables_bound(&expression, &left_types)) + { + right_filters.push(expression); + true.into() + } else { + expression + }; + GraphPattern::filter( + GraphPattern::left_join( + Self::push_filters(*left, left_filters, input_types), + Self::push_filters(*right, right_filters, input_types), + expression, + algorithm, + ), + Expression::and_all(final_filters), + ) + } + GraphPattern::Minus { + left, + right, + algorithm, + } => GraphPattern::minus( + Self::push_filters(*left, filters, input_types), + Self::push_filters(*right, Vec::new(), input_types), + algorithm, + ), + GraphPattern::Extend { + inner, + expression, + variable, + } => { + // TODO: handle the case where the filter overrides an expression variable (should not happen in SPARQL but allowed in the algebra) + let mut inner_filters = Vec::new(); + let mut final_filters = Vec::new(); + for filter in filters { + let extend_variable_used = + filter.used_variables().into_iter().any(|v| *v == variable); + if extend_variable_used { + final_filters.push(filter); + } else { + inner_filters.push(filter); + } + } + GraphPattern::filter( + GraphPattern::extend( + Self::push_filters(*inner, inner_filters, input_types), + variable, + expression, + ), + Expression::and_all(final_filters), + ) + } + GraphPattern::Filter { inner, expression } => { + if let Expression::And(expressions) = expression { + filters.extend(expressions) + } else { + filters.push(expression) + }; + Self::push_filters(*inner, filters, input_types) + } + GraphPattern::Union { inner } => GraphPattern::union_all( + inner + .into_iter() + .map(|c| Self::push_filters(c, filters.clone(), input_types)), + ), + GraphPattern::Slice { + inner, + start, + length, + } => GraphPattern::filter( + GraphPattern::slice( + Self::push_filters(*inner, Vec::new(), input_types), + start, + length, + ), + Expression::and_all(filters), + ), + GraphPattern::Distinct { inner } => { + GraphPattern::distinct(Self::push_filters(*inner, filters, input_types)) + } + GraphPattern::Reduced { inner } => { + GraphPattern::reduced(Self::push_filters(*inner, filters, input_types)) + } + GraphPattern::Project { inner, variables } => { + GraphPattern::project(Self::push_filters(*inner, filters, input_types), variables) + } + GraphPattern::OrderBy { inner, expression } => { + GraphPattern::order_by(Self::push_filters(*inner, filters, input_types), expression) + } + GraphPattern::Service { + inner, + name, + silent, + } => GraphPattern::service( + Self::push_filters(*inner, filters, input_types), + name, + silent, + ), + GraphPattern::Group { + inner, + variables, + aggregates, + } => GraphPattern::filter( + GraphPattern::group( + Self::push_filters(*inner, Vec::new(), input_types), + variables, + aggregates, + ), + Expression::and_all(filters), + ), + } + } + + fn reorder_joins(pattern: GraphPattern, input_types: &VariableTypes) -> GraphPattern { + match pattern { + GraphPattern::QuadPattern { .. } + | GraphPattern::Path { .. } + | GraphPattern::Values { .. } => pattern, + GraphPattern::Join { left, right, .. } => { + // We flatten the join operation + let mut to_reorder = Vec::new(); + let mut todo = vec![*right, *left]; + while let Some(e) = todo.pop() { + if let GraphPattern::Join { left, right, .. } = e { + todo.push(*right); + todo.push(*left); + } else { + to_reorder.push(e); + } + } + + // We do first type inference + let to_reorder_types = to_reorder + .iter() + .map(|p| infer_graph_pattern_types(p, input_types.clone())) + .collect::<Vec<_>>(); + + // We do greedy join reordering + let mut output_cartesian_product_joins = Vec::new(); + let mut not_yet_reordered_ids = vec![true; to_reorder.len()]; + // We look for the next connected component to reorder and pick the smallest element + while let Some(next_entry_id) = not_yet_reordered_ids + .iter() + .enumerate() + .filter(|(_, v)| **v) + .map(|(i, _)| i) + .min_by_key(|i| estimate_graph_pattern_size(&to_reorder[*i], input_types)) + { + not_yet_reordered_ids[next_entry_id] = false; // It's now done + let mut output = to_reorder[next_entry_id].clone(); + let mut output_types = to_reorder_types[next_entry_id].clone(); + // We look for an other child to join with that does not blow up the join cost + while let Some(next_id) = not_yet_reordered_ids + .iter() + .enumerate() + .filter(|(_, v)| **v) + .map(|(i, _)| i) + .filter(|i| { + has_common_variables(&output_types, &to_reorder_types[*i], input_types) + }) + .min_by_key(|i| { + // Estimation of the join cost + if cfg!(feature = "sep-0006") + && is_fit_for_for_loop_join( + &to_reorder[*i], + input_types, + &output_types, + ) + { + estimate_lateral_cost( + &output, + &output_types, + &to_reorder[*i], + input_types, + ) + } else { + estimate_join_cost( + &output, + &to_reorder[*i], + &JoinAlgorithm::HashBuildLeftProbeRight { + keys: join_key_variables( + &output_types, + &to_reorder_types[*i], + input_types, + ), + }, + input_types, + ) + } + }) + { + not_yet_reordered_ids[next_id] = false; // It's now done + let next = to_reorder[next_id].clone(); + #[cfg(feature = "sep-0006")] + { + output = if is_fit_for_for_loop_join(&next, input_types, &output_types) + { + GraphPattern::lateral(output, next) + } else { + GraphPattern::join( + output, + next, + JoinAlgorithm::HashBuildLeftProbeRight { + keys: join_key_variables( + &output_types, + &to_reorder_types[next_id], + input_types, + ), + }, + ) + }; + } + #[cfg(not(feature = "sep-0006"))] + { + output = GraphPattern::join( + output, + next, + JoinAlgorithm::HashBuildLeftProbeRight { + keys: join_key_variables( + &output_types, + &to_reorder_types[next_id], + input_types, + ), + }, + ); + } + output_types.intersect_with(to_reorder_types[next_id].clone()); + } + output_cartesian_product_joins.push(output); + } + output_cartesian_product_joins + .into_iter() + .reduce(|left, right| { + let keys = join_key_variables( + &infer_graph_pattern_types(&left, input_types.clone()), + &infer_graph_pattern_types(&right, input_types.clone()), + input_types, + ); + if estimate_graph_pattern_size(&left, input_types) + <= estimate_graph_pattern_size(&right, input_types) + { + GraphPattern::join( + left, + right, + JoinAlgorithm::HashBuildLeftProbeRight { keys }, + ) + } else { + GraphPattern::join( + right, + left, + JoinAlgorithm::HashBuildLeftProbeRight { keys }, + ) + } + }) + .unwrap() + } + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + GraphPattern::lateral( + Self::reorder_joins(*left, input_types), + Self::reorder_joins(*right, &left_types), + ) + } + GraphPattern::LeftJoin { + left, + right, + expression, + .. + } => { + let left = Self::reorder_joins(*left, input_types); + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let right = Self::reorder_joins(*right, input_types); + let right_types = infer_graph_pattern_types(&right, input_types.clone()); + #[cfg(feature = "sep-0006")] + { + if is_fit_for_for_loop_join(&right, input_types, &left_types) + && has_common_variables(&left_types, &right_types, input_types) + { + return GraphPattern::lateral( + left, + GraphPattern::left_join( + GraphPattern::empty_singleton(), + right, + expression, + LeftJoinAlgorithm::HashBuildRightProbeLeft { keys: Vec::new() }, + ), + ); + } + } + GraphPattern::left_join( + left, + right, + expression, + LeftJoinAlgorithm::HashBuildRightProbeLeft { + keys: join_key_variables(&left_types, &right_types, input_types), + }, + ) + } + GraphPattern::Minus { left, right, .. } => { + let left = Self::reorder_joins(*left, input_types); + let left_types = infer_graph_pattern_types(&left, input_types.clone()); + let right = Self::reorder_joins(*right, input_types); + let right_types = infer_graph_pattern_types(&right, input_types.clone()); + GraphPattern::minus( + left, + right, + MinusAlgorithm::HashBuildRightProbeLeft { + keys: join_key_variables(&left_types, &right_types, input_types), + }, + ) + } + GraphPattern::Extend { + inner, + expression, + variable, + } => GraphPattern::extend( + Self::reorder_joins(*inner, input_types), + variable, + expression, + ), + GraphPattern::Filter { inner, expression } => { + GraphPattern::filter(Self::reorder_joins(*inner, input_types), expression) + } + GraphPattern::Union { inner } => GraphPattern::union_all( + inner + .into_iter() + .map(|c| Self::reorder_joins(c, input_types)), + ), + GraphPattern::Slice { + inner, + start, + length, + } => GraphPattern::slice(Self::reorder_joins(*inner, input_types), start, length), + GraphPattern::Distinct { inner } => { + GraphPattern::distinct(Self::reorder_joins(*inner, input_types)) + } + GraphPattern::Reduced { inner } => { + GraphPattern::reduced(Self::reorder_joins(*inner, input_types)) + } + GraphPattern::Project { inner, variables } => { + GraphPattern::project(Self::reorder_joins(*inner, input_types), variables) + } + GraphPattern::OrderBy { inner, expression } => { + GraphPattern::order_by(Self::reorder_joins(*inner, input_types), expression) + } + GraphPattern::Service { + inner, + name, + silent, + } => GraphPattern::service(Self::reorder_joins(*inner, input_types), name, silent), + GraphPattern::Group { + inner, + variables, + aggregates, + } => GraphPattern::group( + Self::reorder_joins(*inner, input_types), + variables, + aggregates, + ), + } + } +} + +fn is_fit_for_for_loop_join( + pattern: &GraphPattern, + global_input_types: &VariableTypes, + entry_types: &VariableTypes, +) -> bool { + // TODO: think more about it + match pattern { + GraphPattern::Values { .. } + | GraphPattern::QuadPattern { .. } + | GraphPattern::Path { .. } => true, + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + is_fit_for_for_loop_join(left, global_input_types, entry_types) + && is_fit_for_for_loop_join(right, global_input_types, entry_types) + } + GraphPattern::LeftJoin { + left, + right, + expression, + .. + } => { + if !is_fit_for_for_loop_join(left, global_input_types, entry_types) { + return false; + } + + // It is not ok to transform into for loop join if right binds a variable also bound by the entry part of the for loop join + let mut left_types = infer_graph_pattern_types(left, global_input_types.clone()); + let right_types = infer_graph_pattern_types(right, global_input_types.clone()); + if right_types.iter().any(|(variable, t)| { + *t != VariableType::UNDEF + && left_types.get(variable).undef + && entry_types.get(variable) != VariableType::UNDEF + }) { + return false; + } + + // We don't forget the final expression + left_types.intersect_with(right_types); + is_expression_fit_for_for_loop_join(expression, &left_types, entry_types) + } + GraphPattern::Union { inner } => inner + .iter() + .all(|i| is_fit_for_for_loop_join(i, global_input_types, entry_types)), + GraphPattern::Filter { inner, expression } => { + is_fit_for_for_loop_join(inner, global_input_types, entry_types) + && is_expression_fit_for_for_loop_join( + expression, + &infer_graph_pattern_types(inner, global_input_types.clone()), + entry_types, + ) + } + GraphPattern::Extend { + inner, + expression, + variable, + } => { + is_fit_for_for_loop_join(inner, global_input_types, entry_types) + && entry_types.get(variable) == VariableType::UNDEF + && is_expression_fit_for_for_loop_join( + expression, + &infer_graph_pattern_types(inner, global_input_types.clone()), + entry_types, + ) + } + GraphPattern::Join { .. } + | GraphPattern::Minus { .. } + | GraphPattern::Service { .. } + | GraphPattern::OrderBy { .. } + | GraphPattern::Distinct { .. } + | GraphPattern::Reduced { .. } + | GraphPattern::Slice { .. } + | GraphPattern::Project { .. } + | GraphPattern::Group { .. } => false, + } +} + +fn are_all_expression_variables_bound( + expression: &Expression, + variable_types: &VariableTypes, +) -> bool { + expression + .used_variables() + .into_iter() + .all(|v| !variable_types.get(v).undef) +} + +fn are_no_expression_variables_bound( + expression: &Expression, + variable_types: &VariableTypes, +) -> bool { + expression + .used_variables() + .into_iter() + .all(|v| variable_types.get(v) == VariableType::UNDEF) +} + +fn is_expression_fit_for_for_loop_join( + expression: &Expression, + input_types: &VariableTypes, + entry_types: &VariableTypes, +) -> bool { + match expression { + Expression::NamedNode(_) | Expression::Literal(_) => true, + Expression::Variable(v) | Expression::Bound(v) => { + !input_types.get(v).undef || entry_types.get(v) == VariableType::UNDEF + } + Expression::Or(inner) + | Expression::And(inner) + | Expression::Coalesce(inner) + | Expression::FunctionCall(_, inner) => inner + .iter() + .all(|e| is_expression_fit_for_for_loop_join(e, input_types, entry_types)), + Expression::Equal(a, b) + | Expression::SameTerm(a, b) + | Expression::Greater(a, b) + | Expression::GreaterOrEqual(a, b) + | Expression::Less(a, b) + | Expression::LessOrEqual(a, b) + | Expression::Add(a, b) + | Expression::Subtract(a, b) + | Expression::Multiply(a, b) + | Expression::Divide(a, b) => { + is_expression_fit_for_for_loop_join(a, input_types, entry_types) + && is_expression_fit_for_for_loop_join(b, input_types, entry_types) + } + Expression::UnaryPlus(e) | Expression::UnaryMinus(e) | Expression::Not(e) => { + is_expression_fit_for_for_loop_join(e, input_types, entry_types) + } + Expression::If(a, b, c) => { + is_expression_fit_for_for_loop_join(a, input_types, entry_types) + && is_expression_fit_for_for_loop_join(b, input_types, entry_types) + && is_expression_fit_for_for_loop_join(c, input_types, entry_types) + } + Expression::Exists(inner) => is_fit_for_for_loop_join(inner, input_types, entry_types), + } +} + +fn has_common_variables( + left: &VariableTypes, + right: &VariableTypes, + input_types: &VariableTypes, +) -> bool { + // TODO: we should be smart and count as shared variables FILTER(?a = ?b) + left.iter().any(|(variable, left_type)| { + !left_type.undef && !right.get(variable).undef && input_types.get(variable).undef + }) +} + +fn join_key_variables( + left: &VariableTypes, + right: &VariableTypes, + input_types: &VariableTypes, +) -> Vec<Variable> { + left.iter() + .filter(|(variable, left_type)| { + !left_type.undef && !right.get(variable).undef && input_types.get(variable).undef + }) + .map(|(variable, _)| variable.clone()) + .collect() +} + +fn estimate_graph_pattern_size(pattern: &GraphPattern, input_types: &VariableTypes) -> usize { + match pattern { + GraphPattern::Values { bindings, .. } => bindings.len(), + GraphPattern::QuadPattern { + subject, + predicate, + object, + .. + } => estimate_triple_pattern_size( + is_term_pattern_bound(subject, input_types), + is_named_node_pattern_bound(predicate, input_types), + is_term_pattern_bound(object, input_types), + ), + GraphPattern::Path { + subject, + path, + object, + .. + } => estimate_path_size( + is_term_pattern_bound(subject, input_types), + path, + is_term_pattern_bound(object, input_types), + ), + GraphPattern::Join { + left, + right, + algorithm, + } => estimate_join_cost(left, right, algorithm, input_types), + GraphPattern::LeftJoin { + left, + right, + algorithm, + .. + } => match algorithm { + LeftJoinAlgorithm::HashBuildRightProbeLeft { keys } => { + let left_size = estimate_graph_pattern_size(left, input_types); + max( + left_size, + left_size + .saturating_mul(estimate_graph_pattern_size( + right, + &infer_graph_pattern_types(right, input_types.clone()), + )) + .saturating_div(1_000_usize.saturating_pow(keys.len().try_into().unwrap())), + ) + } + }, + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => estimate_lateral_cost( + left, + &infer_graph_pattern_types(left, input_types.clone()), + right, + input_types, + ), + GraphPattern::Union { inner } => inner + .iter() + .map(|inner| estimate_graph_pattern_size(inner, input_types)) + .fold(0, usize::saturating_add), + GraphPattern::Minus { left, .. } => estimate_graph_pattern_size(left, input_types), + GraphPattern::Filter { inner, .. } + | GraphPattern::Extend { inner, .. } + | GraphPattern::OrderBy { inner, .. } + | GraphPattern::Project { inner, .. } + | GraphPattern::Distinct { inner, .. } + | GraphPattern::Reduced { inner, .. } + | GraphPattern::Group { inner, .. } + | GraphPattern::Service { inner, .. } => estimate_graph_pattern_size(inner, input_types), + GraphPattern::Slice { + inner, + start, + length, + } => { + let inner = estimate_graph_pattern_size(inner, input_types); + if let Some(length) = length { + min(inner, *length - *start) + } else { + inner + } + } + } +} + +fn estimate_join_cost( + left: &GraphPattern, + right: &GraphPattern, + algorithm: &JoinAlgorithm, + input_types: &VariableTypes, +) -> usize { + match algorithm { + JoinAlgorithm::HashBuildLeftProbeRight { keys } => { + estimate_graph_pattern_size(left, input_types) + .saturating_mul(estimate_graph_pattern_size(right, input_types)) + .saturating_div(1_000_usize.saturating_pow(keys.len().try_into().unwrap())) + } + } +} +fn estimate_lateral_cost( + left: &GraphPattern, + left_types: &VariableTypes, + right: &GraphPattern, + input_types: &VariableTypes, +) -> usize { + estimate_graph_pattern_size(left, input_types) + .saturating_mul(estimate_graph_pattern_size(right, left_types)) +} + +fn estimate_triple_pattern_size( + subject_bound: bool, + predicate_bound: bool, + object_bound: bool, +) -> usize { + match (subject_bound, predicate_bound, object_bound) { + (true, true, true) => 1, + (true, true, false) => 10, + (true, false, true) => 2, + (false, true, true) => 10_000, + (true, false, false) => 100, + (false, false, false) => 1_000_000_000, + (false, true, false) => 1_000_000, + (false, false, true) => 100_000, + } +} + +fn estimate_path_size(start_bound: bool, path: &PropertyPathExpression, end_bound: bool) -> usize { + match path { + PropertyPathExpression::NamedNode(_) => { + estimate_triple_pattern_size(start_bound, true, end_bound) + } + PropertyPathExpression::Reverse(p) => estimate_path_size(end_bound, p, start_bound), + PropertyPathExpression::Sequence(a, b) => { + // We do a for loop join in the best direction + min( + estimate_path_size(start_bound, a, false) + .saturating_mul(estimate_path_size(true, b, end_bound)), + estimate_path_size(start_bound, a, true) + .saturating_mul(estimate_path_size(false, b, end_bound)), + ) + } + PropertyPathExpression::Alternative(a, b) => estimate_path_size(start_bound, a, end_bound) + .saturating_add(estimate_path_size(start_bound, b, end_bound)), + PropertyPathExpression::ZeroOrMore(p) => { + if start_bound && end_bound { + 1 + } else if start_bound || end_bound { + estimate_path_size(start_bound, p, end_bound).saturating_mul(1000) + } else { + 1_000_000_000 + } + } + PropertyPathExpression::OneOrMore(p) => { + if start_bound && end_bound { + 1 + } else { + estimate_path_size(start_bound, p, end_bound).saturating_mul(1000) + } + } + PropertyPathExpression::ZeroOrOne(p) => { + if start_bound && end_bound { + 1 + } else if start_bound || end_bound { + estimate_path_size(start_bound, p, end_bound) + } else { + 1_000_000_000 + } + } + PropertyPathExpression::NegatedPropertySet(_) => { + estimate_triple_pattern_size(start_bound, false, end_bound) + } + } +} + +fn is_term_pattern_bound(pattern: &GroundTermPattern, input_types: &VariableTypes) -> bool { + match pattern { + GroundTermPattern::NamedNode(_) | GroundTermPattern::Literal(_) => true, + GroundTermPattern::Variable(v) => !input_types.get(v).undef, + #[cfg(feature = "rdf-star")] + GroundTermPattern::Triple(t) => { + is_term_pattern_bound(&t.subject, input_types) + && is_named_node_pattern_bound(&t.predicate, input_types) + && is_term_pattern_bound(&t.object, input_types) + } + } +} + +fn is_named_node_pattern_bound(pattern: &NamedNodePattern, input_types: &VariableTypes) -> bool { + match pattern { + NamedNodePattern::NamedNode(_) => true, + NamedNodePattern::Variable(v) => !input_types.get(v).undef, + } +} diff --git a/lib/sparopt/src/type_inference.rs b/lib/sparopt/src/type_inference.rs new file mode 100644 index 00000000..d53b63e4 --- /dev/null +++ b/lib/sparopt/src/type_inference.rs @@ -0,0 +1,458 @@ +use crate::algebra::{Expression, GraphPattern}; +use oxrdf::Variable; +use spargebra::algebra::Function; +use spargebra::term::{GroundTerm, GroundTermPattern, NamedNodePattern}; +use std::collections::HashMap; +use std::ops::{BitAnd, BitOr}; + +pub fn infer_graph_pattern_types( + pattern: &GraphPattern, + mut types: VariableTypes, +) -> VariableTypes { + match pattern { + GraphPattern::QuadPattern { + subject, + predicate, + object, + graph_name, + } => { + add_ground_term_pattern_types(subject, &mut types, false); + if let NamedNodePattern::Variable(v) = predicate { + types.intersect_variable_with(v.clone(), VariableType::NAMED_NODE) + } + add_ground_term_pattern_types(object, &mut types, true); + if let Some(NamedNodePattern::Variable(v)) = graph_name { + types.intersect_variable_with(v.clone(), VariableType::NAMED_NODE) + } + types + } + GraphPattern::Path { + subject, + object, + graph_name, + .. + } => { + add_ground_term_pattern_types(subject, &mut types, false); + add_ground_term_pattern_types(object, &mut types, true); + if let Some(NamedNodePattern::Variable(v)) = graph_name { + types.intersect_variable_with(v.clone(), VariableType::NAMED_NODE) + } + types + } + GraphPattern::Join { left, right, .. } => { + let mut output_types = infer_graph_pattern_types(left, types.clone()); + output_types.intersect_with(infer_graph_pattern_types(right, types)); + output_types + } + #[cfg(feature = "sep-0006")] + GraphPattern::Lateral { left, right } => { + infer_graph_pattern_types(right, infer_graph_pattern_types(left, types)) + } + GraphPattern::LeftJoin { left, right, .. } => { + let mut right_types = infer_graph_pattern_types(right, types.clone()); // TODO: expression + for t in right_types.inner.values_mut() { + t.undef = true; // Right might be unset + } + let mut output_types = infer_graph_pattern_types(left, types); + output_types.intersect_with(right_types); + output_types + } + GraphPattern::Minus { left, .. } => infer_graph_pattern_types(left, types), + GraphPattern::Union { inner } => inner + .iter() + .map(|inner| infer_graph_pattern_types(inner, types.clone())) + .reduce(|mut a, b| { + a.union_with(b); + a + }) + .unwrap_or_default(), + GraphPattern::Extend { + inner, + variable, + expression, + } => { + let mut types = infer_graph_pattern_types(inner, types); + types.intersect_variable_with( + variable.clone(), + infer_expression_type(expression, &types), + ); + types + } + GraphPattern::Filter { inner, .. } => infer_graph_pattern_types(inner, types), + GraphPattern::Project { inner, variables } => VariableTypes { + inner: infer_graph_pattern_types(inner, types) + .inner + .into_iter() + .filter(|(v, _)| variables.contains(v)) + .collect(), + }, + GraphPattern::Distinct { inner } + | GraphPattern::Reduced { inner } + | GraphPattern::OrderBy { inner, .. } + | GraphPattern::Slice { inner, .. } => infer_graph_pattern_types(inner, types), + GraphPattern::Group { + inner, + variables, + aggregates, + } => { + let types = infer_graph_pattern_types(inner, types); + VariableTypes { + inner: infer_graph_pattern_types(inner, types) + .inner + .into_iter() + .filter(|(v, _)| variables.contains(v)) + .chain(aggregates.iter().map(|(v, _)| (v.clone(), VariableType::ANY))) //TODO: guess from aggregate + .collect(), + } + } + GraphPattern::Values { + variables, + bindings, + } => { + for (i, v) in variables.iter().enumerate() { + let mut t = VariableType::default(); + for binding in bindings { + match binding[i] { + Some(GroundTerm::NamedNode(_)) => t.named_node = true, + Some(GroundTerm::Literal(_)) => t.literal = true, + #[cfg(feature = "rdf-star")] + Some(GroundTerm::Triple(_)) => t.triple = true, + None => t.undef = true, + } + } + types.intersect_variable_with(v.clone(), t) + } + types + } + GraphPattern::Service { + name, + inner, + silent, + } => { + let parent_types = types.clone(); + let mut types = infer_graph_pattern_types(inner, types); + if let NamedNodePattern::Variable(v) = name { + types.intersect_variable_with(v.clone(), VariableType::NAMED_NODE) + } + if *silent { + // On failure, single empty solution + types.union_with(parent_types); + } + types + } + } +} + +fn add_ground_term_pattern_types( + pattern: &GroundTermPattern, + types: &mut VariableTypes, + is_object: bool, +) { + if let GroundTermPattern::Variable(v) = pattern { + types.intersect_variable_with( + v.clone(), + if is_object { + VariableType::TERM + } else { + VariableType::SUBJECT + }, + ) + } + #[cfg(feature = "rdf-star")] + if let GroundTermPattern::Triple(t) = pattern { + add_ground_term_pattern_types(&t.subject, types, false); + if let NamedNodePattern::Variable(v) = &t.predicate { + types.intersect_variable_with(v.clone(), VariableType::NAMED_NODE) + } + add_ground_term_pattern_types(&t.object, types, true); + } +} + +pub fn infer_expression_type(expression: &Expression, types: &VariableTypes) -> VariableType { + match expression { + Expression::NamedNode(_) => VariableType::NAMED_NODE, + Expression::Literal(_) | Expression::Exists(_) | Expression::Bound(_) => { + VariableType::LITERAL + } + Expression::Variable(v) => types.get(v), + Expression::FunctionCall(Function::Datatype | Function::Iri, _) => { + VariableType::NAMED_NODE | VariableType::UNDEF + } + #[cfg(feature = "rdf-star")] + Expression::FunctionCall(Function::Predicate, _) => { + VariableType::NAMED_NODE | VariableType::UNDEF + } + Expression::FunctionCall(Function::BNode, args) => { + if args.is_empty() { + VariableType::BLANK_NODE + } else { + VariableType::BLANK_NODE | VariableType::UNDEF + } + } + Expression::FunctionCall( + Function::Rand | Function::Now | Function::Uuid | Function::StrUuid, + _, + ) => VariableType::LITERAL, + Expression::Or(_) + | Expression::And(_) + | Expression::Equal(_, _) + | Expression::Greater(_, _) + | Expression::GreaterOrEqual(_, _) + | Expression::Less(_, _) + | Expression::LessOrEqual(_, _) + | Expression::Add(_, _) + | Expression::Subtract(_, _) + | Expression::Multiply(_, _) + | Expression::Divide(_, _) + | Expression::UnaryPlus(_) + | Expression::UnaryMinus(_) + | Expression::Not(_) + | Expression::FunctionCall( + Function::Str + | Function::Lang + | Function::LangMatches + | Function::Abs + | Function::Ceil + | Function::Floor + | Function::Round + | Function::Concat + | Function::SubStr + | Function::StrLen + | Function::Replace + | Function::UCase + | Function::LCase + | Function::EncodeForUri + | Function::Contains + | Function::StrStarts + | Function::StrEnds + | Function::StrBefore + | Function::StrAfter + | Function::Year + | Function::Month + | Function::Day + | Function::Hours + | Function::Minutes + | Function::Seconds + | Function::Timezone + | Function::Tz + | Function::Md5 + | Function::Sha1 + | Function::Sha256 + | Function::Sha384 + | Function::Sha512 + | Function::StrLang + | Function::StrDt + | Function::IsIri + | Function::IsBlank + | Function::IsLiteral + | Function::IsNumeric + | Function::Regex, + _, + ) => VariableType::LITERAL | VariableType::UNDEF, + #[cfg(feature = "sep-0002")] + Expression::FunctionCall(Function::Adjust, _) => { + VariableType::LITERAL | VariableType::UNDEF + } + #[cfg(feature = "rdf-star")] + Expression::FunctionCall(Function::IsTriple, _) => { + VariableType::LITERAL | VariableType::UNDEF + } + Expression::SameTerm(left, right) => { + if infer_expression_type(left, types).undef || infer_expression_type(right, types).undef + { + VariableType::LITERAL | VariableType::UNDEF + } else { + VariableType::LITERAL + } + } + Expression::If(_, then, els) => { + infer_expression_type(then, types) | infer_expression_type(els, types) + } + Expression::Coalesce(inner) => { + let mut t = VariableType::UNDEF; + for e in inner { + let new = infer_expression_type(e, types); + t = t | new; + if !new.undef { + t.undef = false; + return t; + } + } + t + } + #[cfg(feature = "rdf-star")] + Expression::FunctionCall(Function::Triple, _) => VariableType::TRIPLE | VariableType::UNDEF, + #[cfg(feature = "rdf-star")] + Expression::FunctionCall(Function::Subject, _) => { + VariableType::SUBJECT | VariableType::UNDEF + } + #[cfg(feature = "rdf-star")] + Expression::FunctionCall(Function::Object, _) => VariableType::TERM | VariableType::UNDEF, + Expression::FunctionCall(Function::Custom(_), _) => VariableType::ANY, + } +} + +#[derive(Default, Clone, Debug)] +pub struct VariableTypes { + inner: HashMap<Variable, VariableType>, +} + +impl VariableTypes { + pub fn get(&self, variable: &Variable) -> VariableType { + self.inner + .get(variable) + .copied() + .unwrap_or(VariableType::UNDEF) + } + + pub fn iter(&self) -> impl Iterator<Item = (&Variable, &VariableType)> { + self.inner.iter() + } + + pub fn intersect_with(&mut self, other: Self) { + for (v, t) in other.inner { + self.intersect_variable_with(v, t); + } + } + + pub fn union_with(&mut self, other: Self) { + for (v, t) in &mut self.inner { + if other.get(v).undef { + t.undef = true; // Might be undefined + } + } + for (v, mut t) in other.inner { + self.inner + .entry(v) + .and_modify(|ex| *ex = *ex | t) + .or_insert({ + t.undef = true; + t + }); + } + } + + fn intersect_variable_with(&mut self, variable: Variable, t: VariableType) { + let t = self.get(&variable) & t; + if t != VariableType::UNDEF { + self.inner.insert(variable, t); + } + } +} + +#[allow(clippy::struct_excessive_bools)] +#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)] +pub struct VariableType { + pub undef: bool, + pub named_node: bool, + pub blank_node: bool, + pub literal: bool, + #[cfg(feature = "rdf-star")] + pub triple: bool, +} + +impl VariableType { + const ANY: Self = Self { + undef: true, + named_node: true, + blank_node: true, + literal: true, + #[cfg(feature = "rdf-star")] + triple: true, + }; + const BLANK_NODE: Self = Self { + undef: false, + named_node: false, + blank_node: true, + literal: false, + #[cfg(feature = "rdf-star")] + triple: false, + }; + const LITERAL: Self = Self { + undef: false, + named_node: false, + blank_node: false, + literal: true, + #[cfg(feature = "rdf-star")] + triple: false, + }; + const NAMED_NODE: Self = Self { + undef: false, + named_node: true, + blank_node: false, + literal: false, + #[cfg(feature = "rdf-star")] + triple: false, + }; + const SUBJECT: Self = Self { + undef: false, + named_node: true, + blank_node: true, + literal: false, + #[cfg(feature = "rdf-star")] + triple: true, + }; + const TERM: Self = Self { + undef: false, + named_node: true, + blank_node: true, + literal: true, + #[cfg(feature = "rdf-star")] + triple: true, + }; + #[cfg(feature = "rdf-star")] + const TRIPLE: Self = Self { + undef: false, + named_node: false, + blank_node: false, + literal: false, + triple: true, + }; + pub const UNDEF: Self = Self { + undef: true, + named_node: false, + blank_node: false, + literal: false, + #[cfg(feature = "rdf-star")] + triple: false, + }; +} + +impl BitOr for VariableType { + type Output = Self; + + fn bitor(self, other: Self) -> Self { + Self { + undef: self.undef || other.undef, + named_node: self.named_node || other.named_node, + blank_node: self.blank_node || other.blank_node, + literal: self.literal || other.literal, + #[cfg(feature = "rdf-star")] + triple: self.triple || other.triple, + } + } +} + +impl BitAnd for VariableType { + type Output = Self; + + #[allow(clippy::nonminimal_bool)] + fn bitand(self, other: Self) -> Self { + Self { + undef: self.undef && other.undef, + named_node: self.named_node && other.named_node + || (self.undef && other.named_node) + || (self.named_node && other.undef), + blank_node: self.blank_node && other.blank_node + || (self.undef && other.blank_node) + || (self.blank_node && other.undef), + literal: self.literal && other.literal + || (self.undef && other.literal) + || (self.literal && other.undef), + #[cfg(feature = "rdf-star")] + triple: self.triple && other.triple + || (self.undef && other.triple) + || (self.triple && other.undef), + } + } +} diff --git a/lib/sparql-smith/Cargo.toml b/lib/sparql-smith/Cargo.toml index bd025f78..5d0a5680 100644 --- a/lib/sparql-smith/Cargo.toml +++ b/lib/sparql-smith/Cargo.toml @@ -1,17 +1,17 @@ [package] name = "sparql-smith" -version = "0.1.0-alpha.4" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" +version = "0.1.0-alpha.5" +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["SPARQL"] repository = "https://github.com/oxigraph/oxigraph/tree/main/lib/sparql-smith" -homepage = "https://oxigraph.org/" documentation = "https://docs.rs/sparql-smith" description = """ A SPARQL test cases generator """ -edition = "2021" +edition.workspace = true +rust-version.workspace = true [features] default = [] @@ -19,5 +19,8 @@ limit-offset = ["order"] order = [] sep-0006 = [] +[lints] +workspace = true + [dependencies] -arbitrary = { version = "1", features = ["derive"] } +arbitrary = { workspace = true, features = ["derive"] } diff --git a/lib/sparql-smith/README.md b/lib/sparql-smith/README.md index a02586b4..f637870c 100644 --- a/lib/sparql-smith/README.md +++ b/lib/sparql-smith/README.md @@ -5,7 +5,7 @@ SPARQL smith [](https://docs.rs/sparql-smith) [](https://crates.io/crates/sparql-smith) [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) sparql-smith is a test case generator for the [SPARQL](https://www.w3.org/TR/sparql11-overview/) language. diff --git a/lib/sparql-smith/src/lib.rs b/lib/sparql-smith/src/lib.rs index 01ca45e5..6b114d68 100644 --- a/lib/sparql-smith/src/lib.rs +++ b/lib/sparql-smith/src/lib.rs @@ -35,8 +35,8 @@ pub struct Query { #[derive(Arbitrary)] struct QueryContent { - // [1] QueryUnit ::= Query - // [2] Query ::= Prologue ( SelectQuery | ConstructQuery | DescribeQuery | AskQuery ) ValuesClause + // [1] QueryUnit ::= Query + // [2] Query ::= Prologue ( SelectQuery | ConstructQuery | DescribeQuery | AskQuery ) ValuesClause variant: QueryVariant, values_clause: ValuesClause, } @@ -44,7 +44,7 @@ struct QueryContent { #[derive(Arbitrary)] enum QueryVariant { Select(SelectQuery), - //TODO: Other variants! + // TODO: Other variants! } impl<'a> Arbitrary<'a> for Query { @@ -82,7 +82,7 @@ impl fmt::Debug for Query { #[derive(Arbitrary)] struct SelectQuery { - // [7] SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier + // [7] SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier select_clause: SelectClause, where_clause: WhereClause, solution_modifier: SolutionModifier, @@ -100,7 +100,7 @@ impl fmt::Display for SelectQuery { #[derive(Arbitrary)] struct SubSelect { - // [8] SubSelect ::= SelectClause WhereClause SolutionModifier ValuesClause + // [8] SubSelect ::= SelectClause WhereClause SolutionModifier ValuesClause select_clause: SelectClause, where_clause: WhereClause, solution_modifier: SolutionModifier, @@ -119,7 +119,7 @@ impl fmt::Display for SubSelect { #[derive(Arbitrary)] struct SelectClause { - // [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' ) + // [9] SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' ) option: Option<SelectOption>, values: SelectValues, } @@ -147,15 +147,15 @@ enum SelectProjection { impl fmt::Display for SelectClause { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "SELECT")?; + f.write_str("SELECT")?; if let Some(option) = &self.option { match option { - SelectOption::Distinct => write!(f, " DISTINCT"), - SelectOption::Reduced => write!(f, " REDUCED"), + SelectOption::Distinct => f.write_str(" DISTINCT"), + SelectOption::Reduced => f.write_str(" REDUCED"), }?; } match &self.values { - SelectValues::Star => write!(f, " *"), + SelectValues::Star => f.write_str(" *"), SelectValues::Projection { start, others } => { for e in once(start).chain(others) { match e { @@ -171,7 +171,7 @@ impl fmt::Display for SelectClause { #[derive(Arbitrary)] struct WhereClause { - // [17] WhereClause ::= 'WHERE'? GroupGraphPattern + // [17] WhereClause ::= 'WHERE'? GroupGraphPattern with_where: bool, group_graph_pattern: GroupGraphPattern, } @@ -179,7 +179,7 @@ struct WhereClause { impl fmt::Display for WhereClause { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.with_where { - write!(f, " WHERE ")?; + f.write_str(" WHERE ")?; } write!(f, "{}", self.group_graph_pattern) } @@ -187,7 +187,7 @@ impl fmt::Display for WhereClause { #[derive(Arbitrary)] struct SolutionModifier { - // [18] SolutionModifier ::= GroupClause? HavingClause? OrderClause? LimitOffsetClauses? + // [18] SolutionModifier ::= GroupClause? HavingClause? OrderClause? LimitOffsetClauses? group: Option<GroupClause>, having: Option<HavingClause>, #[cfg(feature = "order")] @@ -218,7 +218,7 @@ impl fmt::Display for SolutionModifier { #[derive(Arbitrary)] struct GroupClause { - // [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+ + // [19] GroupClause ::= 'GROUP' 'BY' GroupCondition+ start: GroupCondition, others: Vec<GroupCondition>, } @@ -235,7 +235,7 @@ impl fmt::Display for GroupClause { #[derive(Arbitrary)] enum GroupCondition { - // [20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var + // [20] GroupCondition ::= BuiltInCall | FunctionCall | '(' Expression ( 'AS' Var )? ')' | Var BuiltInCall(BuiltInCall), // TODO FunctionCall(FunctionCall) Projection(Expression, Option<Var>), @@ -246,7 +246,7 @@ impl fmt::Display for GroupCondition { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::BuiltInCall(c) => write!(f, "{c}"), - //Self::FunctionCall(c) => write!(f, "{}", c), + // Self::FunctionCall(c) => write!(f, "{c}"), Self::Projection(e, v) => { if let Some(v) = v { write!(f, "({e} AS {v})") @@ -261,7 +261,7 @@ impl fmt::Display for GroupCondition { #[derive(Arbitrary)] struct HavingClause { - // [21] HavingClause ::= 'HAVING' HavingCondition+ + // [21] HavingClause ::= 'HAVING' HavingCondition+ start: HavingCondition, others: Vec<HavingCondition>, } @@ -276,13 +276,13 @@ impl fmt::Display for HavingClause { } } -// [22] HavingCondition ::= Constraint +// [22] HavingCondition ::= Constraint type HavingCondition = Constraint; #[cfg(feature = "order")] #[derive(Arbitrary)] struct OrderClause { - // [23] OrderClause ::= 'ORDER' 'BY' OrderCondition+ + // [23] OrderClause ::= 'ORDER' 'BY' OrderCondition+ start: OrderCondition, others: Vec<OrderCondition>, } @@ -301,7 +301,7 @@ impl fmt::Display for OrderClause { #[cfg(feature = "order")] #[derive(Arbitrary)] enum OrderCondition { - // [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var ) + // [24] OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var ) BrackettedExpression { is_asc: bool, inner: BrackettedExpression, @@ -330,7 +330,7 @@ impl fmt::Display for OrderCondition { #[cfg(feature = "limit-offset")] #[derive(Arbitrary)] enum LimitOffsetClauses { - // [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause? + // [25] LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause? LimitOffset(LimitClause, Option<OffsetClause>), OffsetLimit(OffsetClause, Option<LimitClause>), } @@ -350,7 +350,7 @@ impl fmt::Display for LimitOffsetClauses { #[cfg(feature = "limit-offset")] #[derive(Arbitrary)] struct LimitClause { - // [26] LimitClause ::= 'LIMIT' INTEGER + // [26] LimitClause ::= 'LIMIT' INTEGER value: u8, } @@ -364,7 +364,7 @@ impl fmt::Display for LimitClause { #[cfg(feature = "limit-offset")] #[derive(Arbitrary)] struct OffsetClause { - // [27] OffsetClause ::= 'OFFSET' INTEGER + // [27] OffsetClause ::= 'OFFSET' INTEGER value: u8, } @@ -377,7 +377,7 @@ impl fmt::Display for OffsetClause { #[derive(Arbitrary)] struct ValuesClause { - // [28] ValuesClause ::= ( 'VALUES' DataBlock )? + // [28] ValuesClause ::= ( 'VALUES' DataBlock )? value: Option<DataBlock>, } @@ -393,25 +393,25 @@ impl fmt::Display for ValuesClause { #[derive(Arbitrary)] enum GroupGraphPattern { - // [53] GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub ) '}' + // [53] GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub ) '}' GroupGraphPatternSub(GroupGraphPatternSub), SubSelect(Box<SubSelect>), } impl fmt::Display for GroupGraphPattern { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, " {{ ")?; + f.write_str(" { ")?; match self { Self::GroupGraphPatternSub(p) => write!(f, "{p}"), Self::SubSelect(s) => write!(f, "{s}"), }?; - write!(f, " }} ") + f.write_str(" } ") } } #[derive(Arbitrary)] struct GroupGraphPatternSub { - // [54] GroupGraphPatternSub ::= TriplesBlock? ( GraphPatternNotTriples '.'? TriplesBlock? )* + // [54] GroupGraphPatternSub ::= TriplesBlock? ( GraphPatternNotTriples '.'? TriplesBlock? )* start: Option<TriplesBlock>, others: Vec<GroupGraphPatternSubOtherBlock>, } @@ -431,7 +431,7 @@ impl fmt::Display for GroupGraphPatternSub { for other in &self.others { write!(f, "{}", other.start)?; if other.with_dot { - write!(f, " . ")?; + f.write_str(" . ")?; } if let Some(end) = &other.end { write!(f, "{end}")?; @@ -443,7 +443,7 @@ impl fmt::Display for GroupGraphPatternSub { #[derive(Arbitrary)] struct TriplesBlock { - // [55] TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock? )? + // [55] TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock? )? start: TriplesSameSubjectPath, end: Option<Option<Box<TriplesBlock>>>, } @@ -452,7 +452,7 @@ impl fmt::Display for TriplesBlock { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.start)?; if let Some(end) = &self.end { - write!(f, " . ")?; + f.write_str(" . ")?; if let Some(end) = end { write!(f, "{end}")?; } @@ -463,7 +463,7 @@ impl fmt::Display for TriplesBlock { #[derive(Arbitrary)] enum GraphPatternNotTriples { - // [56] GraphPatternNotTriples ::= GroupOrUnionGraphPattern | OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern | ServiceGraphPattern | Filter | Bind | InlineData + // [56] GraphPatternNotTriples ::= GroupOrUnionGraphPattern | OptionalGraphPattern | MinusGraphPattern | GraphGraphPattern | ServiceGraphPattern | Filter | Bind | InlineData GroupOrUnion(GroupOrUnionGraphPattern), Optional(OptionalGraphPattern), Minus(MinusGraphPattern), @@ -493,7 +493,7 @@ impl fmt::Display for GraphPatternNotTriples { #[derive(Arbitrary)] struct OptionalGraphPattern { - // [57] OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern + // [57] OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern inner: GroupGraphPattern, } @@ -505,7 +505,7 @@ impl fmt::Display for OptionalGraphPattern { #[derive(Arbitrary)] struct LateralGraphPattern { - // [] LateralGraphPattern ::= 'LATERAL' GroupGraphPattern + // [] LateralGraphPattern ::= 'LATERAL' GroupGraphPattern inner: GroupGraphPattern, } @@ -517,7 +517,7 @@ impl fmt::Display for LateralGraphPattern { #[derive(Arbitrary)] struct GraphGraphPattern { - // [58] GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern + // [58] GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern graph: VarOrIri, inner: GroupGraphPattern, } @@ -530,7 +530,7 @@ impl fmt::Display for GraphGraphPattern { #[derive(Arbitrary)] struct Bind { - // [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')' + // [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')' expression: Expression, var: Var, } @@ -543,19 +543,19 @@ impl fmt::Display for Bind { #[derive(Arbitrary)] struct InlineData { - // [61] InlineData ::= 'VALUES' DataBlock + // [61] InlineData ::= 'VALUES' DataBlock inner: DataBlock, } impl fmt::Display for InlineData { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "VALUES {}", &self.inner) + write!(f, "VALUES {}", self.inner) } } #[derive(Arbitrary)] enum DataBlock { - // [62] DataBlock ::= InlineDataOneVar | InlineDataFull + // [62] DataBlock ::= InlineDataOneVar | InlineDataFull OneVar(InlineDataOneVar), Full(InlineDataFull), } @@ -571,7 +571,7 @@ impl fmt::Display for DataBlock { #[derive(Arbitrary)] struct InlineDataOneVar { - // [63] InlineDataOneVar ::= Var '{' DataBlockValue* '}' + // [63] InlineDataOneVar ::= Var '{' DataBlockValue* '}' var: Var, values: Vec<DataBlockValue>, } @@ -587,7 +587,7 @@ impl fmt::Display for InlineDataOneVar { } struct InlineDataFull { - // [64] InlineDataFull ::= ( NIL | '(' Var* ')' ) '{' ( '(' DataBlockValue* ')' | NIL )* '}' + // [64] InlineDataFull ::= ( NIL | '(' Var* ')' ) '{' ( '(' DataBlockValue* ')' | NIL )* '}' vars: Vec<Var>, values: Vec<Vec<DataBlockValue>>, } @@ -617,25 +617,25 @@ impl<'a> Arbitrary<'a> for InlineDataFull { impl fmt::Display for InlineDataFull { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "( ")?; + f.write_str("( ")?; for v in &self.vars { write!(f, " {v}")?; } - write!(f, " ) {{")?; + f.write_str(" ) {")?; for vs in &self.values { - write!(f, " (")?; + f.write_str(" (")?; for v in vs { write!(f, " {v}")?; } - write!(f, " )")?; + f.write_str(" )")?; } - write!(f, " }}") + f.write_str(" }") } } #[derive(Arbitrary)] enum DataBlockValue { - // [65] DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF' + // [65] DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF' Iri(Iri), Literal(Literal), Undef, @@ -646,14 +646,14 @@ impl fmt::Display for DataBlockValue { match self { Self::Iri(i) => write!(f, "{i}"), Self::Literal(l) => write!(f, "{l}"), - Self::Undef => write!(f, "UNDEF"), + Self::Undef => f.write_str("UNDEF"), } } } #[derive(Arbitrary)] struct MinusGraphPattern { - // [66] MinusGraphPattern ::= 'MINUS' GroupGraphPattern + // [66] MinusGraphPattern ::= 'MINUS' GroupGraphPattern inner: GroupGraphPattern, } @@ -665,7 +665,7 @@ impl fmt::Display for MinusGraphPattern { #[derive(Arbitrary)] struct GroupOrUnionGraphPattern { - // [67] GroupOrUnionGraphPattern ::= GroupGraphPattern ( 'UNION' GroupGraphPattern )* + // [67] GroupOrUnionGraphPattern ::= GroupGraphPattern ( 'UNION' GroupGraphPattern )* start: GroupGraphPattern, others: Vec<GroupGraphPattern>, } @@ -682,7 +682,7 @@ impl fmt::Display for GroupOrUnionGraphPattern { #[derive(Arbitrary)] struct Filter { - // [68] Filter ::= 'FILTER' Constraint + // [68] Filter ::= 'FILTER' Constraint constraint: Constraint, } @@ -694,7 +694,7 @@ impl fmt::Display for Filter { #[derive(Arbitrary)] enum Constraint { - // [69] Constraint ::= BrackettedExpression | BuiltInCall | FunctionCall + // [69] Constraint ::= BrackettedExpression | BuiltInCall | FunctionCall BrackettedExpression(BrackettedExpression), BuiltInCall(BuiltInCall), // TODO FunctionCall(FunctionCall), @@ -705,14 +705,14 @@ impl fmt::Display for Constraint { match self { Self::BrackettedExpression(e) => write!(f, "{e}"), Self::BuiltInCall(c) => write!(f, "{c}"), - //Self::FunctionCall(c) => write!(f, "{}", c), + // Self::FunctionCall(c) => write!(f, "{c}"), } } } #[derive(Arbitrary)] struct FunctionCall { - // [70] FunctionCall ::= iri ArgList + // [70] FunctionCall ::= iri ArgList iri: Iri, args: ArgList, } @@ -725,7 +725,7 @@ impl fmt::Display for FunctionCall { #[derive(Arbitrary)] enum ArgList { - // [71] ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression )* ')' + // [71] ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression )* ')' Nil, NotNil { // TODO: DISTINCT @@ -736,39 +736,39 @@ enum ArgList { impl fmt::Display for ArgList { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "(")?; + f.write_str("(")?; if let Self::NotNil { start, others } = self { write!(f, "{start}")?; for e in others { write!(f, ", {e}")?; } } - write!(f, ")") + f.write_str(")") } } #[derive(Arbitrary)] struct ExpressionList { - // [72] ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')' + // [72] ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')' inner: Vec<Expression>, } impl fmt::Display for ExpressionList { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "(")?; + f.write_str("(")?; for (i, e) in self.inner.iter().enumerate() { if i > 0 { - write!(f, ", ")?; + f.write_str(", ")?; } write!(f, "{e}")?; } - write!(f, ")") + f.write_str(")") } } #[derive(Arbitrary)] struct PropertyListNotEmpty { - // [77] PropertyListNotEmpty ::= Verb ObjectList ( ';' ( Verb ObjectList )? )* + // [77] PropertyListNotEmpty ::= Verb ObjectList ( ';' ( Verb ObjectList )? )* start_predicate: Verb, start_object: Box<ObjectList>, others: Vec<Option<PropertyListElement>>, @@ -784,7 +784,7 @@ impl fmt::Display for PropertyListNotEmpty { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{} {}", self.start_predicate, self.start_object)?; for other in &self.others { - write!(f, " ; ")?; + f.write_str(" ; ")?; if let Some(e) = other { write!(f, "{} {}", e.predicate, e.object)?; } @@ -795,7 +795,7 @@ impl fmt::Display for PropertyListNotEmpty { #[derive(Arbitrary)] enum Verb { - // [78] Verb ::= VarOrIri | 'a' + // [78] Verb ::= VarOrIri | 'a' VarOrIri(VarOrIri), A, } @@ -804,14 +804,14 @@ impl fmt::Display for Verb { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::VarOrIri(iri) => write!(f, "{iri}"), - Self::A => write!(f, " a "), + Self::A => f.write_str(" a "), } } } #[derive(Arbitrary)] struct ObjectList { - // [79] ObjectList ::= Object ( ',' Object )* + // [79] ObjectList ::= Object ( ',' Object )* start: Object, others: Vec<Object>, } @@ -820,19 +820,19 @@ impl fmt::Display for ObjectList { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.start)?; for other in &self.others { - write!(f, " , ")?; + f.write_str(" , ")?; write!(f, "{other}")?; } Ok(()) } } -// [80] Object ::= GraphNode +// [80] Object ::= GraphNode type Object = GraphNode; #[derive(Arbitrary)] enum TriplesSameSubjectPath { - // [81] TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath + // [81] TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNodePath PropertyListPath Atomic { subject: VarOrTerm, predicate_object: PropertyListPathNotEmpty, @@ -864,7 +864,7 @@ impl fmt::Display for TriplesSameSubjectPath { #[derive(Arbitrary)] struct PropertyListPath { - // [82] PropertyListPath ::= PropertyListPathNotEmpty? + // [82] PropertyListPath ::= PropertyListPathNotEmpty? inner: Option<PropertyListPathNotEmpty>, } @@ -880,7 +880,7 @@ impl fmt::Display for PropertyListPath { #[derive(Arbitrary)] struct PropertyListPathNotEmpty { - // [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectListPath )? )* + // [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectListPath )? )* start_predicate: PropertyListPathNotEmptyVerb, start_object: Box<ObjectListPath>, others: Vec<Option<PropertyListPathElement>>, @@ -906,7 +906,7 @@ impl fmt::Display for PropertyListPathNotEmpty { }?; write!(f, "{}", self.start_object)?; for other in &self.others { - write!(f, " ; ")?; + f.write_str(" ; ")?; if let Some(e) = other { match &e.predicate { PropertyListPathNotEmptyVerb::VerbPath(p) => write!(f, "{p}"), @@ -919,15 +919,15 @@ impl fmt::Display for PropertyListPathNotEmpty { } } -// [84] VerbPath ::= Path +// [84] VerbPath ::= Path type VerbPath = Path; -// [85] VerbSimple ::= Var +// [85] VerbSimple ::= Var type VerbSimple = Var; #[derive(Arbitrary)] struct ObjectListPath { - // [86] ObjectListPath ::= ObjectPath ( ',' ObjectPath )* + // [86] ObjectListPath ::= ObjectPath ( ',' ObjectPath )* start: ObjectPath, others: Vec<ObjectPath>, } @@ -942,15 +942,15 @@ impl fmt::Display for ObjectListPath { } } -// [87] ObjectPath ::= GraphNodePath +// [87] ObjectPath ::= GraphNodePath type ObjectPath = GraphNodePath; -// [88] Path ::= PathAlternative +// [88] Path ::= PathAlternative type Path = PathAlternative; #[derive(Arbitrary)] struct PathAlternative { - // [89] PathAlternative ::= PathSequence ( '|' PathSequence )* + // [89] PathAlternative ::= PathSequence ( '|' PathSequence )* start: PathSequence, others: Vec<PathSequence>, } @@ -967,7 +967,7 @@ impl fmt::Display for PathAlternative { #[derive(Arbitrary)] struct PathSequence { - // [90] PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )* + // [90] PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )* start: PathEltOrInverse, others: Vec<PathEltOrInverse>, } @@ -984,7 +984,7 @@ impl fmt::Display for PathSequence { #[derive(Arbitrary)] struct PathElt { - // [91] PathElt ::= PathPrimary PathMod? + // [91] PathElt ::= PathPrimary PathMod? path: PathPrimary, mode: Option<PathMod>, } @@ -1001,7 +1001,7 @@ impl fmt::Display for PathElt { #[derive(Arbitrary)] enum PathEltOrInverse { - // [92] PathEltOrInverse ::= PathElt | '^' PathElt + // [92] PathEltOrInverse ::= PathElt | '^' PathElt PathElt(PathElt), Inverse(PathElt), } @@ -1017,7 +1017,7 @@ impl fmt::Display for PathEltOrInverse { #[derive(Arbitrary)] enum PathMod { - // [93] PathMod ::= '?' | '*' | '+' + // [93] PathMod ::= '?' | '*' | '+' ZeroOrOne, ZeroOrMore, OneOrMore, @@ -1026,16 +1026,16 @@ enum PathMod { impl fmt::Display for PathMod { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::ZeroOrOne => write!(f, " ? "), - Self::ZeroOrMore => write!(f, " * "), - Self::OneOrMore => write!(f, " + "), + Self::ZeroOrOne => f.write_str(" ? "), + Self::ZeroOrMore => f.write_str(" * "), + Self::OneOrMore => f.write_str(" + "), } } } #[derive(Arbitrary)] enum PathPrimary { - // [94] PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')' + // [94] PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')' Iri(Iri), A, Negated(PathNegatedPropertySet), @@ -1046,7 +1046,7 @@ impl fmt::Display for PathPrimary { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Iri(iri) => write!(f, "{iri}"), - Self::A => write!(f, " a "), + Self::A => f.write_str(" a "), Self::Negated(n) => write!(f, "!{n}"), Self::Child(c) => write!(f, "({c})"), } @@ -1055,7 +1055,7 @@ impl fmt::Display for PathPrimary { #[derive(Arbitrary)] enum PathNegatedPropertySet { - // [95] PathNegatedPropertySet ::= PathOneInPropertySet | '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')' + // [95] PathNegatedPropertySet ::= PathOneInPropertySet | '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')' Single(PathOneInPropertySet), Multiple { start: PathOneInPropertySet, @@ -1072,7 +1072,7 @@ impl fmt::Display for PathNegatedPropertySet { for other in others { write!(f, " | {other}")?; } - write!(f, " ) ") + f.write_str(" ) ") } } } @@ -1080,7 +1080,7 @@ impl fmt::Display for PathNegatedPropertySet { #[derive(Arbitrary)] enum PathOneInPropertySet { - // [96] PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' ) + // [96] PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' ) Iri(Iri), A, NegatedIri(Iri), @@ -1091,16 +1091,16 @@ impl fmt::Display for PathOneInPropertySet { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Iri(iri) => write!(f, "{iri}"), - Self::A => write!(f, " a "), + Self::A => f.write_str(" a "), Self::NegatedIri(iri) => write!(f, "^{iri}"), - Self::NegatedA => write!(f, " ^a "), + Self::NegatedA => f.write_str(" ^a "), } } } #[derive(Arbitrary)] enum TriplesNode { - // [98] TriplesNode ::= Collection | BlankNodePropertyList + // [98] TriplesNode ::= Collection | BlankNodePropertyList Collection(Collection), BlankNodePropertyList(BlankNodePropertyList), } @@ -1116,7 +1116,7 @@ impl fmt::Display for TriplesNode { #[derive(Arbitrary)] struct BlankNodePropertyList { - // [99] BlankNodePropertyList ::= '[' PropertyListNotEmpty ']' + // [99] BlankNodePropertyList ::= '[' PropertyListNotEmpty ']' inner: PropertyListNotEmpty, } @@ -1128,7 +1128,7 @@ impl fmt::Display for BlankNodePropertyList { #[derive(Arbitrary)] enum TriplesNodePath { - // [100] TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath + // [100] TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath CollectionPath(CollectionPath), BlankNodePropertyListPath(BlankNodePropertyListPath), } @@ -1144,7 +1144,7 @@ impl fmt::Display for TriplesNodePath { #[derive(Arbitrary)] struct BlankNodePropertyListPath { - // [101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']' + // [101] BlankNodePropertyListPath ::= '[' PropertyListPathNotEmpty ']' inner: PropertyListPathNotEmpty, } @@ -1156,7 +1156,7 @@ impl fmt::Display for BlankNodePropertyListPath { #[derive(Arbitrary)] struct Collection { - // [102] Collection ::= '(' GraphNode+ ')' + // [102] Collection ::= '(' GraphNode+ ')' start: Box<GraphNode>, others: Vec<GraphNode>, } @@ -1167,13 +1167,13 @@ impl fmt::Display for Collection { for e in &self.others { write!(f, " {e}")?; } - write!(f, " )") + f.write_str(" )") } } #[derive(Arbitrary)] struct CollectionPath { - // [103] CollectionPath ::= '(' GraphNodePath+ ')' + // [103] CollectionPath ::= '(' GraphNodePath+ ')' start: Box<GraphNodePath>, others: Vec<GraphNodePath>, } @@ -1184,13 +1184,13 @@ impl fmt::Display for CollectionPath { for e in &self.others { write!(f, " {e}")?; } - write!(f, " )") + f.write_str(" )") } } #[derive(Arbitrary)] enum GraphNode { - // [104] GraphNode ::= VarOrTerm | TriplesNode + // [104] GraphNode ::= VarOrTerm | TriplesNode VarOrTerm(VarOrTerm), TriplesNode(TriplesNode), } @@ -1206,7 +1206,7 @@ impl fmt::Display for GraphNode { #[derive(Arbitrary)] enum GraphNodePath { - // [105] GraphNodePath ::= VarOrTerm | TriplesNodePath + // [105] GraphNodePath ::= VarOrTerm | TriplesNodePath VarOrTerm(VarOrTerm), TriplesNodePath(TriplesNodePath), } @@ -1222,7 +1222,7 @@ impl fmt::Display for GraphNodePath { #[derive(Arbitrary)] enum VarOrTerm { - // [106] VarOrTerm ::= Var | GraphTerm + // [106] VarOrTerm ::= Var | GraphTerm Var(Var), GraphTerm(GraphTerm), } @@ -1238,7 +1238,7 @@ impl fmt::Display for VarOrTerm { #[derive(Arbitrary)] enum VarOrIri { - // [107] VarOrIri ::= Var | iri + // [107] VarOrIri ::= Var | iri Var(Var), Iri(Iri), } @@ -1253,7 +1253,7 @@ impl fmt::Display for VarOrIri { } struct Var { - // [108] Var ::= VAR1 | VAR2 + // [108] Var ::= VAR1 | VAR2 value: u8, } @@ -1277,7 +1277,7 @@ impl fmt::Display for Var { #[derive(Arbitrary)] enum GraphTerm { - // [109] GraphTerm ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL + // [109] GraphTerm ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL Iri(Iri), Literal(Literal), Nil, @@ -1289,17 +1289,17 @@ impl fmt::Display for GraphTerm { match self { Self::Iri(iri) => write!(f, "{iri}"), Self::Literal(l) => write!(f, "{l}"), - Self::Nil => write!(f, " () "), + Self::Nil => f.write_str(" () "), } } } -// [110] Expression ::= ConditionalOrExpression +// [110] Expression ::= ConditionalOrExpression type Expression = ConditionalOrExpression; #[derive(Arbitrary)] struct ConditionalOrExpression { - // [111] ConditionalOrExpression ::= ConditionalAndExpression ( '||' ConditionalAndExpression )* + // [111] ConditionalOrExpression ::= ConditionalAndExpression ( '||' ConditionalAndExpression )* start: ConditionalAndExpression, others: Vec<ConditionalAndExpression>, } @@ -1316,7 +1316,7 @@ impl fmt::Display for ConditionalOrExpression { #[derive(Arbitrary)] struct ConditionalAndExpression { - // [112] ConditionalAndExpression ::= ValueLogical ( '&&' ValueLogical )* + // [112] ConditionalAndExpression ::= ValueLogical ( '&&' ValueLogical )* start: ValueLogical, others: Vec<ValueLogical>, } @@ -1331,12 +1331,12 @@ impl fmt::Display for ConditionalAndExpression { } } -// [113] ValueLogical ::= RelationalExpression +// [113] ValueLogical ::= RelationalExpression type ValueLogical = RelationalExpression; #[derive(Arbitrary)] enum RelationalExpression { - // [114] RelationalExpression ::= NumericExpression ( '=' NumericExpression | '!=' NumericExpression | '<' NumericExpression | '>' NumericExpression | '<=' NumericExpression | '>=' NumericExpression | 'IN' ExpressionList | 'NOT' 'IN' ExpressionList )? + // [114] RelationalExpression ::= NumericExpression ( '=' NumericExpression | '!=' NumericExpression | '<' NumericExpression | '>' NumericExpression | '<=' NumericExpression | '>=' NumericExpression | 'IN' ExpressionList | 'NOT' 'IN' ExpressionList )? Base(NumericExpression), Equal(NumericExpression, NumericExpression), NotEqual(NumericExpression, NumericExpression), @@ -1364,12 +1364,12 @@ impl fmt::Display for RelationalExpression { } } -// [115] NumericExpression ::= AdditiveExpression +// [115] NumericExpression ::= AdditiveExpression type NumericExpression = AdditiveExpression; #[derive(Arbitrary)] enum AdditiveExpression { - // [116] AdditiveExpression ::= MultiplicativeExpression ( '+' MultiplicativeExpression | '-' MultiplicativeExpression | ( NumericLiteralPositive | NumericLiteralNegative ) ( ( '*' UnaryExpression ) | ( '/' UnaryExpression ) )* )* + // [116] AdditiveExpression ::= MultiplicativeExpression ( '+' MultiplicativeExpression | '-' MultiplicativeExpression | ( NumericLiteralPositive | NumericLiteralNegative ) ( ( '*' UnaryExpression ) | ( '/' UnaryExpression ) )* )* Base(MultiplicativeExpression), Plus(MultiplicativeExpression, MultiplicativeExpression), Minus(MultiplicativeExpression, MultiplicativeExpression), // TODO: Prefix + and - @@ -1387,7 +1387,7 @@ impl fmt::Display for AdditiveExpression { #[derive(Arbitrary)] enum MultiplicativeExpression { - // [117] MultiplicativeExpression ::= UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )* + // [117] MultiplicativeExpression ::= UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )* Base(UnaryExpression), Mul(UnaryExpression, UnaryExpression), Div(UnaryExpression, UnaryExpression), @@ -1405,7 +1405,7 @@ impl fmt::Display for MultiplicativeExpression { #[derive(Arbitrary)] enum UnaryExpression { - // [118] UnaryExpression ::= '!' PrimaryExpression | '+' PrimaryExpression | '-' PrimaryExpression | PrimaryExpression + // [118] UnaryExpression ::= '!' PrimaryExpression | '+' PrimaryExpression | '-' PrimaryExpression | PrimaryExpression Not(PrimaryExpression), Plus(PrimaryExpression), Minus(PrimaryExpression), @@ -1425,7 +1425,7 @@ impl fmt::Display for UnaryExpression { #[derive(Arbitrary)] enum PrimaryExpression { - // [119] PrimaryExpression ::= BrackettedExpression | BuiltInCall | iriOrFunction | RDFLiteral | NumericLiteral | BooleanLiteral | Var + // [119] PrimaryExpression ::= BrackettedExpression | BuiltInCall | iriOrFunction | RDFLiteral | NumericLiteral | BooleanLiteral | Var Bracketted(BrackettedExpression), BuiltInCall(BuiltInCall), IriOrFunction(IriOrFunction), @@ -1447,7 +1447,7 @@ impl fmt::Display for PrimaryExpression { #[derive(Arbitrary)] struct BrackettedExpression { - // [120] BrackettedExpression ::= '(' Expression ')' + // [120] BrackettedExpression ::= '(' Expression ')' inner: Box<Expression>, } @@ -1459,61 +1459,61 @@ impl fmt::Display for BrackettedExpression { #[derive(Arbitrary)] enum BuiltInCall { - // [121] BuiltInCall ::= Aggregate - // | 'STR' '(' Expression ')' - // | 'LANG' '(' Expression ')' - // | 'LANGMATCHES' '(' Expression ',' Expression ')' - // | 'DATATYPE' '(' Expression ')' - // | 'BOUND' '(' Var ')' - // | 'IRI' '(' Expression ')' - // | 'URI' '(' Expression ')' - // | 'BNODE' ( '(' Expression ')' | NIL ) - // | 'RAND' NIL - // | 'ABS' '(' Expression ')' - // | 'CEIL' '(' Expression ')' - // | 'FLOOR' '(' Expression ')' - // | 'ROUND' '(' Expression ')' - // | 'CONCAT' ExpressionList - // | SubstringExpression - // | 'STRLEN' '(' Expression ')' - // | StrReplaceExpression - // | 'UCASE' '(' Expression ')' - // | 'LCASE' '(' Expression ')' - // | 'ENCODE_FOR_URI' '(' Expression ')' - // | 'CONTAINS' '(' Expression ',' Expression ')' - // | 'STRSTARTS' '(' Expression ',' Expression ')' - // | 'STRENDS' '(' Expression ',' Expression ')' - // | 'STRBEFORE' '(' Expression ',' Expression ')' - // | 'STRAFTER' '(' Expression ',' Expression ')' - // | 'YEAR' '(' Expression ')' - // | 'MONTH' '(' Expression ')' - // | 'DAY' '(' Expression ')' - // | 'HOURS' '(' Expression ')' - // | 'MINUTES' '(' Expression ')' - // | 'SECONDS' '(' Expression ')' - // | 'TIMEZONE' '(' Expression ')' - // | 'TZ' '(' Expression ')' - // | 'NOW' NIL - // | 'UUID' NIL - // | 'STRUUID' NIL - // | 'MD5' '(' Expression ')' - // | 'SHA1' '(' Expression ')' - // | 'SHA256' '(' Expression ')' - // | 'SHA384' '(' Expression ')' - // | 'SHA512' '(' Expression ')' - // | 'COALESCE' ExpressionList - // | 'IF' '(' Expression ',' Expression ',' Expression ')' - // | 'STRLANG' '(' Expression ',' Expression ')' - // | 'STRDT' '(' Expression ',' Expression ')' - // | 'sameTerm' '(' Expression ',' Expression ')' - // | 'isIRI' '(' Expression ')' - // | 'isURI' '(' Expression ')' - // | 'isBLANK' '(' Expression ')' - // | 'isLITERAL' '(' Expression ')' - // | 'isNUMERIC' '(' Expression ')' - // | RegexExpression - // | ExistsFunc - // | NotExistsFunc + // [121] BuiltInCall ::= Aggregate + // | 'STR' '(' Expression ')' + // | 'LANG' '(' Expression ')' + // | 'LANGMATCHES' '(' Expression ',' Expression ')' + // | 'DATATYPE' '(' Expression ')' + // | 'BOUND' '(' Var ')' + // | 'IRI' '(' Expression ')' + // | 'URI' '(' Expression ')' + // | 'BNODE' ( '(' Expression ')' | NIL ) + // | 'RAND' NIL + // | 'ABS' '(' Expression ')' + // | 'CEIL' '(' Expression ')' + // | 'FLOOR' '(' Expression ')' + // | 'ROUND' '(' Expression ')' + // | 'CONCAT' ExpressionList + // | SubstringExpression + // | 'STRLEN' '(' Expression ')' + // | StrReplaceExpression + // | 'UCASE' '(' Expression ')' + // | 'LCASE' '(' Expression ')' + // | 'ENCODE_FOR_URI' '(' Expression ')' + // | 'CONTAINS' '(' Expression ',' Expression ')' + // | 'STRSTARTS' '(' Expression ',' Expression ')' + // | 'STRENDS' '(' Expression ',' Expression ')' + // | 'STRBEFORE' '(' Expression ',' Expression ')' + // | 'STRAFTER' '(' Expression ',' Expression ')' + // | 'YEAR' '(' Expression ')' + // | 'MONTH' '(' Expression ')' + // | 'DAY' '(' Expression ')' + // | 'HOURS' '(' Expression ')' + // | 'MINUTES' '(' Expression ')' + // | 'SECONDS' '(' Expression ')' + // | 'TIMEZONE' '(' Expression ')' + // | 'TZ' '(' Expression ')' + // | 'NOW' NIL + // | 'UUID' NIL + // | 'STRUUID' NIL + // | 'MD5' '(' Expression ')' + // | 'SHA1' '(' Expression ')' + // | 'SHA256' '(' Expression ')' + // | 'SHA384' '(' Expression ')' + // | 'SHA512' '(' Expression ')' + // | 'COALESCE' ExpressionList + // | 'IF' '(' Expression ',' Expression ',' Expression ')' + // | 'STRLANG' '(' Expression ',' Expression ')' + // | 'STRDT' '(' Expression ',' Expression ')' + // | 'sameTerm' '(' Expression ',' Expression ')' + // | 'isIRI' '(' Expression ')' + // | 'isURI' '(' Expression ')' + // | 'isBLANK' '(' Expression ')' + // | 'isLITERAL' '(' Expression ')' + // | 'isNUMERIC' '(' Expression ')' + // | RegexExpression + // | ExistsFunc + // | NotExistsFunc Str(Box<Expression>), Lang(Box<Expression>), Datatype(Box<Expression>), @@ -1530,7 +1530,7 @@ enum BuiltInCall { IsLiteral(Box<Expression>), IsNumeric(Box<Expression>), Exists(ExistsFunc), - NotExists(NotExistsFunc), //TODO: Other functions + NotExists(NotExistsFunc), // TODO: Other functions } impl fmt::Display for BuiltInCall { @@ -1559,7 +1559,7 @@ impl fmt::Display for BuiltInCall { #[derive(Arbitrary)] struct ExistsFunc { - // [125] ExistsFunc ::= 'EXISTS' GroupGraphPattern + // [125] ExistsFunc ::= 'EXISTS' GroupGraphPattern pattern: GroupGraphPattern, } @@ -1571,7 +1571,7 @@ impl fmt::Display for ExistsFunc { #[derive(Arbitrary)] struct NotExistsFunc { - // [126] NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern + // [126] NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern pattern: GroupGraphPattern, } @@ -1583,28 +1583,28 @@ impl fmt::Display for NotExistsFunc { #[derive(Arbitrary)] struct IriOrFunction { - // [128] iriOrFunction ::= iri ArgList? + // [128] iriOrFunction ::= iri ArgList? iri: Iri, - //TODO args: Option<ArgList>, + // TODO args: Option<ArgList>, } impl fmt::Display for IriOrFunction { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.iri)?; - /*if let Some(args) = &self.args { - write!(f, "{}", args)?; - }*/ + // if let Some(args) = &self.args { + // write!(f, "{args}")?; + // } Ok(()) } } struct Literal { - // [129] RDFLiteral ::= String ( LANGTAG | ( '^^' iri ) )? - // [130] NumericLiteral ::= NumericLiteralUnsigned | NumericLiteralPositive | NumericLiteralNegative - // [131] NumericLiteralUnsigned ::= INTEGER | DECIMAL | DOUBLE - // [132] NumericLiteralPositive ::= INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE - // [133] NumericLiteralNegative ::= INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE - // [134] BooleanLiteral ::= 'true' | 'false' + // [129] RDFLiteral ::= String ( LANGTAG | ( '^^' iri ) )? + // [130] NumericLiteral ::= NumericLiteralUnsigned | NumericLiteralPositive | NumericLiteralNegative + // [131] NumericLiteralUnsigned ::= INTEGER | DECIMAL | DOUBLE + // [132] NumericLiteralPositive ::= INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE + // [133] NumericLiteralNegative ::= INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE + // [134] BooleanLiteral ::= 'true' | 'false' value: &'static str, } @@ -1627,7 +1627,7 @@ impl fmt::Display for Literal { } struct Iri { - // [136] iri ::= IRIREF | PrefixedName + // [136] iri ::= IRIREF | PrefixedName value: u8, } diff --git a/lib/src/io/error.rs b/lib/src/io/error.rs deleted file mode 100644 index 6a90404b..00000000 --- a/lib/src/io/error.rs +++ /dev/null @@ -1,155 +0,0 @@ -use oxiri::IriParseError; -use rio_turtle::TurtleError; -use rio_xml::RdfXmlError; -use std::error::Error; -use std::{fmt, io}; - -/// Error returned during RDF format parsing. -#[derive(Debug)] -pub enum ParseError { - /// I/O error during parsing (file not found...). - Io(io::Error), - /// An error in the file syntax. - Syntax(SyntaxError), -} - -impl ParseError { - #[inline] - pub(crate) fn invalid_base_iri(iri: &str, error: IriParseError) -> Self { - Self::Syntax(SyntaxError { - inner: SyntaxErrorKind::InvalidBaseIri { - iri: iri.to_owned(), - error, - }, - }) - } -} - -impl fmt::Display for ParseError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Io(e) => e.fmt(f), - Self::Syntax(e) => e.fmt(f), - } - } -} - -impl Error for ParseError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::Io(e) => Some(e), - Self::Syntax(e) => Some(e), - } - } -} - -impl From<TurtleError> for ParseError { - #[inline] - fn from(error: TurtleError) -> Self { - let error = io::Error::from(error); - if error.get_ref().map_or( - false, - <(dyn Error + Send + Sync + 'static)>::is::<TurtleError>, - ) { - Self::Syntax(SyntaxError { - inner: SyntaxErrorKind::Turtle(*error.into_inner().unwrap().downcast().unwrap()), - }) - } else { - Self::Io(error) - } - } -} - -impl From<RdfXmlError> for ParseError { - #[inline] - fn from(error: RdfXmlError) -> Self { - let error = io::Error::from(error); - if error.get_ref().map_or( - false, - <(dyn Error + Send + Sync + 'static)>::is::<RdfXmlError>, - ) { - Self::Syntax(SyntaxError { - inner: SyntaxErrorKind::RdfXml(*error.into_inner().unwrap().downcast().unwrap()), - }) - } else { - Self::Io(error) - } - } -} - -impl From<io::Error> for ParseError { - #[inline] - fn from(error: io::Error) -> Self { - Self::Io(error) - } -} - -impl From<SyntaxError> for ParseError { - #[inline] - fn from(error: SyntaxError) -> Self { - Self::Syntax(error) - } -} - -impl From<ParseError> for io::Error { - #[inline] - fn from(error: ParseError) -> Self { - match error { - ParseError::Io(error) => error, - ParseError::Syntax(error) => error.into(), - } - } -} - -/// An error in the syntax of the parsed file. -#[derive(Debug)] -pub struct SyntaxError { - inner: SyntaxErrorKind, -} - -#[derive(Debug)] -enum SyntaxErrorKind { - Turtle(TurtleError), - RdfXml(RdfXmlError), - InvalidBaseIri { iri: String, error: IriParseError }, -} - -impl fmt::Display for SyntaxError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.inner { - SyntaxErrorKind::Turtle(e) => e.fmt(f), - SyntaxErrorKind::RdfXml(e) => e.fmt(f), - SyntaxErrorKind::InvalidBaseIri { iri, error } => { - write!(f, "Invalid base IRI '{iri}': {error}") - } - } - } -} - -impl Error for SyntaxError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match &self.inner { - SyntaxErrorKind::Turtle(e) => Some(e), - SyntaxErrorKind::RdfXml(e) => Some(e), - SyntaxErrorKind::InvalidBaseIri { .. } => None, - } - } -} - -impl From<SyntaxError> for io::Error { - #[inline] - fn from(error: SyntaxError) -> Self { - match error.inner { - SyntaxErrorKind::Turtle(error) => error.into(), - SyntaxErrorKind::RdfXml(error) => error.into(), - SyntaxErrorKind::InvalidBaseIri { iri, error } => Self::new( - io::ErrorKind::InvalidInput, - format!("Invalid IRI '{iri}': {error}"), - ), - } - } -} diff --git a/lib/src/io/mod.rs b/lib/src/io/mod.rs deleted file mode 100644 index 6c2c49b4..00000000 --- a/lib/src/io/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Utilities to read and write RDF graphs and datasets. - -mod error; -mod format; -pub mod read; -pub mod write; - -pub use self::format::DatasetFormat; -pub use self::format::GraphFormat; -pub use self::read::DatasetParser; -pub use self::read::GraphParser; -pub use self::write::DatasetSerializer; -pub use self::write::GraphSerializer; diff --git a/lib/src/io/read.rs b/lib/src/io/read.rs deleted file mode 100644 index b407fd9f..00000000 --- a/lib/src/io/read.rs +++ /dev/null @@ -1,381 +0,0 @@ -//! Utilities to read RDF graphs and datasets. - -pub use crate::io::error::{ParseError, SyntaxError}; -use crate::io::{DatasetFormat, GraphFormat}; -use crate::model::*; -use oxiri::{Iri, IriParseError}; -use rio_api::model as rio; -use rio_api::parser::{QuadsParser, TriplesParser}; -use rio_turtle::{NQuadsParser, NTriplesParser, TriGParser, TurtleParser}; -use rio_xml::RdfXmlParser; -use std::collections::HashMap; -use std::io::BufRead; - -/// Parsers for RDF graph serialization formats. -/// -/// It currently supports the following formats: -/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`GraphFormat::NTriples`]) -/// * [Turtle](https://www.w3.org/TR/turtle/) ([`GraphFormat::Turtle`]) -/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`GraphFormat::RdfXml`]) -/// -/// ``` -/// use oxigraph::io::{GraphFormat, GraphParser}; -/// use std::io::Cursor; -/// -/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; -/// -/// let parser = GraphParser::from_format(GraphFormat::NTriples); -/// let triples = parser.read_triples(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; -/// -///assert_eq!(triples.len(), 1); -///assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); -/// # std::io::Result::Ok(()) -/// ``` -pub struct GraphParser { - format: GraphFormat, - base_iri: Option<Iri<String>>, -} - -impl GraphParser { - /// Builds a parser for the given format. - #[inline] - pub fn from_format(format: GraphFormat) -> Self { - Self { - format, - base_iri: None, - } - } - - /// Provides an IRI that could be used to resolve the file relative IRIs. - /// - /// ``` - /// use oxigraph::io::{GraphFormat, GraphParser}; - /// use std::io::Cursor; - /// - /// let file = "</s> </p> </o> ."; - /// - /// let parser = GraphParser::from_format(GraphFormat::Turtle).with_base_iri("http://example.com")?; - /// let triples = parser.read_triples(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; - /// - ///assert_eq!(triples.len(), 1); - ///assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); - /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) - /// ``` - #[inline] - pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { - self.base_iri = Some(Iri::parse(base_iri.into())?); - Ok(self) - } - - /// Executes the parsing itself on a [`BufRead`] implementation and returns an iterator of triples. - #[allow(clippy::unnecessary_wraps)] - pub fn read_triples<R: BufRead>(&self, reader: R) -> Result<TripleReader<R>, ParseError> { - Ok(TripleReader { - mapper: RioMapper::default(), - parser: match self.format { - GraphFormat::NTriples => TripleReaderKind::NTriples(NTriplesParser::new(reader)), - GraphFormat::Turtle => { - TripleReaderKind::Turtle(TurtleParser::new(reader, self.base_iri.clone())) - } - GraphFormat::RdfXml => { - TripleReaderKind::RdfXml(RdfXmlParser::new(reader, self.base_iri.clone())) - } - }, - buffer: Vec::new(), - }) - } -} - -/// An iterator yielding read triples. -/// Could be built using a [`GraphParser`]. -/// -/// ``` -/// use oxigraph::io::{GraphFormat, GraphParser}; -/// use std::io::Cursor; -/// -/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> ."; -/// -/// let parser = GraphParser::from_format(GraphFormat::NTriples); -/// let triples = parser.read_triples(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; -/// -///assert_eq!(triples.len(), 1); -///assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); -/// # std::io::Result::Ok(()) -/// ``` -#[must_use] -pub struct TripleReader<R: BufRead> { - mapper: RioMapper, - parser: TripleReaderKind<R>, - buffer: Vec<Triple>, -} - -#[allow(clippy::large_enum_variant)] -enum TripleReaderKind<R: BufRead> { - NTriples(NTriplesParser<R>), - Turtle(TurtleParser<R>), - RdfXml(RdfXmlParser<R>), -} - -impl<R: BufRead> Iterator for TripleReader<R> { - type Item = Result<Triple, ParseError>; - - fn next(&mut self) -> Option<Result<Triple, ParseError>> { - loop { - if let Some(r) = self.buffer.pop() { - return Some(Ok(r)); - } - - if let Err(error) = match &mut self.parser { - TripleReaderKind::NTriples(parser) => { - Self::read(parser, &mut self.buffer, &mut self.mapper) - } - TripleReaderKind::Turtle(parser) => { - Self::read(parser, &mut self.buffer, &mut self.mapper) - } - TripleReaderKind::RdfXml(parser) => { - Self::read(parser, &mut self.buffer, &mut self.mapper) - } - }? { - return Some(Err(error)); - } - } - } -} - -impl<R: BufRead> TripleReader<R> { - fn read<P: TriplesParser>( - parser: &mut P, - buffer: &mut Vec<Triple>, - mapper: &mut RioMapper, - ) -> Option<Result<(), ParseError>> - where - ParseError: From<P::Error>, - { - if parser.is_end() { - None - } else if let Err(e) = parser.parse_step(&mut |t| { - buffer.push(mapper.triple(&t)); - Ok(()) - }) { - Some(Err(e)) - } else { - Some(Ok(())) - } - } -} - -/// A parser for RDF dataset serialization formats. -/// -/// It currently supports the following formats: -/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`DatasetFormat::NQuads`]) -/// * [TriG](https://www.w3.org/TR/trig/) ([`DatasetFormat::TriG`]) -/// -/// ``` -/// use oxigraph::io::{DatasetFormat, DatasetParser}; -/// use std::io::Cursor; -/// -/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> ."; -/// -/// let parser = DatasetParser::from_format(DatasetFormat::NQuads); -/// let quads = parser.read_quads(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; -/// -///assert_eq!(quads.len(), 1); -///assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); -/// # std::io::Result::Ok(()) -/// ``` -pub struct DatasetParser { - format: DatasetFormat, - base_iri: Option<Iri<String>>, -} - -impl DatasetParser { - /// Builds a parser for the given format. - #[inline] - pub fn from_format(format: DatasetFormat) -> Self { - Self { - format, - base_iri: None, - } - } - - /// Provides an IRI that could be used to resolve the file relative IRIs. - /// - /// ``` - /// use oxigraph::io::{DatasetFormat, DatasetParser}; - /// use std::io::Cursor; - /// - /// let file = "<g> { </s> </p> </o> }"; - /// - /// let parser = DatasetParser::from_format(DatasetFormat::TriG).with_base_iri("http://example.com")?; - /// let triples = parser.read_quads(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; - /// - ///assert_eq!(triples.len(), 1); - ///assert_eq!(triples[0].subject.to_string(), "<http://example.com/s>"); - /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) - /// ``` - #[inline] - pub fn with_base_iri(mut self, base_iri: impl Into<String>) -> Result<Self, IriParseError> { - self.base_iri = Some(Iri::parse(base_iri.into())?); - Ok(self) - } - - /// Executes the parsing itself on a [`BufRead`] implementation and returns an iterator of quads. - #[allow(clippy::unnecessary_wraps)] - pub fn read_quads<R: BufRead>(&self, reader: R) -> Result<QuadReader<R>, ParseError> { - Ok(QuadReader { - mapper: RioMapper::default(), - parser: match self.format { - DatasetFormat::NQuads => QuadReaderKind::NQuads(NQuadsParser::new(reader)), - DatasetFormat::TriG => { - QuadReaderKind::TriG(TriGParser::new(reader, self.base_iri.clone())) - } - }, - buffer: Vec::new(), - }) - } -} - -/// An iterator yielding read quads. -/// Could be built using a [`DatasetParser`]. -/// -/// ``` -/// use oxigraph::io::{DatasetFormat, DatasetParser}; -/// use std::io::Cursor; -/// -/// let file = "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> ."; -/// -/// let parser = DatasetParser::from_format(DatasetFormat::NQuads); -/// let quads = parser.read_quads(Cursor::new(file))?.collect::<Result<Vec<_>,_>>()?; -/// -///assert_eq!(quads.len(), 1); -///assert_eq!(quads[0].subject.to_string(), "<http://example.com/s>"); -/// # std::io::Result::Ok(()) -/// ``` -#[must_use] -pub struct QuadReader<R: BufRead> { - mapper: RioMapper, - parser: QuadReaderKind<R>, - buffer: Vec<Quad>, -} - -enum QuadReaderKind<R: BufRead> { - NQuads(NQuadsParser<R>), - TriG(TriGParser<R>), -} - -impl<R: BufRead> Iterator for QuadReader<R> { - type Item = Result<Quad, ParseError>; - - fn next(&mut self) -> Option<Result<Quad, ParseError>> { - loop { - if let Some(r) = self.buffer.pop() { - return Some(Ok(r)); - } - - if let Err(error) = match &mut self.parser { - QuadReaderKind::NQuads(parser) => { - Self::read(parser, &mut self.buffer, &mut self.mapper) - } - QuadReaderKind::TriG(parser) => { - Self::read(parser, &mut self.buffer, &mut self.mapper) - } - }? { - return Some(Err(error)); - } - } - } -} - -impl<R: BufRead> QuadReader<R> { - fn read<P: QuadsParser>( - parser: &mut P, - buffer: &mut Vec<Quad>, - mapper: &mut RioMapper, - ) -> Option<Result<(), ParseError>> - where - ParseError: From<P::Error>, - { - if parser.is_end() { - None - } else if let Err(e) = parser.parse_step(&mut |t| { - buffer.push(mapper.quad(&t)); - Ok(()) - }) { - Some(Err(e)) - } else { - Some(Ok(())) - } - } -} - -#[derive(Default)] -struct RioMapper { - bnode_map: HashMap<String, BlankNode>, -} - -impl<'a> RioMapper { - fn named_node(node: rio::NamedNode<'a>) -> NamedNode { - NamedNode::new_unchecked(node.iri) - } - - fn blank_node(&mut self, node: rio::BlankNode<'a>) -> BlankNode { - self.bnode_map - .entry(node.id.to_owned()) - .or_default() - .clone() - } - - fn literal(literal: rio::Literal<'a>) -> Literal { - match literal { - rio::Literal::Simple { value } => Literal::new_simple_literal(value), - rio::Literal::LanguageTaggedString { value, language } => { - Literal::new_language_tagged_literal_unchecked(value, language) - } - rio::Literal::Typed { value, datatype } => { - Literal::new_typed_literal(value, Self::named_node(datatype)) - } - } - } - - fn subject(&mut self, node: rio::Subject<'a>) -> Subject { - match node { - rio::Subject::NamedNode(node) => Self::named_node(node).into(), - rio::Subject::BlankNode(node) => self.blank_node(node).into(), - rio::Subject::Triple(triple) => self.triple(triple).into(), - } - } - - fn term(&mut self, node: rio::Term<'a>) -> Term { - match node { - rio::Term::NamedNode(node) => Self::named_node(node).into(), - rio::Term::BlankNode(node) => self.blank_node(node).into(), - rio::Term::Literal(literal) => Self::literal(literal).into(), - rio::Term::Triple(triple) => self.triple(triple).into(), - } - } - - fn triple(&mut self, triple: &rio::Triple<'a>) -> Triple { - Triple { - subject: self.subject(triple.subject), - predicate: Self::named_node(triple.predicate), - object: self.term(triple.object), - } - } - - fn graph_name(&mut self, graph_name: Option<rio::GraphName<'a>>) -> GraphName { - match graph_name { - Some(rio::GraphName::NamedNode(node)) => Self::named_node(node).into(), - Some(rio::GraphName::BlankNode(node)) => self.blank_node(node).into(), - None => GraphName::DefaultGraph, - } - } - - fn quad(&mut self, quad: &rio::Quad<'a>) -> Quad { - Quad { - subject: self.subject(quad.subject), - predicate: Self::named_node(quad.predicate), - object: self.term(quad.object), - graph_name: self.graph_name(quad.graph_name), - } - } -} diff --git a/lib/src/io/write.rs b/lib/src/io/write.rs deleted file mode 100644 index a2bddc9c..00000000 --- a/lib/src/io/write.rs +++ /dev/null @@ -1,261 +0,0 @@ -//! Utilities to write RDF graphs and datasets. - -use crate::io::{DatasetFormat, GraphFormat}; -use crate::model::*; -use rio_api::formatter::TriplesFormatter; -use rio_api::model as rio; -use rio_xml::RdfXmlFormatter; -use std::io::{self, Write}; - -/// A serializer for RDF graph serialization formats. -/// -/// It currently supports the following formats: -/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`GraphFormat::NTriples`]) -/// * [Turtle](https://www.w3.org/TR/turtle/) ([`GraphFormat::Turtle`]) -/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`GraphFormat::RdfXml`]) -/// -/// ``` -/// use oxigraph::io::{GraphFormat, GraphSerializer}; -/// use oxigraph::model::*; -/// -/// let mut buffer = Vec::new(); -/// let mut writer = GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer)?; -/// writer.write(&Triple { -/// subject: NamedNode::new("http://example.com/s")?.into(), -/// predicate: NamedNode::new("http://example.com/p")?, -/// object: NamedNode::new("http://example.com/o")?.into() -/// })?; -/// writer.finish()?; -/// -///assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes()); -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -pub struct GraphSerializer { - format: GraphFormat, -} - -impl GraphSerializer { - /// Builds a serializer for the given format - #[inline] - pub fn from_format(format: GraphFormat) -> Self { - Self { format } - } - - /// Returns a [`TripleWriter`] allowing writing triples into the given [`Write`] implementation - pub fn triple_writer<W: Write>(&self, writer: W) -> io::Result<TripleWriter<W>> { - Ok(TripleWriter { - formatter: match self.format { - GraphFormat::NTriples | GraphFormat::Turtle => TripleWriterKind::NTriples(writer), - GraphFormat::RdfXml => TripleWriterKind::RdfXml(RdfXmlFormatter::new(writer)?), - }, - }) - } -} - -/// Allows writing triples. -/// Could be built using a [`GraphSerializer`]. -/// -/// Warning: Do not forget to run the [`finish`](TripleWriter::finish()) method to properly write the last bytes of the file. -/// -/// ``` -/// use oxigraph::io::{GraphFormat, GraphSerializer}; -/// use oxigraph::model::*; -/// -/// let mut buffer = Vec::new(); -/// let mut writer = GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer)?; -/// writer.write(&Triple { -/// subject: NamedNode::new("http://example.com/s")?.into(), -/// predicate: NamedNode::new("http://example.com/p")?, -/// object: NamedNode::new("http://example.com/o")?.into() -/// })?; -/// writer.finish()?; -/// -///assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes()); -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -#[must_use] -pub struct TripleWriter<W: Write> { - formatter: TripleWriterKind<W>, -} - -enum TripleWriterKind<W: Write> { - NTriples(W), - RdfXml(RdfXmlFormatter<W>), -} - -impl<W: Write> TripleWriter<W> { - /// Writes a triple - pub fn write<'a>(&mut self, triple: impl Into<TripleRef<'a>>) -> io::Result<()> { - let triple = triple.into(); - match &mut self.formatter { - TripleWriterKind::NTriples(writer) => { - writeln!(writer, "{triple} .")?; - } - TripleWriterKind::RdfXml(formatter) => formatter.format(&rio::Triple { - subject: match triple.subject { - SubjectRef::NamedNode(node) => rio::NamedNode { iri: node.as_str() }.into(), - SubjectRef::BlankNode(node) => rio::BlankNode { id: node.as_str() }.into(), - SubjectRef::Triple(_) => { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - "RDF/XML does not support RDF-star yet", - )) - } - }, - predicate: rio::NamedNode { - iri: triple.predicate.as_str(), - }, - object: match triple.object { - TermRef::NamedNode(node) => rio::NamedNode { iri: node.as_str() }.into(), - TermRef::BlankNode(node) => rio::BlankNode { id: node.as_str() }.into(), - TermRef::Literal(literal) => if literal.is_plain() { - if let Some(language) = literal.language() { - rio::Literal::LanguageTaggedString { - value: literal.value(), - language, - } - } else { - rio::Literal::Simple { - value: literal.value(), - } - } - } else { - rio::Literal::Typed { - value: literal.value(), - datatype: rio::NamedNode { - iri: literal.datatype().as_str(), - }, - } - } - .into(), - TermRef::Triple(_) => { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - "RDF/XML does not support RDF-star yet", - )) - } - }, - })?, - } - Ok(()) - } - - /// Writes the last bytes of the file - pub fn finish(self) -> io::Result<()> { - match self.formatter { - TripleWriterKind::NTriples(mut writer) => writer.flush(), - TripleWriterKind::RdfXml(formatter) => formatter.finish()?.flush(), //TODO: remove flush when the next version of Rio is going to be released - } - } -} - -/// A serializer for RDF graph serialization formats. -/// -/// It currently supports the following formats: -/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`DatasetFormat::NQuads`]) -/// * [TriG](https://www.w3.org/TR/trig/) ([`DatasetFormat::TriG`]) -/// -/// ``` -/// use oxigraph::io::{DatasetFormat, DatasetSerializer}; -/// use oxigraph::model::*; -/// -/// let mut buffer = Vec::new(); -/// let mut writer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer)?; -/// writer.write(&Quad { -/// subject: NamedNode::new("http://example.com/s")?.into(), -/// predicate: NamedNode::new("http://example.com/p")?, -/// object: NamedNode::new("http://example.com/o")?.into(), -/// graph_name: NamedNode::new("http://example.com/g")?.into(), -/// })?; -/// writer.finish()?; -/// -///assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes()); -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -pub struct DatasetSerializer { - format: DatasetFormat, -} - -impl DatasetSerializer { - /// Builds a serializer for the given format - #[inline] - pub fn from_format(format: DatasetFormat) -> Self { - Self { format } - } - - /// Returns a [`QuadWriter`] allowing writing triples into the given [`Write`] implementation - #[allow(clippy::unnecessary_wraps)] - pub fn quad_writer<W: Write>(&self, writer: W) -> io::Result<QuadWriter<W>> { - Ok(QuadWriter { - formatter: match self.format { - DatasetFormat::NQuads => QuadWriterKind::NQuads(writer), - DatasetFormat::TriG => QuadWriterKind::TriG(writer), - }, - }) - } -} - -/// Allows writing triples. -/// Could be built using a [`DatasetSerializer`]. -/// -/// Warning: Do not forget to run the [`finish`](QuadWriter::finish()) method to properly write the last bytes of the file. -/// -/// ``` -/// use oxigraph::io::{DatasetFormat, DatasetSerializer}; -/// use oxigraph::model::*; -/// -/// let mut buffer = Vec::new(); -/// let mut writer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer)?; -/// writer.write(&Quad { -/// subject: NamedNode::new("http://example.com/s")?.into(), -/// predicate: NamedNode::new("http://example.com/p")?, -/// object: NamedNode::new("http://example.com/o")?.into(), -/// graph_name: NamedNode::new("http://example.com/g")?.into(), -/// })?; -/// writer.finish()?; -/// -///assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes()); -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -#[must_use] -pub struct QuadWriter<W: Write> { - formatter: QuadWriterKind<W>, -} - -enum QuadWriterKind<W: Write> { - NQuads(W), - TriG(W), -} - -impl<W: Write> QuadWriter<W> { - /// Writes a quad - pub fn write<'a>(&mut self, quad: impl Into<QuadRef<'a>>) -> io::Result<()> { - let quad = quad.into(); - match &mut self.formatter { - QuadWriterKind::NQuads(writer) => { - writeln!(writer, "{quad} .")?; - } - QuadWriterKind::TriG(writer) => { - if quad.graph_name.is_default_graph() { - writeln!(writer, "{} .", TripleRef::from(quad)) - } else { - writeln!( - writer, - "{} {{ {} }}", - quad.graph_name, - TripleRef::from(quad) - ) - }?; - } - } - Ok(()) - } - - /// Writes the last bytes of the file - #[allow(clippy::unused_self, clippy::unnecessary_wraps)] - pub fn finish(self) -> io::Result<()> { - match self.formatter { - QuadWriterKind::NQuads(mut writer) | QuadWriterKind::TriG(mut writer) => writer.flush(), - } - } -} diff --git a/lib/src/lib.rs b/lib/src/lib.rs deleted file mode 100644 index 29ef24ae..00000000 --- a/lib/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -#![doc = include_str!("../README.md")] -#![doc(html_favicon_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] -#![doc(html_logo_url = "https://raw.githubusercontent.com/oxigraph/oxigraph/main/logo.svg")] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![doc(test(attr(deny(warnings))))] -#![allow(clippy::return_self_not_must_use)] - -pub mod io; -pub mod sparql; -mod storage; -pub mod store; - -pub mod model { - //! Implements data structures for [RDF 1.1 Concepts](https://www.w3.org/TR/rdf11-concepts/) using [OxRDF](https://crates.io/crates/oxrdf). - - pub use oxrdf::{ - dataset, graph, vocab, BlankNode, BlankNodeIdParseError, BlankNodeRef, Dataset, Graph, - GraphName, GraphNameRef, IriParseError, LanguageTagParseError, Literal, LiteralRef, - NamedNode, NamedNodeRef, NamedOrBlankNode, NamedOrBlankNodeRef, Quad, QuadRef, Subject, - SubjectRef, Term, TermParseError, TermRef, Triple, TripleRef, - }; -} diff --git a/lib/src/sparql/error.rs b/lib/src/sparql/error.rs deleted file mode 100644 index 101b0165..00000000 --- a/lib/src/sparql/error.rs +++ /dev/null @@ -1,158 +0,0 @@ -use crate::io::read::ParseError; -use crate::storage::StorageError; -use std::convert::Infallible; -use std::error; -use std::fmt; -use std::io; - -/// A SPARQL evaluation error. -#[derive(Debug)] -#[non_exhaustive] -pub enum EvaluationError { - /// An error in SPARQL parsing. - Parsing(spargebra::ParseError), - /// An error from the storage. - Storage(StorageError), - /// An error while parsing an external RDF file. - GraphParsing(ParseError), - /// An error while parsing an external result file (likely from a federated query). - ResultsParsing(sparesults::ParseError), - /// An error returned during store IOs or during results write. - Io(io::Error), - /// An error returned during the query evaluation itself (not supported custom function...). - Query(QueryError), -} - -/// An error returned during the query evaluation itself (not supported custom function...). -#[derive(Debug)] -pub struct QueryError { - inner: QueryErrorKind, -} - -#[derive(Debug)] -enum QueryErrorKind { - Msg { msg: String }, - Other(Box<dyn error::Error + Send + Sync + 'static>), -} - -impl fmt::Display for EvaluationError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Parsing(error) => error.fmt(f), - Self::Storage(error) => error.fmt(f), - Self::GraphParsing(error) => error.fmt(f), - Self::ResultsParsing(error) => error.fmt(f), - Self::Io(error) => error.fmt(f), - Self::Query(error) => error.fmt(f), - } - } -} - -impl fmt::Display for QueryError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.inner { - QueryErrorKind::Msg { msg } => write!(f, "{msg}"), - QueryErrorKind::Other(error) => error.fmt(f), - } - } -} - -impl error::Error for EvaluationError { - #[inline] - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - match self { - Self::Parsing(e) => Some(e), - Self::Storage(e) => Some(e), - Self::GraphParsing(e) => Some(e), - Self::ResultsParsing(e) => Some(e), - Self::Io(e) => Some(e), - Self::Query(e) => Some(e), - } - } -} - -impl error::Error for QueryError { - #[inline] - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - match &self.inner { - QueryErrorKind::Msg { .. } => None, - QueryErrorKind::Other(e) => Some(e.as_ref()), - } - } -} - -impl EvaluationError { - /// Wraps another error. - #[inline] - pub(crate) fn wrap(error: impl error::Error + Send + Sync + 'static) -> Self { - Self::Query(QueryError { - inner: QueryErrorKind::Other(Box::new(error)), - }) - } - - /// Builds an error from a printable error message. - #[inline] - pub(crate) fn msg(msg: impl Into<String>) -> Self { - Self::Query(QueryError { - inner: QueryErrorKind::Msg { msg: msg.into() }, - }) - } -} - -impl From<Infallible> for EvaluationError { - #[inline] - fn from(error: Infallible) -> Self { - match error {} - } -} - -impl From<spargebra::ParseError> for EvaluationError { - #[inline] - fn from(error: spargebra::ParseError) -> Self { - Self::Parsing(error) - } -} - -impl From<StorageError> for EvaluationError { - #[inline] - fn from(error: StorageError) -> Self { - Self::Storage(error) - } -} - -impl From<io::Error> for EvaluationError { - #[inline] - fn from(error: io::Error) -> Self { - Self::Io(error) - } -} - -impl From<ParseError> for EvaluationError { - #[inline] - fn from(error: ParseError) -> Self { - Self::GraphParsing(error) - } -} - -impl From<sparesults::ParseError> for EvaluationError { - #[inline] - fn from(error: sparesults::ParseError) -> Self { - Self::ResultsParsing(error) - } -} - -impl From<EvaluationError> for io::Error { - #[inline] - fn from(error: EvaluationError) -> Self { - match error { - EvaluationError::Parsing(error) => Self::new(io::ErrorKind::InvalidData, error), - EvaluationError::GraphParsing(error) => error.into(), - EvaluationError::ResultsParsing(error) => error.into(), - EvaluationError::Io(error) => error, - EvaluationError::Storage(error) => error.into(), - EvaluationError::Query(error) => Self::new(io::ErrorKind::Other, error), - } - } -} diff --git a/lib/src/sparql/http/mod.rs b/lib/src/sparql/http/mod.rs deleted file mode 100644 index 0266d0b3..00000000 --- a/lib/src/sparql/http/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -#[cfg(not(feature = "http_client"))] -mod dummy; -#[cfg(feature = "http_client")] -mod simple; - -#[cfg(not(feature = "http_client"))] -pub use dummy::Client; -#[cfg(feature = "http_client")] -pub use simple::Client; diff --git a/lib/src/sparql/model.rs b/lib/src/sparql/model.rs deleted file mode 100644 index d7c69ca7..00000000 --- a/lib/src/sparql/model.rs +++ /dev/null @@ -1,346 +0,0 @@ -use crate::io::GraphFormat; -use crate::io::GraphSerializer; -use crate::model::*; -use crate::sparql::error::EvaluationError; -use oxrdf::{Variable, VariableRef}; -pub use sparesults::QuerySolution; -use sparesults::{ - ParseError, QueryResultsFormat, QueryResultsParser, QueryResultsReader, QueryResultsSerializer, - SolutionsReader, -}; -use std::io::{BufRead, Write}; -use std::rc::Rc; - -/// Results of a [SPARQL query](https://www.w3.org/TR/sparql11-query/). -pub enum QueryResults { - /// Results of a [SELECT](https://www.w3.org/TR/sparql11-query/#select) query. - Solutions(QuerySolutionIter), - /// Result of a [ASK](https://www.w3.org/TR/sparql11-query/#ask) query. - Boolean(bool), - /// Results of a [CONSTRUCT](https://www.w3.org/TR/sparql11-query/#construct) or [DESCRIBE](https://www.w3.org/TR/sparql11-query/#describe) query. - Graph(QueryTripleIter), -} - -impl QueryResults { - /// Reads a SPARQL query results serialization. - pub fn read( - reader: impl BufRead + 'static, - format: QueryResultsFormat, - ) -> Result<Self, ParseError> { - Ok(QueryResultsParser::from_format(format) - .read_results(reader)? - .into()) - } - - /// Writes the query results (solutions or boolean). - /// - /// This method fails if it is called on the `Graph` results. - /// - /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::model::*; - /// use oxigraph::sparql::QueryResultsFormat; - /// - /// let store = Store::new()?; - /// let ex = NamedNodeRef::new("http://example.com")?; - /// store.insert(QuadRef::new(ex, ex, ex, GraphNameRef::DefaultGraph))?; - /// - /// let mut results = Vec::new(); - /// store.query("SELECT ?s WHERE { ?s ?p ?o }")?.write(&mut results, QueryResultsFormat::Json)?; - /// assert_eq!(results, "{\"head\":{\"vars\":[\"s\"]},\"results\":{\"bindings\":[{\"s\":{\"type\":\"uri\",\"value\":\"http://example.com\"}}]}}".as_bytes()); - /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) - /// ``` - pub fn write( - self, - writer: impl Write, - format: QueryResultsFormat, - ) -> Result<(), EvaluationError> { - let serializer = QueryResultsSerializer::from_format(format); - match self { - Self::Boolean(value) => { - serializer.write_boolean_result(writer, value)?; - } - Self::Solutions(solutions) => { - let mut writer = - serializer.solutions_writer(writer, solutions.variables().to_vec())?; - for solution in solutions { - writer.write(&solution?)?; - } - writer.finish()?; - } - Self::Graph(triples) => { - let s = VariableRef::new_unchecked("subject"); - let p = VariableRef::new_unchecked("predicate"); - let o = VariableRef::new_unchecked("object"); - let mut writer = serializer.solutions_writer( - writer, - vec![s.into_owned(), p.into_owned(), o.into_owned()], - )?; - for triple in triples { - let triple = triple?; - writer.write([ - (s, &triple.subject.into()), - (p, &triple.predicate.into()), - (o, &triple.object), - ])?; - } - writer.finish()?; - } - } - Ok(()) - } - - /// Writes the graph query results. - /// - /// This method fails if it is called on the `Solution` or `Boolean` results. - /// - /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::io::GraphFormat; - /// use oxigraph::model::*; - /// use std::io::Cursor; - /// - /// let graph = "<http://example.com> <http://example.com> <http://example.com> .\n".as_bytes(); - /// - /// let store = Store::new()?; - /// store.load_graph(Cursor::new(graph), GraphFormat::NTriples, GraphNameRef::DefaultGraph, None)?; - /// - /// let mut results = Vec::new(); - /// store.query("CONSTRUCT WHERE { ?s ?p ?o }")?.write_graph(&mut results, GraphFormat::NTriples)?; - /// assert_eq!(results, graph); - /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) - /// ``` - pub fn write_graph( - self, - write: impl Write, - format: GraphFormat, - ) -> Result<(), EvaluationError> { - if let Self::Graph(triples) = self { - let mut writer = GraphSerializer::from_format(format).triple_writer(write)?; - for triple in triples { - writer.write(&triple?)?; - } - writer.finish()?; - Ok(()) - } else { - Err(EvaluationError::msg( - "Bindings or booleans could not be formatted as an RDF graph", - )) - } - } -} - -impl From<QuerySolutionIter> for QueryResults { - #[inline] - fn from(value: QuerySolutionIter) -> Self { - Self::Solutions(value) - } -} - -impl<R: BufRead + 'static> From<QueryResultsReader<R>> for QueryResults { - fn from(reader: QueryResultsReader<R>) -> Self { - match reader { - QueryResultsReader::Solutions(s) => Self::Solutions(s.into()), - QueryResultsReader::Boolean(v) => Self::Boolean(v), - } - } -} - -/// An iterator over [`QuerySolution`]s. -/// -/// ``` -/// use oxigraph::store::Store; -/// use oxigraph::sparql::QueryResults; -/// -/// let store = Store::new()?; -/// if let QueryResults::Solutions(solutions) = store.query("SELECT ?s WHERE { ?s ?p ?o }")? { -/// for solution in solutions { -/// println!("{:?}", solution?.get("s")); -/// } -/// } -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -#[allow(clippy::rc_buffer)] -pub struct QuerySolutionIter { - variables: Rc<Vec<Variable>>, - iter: Box<dyn Iterator<Item = Result<QuerySolution, EvaluationError>>>, -} - -impl QuerySolutionIter { - pub fn new( - variables: Rc<Vec<Variable>>, - iter: impl Iterator<Item = Result<Vec<Option<Term>>, EvaluationError>> + 'static, - ) -> Self { - Self { - variables: Rc::clone(&variables), - iter: Box::new( - iter.map(move |t| t.map(|values| (Rc::clone(&variables), values).into())), - ), - } - } - - /// The variables used in the solutions. - /// - /// ``` - /// use oxigraph::store::Store; - /// use oxigraph::sparql::{QueryResults, Variable}; - /// - /// let store = Store::new()?; - /// if let QueryResults::Solutions(solutions) = store.query("SELECT ?s ?o WHERE { ?s ?p ?o }")? { - /// assert_eq!(solutions.variables(), &[Variable::new("s")?, Variable::new("o")?]); - /// } - /// # Result::<_,Box<dyn std::error::Error>>::Ok(()) - /// ``` - #[inline] - pub fn variables(&self) -> &[Variable] { - &self.variables - } -} - -impl<R: BufRead + 'static> From<SolutionsReader<R>> for QuerySolutionIter { - fn from(reader: SolutionsReader<R>) -> Self { - Self { - variables: Rc::new(reader.variables().to_vec()), - iter: Box::new(reader.map(|t| t.map_err(EvaluationError::from))), - } - } -} - -impl Iterator for QuerySolutionIter { - type Item = Result<QuerySolution, EvaluationError>; - - #[inline] - fn next(&mut self) -> Option<Result<QuerySolution, EvaluationError>> { - self.iter.next() - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } -} - -/// An iterator over the triples that compose a graph solution. -/// -/// ``` -/// use oxigraph::store::Store; -/// use oxigraph::sparql::QueryResults; -/// -/// let store = Store::new()?; -/// if let QueryResults::Graph(triples) = store.query("CONSTRUCT WHERE { ?s ?p ?o }")? { -/// for triple in triples { -/// println!("{}", triple?); -/// } -/// } -/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) -/// ``` -pub struct QueryTripleIter { - pub(crate) iter: Box<dyn Iterator<Item = Result<Triple, EvaluationError>>>, -} - -impl Iterator for QueryTripleIter { - type Item = Result<Triple, EvaluationError>; - - #[inline] - fn next(&mut self) -> Option<Result<Triple, EvaluationError>> { - self.iter.next() - } - - #[inline] - fn size_hint(&self) -> (usize, Option<usize>) { - self.iter.size_hint() - } - - #[inline] - fn fold<Acc, G>(self, init: Acc, g: G) -> Acc - where - G: FnMut(Acc, Self::Item) -> Acc, - { - self.iter.fold(init, g) - } -} - -#[test] -fn test_serialization_roundtrip() -> Result<(), EvaluationError> { - use std::io::Cursor; - use std::str; - - for format in [ - QueryResultsFormat::Json, - QueryResultsFormat::Xml, - QueryResultsFormat::Tsv, - ] { - let results = vec![ - QueryResults::Boolean(true), - QueryResults::Boolean(false), - QueryResults::Solutions(QuerySolutionIter::new( - Rc::new(vec![ - Variable::new_unchecked("foo"), - Variable::new_unchecked("bar"), - ]), - Box::new( - vec![ - Ok(vec![None, None]), - Ok(vec![ - Some(NamedNode::new_unchecked("http://example.com").into()), - None, - ]), - Ok(vec![ - None, - Some(NamedNode::new_unchecked("http://example.com").into()), - ]), - Ok(vec![ - Some(BlankNode::new_unchecked("foo").into()), - Some(BlankNode::new_unchecked("bar").into()), - ]), - Ok(vec![Some(Literal::new_simple_literal("foo").into()), None]), - Ok(vec![ - Some( - Literal::new_language_tagged_literal_unchecked("foo", "fr").into(), - ), - None, - ]), - Ok(vec![ - Some(Literal::from(1).into()), - Some(Literal::from(true).into()), - ]), - Ok(vec![ - Some(Literal::from(1.33).into()), - Some(Literal::from(false).into()), - ]), - Ok(vec![ - Some( - Triple::new( - NamedNode::new_unchecked("http://example.com/s"), - NamedNode::new_unchecked("http://example.com/p"), - Triple::new( - NamedNode::new_unchecked("http://example.com/os"), - NamedNode::new_unchecked("http://example.com/op"), - NamedNode::new_unchecked("http://example.com/oo"), - ), - ) - .into(), - ), - None, - ]), - ] - .into_iter(), - ), - )), - ]; - - for ex in results { - let mut buffer = Vec::new(); - ex.write(&mut buffer, format)?; - let ex2 = QueryResults::read(Cursor::new(buffer.clone()), format)?; - let mut buffer2 = Vec::new(); - ex2.write(&mut buffer2, format)?; - assert_eq!( - str::from_utf8(&buffer).unwrap(), - str::from_utf8(&buffer2).unwrap() - ); - } - } - - Ok(()) -} diff --git a/lib/src/sparql/plan.rs b/lib/src/sparql/plan.rs deleted file mode 100644 index 5ca5cc03..00000000 --- a/lib/src/sparql/plan.rs +++ /dev/null @@ -1,1167 +0,0 @@ -use crate::model::{BlankNode, Literal, NamedNode, Term, Triple}; -use crate::sparql::Variable; -use crate::storage::numeric_encoder::EncodedTerm; -use json_event_parser::{JsonEvent, JsonWriter}; -use regex::Regex; -use spargebra::algebra::GraphPattern; -use spargebra::term::GroundTerm; -use std::cell::Cell; -use std::cmp::max; -use std::collections::btree_map::Entry; -use std::collections::{BTreeMap, BTreeSet}; -use std::rc::Rc; -use std::time::Duration; -use std::{fmt, io}; - -#[derive(Debug, Clone)] -pub enum PlanNode { - StaticBindings { - encoded_tuples: Vec<EncodedTuple>, - variables: Vec<PlanVariable>, - plain_bindings: Vec<Vec<Option<GroundTerm>>>, - }, - Service { - service_name: PatternValue, - variables: Rc<[Variable]>, - child: Rc<Self>, - graph_pattern: Rc<GraphPattern>, - silent: bool, - }, - QuadPattern { - subject: PatternValue, - predicate: PatternValue, - object: PatternValue, - graph_name: PatternValue, - }, - PathPattern { - subject: PatternValue, - path: Rc<PlanPropertyPath>, - object: PatternValue, - graph_name: PatternValue, - }, - /// Streams left and materializes right join - HashJoin { - left: Rc<Self>, - right: Rc<Self>, - }, - /// Right nested in left loop - ForLoopJoin { - left: Rc<Self>, - right: Rc<Self>, - }, - /// Streams left and materializes right anti join - AntiJoin { - left: Rc<Self>, - right: Rc<Self>, - }, - Filter { - child: Rc<Self>, - expression: Box<PlanExpression>, - }, - Union { - children: Vec<Rc<Self>>, - }, - /// hash left join - HashLeftJoin { - left: Rc<Self>, - right: Rc<Self>, - expression: Box<PlanExpression>, - }, - /// right nested in left loop - ForLoopLeftJoin { - left: Rc<Self>, - right: Rc<Self>, - possible_problem_vars: Rc<[usize]>, //Variables that should not be part of the entry of the left join - }, - Extend { - child: Rc<Self>, - variable: PlanVariable, - expression: Box<PlanExpression>, - }, - Sort { - child: Rc<Self>, - by: Vec<Comparator>, - }, - HashDeduplicate { - child: Rc<Self>, - }, - /// Removes duplicated consecutive elements - Reduced { - child: Rc<Self>, - }, - Skip { - child: Rc<Self>, - count: usize, - }, - Limit { - child: Rc<Self>, - count: usize, - }, - Project { - child: Rc<Self>, - mapping: Rc<[(PlanVariable, PlanVariable)]>, // pairs of (variable key in child, variable key in output) - }, - Aggregate { - // By definition the group by key are the range 0..key_mapping.len() - child: Rc<Self>, - key_variables: Rc<[PlanVariable]>, - aggregates: Rc<[(PlanAggregation, PlanVariable)]>, - }, -} - -impl PlanNode { - /// Returns variables that might be bound in the result set - pub fn used_variables(&self) -> BTreeSet<usize> { - let mut set = BTreeSet::default(); - self.lookup_used_variables(&mut |v| { - set.insert(v); - }); - set - } - - pub fn lookup_used_variables(&self, callback: &mut impl FnMut(usize)) { - match self { - Self::StaticBindings { encoded_tuples, .. } => { - for tuple in encoded_tuples { - for (key, value) in tuple.iter().enumerate() { - if value.is_some() { - callback(key); - } - } - } - } - Self::QuadPattern { - subject, - predicate, - object, - graph_name, - } => { - subject.lookup_variables(callback); - predicate.lookup_variables(callback); - object.lookup_variables(callback); - graph_name.lookup_variables(callback); - } - Self::PathPattern { - subject, - object, - graph_name, - .. - } => { - subject.lookup_variables(callback); - object.lookup_variables(callback); - graph_name.lookup_variables(callback); - } - Self::Filter { child, expression } => { - expression.lookup_used_variables(callback); - child.lookup_used_variables(callback); - } - Self::Union { children } => { - for child in children { - child.lookup_used_variables(callback); - } - } - Self::HashJoin { left, right } - | Self::ForLoopJoin { left, right, .. } - | Self::AntiJoin { left, right } - | Self::ForLoopLeftJoin { left, right, .. } => { - left.lookup_used_variables(callback); - right.lookup_used_variables(callback); - } - Self::HashLeftJoin { - left, - right, - expression, - } => { - left.lookup_used_variables(callback); - right.lookup_used_variables(callback); - expression.lookup_used_variables(callback); - } - Self::Extend { - child, - variable, - expression, - } => { - callback(variable.encoded); - expression.lookup_used_variables(callback); - child.lookup_used_variables(callback); - } - Self::Sort { child, .. } - | Self::HashDeduplicate { child } - | Self::Reduced { child } - | Self::Skip { child, .. } - | Self::Limit { child, .. } => child.lookup_used_variables(callback), - Self::Service { - child, - service_name, - .. - } => { - service_name.lookup_variables(callback); - child.lookup_used_variables(callback); - } - Self::Project { mapping, child } => { - let child_bound = child.used_variables(); - for (child_i, output_i) in mapping.iter() { - if child_bound.contains(&child_i.encoded) { - callback(output_i.encoded); - } - } - } - Self::Aggregate { - key_variables, - aggregates, - .. - } => { - for var in key_variables.iter() { - callback(var.encoded); - } - for (_, var) in aggregates.iter() { - callback(var.encoded); - } - } - } - } - - /// Returns subset of the set of variables that are always bound in the result set - /// - /// (subset because this function is not perfect yet) - pub fn always_bound_variables(&self) -> BTreeSet<usize> { - let mut set = BTreeSet::default(); - self.lookup_always_bound_variables(&mut |v| { - set.insert(v); - }); - set - } - - pub fn lookup_always_bound_variables(&self, callback: &mut impl FnMut(usize)) { - match self { - Self::StaticBindings { encoded_tuples, .. } => { - let mut variables = BTreeMap::default(); // value true iff always bound - let max_tuple_length = encoded_tuples - .iter() - .map(EncodedTuple::capacity) - .fold(0, max); - for tuple in encoded_tuples { - for key in 0..max_tuple_length { - match variables.entry(key) { - Entry::Vacant(e) => { - e.insert(tuple.contains(key)); - } - Entry::Occupied(mut e) => { - if !tuple.contains(key) { - e.insert(false); - } - } - } - } - } - for (k, v) in variables { - if v { - callback(k); - } - } - } - Self::QuadPattern { - subject, - predicate, - object, - graph_name, - } => { - subject.lookup_variables(callback); - predicate.lookup_variables(callback); - object.lookup_variables(callback); - graph_name.lookup_variables(callback); - } - Self::PathPattern { - subject, - object, - graph_name, - .. - } => { - subject.lookup_variables(callback); - object.lookup_variables(callback); - graph_name.lookup_variables(callback); - } - Self::Filter { child, .. } => { - //TODO: have a look at the expression to know if it filters out unbound variables - child.lookup_always_bound_variables(callback); - } - Self::Union { children } => { - if let Some(vars) = children - .iter() - .map(|c| c.always_bound_variables()) - .reduce(|a, b| a.intersection(&b).copied().collect()) - { - for v in vars { - callback(v); - } - } - } - Self::HashJoin { left, right } | Self::ForLoopJoin { left, right, .. } => { - left.lookup_always_bound_variables(callback); - right.lookup_always_bound_variables(callback); - } - Self::AntiJoin { left, .. } - | Self::HashLeftJoin { left, .. } - | Self::ForLoopLeftJoin { left, .. } => { - left.lookup_always_bound_variables(callback); - } - Self::Extend { - child, - variable, - expression, - } => { - if matches!( - expression.as_ref(), - PlanExpression::NamedNode(_) | PlanExpression::Literal(_) - ) { - // TODO: more cases? - callback(variable.encoded); - } - child.lookup_always_bound_variables(callback); - } - Self::Sort { child, .. } - | Self::HashDeduplicate { child } - | Self::Reduced { child } - | Self::Skip { child, .. } - | Self::Limit { child, .. } => child.lookup_always_bound_variables(callback), - Self::Service { child, silent, .. } => { - if *silent { - // none, might return a null tuple - } else { - child.lookup_always_bound_variables(callback) - } - } - Self::Project { mapping, child } => { - let child_bound = child.always_bound_variables(); - for (child_i, output_i) in mapping.iter() { - if child_bound.contains(&child_i.encoded) { - callback(output_i.encoded); - } - } - } - Self::Aggregate { .. } => { - //TODO - } - } - } - - pub fn is_variable_bound(&self, variable: usize) -> bool { - let mut found = false; - self.lookup_always_bound_variables(&mut |v| { - if v == variable { - found = true; - } - }); - found - } -} - -#[derive(Debug, Clone)] -pub struct PlanTerm<T> { - pub encoded: EncodedTerm, - pub plain: T, -} - -impl<T: fmt::Display> fmt::Display for PlanTerm<T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.plain) - } -} - -#[derive(Debug, Clone)] -pub enum PatternValue { - Constant(PlanTerm<PatternValueConstant>), - Variable(PlanVariable), - TriplePattern(Box<TriplePatternValue>), -} - -impl PatternValue { - pub fn lookup_variables(&self, callback: &mut impl FnMut(usize)) { - if let Self::Variable(v) = self { - callback(v.encoded) - } else if let Self::TriplePattern(p) = self { - p.subject.lookup_variables(callback); - p.predicate.lookup_variables(callback); - p.object.lookup_variables(callback); - } - } -} - -impl fmt::Display for PatternValue { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Constant(c) => write!(f, "{c}"), - Self::Variable(v) => write!(f, "{v}"), - Self::TriplePattern(p) => write!(f, "{p}"), - } - } -} - -#[derive(Debug, Clone)] -pub enum PatternValueConstant { - NamedNode(NamedNode), - Literal(Literal), - Triple(Box<Triple>), - DefaultGraph, -} - -impl fmt::Display for PatternValueConstant { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::NamedNode(n) => write!(f, "{n}"), - Self::Literal(l) => write!(f, "{l}"), - Self::Triple(t) => write!(f, "<< {t} >>"), - Self::DefaultGraph => f.write_str("DEFAULT"), - } - } -} - -#[derive(Debug, Clone)] -pub struct TriplePatternValue { - pub subject: PatternValue, - pub predicate: PatternValue, - pub object: PatternValue, -} - -impl fmt::Display for TriplePatternValue { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{} {} {}", self.subject, self.predicate, self.object) - } -} - -#[derive(Debug, Clone)] -pub struct PlanVariable<P = Variable> { - pub encoded: usize, - pub plain: P, -} - -impl<P: fmt::Display> fmt::Display for PlanVariable<P> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.plain) - } -} - -#[derive(Debug, Clone)] -pub enum PlanExpression { - NamedNode(PlanTerm<NamedNode>), - Literal(PlanTerm<Literal>), - Variable(PlanVariable), - Exists(Rc<PlanNode>), - Or(Vec<Self>), - And(Vec<Self>), - Equal(Box<Self>, Box<Self>), - Greater(Box<Self>, Box<Self>), - GreaterOrEqual(Box<Self>, Box<Self>), - Less(Box<Self>, Box<Self>), - LessOrEqual(Box<Self>, Box<Self>), - Add(Box<Self>, Box<Self>), - Subtract(Box<Self>, Box<Self>), - Multiply(Box<Self>, Box<Self>), - Divide(Box<Self>, Box<Self>), - UnaryPlus(Box<Self>), - UnaryMinus(Box<Self>), - Not(Box<Self>), - Str(Box<Self>), - Lang(Box<Self>), - LangMatches(Box<Self>, Box<Self>), - Datatype(Box<Self>), - Bound(PlanVariable), - Iri(Box<Self>), - BNode(Option<Box<Self>>), - Rand, - Abs(Box<Self>), - Ceil(Box<Self>), - Floor(Box<Self>), - Round(Box<Self>), - Concat(Vec<Self>), - SubStr(Box<Self>, Box<Self>, Option<Box<Self>>), - StrLen(Box<Self>), - StaticReplace(Box<Self>, Regex, Box<Self>), - DynamicReplace(Box<Self>, Box<Self>, Box<Self>, Option<Box<Self>>), - UCase(Box<Self>), - LCase(Box<Self>), - EncodeForUri(Box<Self>), - Contains(Box<Self>, Box<Self>), - StrStarts(Box<Self>, Box<Self>), - StrEnds(Box<Self>, Box<Self>), - StrBefore(Box<Self>, Box<Self>), - StrAfter(Box<Self>, Box<Self>), - Year(Box<Self>), - Month(Box<Self>), - Day(Box<Self>), - Hours(Box<Self>), - Minutes(Box<Self>), - Seconds(Box<Self>), - Timezone(Box<Self>), - Tz(Box<Self>), - Now, - Uuid, - StrUuid, - Md5(Box<Self>), - Sha1(Box<Self>), - Sha256(Box<Self>), - Sha384(Box<Self>), - Sha512(Box<Self>), - Coalesce(Vec<Self>), - If(Box<Self>, Box<Self>, Box<Self>), - StrLang(Box<Self>, Box<Self>), - StrDt(Box<Self>, Box<Self>), - SameTerm(Box<Self>, Box<Self>), - IsIri(Box<Self>), - IsBlank(Box<Self>), - IsLiteral(Box<Self>), - IsNumeric(Box<Self>), - StaticRegex(Box<Self>, Regex), - DynamicRegex(Box<Self>, Box<Self>, Option<Box<Self>>), - Triple(Box<Self>, Box<Self>, Box<Self>), - Subject(Box<Self>), - Predicate(Box<Self>), - Object(Box<Self>), - IsTriple(Box<Self>), - Adjust(Box<Self>, Box<Self>), - BooleanCast(Box<Self>), - DoubleCast(Box<Self>), - FloatCast(Box<Self>), - DecimalCast(Box<Self>), - IntegerCast(Box<Self>), - DateCast(Box<Self>), - TimeCast(Box<Self>), - DateTimeCast(Box<Self>), - DurationCast(Box<Self>), - YearMonthDurationCast(Box<Self>), - DayTimeDurationCast(Box<Self>), - StringCast(Box<Self>), - CustomFunction(NamedNode, Vec<Self>), -} - -impl PlanExpression { - pub fn lookup_used_variables(&self, callback: &mut impl FnMut(usize)) { - match self { - Self::Variable(v) | Self::Bound(v) => { - callback(v.encoded); - } - Self::NamedNode(_) - | Self::Literal(_) - | Self::Rand - | Self::Now - | Self::Uuid - | Self::StrUuid - | Self::BNode(None) => (), - Self::UnaryPlus(e) - | Self::UnaryMinus(e) - | Self::Not(e) - | Self::BNode(Some(e)) - | Self::Str(e) - | Self::Lang(e) - | Self::Datatype(e) - | Self::Iri(e) - | Self::Abs(e) - | Self::Ceil(e) - | Self::Floor(e) - | Self::Round(e) - | Self::UCase(e) - | Self::LCase(e) - | Self::StrLen(e) - | Self::EncodeForUri(e) - | Self::StaticRegex(e, _) - | Self::Year(e) - | Self::Month(e) - | Self::Day(e) - | Self::Hours(e) - | Self::Minutes(e) - | Self::Seconds(e) - | Self::Timezone(e) - | Self::Tz(e) - | Self::Md5(e) - | Self::Sha1(e) - | Self::Sha256(e) - | Self::Sha384(e) - | Self::Sha512(e) - | Self::IsIri(e) - | Self::IsBlank(e) - | Self::IsLiteral(e) - | Self::IsNumeric(e) - | Self::IsTriple(e) - | Self::Subject(e) - | Self::Predicate(e) - | Self::Object(e) - | Self::BooleanCast(e) - | Self::DoubleCast(e) - | Self::FloatCast(e) - | Self::DecimalCast(e) - | Self::IntegerCast(e) - | Self::DateCast(e) - | Self::TimeCast(e) - | Self::DateTimeCast(e) - | Self::DurationCast(e) - | Self::YearMonthDurationCast(e) - | Self::DayTimeDurationCast(e) - | Self::StringCast(e) => e.lookup_used_variables(callback), - Self::Equal(a, b) - | Self::Greater(a, b) - | Self::GreaterOrEqual(a, b) - | Self::Less(a, b) - | Self::LessOrEqual(a, b) - | Self::Add(a, b) - | Self::Subtract(a, b) - | Self::Multiply(a, b) - | Self::Divide(a, b) - | Self::LangMatches(a, b) - | Self::Contains(a, b) - | Self::StaticReplace(a, _, b) - | Self::StrStarts(a, b) - | Self::StrEnds(a, b) - | Self::StrBefore(a, b) - | Self::StrAfter(a, b) - | Self::StrLang(a, b) - | Self::StrDt(a, b) - | Self::SameTerm(a, b) - | Self::SubStr(a, b, None) - | Self::DynamicRegex(a, b, None) - | Self::Adjust(a, b) => { - a.lookup_used_variables(callback); - b.lookup_used_variables(callback); - } - Self::If(a, b, c) - | Self::SubStr(a, b, Some(c)) - | Self::DynamicRegex(a, b, Some(c)) - | Self::DynamicReplace(a, b, c, None) - | Self::Triple(a, b, c) => { - a.lookup_used_variables(callback); - b.lookup_used_variables(callback); - c.lookup_used_variables(callback); - } - Self::DynamicReplace(a, b, c, Some(d)) => { - a.lookup_used_variables(callback); - b.lookup_used_variables(callback); - c.lookup_used_variables(callback); - d.lookup_used_variables(callback); - } - Self::Or(es) - | Self::And(es) - | Self::Concat(es) - | Self::Coalesce(es) - | Self::CustomFunction(_, es) => { - for e in es { - e.lookup_used_variables(callback); - } - } - Self::Exists(e) => { - e.lookup_used_variables(callback); - } - } - } -} - -impl fmt::Display for PlanExpression { - #[allow(clippy::many_single_char_names)] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Variable(v) => { - write!(f, "{v}") - } - Self::Bound(v) => { - write!(f, "Bound({v})") - } - Self::NamedNode(n) => write!(f, "{n}"), - Self::Literal(l) => write!(f, "{l}"), - Self::Rand => write!(f, "Rand()"), - Self::Now => write!(f, "Now()"), - Self::Uuid => write!(f, "Uuid()"), - Self::StrUuid => write!(f, "StrUuid()"), - Self::UnaryPlus(e) => write!(f, "UnaryPlus({e})"), - Self::UnaryMinus(e) => write!(f, "UnaryMinus({e})"), - Self::Not(e) => write!(f, "Not({e})"), - Self::BNode(e) => { - if let Some(e) = e { - write!(f, "BNode({e})") - } else { - write!(f, "BNode()") - } - } - Self::Str(e) => write!(f, "Str({e})"), - Self::Lang(e) => write!(f, "Lang({e})"), - Self::Datatype(e) => write!(f, "Datatype({e})"), - Self::Iri(e) => write!(f, "Iri({e})"), - Self::Abs(e) => write!(f, "Abs({e})"), - Self::Ceil(e) => write!(f, "Ceil({e})"), - Self::Floor(e) => write!(f, "Floor({e})"), - Self::Round(e) => write!(f, "Round({e})"), - Self::UCase(e) => write!(f, "UCase({e})"), - Self::LCase(e) => write!(f, "LCase({e})"), - Self::StrLen(e) => write!(f, "StrLen({e})"), - Self::EncodeForUri(e) => write!(f, "EncodeForUri({e})"), - Self::StaticRegex(e, r) => write!(f, "StaticRegex({e}, {r})"), - Self::Year(e) => write!(f, "Year({e})"), - Self::Month(e) => write!(f, "Month({e})"), - Self::Day(e) => write!(f, "Day({e})"), - Self::Hours(e) => write!(f, "Hours({e})"), - Self::Minutes(e) => write!(f, "Minutes({e})"), - Self::Seconds(e) => write!(f, "Seconds({e})"), - Self::Timezone(e) => write!(f, "Timezone({e})"), - Self::Tz(e) => write!(f, "Tz({e})"), - Self::Md5(e) => write!(f, "Md5({e})"), - Self::Sha1(e) => write!(f, "Sha1({e})"), - Self::Sha256(e) => write!(f, "Sha256({e})"), - Self::Sha384(e) => write!(f, "Sha384({e})"), - Self::Sha512(e) => write!(f, "Sha512({e})"), - Self::IsIri(e) => write!(f, "IsIri({e})"), - Self::IsBlank(e) => write!(f, "IsBlank({e})"), - Self::IsLiteral(e) => write!(f, "IsLiteral({e})"), - Self::IsNumeric(e) => write!(f, "IsNumeric({e})"), - Self::IsTriple(e) => write!(f, "IsTriple({e})"), - Self::Subject(e) => write!(f, "Subject({e})"), - Self::Predicate(e) => write!(f, "Predicate({e})"), - Self::Object(e) => write!(f, "Object({e})"), - Self::BooleanCast(e) => write!(f, "BooleanCast({e})"), - Self::DoubleCast(e) => write!(f, "DoubleCast({e})"), - Self::FloatCast(e) => write!(f, "FloatCast({e})"), - Self::DecimalCast(e) => write!(f, "DecimalCast({e})"), - Self::IntegerCast(e) => write!(f, "IntegerCast({e})"), - Self::DateCast(e) => write!(f, "DateCast({e})"), - Self::TimeCast(e) => write!(f, "TimeCast({e})"), - Self::DateTimeCast(e) => write!(f, "DateTimeCast({e})"), - Self::DurationCast(e) => write!(f, "DurationCast({e})"), - Self::YearMonthDurationCast(e) => write!(f, "YearMonthDurationCast({e})"), - Self::DayTimeDurationCast(e) => write!(f, "DayTimeDurationCast({e})"), - Self::StringCast(e) => write!(f, "StringCast({e})"), - Self::Or(es) => { - write!(f, "Or(")?; - for (i, e) in es.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{e}")?; - } - write!(f, ")") - } - Self::And(es) => { - write!(f, "And(")?; - for (i, e) in es.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{e}")?; - } - write!(f, ")") - } - Self::Equal(a, b) => write!(f, "Equal({a}, {b})"), - Self::Greater(a, b) => write!(f, "Greater({a}, {b})"), - Self::GreaterOrEqual(a, b) => write!(f, "GreaterOrEqual({a}, {b})"), - Self::Less(a, b) => write!(f, "Less({a}, {b})"), - Self::LessOrEqual(a, b) => write!(f, "LessOrEqual({a}, {b})"), - Self::Add(a, b) => write!(f, "Add({a}, {b})"), - Self::Subtract(a, b) => write!(f, "Subtract({a}, {b})"), - Self::Multiply(a, b) => write!(f, "Multiply({a}, {b})"), - Self::Divide(a, b) => write!(f, "Divide({a}, {b})"), - Self::LangMatches(a, b) => write!(f, "LangMatches({a}, {b})"), - Self::Contains(a, b) => write!(f, "Contains({a}, {b})"), - Self::StaticReplace(a, b, c) => write!(f, "StaticReplace({a}, {b}, {c})"), - Self::StrStarts(a, b) => write!(f, "StrStarts({a}, {b})"), - Self::StrEnds(a, b) => write!(f, "StrEnds({a}, {b})"), - Self::StrBefore(a, b) => write!(f, "StrBefore({a}, {b})"), - Self::StrAfter(a, b) => write!(f, "StrAfter({a}, {b})"), - Self::StrLang(a, b) => write!(f, "StrLang({a}, {b})"), - Self::StrDt(a, b) => write!(f, "StrDt({a}, {b})"), - Self::SameTerm(a, b) => write!(f, "SameTerm({a}, {b})"), - Self::SubStr(a, b, None) => write!(f, "SubStr({a}, {b})"), - Self::DynamicRegex(a, b, None) => write!(f, "DynamicRegex({a}, {b})"), - Self::Adjust(a, b) => write!(f, "Adjust({a}, {b})"), - Self::If(a, b, c) => write!(f, "If({a}, {b}, {c})"), - Self::SubStr(a, b, Some(c)) => write!(f, "SubStr({a}, {b}, {c})"), - Self::DynamicRegex(a, b, Some(c)) => write!(f, "DynamicRegex({a}, {b}, {c})"), - Self::DynamicReplace(a, b, c, None) => write!(f, "DynamicReplace({a}, {b}, {c})"), - Self::Triple(a, b, c) => write!(f, "Triple({a}, {b}, {c})"), - Self::DynamicReplace(a, b, c, Some(d)) => { - write!(f, "DynamicReplace({a}, {b}, {c}, {d})") - } - Self::Concat(es) => { - write!(f, "Concat(")?; - for (i, e) in es.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{e}")?; - } - write!(f, ")") - } - Self::Coalesce(es) => { - write!(f, "Coalesce(")?; - for (i, e) in es.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{e}")?; - } - write!(f, ")") - } - Self::CustomFunction(name, es) => { - write!(f, "{name}(")?; - for (i, e) in es.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{e}")?; - } - write!(f, ")") - } - Self::Exists(_) => write!(f, "Exists()"), //TODO - } - } -} - -#[derive(Debug, Clone)] -pub struct PlanAggregation { - pub function: PlanAggregationFunction, - pub parameter: Option<PlanExpression>, - pub distinct: bool, -} - -impl fmt::Display for PlanAggregation { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.function { - PlanAggregationFunction::Count => { - write!(f, "Count") - } - PlanAggregationFunction::Sum => { - write!(f, "Sum") - } - PlanAggregationFunction::Min => { - write!(f, "Min") - } - PlanAggregationFunction::Max => { - write!(f, "Max") - } - PlanAggregationFunction::Avg => { - write!(f, "Avg") - } - PlanAggregationFunction::GroupConcat { .. } => { - write!(f, "GroupConcat") - } - PlanAggregationFunction::Sample => write!(f, "Sample"), - }?; - if self.distinct { - write!(f, "Distinct")?; - } - write!(f, "(")?; - if let Some(expr) = &self.parameter { - write!(f, "{expr}")?; - } - if let PlanAggregationFunction::GroupConcat { separator } = &self.function { - write!(f, "; separator={separator}")?; - } - write!(f, ")") - } -} - -#[derive(Debug, Clone)] -pub enum PlanAggregationFunction { - Count, - Sum, - Min, - Max, - Avg, - Sample, - GroupConcat { separator: Rc<str> }, -} - -#[derive(Debug, Clone)] -pub enum PlanPropertyPath { - Path(PlanTerm<NamedNode>), - Reverse(Rc<Self>), - Sequence(Rc<Self>, Rc<Self>), - Alternative(Rc<Self>, Rc<Self>), - ZeroOrMore(Rc<Self>), - OneOrMore(Rc<Self>), - ZeroOrOne(Rc<Self>), - NegatedPropertySet(Rc<[PlanTerm<NamedNode>]>), -} - -impl fmt::Display for PlanPropertyPath { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Path(p) => write!(f, "{p}"), - Self::Reverse(p) => write!(f, "Reverse({p})"), - Self::Sequence(a, b) => write!(f, "Sequence{a}, {b}"), - Self::Alternative(a, b) => write!(f, "Alternative{a}, {b}"), - Self::ZeroOrMore(p) => write!(f, "ZeroOrMore({p})"), - Self::OneOrMore(p) => write!(f, "OneOrMore({p})"), - Self::ZeroOrOne(p) => write!(f, "ZeroOrOne({p})"), - Self::NegatedPropertySet(ps) => { - write!(f, "NegatedPropertySet(")?; - for (i, p) in ps.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{p}")?; - } - write!(f, ")") - } - } - } -} - -#[derive(Debug, Clone)] -pub enum Comparator { - Asc(PlanExpression), - Desc(PlanExpression), -} - -impl fmt::Display for Comparator { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Asc(c) => write!(f, "Asc({c})"), - Self::Desc(c) => write!(f, "Desc({c})"), - } - } -} - -#[derive(Debug, Clone)] -pub struct TripleTemplate { - pub subject: TripleTemplateValue, - pub predicate: TripleTemplateValue, - pub object: TripleTemplateValue, -} - -impl fmt::Display for TripleTemplate { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{} {} {}", self.subject, self.predicate, self.object) - } -} - -#[derive(Debug, Clone)] -pub enum TripleTemplateValue { - Constant(PlanTerm<Term>), - BlankNode(PlanVariable<BlankNode>), - Variable(PlanVariable), - Triple(Box<TripleTemplate>), -} - -impl fmt::Display for TripleTemplateValue { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Constant(c) => write!(f, "{c}"), - Self::BlankNode(bn) => write!(f, "{bn}"), - Self::Variable(v) => write!(f, "{v}"), - Self::Triple(t) => write!(f, "<< {t} >>"), - } - } -} - -#[derive(Eq, PartialEq, Debug, Clone, Hash)] -pub struct EncodedTuple { - inner: Vec<Option<EncodedTerm>>, -} - -impl EncodedTuple { - pub fn with_capacity(capacity: usize) -> Self { - Self { - inner: Vec::with_capacity(capacity), - } - } - - pub fn capacity(&self) -> usize { - self.inner.capacity() - } - - pub fn contains(&self, index: usize) -> bool { - self.inner.get(index).map_or(false, Option::is_some) - } - - pub fn get(&self, index: usize) -> Option<&EncodedTerm> { - self.inner.get(index).unwrap_or(&None).as_ref() - } - - pub fn iter(&self) -> impl Iterator<Item = Option<EncodedTerm>> + '_ { - self.inner.iter().cloned() - } - - pub fn set(&mut self, index: usize, value: EncodedTerm) { - if self.inner.len() <= index { - self.inner.resize(index + 1, None); - } - self.inner[index] = Some(value); - } - - pub fn combine_with(&self, other: &Self) -> Option<Self> { - if self.inner.len() < other.inner.len() { - let mut result = other.inner.clone(); - for (key, self_value) in self.inner.iter().enumerate() { - if let Some(self_value) = self_value { - match &other.inner[key] { - Some(other_value) => { - if self_value != other_value { - return None; - } - } - None => result[key] = Some(self_value.clone()), - } - } - } - Some(Self { inner: result }) - } else { - let mut result = self.inner.clone(); - for (key, other_value) in other.inner.iter().enumerate() { - if let Some(other_value) = other_value { - match &self.inner[key] { - Some(self_value) => { - if self_value != other_value { - return None; - } - } - None => result[key] = Some(other_value.clone()), - } - } - } - Some(Self { inner: result }) - } - } -} - -impl IntoIterator for EncodedTuple { - type Item = Option<EncodedTerm>; - type IntoIter = std::vec::IntoIter<Option<EncodedTerm>>; - - fn into_iter(self) -> Self::IntoIter { - self.inner.into_iter() - } -} - -pub struct PlanNodeWithStats { - pub node: Rc<PlanNode>, - pub children: Vec<Rc<PlanNodeWithStats>>, - pub exec_count: Cell<usize>, - pub exec_duration: Cell<Duration>, -} - -impl PlanNodeWithStats { - pub fn json_node( - &self, - writer: &mut JsonWriter<impl io::Write>, - with_stats: bool, - ) -> io::Result<()> { - writer.write_event(JsonEvent::StartObject)?; - writer.write_event(JsonEvent::ObjectKey("name"))?; - writer.write_event(JsonEvent::String(&self.node_label()))?; - if with_stats { - writer.write_event(JsonEvent::ObjectKey("number of results"))?; - writer.write_event(JsonEvent::Number(&self.exec_count.get().to_string()))?; - writer.write_event(JsonEvent::ObjectKey("duration in seconds"))?; - writer.write_event(JsonEvent::Number( - &self.exec_duration.get().as_secs_f32().to_string(), - ))?; - } - writer.write_event(JsonEvent::ObjectKey("children"))?; - writer.write_event(JsonEvent::StartArray)?; - for child in &self.children { - child.json_node(writer, with_stats)?; - } - writer.write_event(JsonEvent::EndArray)?; - writer.write_event(JsonEvent::EndObject) - } - - fn node_label(&self) -> String { - match self.node.as_ref() { - PlanNode::Aggregate { - key_variables, - aggregates, - .. - } => format!( - "Aggregate({})", - key_variables - .iter() - .map(ToString::to_string) - .chain(aggregates.iter().map(|(agg, v)| format!("{agg} -> {v}"))) - .collect::<Vec<_>>() - .join(", ") - ), - PlanNode::AntiJoin { .. } => "AntiJoin".to_owned(), - PlanNode::Extend { - expression, - variable, - .. - } => format!("Extend({expression} -> {variable})"), - PlanNode::Filter { expression, .. } => format!("Filter({expression})"), - PlanNode::ForLoopJoin { .. } => "ForLoopJoin".to_owned(), - PlanNode::ForLoopLeftJoin { .. } => "ForLoopLeftJoin".to_owned(), - PlanNode::HashDeduplicate { .. } => "HashDeduplicate".to_owned(), - PlanNode::HashJoin { .. } => "HashJoin".to_owned(), - PlanNode::HashLeftJoin { expression, .. } => format!("HashLeftJoin({expression})"), - PlanNode::Limit { count, .. } => format!("Limit({count})"), - PlanNode::PathPattern { - subject, - path, - object, - graph_name, - } => format!("PathPattern({subject} {path} {object} {graph_name})"), - PlanNode::Project { mapping, .. } => { - format!( - "Project({})", - mapping - .iter() - .map(|(f, t)| if f.plain == t.plain { - f.to_string() - } else { - format!("{f} -> {t}") - }) - .collect::<Vec<_>>() - .join(", ") - ) - } - PlanNode::QuadPattern { - subject, - predicate, - object, - graph_name, - } => format!("QuadPattern({subject} {predicate} {object} {graph_name})"), - PlanNode::Reduced { .. } => "Reduced".to_owned(), - PlanNode::Service { - service_name, - silent, - .. - } => { - if *silent { - format!("SilentService({service_name})") - } else { - format!("Service({service_name})") - } - } - PlanNode::Skip { count, .. } => format!("Skip({count})"), - PlanNode::Sort { by, .. } => { - format!( - "Sort({})", - by.iter() - .map(ToString::to_string) - .collect::<Vec<_>>() - .join(", ") - ) - } - PlanNode::StaticBindings { variables, .. } => { - format!( - "StaticBindings({})", - variables - .iter() - .map(ToString::to_string) - .collect::<Vec<_>>() - .join(", ") - ) - } - PlanNode::Union { .. } => "Union".to_owned(), - } - } -} - -impl fmt::Debug for PlanNodeWithStats { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut obj = f.debug_struct("Node"); - obj.field("name", &self.node_label()); - if self.exec_duration.get() > Duration::default() { - obj.field("number of results", &self.exec_count.get()); - obj.field("duration in seconds", &self.exec_duration.get()); - } - if !self.children.is_empty() { - obj.field("children", &self.children); - } - obj.finish() - } -} diff --git a/lib/src/sparql/plan_builder.rs b/lib/src/sparql/plan_builder.rs deleted file mode 100644 index 02432883..00000000 --- a/lib/src/sparql/plan_builder.rs +++ /dev/null @@ -1,1718 +0,0 @@ -use crate::model::Term as OxTerm; -use crate::sparql::dataset::DatasetView; -use crate::sparql::error::EvaluationError; -use crate::sparql::eval::compile_pattern; -use crate::sparql::plan::*; -use crate::storage::numeric_encoder::{EncodedTerm, EncodedTriple}; -use oxrdf::vocab::xsd; -use oxrdf::TermRef; -use rand::random; -use regex::Regex; -use spargebra::algebra::*; -use spargebra::term::*; -use std::collections::{BTreeSet, HashMap, HashSet}; -use std::mem::swap; -use std::rc::Rc; - -pub struct PlanBuilder<'a> { - dataset: &'a DatasetView, - custom_functions: &'a HashMap<NamedNode, Rc<dyn Fn(&[OxTerm]) -> Option<OxTerm>>>, - with_optimizations: bool, -} - -impl<'a> PlanBuilder<'a> { - pub fn build( - dataset: &'a DatasetView, - pattern: &GraphPattern, - is_cardinality_meaningful: bool, - custom_functions: &'a HashMap<NamedNode, Rc<dyn Fn(&[OxTerm]) -> Option<OxTerm>>>, - without_optimizations: bool, - ) -> Result<(PlanNode, Vec<Variable>), EvaluationError> { - let mut variables = Vec::default(); - let plan = PlanBuilder { - dataset, - custom_functions, - with_optimizations: !without_optimizations, - } - .build_for_graph_pattern( - pattern, - &mut variables, - &PatternValue::Constant(PlanTerm { - encoded: EncodedTerm::DefaultGraph, - plain: PatternValueConstant::DefaultGraph, - }), - )?; - let plan = if !without_optimizations && !is_cardinality_meaningful { - // let's reduce downstream task. - // TODO: avoid if already REDUCED or DISTINCT - PlanNode::Reduced { - child: Rc::new(plan), - } - } else { - plan - }; - Ok((plan, variables)) - } - - pub fn build_graph_template( - dataset: &'a DatasetView, - template: &[TriplePattern], - mut variables: Vec<Variable>, - custom_functions: &'a HashMap<NamedNode, Rc<dyn Fn(&[OxTerm]) -> Option<OxTerm>>>, - without_optimizations: bool, - ) -> Vec<TripleTemplate> { - PlanBuilder { - dataset, - custom_functions, - with_optimizations: !without_optimizations, - } - .build_for_graph_template(template, &mut variables) - } - - fn build_for_graph_pattern( - &self, - pattern: &GraphPattern, - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - ) -> Result<PlanNode, EvaluationError> { - Ok(match pattern { - GraphPattern::Bgp { patterns } => { - if self.with_optimizations { - self.build_for_bgp(sort_bgp(patterns), variables, graph_name) - } else { - self.build_for_bgp(patterns, variables, graph_name) - } - } - GraphPattern::Path { - subject, - path, - object, - } => PlanNode::PathPattern { - subject: self.pattern_value_from_term_or_variable(subject, variables), - path: Rc::new(self.build_for_path(path)), - object: self.pattern_value_from_term_or_variable(object, variables), - graph_name: graph_name.clone(), - }, - GraphPattern::Join { left, right } => self.new_join( - self.build_for_graph_pattern(left, variables, graph_name)?, - self.build_for_graph_pattern(right, variables, graph_name)?, - ), - GraphPattern::LeftJoin { - left, - right, - expression, - } => { - let left = self.build_for_graph_pattern(left, variables, graph_name)?; - let right = self.build_for_graph_pattern(right, variables, graph_name)?; - - if self.with_optimizations && Self::can_use_for_loop_left_join(&right) { - let mut possible_problem_vars = BTreeSet::new(); - Self::add_left_join_problematic_variables(&right, &mut possible_problem_vars); - - //We add the extra filter if needed - let right = if let Some(expr) = expression { - self.push_filter( - Rc::new(right), - Box::new(self.build_for_expression(expr, variables, graph_name)?), - ) - } else { - right - }; - PlanNode::ForLoopLeftJoin { - left: Rc::new(left), - right: Rc::new(right), - possible_problem_vars: possible_problem_vars.into_iter().collect(), - } - } else { - PlanNode::HashLeftJoin { - left: Rc::new(left), - right: Rc::new(right), - expression: Box::new(expression.as_ref().map_or( - Ok(PlanExpression::Literal(PlanTerm { - encoded: true.into(), - plain: true.into(), - })), - |e| self.build_for_expression(e, variables, graph_name), - )?), - } - } - } - GraphPattern::Lateral { left, right } => PlanNode::ForLoopJoin { - left: Rc::new(self.build_for_graph_pattern(left, variables, graph_name)?), - right: Rc::new(self.build_for_graph_pattern(right, variables, graph_name)?), - }, - GraphPattern::Filter { expr, inner } => self.push_filter( - Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - Box::new(self.build_for_expression(expr, variables, graph_name)?), - ), - GraphPattern::Union { left, right } => { - //We flatten the UNION - let mut stack: Vec<&GraphPattern> = vec![left, right]; - let mut children = vec![]; - loop { - match stack.pop() { - None => break, - Some(GraphPattern::Union { left, right }) => { - stack.push(left); - stack.push(right); - } - Some(p) => children.push(Rc::new( - self.build_for_graph_pattern(p, variables, graph_name)?, - )), - } - } - PlanNode::Union { children } - } - GraphPattern::Graph { name, inner } => { - let graph_name = self.pattern_value_from_named_node_or_variable(name, variables); - self.build_for_graph_pattern(inner, variables, &graph_name)? - } - GraphPattern::Extend { - inner, - variable, - expression, - } => PlanNode::Extend { - child: Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - variable: build_plan_variable(variables, variable), - expression: Box::new(self.build_for_expression(expression, variables, graph_name)?), - }, - GraphPattern::Minus { left, right } => PlanNode::AntiJoin { - left: Rc::new(self.build_for_graph_pattern(left, variables, graph_name)?), - right: Rc::new(self.build_for_graph_pattern(right, variables, graph_name)?), - }, - GraphPattern::Service { - name, - inner, - silent, - } => { - // Child building should be at the begging in order for `variables` to be filled - let child = self.build_for_graph_pattern(inner, variables, graph_name)?; - let service_name = self.pattern_value_from_named_node_or_variable(name, variables); - PlanNode::Service { - service_name, - variables: Rc::from(variables.as_slice()), - child: Rc::new(child), - graph_pattern: Rc::new(inner.as_ref().clone()), - silent: *silent, - } - } - GraphPattern::Group { - inner, - variables: by, - aggregates, - } => PlanNode::Aggregate { - child: Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - key_variables: by - .iter() - .map(|k| build_plan_variable(variables, k)) - .collect(), - aggregates: aggregates - .iter() - .map(|(v, a)| { - Ok(( - self.build_for_aggregate(a, variables, graph_name)?, - build_plan_variable(variables, v), - )) - }) - .collect::<Result<_, EvaluationError>>()?, - }, - GraphPattern::Values { - variables: table_variables, - bindings, - } => { - let bindings_variables = table_variables - .iter() - .map(|v| build_plan_variable(variables, v)) - .collect::<Vec<_>>(); - let encoded_tuples = bindings - .iter() - .map(|row| { - let mut result = EncodedTuple::with_capacity(variables.len()); - for (key, value) in row.iter().enumerate() { - if let Some(term) = value { - result.set( - bindings_variables[key].encoded, - match term { - GroundTerm::NamedNode(node) => self.build_term(node), - GroundTerm::Literal(literal) => self.build_term(literal), - GroundTerm::Triple(triple) => self.build_triple(triple), - }, - ); - } - } - result - }) - .collect(); - PlanNode::StaticBindings { - encoded_tuples, - variables: bindings_variables, - plain_bindings: bindings.clone(), - } - } - GraphPattern::OrderBy { inner, expression } => { - let condition: Result<Vec<_>, EvaluationError> = expression - .iter() - .map(|comp| match comp { - OrderExpression::Asc(e) => Ok(Comparator::Asc( - self.build_for_expression(e, variables, graph_name)?, - )), - OrderExpression::Desc(e) => Ok(Comparator::Desc( - self.build_for_expression(e, variables, graph_name)?, - )), - }) - .collect(); - PlanNode::Sort { - child: Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - by: condition?, - } - } - GraphPattern::Project { - inner, - variables: projection, - } => { - let mut inner_variables = projection.clone(); - let inner_graph_name = - Self::convert_pattern_value_id(graph_name, &mut inner_variables); - PlanNode::Project { - child: Rc::new(self.build_for_graph_pattern( - inner, - &mut inner_variables, - &inner_graph_name, - )?), - mapping: projection - .iter() - .enumerate() - .map(|(new_variable, variable)| { - ( - PlanVariable { - encoded: new_variable, - plain: variable.clone(), - }, - build_plan_variable(variables, variable), - ) - }) - .collect(), - } - } - GraphPattern::Distinct { inner } => PlanNode::HashDeduplicate { - child: Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - }, - GraphPattern::Reduced { inner } => PlanNode::Reduced { - child: Rc::new(self.build_for_graph_pattern(inner, variables, graph_name)?), - }, - GraphPattern::Slice { - inner, - start, - length, - } => { - let mut plan = self.build_for_graph_pattern(inner, variables, graph_name)?; - if *start > 0 { - plan = PlanNode::Skip { - child: Rc::new(plan), - count: *start, - }; - } - if let Some(length) = length { - plan = PlanNode::Limit { - child: Rc::new(plan), - count: *length, - }; - } - plan - } - }) - } - - fn build_for_bgp<'b>( - &self, - patterns: impl IntoIterator<Item = &'b TriplePattern>, - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - ) -> PlanNode { - patterns - .into_iter() - .map(|triple| PlanNode::QuadPattern { - subject: self.pattern_value_from_term_or_variable(&triple.subject, variables), - predicate: self - .pattern_value_from_named_node_or_variable(&triple.predicate, variables), - object: self.pattern_value_from_term_or_variable(&triple.object, variables), - graph_name: graph_name.clone(), - }) - .reduce(|a, b| self.new_join(a, b)) - .unwrap_or_else(|| PlanNode::StaticBindings { - encoded_tuples: vec![EncodedTuple::with_capacity(variables.len())], - variables: Vec::new(), - plain_bindings: vec![Vec::new()], - }) - } - - fn build_for_path(&self, path: &PropertyPathExpression) -> PlanPropertyPath { - match path { - PropertyPathExpression::NamedNode(p) => PlanPropertyPath::Path(PlanTerm { - encoded: self.build_term(p), - plain: p.clone(), - }), - PropertyPathExpression::Reverse(p) => { - PlanPropertyPath::Reverse(Rc::new(self.build_for_path(p))) - } - PropertyPathExpression::Alternative(a, b) => PlanPropertyPath::Alternative( - Rc::new(self.build_for_path(a)), - Rc::new(self.build_for_path(b)), - ), - PropertyPathExpression::Sequence(a, b) => PlanPropertyPath::Sequence( - Rc::new(self.build_for_path(a)), - Rc::new(self.build_for_path(b)), - ), - PropertyPathExpression::ZeroOrMore(p) => { - PlanPropertyPath::ZeroOrMore(Rc::new(self.build_for_path(p))) - } - PropertyPathExpression::OneOrMore(p) => { - PlanPropertyPath::OneOrMore(Rc::new(self.build_for_path(p))) - } - PropertyPathExpression::ZeroOrOne(p) => { - PlanPropertyPath::ZeroOrOne(Rc::new(self.build_for_path(p))) - } - PropertyPathExpression::NegatedPropertySet(p) => PlanPropertyPath::NegatedPropertySet( - p.iter() - .map(|p| PlanTerm { - encoded: self.build_term(p), - plain: p.clone(), - }) - .collect(), - ), - } - } - - fn build_for_expression( - &self, - expression: &Expression, - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - ) -> Result<PlanExpression, EvaluationError> { - Ok(match expression { - Expression::NamedNode(node) => PlanExpression::NamedNode(PlanTerm { - encoded: self.build_term(node), - plain: node.clone(), - }), - Expression::Literal(l) => PlanExpression::Literal(PlanTerm { - encoded: self.build_term(l), - plain: l.clone(), - }), - Expression::Variable(v) => PlanExpression::Variable(build_plan_variable(variables, v)), - Expression::Or(a, b) => PlanExpression::Or(vec![ - self.build_for_expression(a, variables, graph_name)?, - self.build_for_expression(b, variables, graph_name)?, - ]), - Expression::And(a, b) => PlanExpression::And(vec![ - self.build_for_expression(a, variables, graph_name)?, - self.build_for_expression(b, variables, graph_name)?, - ]), - Expression::Equal(a, b) => PlanExpression::Equal( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::SameTerm(a, b) => PlanExpression::SameTerm( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::Greater(a, b) => PlanExpression::Greater( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::GreaterOrEqual(a, b) => PlanExpression::GreaterOrEqual( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::Less(a, b) => PlanExpression::Less( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::LessOrEqual(a, b) => PlanExpression::LessOrEqual( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::In(e, l) => { - let e = self.build_for_expression(e, variables, graph_name)?; - if l.is_empty() { - // False except on error - PlanExpression::If( - Box::new(e), - Box::new(PlanExpression::Literal(PlanTerm { - encoded: false.into(), - plain: false.into(), - })), - Box::new(PlanExpression::Literal(PlanTerm { - encoded: false.into(), - plain: false.into(), - })), - ) - } else { - PlanExpression::Or( - l.iter() - .map(|v| { - Ok(PlanExpression::Equal( - Box::new(e.clone()), - Box::new(self.build_for_expression(v, variables, graph_name)?), - )) - }) - .collect::<Result<_, EvaluationError>>()?, - ) - } - } - Expression::Add(a, b) => PlanExpression::Add( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::Subtract(a, b) => PlanExpression::Subtract( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::Multiply(a, b) => PlanExpression::Multiply( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::Divide(a, b) => PlanExpression::Divide( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - ), - Expression::UnaryPlus(e) => PlanExpression::UnaryPlus(Box::new( - self.build_for_expression(e, variables, graph_name)?, - )), - Expression::UnaryMinus(e) => PlanExpression::UnaryMinus(Box::new( - self.build_for_expression(e, variables, graph_name)?, - )), - Expression::Not(e) => PlanExpression::Not(Box::new( - self.build_for_expression(e, variables, graph_name)?, - )), - Expression::FunctionCall(function, parameters) => match function { - Function::Str => PlanExpression::Str(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Lang => PlanExpression::Lang(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::LangMatches => PlanExpression::LangMatches( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::Datatype => PlanExpression::Datatype(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Iri => PlanExpression::Iri(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::BNode => PlanExpression::BNode(match parameters.get(0) { - Some(e) => Some(Box::new( - self.build_for_expression(e, variables, graph_name)?, - )), - None => None, - }), - Function::Rand => PlanExpression::Rand, - Function::Abs => PlanExpression::Abs(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Ceil => PlanExpression::Ceil(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Floor => PlanExpression::Floor(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Round => PlanExpression::Round(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Concat => { - PlanExpression::Concat(self.expression_list(parameters, variables, graph_name)?) - } - Function::SubStr => PlanExpression::SubStr( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - match parameters.get(2) { - Some(flags) => Some(Box::new( - self.build_for_expression(flags, variables, graph_name)?, - )), - None => None, - }, - ), - Function::StrLen => PlanExpression::StrLen(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Replace => { - if let Some(static_regex) = - compile_static_pattern_if_exists(¶meters[1], parameters.get(3)) - { - PlanExpression::StaticReplace( - Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?), - static_regex, - Box::new(self.build_for_expression( - ¶meters[2], - variables, - graph_name, - )?), - ) - } else { - PlanExpression::DynamicReplace( - Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?), - Box::new(self.build_for_expression( - ¶meters[1], - variables, - graph_name, - )?), - Box::new(self.build_for_expression( - ¶meters[2], - variables, - graph_name, - )?), - match parameters.get(3) { - Some(flags) => Some(Box::new( - self.build_for_expression(flags, variables, graph_name)?, - )), - None => None, - }, - ) - } - } - Function::UCase => PlanExpression::UCase(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::LCase => PlanExpression::LCase(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::EncodeForUri => PlanExpression::EncodeForUri(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Contains => PlanExpression::Contains( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::StrStarts => PlanExpression::StrStarts( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::StrEnds => PlanExpression::StrEnds( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::StrBefore => PlanExpression::StrBefore( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::StrAfter => PlanExpression::StrAfter( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::Year => PlanExpression::Year(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Month => PlanExpression::Month(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Day => PlanExpression::Day(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Hours => PlanExpression::Hours(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Minutes => PlanExpression::Minutes(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Seconds => PlanExpression::Seconds(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Timezone => PlanExpression::Timezone(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Tz => PlanExpression::Tz(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Now => PlanExpression::Now, - Function::Uuid => PlanExpression::Uuid, - Function::StrUuid => PlanExpression::StrUuid, - Function::Md5 => PlanExpression::Md5(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Sha1 => PlanExpression::Sha1(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Sha256 => PlanExpression::Sha256(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Sha384 => PlanExpression::Sha384(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Sha512 => PlanExpression::Sha512(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::StrLang => PlanExpression::StrLang( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::StrDt => PlanExpression::StrDt( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::IsIri => PlanExpression::IsIri(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::IsBlank => PlanExpression::IsBlank(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::IsLiteral => PlanExpression::IsLiteral(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::IsNumeric => PlanExpression::IsNumeric(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Regex => { - if let Some(static_regex) = - compile_static_pattern_if_exists(¶meters[1], parameters.get(2)) - { - PlanExpression::StaticRegex( - Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?), - static_regex, - ) - } else { - PlanExpression::DynamicRegex( - Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?), - Box::new(self.build_for_expression( - ¶meters[1], - variables, - graph_name, - )?), - match parameters.get(2) { - Some(flags) => Some(Box::new( - self.build_for_expression(flags, variables, graph_name)?, - )), - None => None, - }, - ) - } - } - Function::Triple => PlanExpression::Triple( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[2], variables, graph_name)?), - ), - Function::Subject => PlanExpression::Subject(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::Predicate => PlanExpression::Predicate(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Object => PlanExpression::Object(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?)), - Function::IsTriple => PlanExpression::IsTriple(Box::new( - self.build_for_expression(¶meters[0], variables, graph_name)?, - )), - Function::Adjust => PlanExpression::Adjust( - Box::new(self.build_for_expression(¶meters[0], variables, graph_name)?), - Box::new(self.build_for_expression(¶meters[1], variables, graph_name)?), - ), - Function::Custom(name) => { - if self.custom_functions.contains_key(name) { - PlanExpression::CustomFunction( - name.clone(), - parameters - .iter() - .map(|p| self.build_for_expression(p, variables, graph_name)) - .collect::<Result<Vec<_>, EvaluationError>>()?, - ) - } else if name.as_ref() == xsd::BOOLEAN { - self.build_cast( - parameters, - PlanExpression::BooleanCast, - variables, - graph_name, - "boolean", - )? - } else if name.as_ref() == xsd::DOUBLE { - self.build_cast( - parameters, - PlanExpression::DoubleCast, - variables, - graph_name, - "double", - )? - } else if name.as_ref() == xsd::FLOAT { - self.build_cast( - parameters, - PlanExpression::FloatCast, - variables, - graph_name, - "float", - )? - } else if name.as_ref() == xsd::DECIMAL { - self.build_cast( - parameters, - PlanExpression::DecimalCast, - variables, - graph_name, - "decimal", - )? - } else if name.as_ref() == xsd::INTEGER { - self.build_cast( - parameters, - PlanExpression::IntegerCast, - variables, - graph_name, - "integer", - )? - } else if name.as_ref() == xsd::DATE { - self.build_cast( - parameters, - PlanExpression::DateCast, - variables, - graph_name, - "date", - )? - } else if name.as_ref() == xsd::TIME { - self.build_cast( - parameters, - PlanExpression::TimeCast, - variables, - graph_name, - "time", - )? - } else if name.as_ref() == xsd::DATE_TIME { - self.build_cast( - parameters, - PlanExpression::DateTimeCast, - variables, - graph_name, - "dateTime", - )? - } else if name.as_ref() == xsd::DURATION { - self.build_cast( - parameters, - PlanExpression::DurationCast, - variables, - graph_name, - "duration", - )? - } else if name.as_ref() == xsd::YEAR_MONTH_DURATION { - self.build_cast( - parameters, - PlanExpression::YearMonthDurationCast, - variables, - graph_name, - "yearMonthDuration", - )? - } else if name.as_ref() == xsd::DAY_TIME_DURATION { - self.build_cast( - parameters, - PlanExpression::DayTimeDurationCast, - variables, - graph_name, - "dayTimeDuration", - )? - } else if name.as_ref() == xsd::STRING { - self.build_cast( - parameters, - PlanExpression::StringCast, - variables, - graph_name, - "string", - )? - } else { - return Err(EvaluationError::msg(format!( - "Not supported custom function {expression}" - ))); - } - } - }, - Expression::Bound(v) => PlanExpression::Bound(build_plan_variable(variables, v)), - Expression::If(a, b, c) => PlanExpression::If( - Box::new(self.build_for_expression(a, variables, graph_name)?), - Box::new(self.build_for_expression(b, variables, graph_name)?), - Box::new(self.build_for_expression(c, variables, graph_name)?), - ), - Expression::Exists(n) => { - let mut variables = variables.clone(); // Do not expose the exists variables outside - PlanExpression::Exists(Rc::new(self.build_for_graph_pattern( - n, - &mut variables, - graph_name, - )?)) - } - Expression::Coalesce(parameters) => { - PlanExpression::Coalesce(self.expression_list(parameters, variables, graph_name)?) - } - }) - } - - fn build_cast( - &self, - parameters: &[Expression], - constructor: impl Fn(Box<PlanExpression>) -> PlanExpression, - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - name: &'static str, - ) -> Result<PlanExpression, EvaluationError> { - if parameters.len() == 1 { - Ok(constructor(Box::new(self.build_for_expression( - ¶meters[0], - variables, - graph_name, - )?))) - } else { - Err(EvaluationError::msg(format!( - "The xsd:{name} casting takes only one parameter" - ))) - } - } - - fn expression_list( - &self, - l: &[Expression], - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - ) -> Result<Vec<PlanExpression>, EvaluationError> { - l.iter() - .map(|e| self.build_for_expression(e, variables, graph_name)) - .collect() - } - - fn pattern_value_from_term_or_variable( - &self, - term_or_variable: &TermPattern, - variables: &mut Vec<Variable>, - ) -> PatternValue { - match term_or_variable { - TermPattern::Variable(variable) => { - PatternValue::Variable(build_plan_variable(variables, variable)) - } - TermPattern::NamedNode(node) => PatternValue::Constant(PlanTerm { - encoded: self.build_term(node), - plain: PatternValueConstant::NamedNode(node.clone()), - }), - TermPattern::BlankNode(bnode) => { - PatternValue::Variable(build_plan_variable( - variables, - &Variable::new_unchecked(bnode.as_str()), - )) - //TODO: very bad hack to convert bnode to variable - } - TermPattern::Literal(literal) => PatternValue::Constant(PlanTerm { - encoded: self.build_term(literal), - plain: PatternValueConstant::Literal(literal.clone()), - }), - TermPattern::Triple(triple) => { - match ( - self.pattern_value_from_term_or_variable(&triple.subject, variables), - self.pattern_value_from_named_node_or_variable(&triple.predicate, variables), - self.pattern_value_from_term_or_variable(&triple.object, variables), - ) { - ( - PatternValue::Constant(PlanTerm { - encoded: encoded_subject, - plain: plain_subject, - }), - PatternValue::Constant(PlanTerm { - encoded: encoded_predicate, - plain: plain_predicate, - }), - PatternValue::Constant(PlanTerm { - encoded: encoded_object, - plain: plain_object, - }), - ) => PatternValue::Constant(PlanTerm { - encoded: EncodedTriple { - subject: encoded_subject, - predicate: encoded_predicate, - object: encoded_object, - } - .into(), - plain: PatternValueConstant::Triple(Box::new(Triple { - subject: match plain_subject { - PatternValueConstant::NamedNode(s) => s.into(), - PatternValueConstant::Triple(s) => s.into(), - PatternValueConstant::Literal(_) - | PatternValueConstant::DefaultGraph => unreachable!(), - }, - predicate: match plain_predicate { - PatternValueConstant::NamedNode(s) => s, - PatternValueConstant::Literal(_) - | PatternValueConstant::Triple(_) - | PatternValueConstant::DefaultGraph => unreachable!(), - }, - object: match plain_object { - PatternValueConstant::NamedNode(s) => s.into(), - PatternValueConstant::Literal(s) => s.into(), - PatternValueConstant::Triple(s) => s.into(), - PatternValueConstant::DefaultGraph => unreachable!(), - }, - })), - }), - (subject, predicate, object) => { - PatternValue::TriplePattern(Box::new(TriplePatternValue { - subject, - predicate, - object, - })) - } - } - } - } - } - - fn pattern_value_from_named_node_or_variable( - &self, - named_node_or_variable: &NamedNodePattern, - variables: &mut Vec<Variable>, - ) -> PatternValue { - match named_node_or_variable { - NamedNodePattern::NamedNode(named_node) => PatternValue::Constant(PlanTerm { - encoded: self.build_term(named_node), - plain: PatternValueConstant::NamedNode(named_node.clone()), - }), - NamedNodePattern::Variable(variable) => { - PatternValue::Variable(build_plan_variable(variables, variable)) - } - } - } - - fn build_for_aggregate( - &self, - aggregate: &AggregateExpression, - variables: &mut Vec<Variable>, - graph_name: &PatternValue, - ) -> Result<PlanAggregation, EvaluationError> { - match aggregate { - AggregateExpression::Count { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Count, - parameter: match expr { - Some(expr) => Some(self.build_for_expression(expr, variables, graph_name)?), - None => None, - }, - distinct: *distinct, - }), - AggregateExpression::Sum { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Sum, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::Min { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Min, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::Max { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Max, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::Avg { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Avg, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::Sample { expr, distinct } => Ok(PlanAggregation { - function: PlanAggregationFunction::Sample, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::GroupConcat { - expr, - distinct, - separator, - } => Ok(PlanAggregation { - function: PlanAggregationFunction::GroupConcat { - separator: Rc::from(separator.as_deref().unwrap_or(" ")), - }, - parameter: Some(self.build_for_expression(expr, variables, graph_name)?), - distinct: *distinct, - }), - AggregateExpression::Custom { .. } => Err(EvaluationError::msg( - "Custom aggregation functions are not supported yet", - )), - } - } - - fn build_for_graph_template( - &self, - template: &[TriplePattern], - variables: &mut Vec<Variable>, - ) -> Vec<TripleTemplate> { - let mut bnodes = Vec::default(); - template - .iter() - .map(|triple| TripleTemplate { - subject: self.template_value_from_term_or_variable( - &triple.subject, - variables, - &mut bnodes, - ), - predicate: self - .template_value_from_named_node_or_variable(&triple.predicate, variables), - object: self.template_value_from_term_or_variable( - &triple.object, - variables, - &mut bnodes, - ), - }) - .collect() - } - - fn template_value_from_term_or_variable( - &self, - term_or_variable: &TermPattern, - variables: &mut Vec<Variable>, - bnodes: &mut Vec<BlankNode>, - ) -> TripleTemplateValue { - match term_or_variable { - TermPattern::Variable(variable) => { - TripleTemplateValue::Variable(build_plan_variable(variables, variable)) - } - TermPattern::NamedNode(node) => TripleTemplateValue::Constant(PlanTerm { - encoded: self.build_term(node), - plain: node.clone().into(), - }), - TermPattern::BlankNode(bnode) => TripleTemplateValue::BlankNode(PlanVariable { - encoded: bnode_key(bnodes, bnode), - plain: bnode.clone(), - }), - TermPattern::Literal(literal) => TripleTemplateValue::Constant(PlanTerm { - encoded: self.build_term(literal), - plain: literal.clone().into(), - }), - TermPattern::Triple(triple) => match ( - self.template_value_from_term_or_variable(&triple.subject, variables, bnodes), - self.template_value_from_named_node_or_variable(&triple.predicate, variables), - self.template_value_from_term_or_variable(&triple.object, variables, bnodes), - ) { - ( - TripleTemplateValue::Constant(subject), - TripleTemplateValue::Constant(predicate), - TripleTemplateValue::Constant(object), - ) => TripleTemplateValue::Constant(PlanTerm { - encoded: EncodedTriple { - subject: subject.encoded, - predicate: predicate.encoded, - object: object.encoded, - } - .into(), - plain: Triple { - subject: match subject.plain { - Term::NamedNode(node) => node.into(), - Term::BlankNode(node) => node.into(), - Term::Literal(_) => unreachable!(), - Term::Triple(node) => node.into(), - }, - predicate: match predicate.plain { - Term::NamedNode(node) => node, - Term::BlankNode(_) | Term::Literal(_) | Term::Triple(_) => { - unreachable!() - } - }, - object: object.plain, - } - .into(), - }), - (subject, predicate, object) => { - TripleTemplateValue::Triple(Box::new(TripleTemplate { - subject, - predicate, - object, - })) - } - }, - } - } - - fn template_value_from_named_node_or_variable( - &self, - named_node_or_variable: &NamedNodePattern, - variables: &mut Vec<Variable>, - ) -> TripleTemplateValue { - match named_node_or_variable { - NamedNodePattern::Variable(variable) => { - TripleTemplateValue::Variable(build_plan_variable(variables, variable)) - } - NamedNodePattern::NamedNode(term) => TripleTemplateValue::Constant(PlanTerm { - encoded: self.build_term(term), - plain: term.clone().into(), - }), - } - } - - fn convert_pattern_value_id(from_value: &PatternValue, to: &mut Vec<Variable>) -> PatternValue { - match from_value { - PatternValue::Constant(c) => PatternValue::Constant(c.clone()), - PatternValue::Variable(from_id) => { - PatternValue::Variable(Self::convert_plan_variable(from_id, to)) - } - PatternValue::TriplePattern(triple) => { - PatternValue::TriplePattern(Box::new(TriplePatternValue { - subject: Self::convert_pattern_value_id(&triple.subject, to), - predicate: Self::convert_pattern_value_id(&triple.predicate, to), - object: Self::convert_pattern_value_id(&triple.object, to), - })) - } - } - } - - fn convert_plan_variable(from_variable: &PlanVariable, to: &mut Vec<Variable>) -> PlanVariable { - let encoded = if let Some(to_id) = to - .iter() - .enumerate() - .find_map(|(to_id, var)| (*var == from_variable.plain).then(|| to_id)) - { - to_id - } else { - to.push(Variable::new_unchecked(format!("{:x}", random::<u128>()))); - to.len() - 1 - }; - PlanVariable { - encoded, - plain: from_variable.plain.clone(), - } - } - - fn can_use_for_loop_left_join(node: &PlanNode) -> bool { - // We forbid MINUS, SERVICE and everything that affects cardinality in for loop left joins - match node { - PlanNode::StaticBindings { .. } - | PlanNode::QuadPattern { .. } - | PlanNode::PathPattern { .. } => true, - PlanNode::Filter { child, .. } - | PlanNode::Extend { child, .. } - | PlanNode::Sort { child, .. } - | PlanNode::Project { child, .. } - | PlanNode::Aggregate { child, .. } => Self::can_use_for_loop_left_join(child), - PlanNode::Union { children } => { - children.iter().all(|c| Self::can_use_for_loop_left_join(c)) - } - PlanNode::HashJoin { left, right } - | PlanNode::ForLoopJoin { left, right } - | PlanNode::ForLoopLeftJoin { left, right, .. } - | PlanNode::HashLeftJoin { left, right, .. } => { - Self::can_use_for_loop_left_join(left) && Self::can_use_for_loop_left_join(right) - } - PlanNode::AntiJoin { .. } - | PlanNode::Service { .. } - | PlanNode::HashDeduplicate { .. } - | PlanNode::Reduced { .. } - | PlanNode::Skip { .. } - | PlanNode::Limit { .. } => false, - } - } - - fn add_left_join_problematic_variables(node: &PlanNode, set: &mut BTreeSet<usize>) { - match node { - PlanNode::StaticBindings { .. } - | PlanNode::QuadPattern { .. } - | PlanNode::PathPattern { .. } => (), - PlanNode::Filter { child, expression } => { - let always_already_bound = child.always_bound_variables(); - expression.lookup_used_variables(&mut |v| { - if !always_already_bound.contains(&v) { - set.insert(v); - } - }); - Self::add_left_join_problematic_variables(child, set); - } - PlanNode::Union { children } => { - for child in children { - Self::add_left_join_problematic_variables(child, set); - } - } - PlanNode::HashJoin { left, right } | PlanNode::ForLoopJoin { left, right } => { - Self::add_left_join_problematic_variables(left, set); - Self::add_left_join_problematic_variables(right, set); - } - PlanNode::AntiJoin { left, .. } => { - Self::add_left_join_problematic_variables(left, set); - } - PlanNode::ForLoopLeftJoin { left, right, .. } => { - Self::add_left_join_problematic_variables(left, set); - right.lookup_used_variables(&mut |v| { - set.insert(v); - }); - } - PlanNode::HashLeftJoin { - left, - right, - expression, - } => { - Self::add_left_join_problematic_variables(left, set); - right.lookup_used_variables(&mut |v| { - set.insert(v); - }); - let always_already_bound = left.always_bound_variables(); - expression.lookup_used_variables(&mut |v| { - if !always_already_bound.contains(&v) { - set.insert(v); - } - }); - } - PlanNode::Extend { - child, expression, .. - } => { - let always_already_bound = child.always_bound_variables(); - expression.lookup_used_variables(&mut |v| { - if !always_already_bound.contains(&v) { - set.insert(v); - } - }); - Self::add_left_join_problematic_variables(child, set); - Self::add_left_join_problematic_variables(child, set); - } - PlanNode::Sort { child, .. } - | PlanNode::HashDeduplicate { child } - | PlanNode::Reduced { child } - | PlanNode::Project { child, .. } => { - Self::add_left_join_problematic_variables(child, set); - } - PlanNode::Skip { child, .. } | PlanNode::Limit { child, .. } => { - // Any variable might affect arity - child.lookup_used_variables(&mut |v| { - set.insert(v); - }) - } - PlanNode::Service { child, silent, .. } => { - if *silent { - child.lookup_used_variables(&mut |v| { - set.insert(v); - }); - } else { - Self::add_left_join_problematic_variables(child, set) - } - } - PlanNode::Aggregate { - key_variables, - aggregates, - .. - } => { - set.extend(key_variables.iter().map(|v| v.encoded)); - //TODO: This is too harsh - for (_, var) in aggregates.iter() { - set.insert(var.encoded); - } - } - } - } - - fn new_join(&self, mut left: PlanNode, mut right: PlanNode) -> PlanNode { - // We first use VALUES to filter the following patterns evaluation - if matches!(right, PlanNode::StaticBindings { .. }) { - swap(&mut left, &mut right); - } - - if self.with_optimizations - && Self::is_fit_for_for_loop_join(&right) - && Self::has_some_common_variables(&left, &right) - { - PlanNode::ForLoopJoin { - left: Rc::new(left), - right: Rc::new(right), - } - } else { - // Let's avoid materializing right if left is already materialized - // TODO: be smarter and reuse already existing materialization - if matches!(left, PlanNode::StaticBindings { .. }) { - swap(&mut left, &mut right); - } - PlanNode::HashJoin { - left: Rc::new(left), - right: Rc::new(right), - } - } - } - - fn has_some_common_variables(left: &PlanNode, right: &PlanNode) -> bool { - left.always_bound_variables() - .intersection(&right.always_bound_variables()) - .next() - .is_some() - } - - fn is_fit_for_for_loop_join(node: &PlanNode) -> bool { - //TODO: think more about it - match node { - PlanNode::StaticBindings { .. } - | PlanNode::QuadPattern { .. } - | PlanNode::PathPattern { .. } => true, - PlanNode::ForLoopJoin { left, right } | PlanNode::HashJoin { left, right } => { - Self::is_fit_for_for_loop_join(left) && Self::is_fit_for_for_loop_join(right) - } - PlanNode::Filter { child, .. } | PlanNode::Extend { child, .. } => { - Self::is_fit_for_for_loop_join(child) - } - PlanNode::Union { children } => { - children.iter().all(|c| Self::is_fit_for_for_loop_join(c)) - } - PlanNode::AntiJoin { .. } - | PlanNode::HashLeftJoin { .. } - | PlanNode::ForLoopLeftJoin { .. } - | PlanNode::Service { .. } - | PlanNode::Sort { .. } - | PlanNode::HashDeduplicate { .. } - | PlanNode::Reduced { .. } - | PlanNode::Skip { .. } - | PlanNode::Limit { .. } - | PlanNode::Project { .. } - | PlanNode::Aggregate { .. } => false, - } - } - - fn push_filter(&self, node: Rc<PlanNode>, filter: Box<PlanExpression>) -> PlanNode { - if !self.with_optimizations { - return PlanNode::Filter { - child: node, - expression: filter, - }; - } - if let PlanExpression::And(filters) = *filter { - return filters - .into_iter() - .fold((*node.as_ref()).clone(), |acc, f| { - self.push_filter(Rc::new(acc), Box::new(f)) - }); - } - let mut filter_variables = BTreeSet::new(); - filter.lookup_used_variables(&mut |v| { - filter_variables.insert(v); - }); - match node.as_ref() { - PlanNode::HashJoin { left, right } => { - if filter_variables.iter().all(|v| left.is_variable_bound(*v)) { - if filter_variables.iter().all(|v| right.is_variable_bound(*v)) { - PlanNode::HashJoin { - left: Rc::new(self.push_filter(Rc::clone(left), filter.clone())), - right: Rc::new(self.push_filter(Rc::clone(right), filter)), - } - } else { - PlanNode::HashJoin { - left: Rc::new(self.push_filter(Rc::clone(left), filter)), - right: Rc::clone(right), - } - } - } else if filter_variables.iter().all(|v| right.is_variable_bound(*v)) { - PlanNode::HashJoin { - left: Rc::clone(left), - right: Rc::new(self.push_filter(Rc::clone(right), filter)), - } - } else { - PlanNode::Filter { - child: Rc::new(PlanNode::HashJoin { - left: Rc::clone(left), - right: Rc::clone(right), - }), - expression: filter, - } - } - } - PlanNode::ForLoopJoin { left, right } => { - if filter_variables.iter().all(|v| left.is_variable_bound(*v)) { - PlanNode::ForLoopJoin { - left: Rc::new(self.push_filter(Rc::clone(left), filter)), - right: Rc::clone(right), - } - } else if filter_variables.iter().all(|v| right.is_variable_bound(*v)) { - PlanNode::ForLoopJoin { - //TODO: should we do that always? - left: Rc::clone(left), - right: Rc::new(self.push_filter(Rc::clone(right), filter)), - } - } else { - PlanNode::Filter { - child: Rc::new(PlanNode::HashJoin { - left: Rc::clone(left), - right: Rc::clone(right), - }), - expression: filter, - } - } - } - PlanNode::Extend { - child, - expression, - variable, - } => { - //TODO: handle the case where the filter generates an expression variable - if filter_variables.iter().all(|v| child.is_variable_bound(*v)) { - PlanNode::Extend { - child: Rc::new(self.push_filter(Rc::clone(child), filter)), - expression: expression.clone(), - variable: variable.clone(), - } - } else { - PlanNode::Filter { - child: Rc::new(PlanNode::Extend { - child: Rc::clone(child), - expression: expression.clone(), - variable: variable.clone(), - }), - expression: filter, - } - } - } - PlanNode::Filter { child, expression } => { - if filter_variables.iter().all(|v| child.is_variable_bound(*v)) { - PlanNode::Filter { - child: Rc::new(self.push_filter(Rc::clone(child), filter)), - expression: expression.clone(), - } - } else { - PlanNode::Filter { - child: Rc::clone(child), - expression: Box::new(PlanExpression::And(vec![ - *expression.clone(), - *filter, - ])), - } - } - } - PlanNode::Union { children } => PlanNode::Union { - children: children - .iter() - .map(|c| Rc::new(self.push_filter(Rc::clone(c), filter.clone()))) - .collect(), - }, - _ => PlanNode::Filter { - //TODO: more? - child: node, - expression: filter, - }, - } - } - - fn build_term<'b>(&self, term: impl Into<TermRef<'b>>) -> EncodedTerm { - self.dataset.encode_term(term) - } - - fn build_triple(&self, triple: &GroundTriple) -> EncodedTerm { - EncodedTriple::new( - match &triple.subject { - GroundSubject::NamedNode(node) => self.build_term(node), - GroundSubject::Triple(triple) => self.build_triple(triple), - }, - self.build_term(&triple.predicate), - match &triple.object { - GroundTerm::NamedNode(node) => self.build_term(node), - GroundTerm::Literal(literal) => self.build_term(literal), - GroundTerm::Triple(triple) => self.build_triple(triple), - }, - ) - .into() - } -} - -fn build_plan_variable(variables: &mut Vec<Variable>, variable: &Variable) -> PlanVariable { - let encoded = if let Some(key) = slice_key(variables, variable) { - key - } else { - variables.push(variable.clone()); - variables.len() - 1 - }; - PlanVariable { - plain: variable.clone(), - encoded, - } -} - -fn bnode_key(blank_nodes: &mut Vec<BlankNode>, blank_node: &BlankNode) -> usize { - if let Some(key) = slice_key(blank_nodes, blank_node) { - key - } else { - blank_nodes.push(blank_node.clone()); - blank_nodes.len() - 1 - } -} - -fn slice_key<T: Eq>(slice: &[T], element: &T) -> Option<usize> { - for (i, item) in slice.iter().enumerate() { - if item == element { - return Some(i); - } - } - None -} - -fn sort_bgp(p: &[TriplePattern]) -> Vec<&TriplePattern> { - let mut assigned_variables = HashSet::default(); - let mut assigned_blank_nodes = HashSet::default(); - let mut new_p: Vec<_> = p.iter().collect(); - - for i in 0..new_p.len() { - new_p[i..].sort_by(|p1, p2| { - estimate_pattern_cost(p1, &assigned_variables, &assigned_blank_nodes).cmp( - &estimate_pattern_cost(p2, &assigned_variables, &assigned_blank_nodes), - ) - }); - add_pattern_variables(new_p[i], &mut assigned_variables, &mut assigned_blank_nodes); - } - - new_p -} - -fn estimate_pattern_cost( - pattern: &TriplePattern, - assigned_variables: &HashSet<&Variable>, - assigned_blank_nodes: &HashSet<&BlankNode>, -) -> u32 { - let mut count = 0; - match &pattern.subject { - TermPattern::NamedNode(_) | TermPattern::Literal(_) => count += 1, - TermPattern::BlankNode(bnode) => { - if !assigned_blank_nodes.contains(bnode) { - count += 4; - } - } - TermPattern::Variable(v) => { - if !assigned_variables.contains(v) { - count += 4; - } - } - TermPattern::Triple(t) => { - count += estimate_pattern_cost(t, assigned_variables, assigned_blank_nodes) - } - } - if let NamedNodePattern::Variable(v) = &pattern.predicate { - if !assigned_variables.contains(v) { - count += 4; - } - } else { - count += 1; - } - match &pattern.object { - TermPattern::NamedNode(_) | TermPattern::Literal(_) => count += 1, - TermPattern::BlankNode(bnode) => { - if !assigned_blank_nodes.contains(bnode) { - count += 4; - } - } - TermPattern::Variable(v) => { - if !assigned_variables.contains(v) { - count += 4; - } - } - TermPattern::Triple(t) => { - count += estimate_pattern_cost(t, assigned_variables, assigned_blank_nodes) - } - } - count -} - -fn add_pattern_variables<'a>( - pattern: &'a TriplePattern, - variables: &mut HashSet<&'a Variable>, - blank_nodes: &mut HashSet<&'a BlankNode>, -) { - match &pattern.subject { - TermPattern::NamedNode(_) | TermPattern::Literal(_) => (), - TermPattern::BlankNode(bnode) => { - blank_nodes.insert(bnode); - } - TermPattern::Variable(v) => { - variables.insert(v); - } - TermPattern::Triple(t) => add_pattern_variables(t, variables, blank_nodes), - } - if let NamedNodePattern::Variable(v) = &pattern.predicate { - variables.insert(v); - } - match &pattern.object { - TermPattern::NamedNode(_) | TermPattern::Literal(_) => (), - TermPattern::BlankNode(bnode) => { - blank_nodes.insert(bnode); - } - TermPattern::Variable(v) => { - variables.insert(v); - } - TermPattern::Triple(t) => add_pattern_variables(t, variables, blank_nodes), - } -} - -fn compile_static_pattern_if_exists( - pattern: &Expression, - options: Option<&Expression>, -) -> Option<Regex> { - let static_pattern = if let Expression::Literal(pattern) = pattern { - (pattern.datatype() == xsd::STRING).then(|| pattern.value()) - } else { - None - }; - let static_options = if let Some(options) = options { - if let Expression::Literal(options) = options { - (options.datatype() == xsd::STRING).then(|| Some(options.value())) - } else { - None - } - } else { - Some(None) - }; - if let (Some(static_pattern), Some(static_options)) = (static_pattern, static_options) { - compile_pattern(static_pattern, static_options) - } else { - None - } -} diff --git a/lib/src/storage/error.rs b/lib/src/storage/error.rs deleted file mode 100644 index f0d5b841..00000000 --- a/lib/src/storage/error.rs +++ /dev/null @@ -1,226 +0,0 @@ -use crate::io::read::ParseError; -use std::error::Error; -use std::fmt; -use std::io; - -/// An error related to storage operations (reads, writes...). -#[derive(Debug)] -#[non_exhaustive] -pub enum StorageError { - /// Error from the OS I/O layer. - Io(io::Error), - /// Error related to data corruption. - Corruption(CorruptionError), - #[doc(hidden)] - Other(Box<dyn Error + Send + Sync + 'static>), -} - -impl fmt::Display for StorageError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Io(e) => e.fmt(f), - Self::Corruption(e) => e.fmt(f), - Self::Other(e) => e.fmt(f), - } - } -} - -impl Error for StorageError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::Io(e) => Some(e), - Self::Corruption(e) => Some(e), - Self::Other(e) => Some(e.as_ref()), - } - } -} - -impl From<io::Error> for StorageError { - #[inline] - fn from(error: io::Error) -> Self { - Self::Io(error) - } -} - -impl From<StorageError> for io::Error { - #[inline] - fn from(error: StorageError) -> Self { - match error { - StorageError::Io(error) => error, - StorageError::Corruption(error) => error.into(), - StorageError::Other(error) => Self::new(io::ErrorKind::Other, error), - } - } -} - -/// An error return if some content in the database is corrupted. -#[derive(Debug)] -pub struct CorruptionError { - inner: CorruptionErrorKind, -} - -#[derive(Debug)] -enum CorruptionErrorKind { - Msg(String), - Other(Box<dyn Error + Send + Sync + 'static>), -} - -impl CorruptionError { - /// Builds an error from a printable error message. - #[inline] - pub(crate) fn new(error: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self { - Self { - inner: CorruptionErrorKind::Other(error.into()), - } - } - - /// Builds an error from a printable error message. - #[inline] - pub(crate) fn msg(msg: impl Into<String>) -> Self { - Self { - inner: CorruptionErrorKind::Msg(msg.into()), - } - } -} - -impl fmt::Display for CorruptionError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match &self.inner { - CorruptionErrorKind::Msg(e) => e.fmt(f), - CorruptionErrorKind::Other(e) => e.fmt(f), - } - } -} - -impl Error for CorruptionError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match &self.inner { - CorruptionErrorKind::Msg(_) => None, - CorruptionErrorKind::Other(e) => Some(e.as_ref()), - } - } -} - -impl From<CorruptionError> for StorageError { - #[inline] - fn from(error: CorruptionError) -> Self { - Self::Corruption(error) - } -} - -impl From<CorruptionError> for io::Error { - #[inline] - fn from(error: CorruptionError) -> Self { - Self::new(io::ErrorKind::InvalidData, error) - } -} - -/// An error raised while loading a file into a [`Store`](crate::store::Store). -#[derive(Debug)] -pub enum LoaderError { - /// An error raised while reading the file. - Parsing(ParseError), - /// An error raised during the insertion in the store. - Storage(StorageError), -} - -impl fmt::Display for LoaderError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Parsing(e) => e.fmt(f), - Self::Storage(e) => e.fmt(f), - } - } -} - -impl Error for LoaderError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::Parsing(e) => Some(e), - Self::Storage(e) => Some(e), - } - } -} - -impl From<ParseError> for LoaderError { - #[inline] - fn from(error: ParseError) -> Self { - Self::Parsing(error) - } -} - -impl From<StorageError> for LoaderError { - #[inline] - fn from(error: StorageError) -> Self { - Self::Storage(error) - } -} - -impl From<LoaderError> for io::Error { - #[inline] - fn from(error: LoaderError) -> Self { - match error { - LoaderError::Storage(error) => error.into(), - LoaderError::Parsing(error) => error.into(), - } - } -} - -/// An error raised while writing a file from a [`Store`](crate::store::Store). -#[derive(Debug)] -pub enum SerializerError { - /// An error raised while writing the content. - Io(io::Error), - /// An error raised during the lookup in the store. - Storage(StorageError), -} - -impl fmt::Display for SerializerError { - #[inline] - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Io(e) => e.fmt(f), - Self::Storage(e) => e.fmt(f), - } - } -} - -impl Error for SerializerError { - #[inline] - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - Self::Io(e) => Some(e), - Self::Storage(e) => Some(e), - } - } -} - -impl From<io::Error> for SerializerError { - #[inline] - fn from(error: io::Error) -> Self { - Self::Io(error) - } -} - -impl From<StorageError> for SerializerError { - #[inline] - fn from(error: StorageError) -> Self { - Self::Storage(error) - } -} - -impl From<SerializerError> for io::Error { - #[inline] - fn from(error: SerializerError) -> Self { - match error { - SerializerError::Storage(error) => error.into(), - SerializerError::Io(error) => error, - } - } -} diff --git a/lints/build_clippy_config.py b/lints/build_clippy_config.py new file mode 100644 index 00000000..f56bcb00 --- /dev/null +++ b/lints/build_clippy_config.py @@ -0,0 +1,83 @@ +import json +from pathlib import Path +from urllib.request import urlopen + +import tomlkit + +MSRV = "1.74.0" +LINT_BLACKLIST = { + "absolute_paths", # TODO: might be nice + "alloc_instead_of_core", + "arithmetic_side_effects", # TODO: might be nice + "as_conversions", + "big_endian_bytes", + "cargo_common_metadata", # TODO: might be nice + "doc_markdown", # Too many false positives + "default_numeric_fallback", + "else_if_without_else", + "exhaustive_enums", + "exhaustive_structs", + "float_arithmetic", + "float_cmp", + "float_cmp_const", + "impl_trait_in_params", + "implicit_return", + "indexing_slicing", + "integer_division", + "little_endian_bytes", + "map_err_ignore", + "min_ident_chars", + "missing_docs_in_private_items", + "missing_errors_doc", + "missing_inline_in_public_items", + "missing_panics_doc", + "missing_trait_methods", + "mixed_read_write_in_expression", + "mod_module_files", + "module_name_repetitions", + "modulo_arithmetic", + "multiple_crate_versions", + "multiple_unsafe_ops_per_block", + "must_use_candidate", # TODO: might be nice + "option_option", + "pattern_type_mismatch", + "pub_use", + "pub_with_shorthand", + "question_mark_used", + "self_named_module_files", # TODO: might be nice + "semicolon_if_nothing_returned", # TODO: might be nice + "semicolon_outside_block", + "similar_names", + "single_call_fn", + "single_char_lifetime_names", + "std_instead_of_alloc", + "std_instead_of_core", + "shadow_reuse", + "shadow_unrelated", + "string_slice", # TODO: might be nice + "too_many_lines", + "separated_literal_suffix", + "unreachable", # TODO: might be nice + "unwrap_used", # TODO: might be nice to use expect instead + "wildcard_enum_match_arm", # TODO: might be nice + "wildcard_imports", # TODO: might be nice +} + +lints = set() +with urlopen( + f"https://rust-lang.github.io/rust-clippy/rust-{MSRV}/lints.json" +) as response: + for lint in json.load(response): + if lint["level"] == "allow" and lint["group"] != "nursery": + lints.add(lint["id"]) + +for flag in LINT_BLACKLIST: + if flag in lints: + lints.remove(flag) + else: + print(f"Unused blacklisted flag: {flag}") + +cargo_path = Path(__file__).parent.parent / "Cargo.toml" +cargo_toml = tomlkit.parse(cargo_path.read_text()) +cargo_toml["workspace"]["lints"]["clippy"] = {lint: "warn" for lint in sorted(lints)} +cargo_path.write_text(tomlkit.dumps(cargo_toml)) diff --git a/lints/test_debian_compatibility.py b/lints/test_debian_compatibility.py new file mode 100644 index 00000000..2e81a79b --- /dev/null +++ b/lints/test_debian_compatibility.py @@ -0,0 +1,140 @@ +import json +import subprocess +from pathlib import Path +from time import sleep +from urllib.error import HTTPError +from urllib.request import urlopen + +TARGET_DEBIAN_VERSIONS = ["sid"] +IGNORE_PACKAGES = {"oxigraph-js", "oxigraph-testsuite", "pyoxigraph", "sparql-smith"} +ALLOWED_MISSING_PACKAGES = { + "codspeed-criterion-compat", + "escargot", + "json-event-parser", + "oxhttp", + "oxiri", + "quick-xml", +} + +base_path = Path(__file__).parent.parent + +cargo_metadata = json.loads( + subprocess.check_output(["cargo", "metadata", "--format-version", "1"]) +) +package_by_id = {package["id"]: package for package in cargo_metadata["packages"]} +workspace_packages = { + package_id.split(" ")[0] + for package_id in cargo_metadata["workspace_default_members"] +} +debian_cache = {} +errors = set() + + +def parse_version(version): + return tuple(int(e) for e in version.split("-")[0].split(".")) + + +def fetch_debian_package_desc(debian_name): + url = f"https://sources.debian.org/api/src/{debian_name}/" + for i in range(0, 10): + try: + with urlopen(url) as response: + return json.loads(response.read().decode()) + except HTTPError as e: + if e.code / 100 == 5: + wait = 2**i + print(f"Error {e} from {url}, retrying after {wait}s") + sleep(wait) + else: + print(f"Failed to fetch debian name {debian_name} from {url}: {e}") + raise e + raise Exception(f"Failed to fetch {url}") + + +for package_id in cargo_metadata["workspace_default_members"]: + package = package_by_id[package_id] + if package["name"] in IGNORE_PACKAGES: + continue + for dependency in package["dependencies"]: + if ( + dependency["name"] in workspace_packages + or dependency["name"] in ALLOWED_MISSING_PACKAGES + ): + continue + candidate_debian_name = f"rust-{dependency['name'].replace('_', '-')}" + if dependency["name"] not in debian_cache: + debian_cache[candidate_debian_name] = fetch_debian_package_desc( + candidate_debian_name + ) + debian_package = debian_cache[candidate_debian_name] + if "error" in debian_package: + errors.add(f"No Debian package found for {dependency['name']}") + continue + for target_debian_suite in TARGET_DEBIAN_VERSIONS: + debian_version = next( + ( + debian_version + for debian_version in debian_package["versions"] + if target_debian_suite in debian_version["suites"] + ), + None, + ) + if debian_version is None: + errors.add( + f"The debian package {debian_package['package']} does not support {target_debian_suite}" + ) + continue + + # We check the debian version is compatible with the req version + parsed_debian_version = parse_version(debian_version["version"]) + for range_element in dependency["req"].split(","): + range_element = range_element.strip() + if range_element.startswith("^"): + first_found = False + for expected, actual in zip( + parse_version(range_element[1:]), parsed_debian_version + ): + if first_found: + if actual > expected: + break # Done + if actual < expected: + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + break + else: + if actual != expected: + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + if expected != 0: + first_found = True + elif range_element.startswith(">="): + if not parsed_debian_version >= parse_version(range_element[2:]): + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + elif range_element.startswith(">"): + if not parsed_debian_version > parse_version(range_element[1:]): + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + elif range_element.startswith("<="): + if not parsed_debian_version <= parse_version(range_element[2:]): + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + elif range_element.startswith("<"): + if not parsed_debian_version < parse_version(range_element[1:]): + errors.add( + f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" + ) + else: + errors.add( + f"The requirement {range_element} of {dependency['name']} is not supported by this script" + ) + +for error in sorted(errors): + print(error) +if errors: + exit(1) diff --git a/test_spec_links.py b/lints/test_spec_links.py similarity index 95% rename from test_spec_links.py rename to lints/test_spec_links.py index 76fb2e88..a0d2c2e9 100644 --- a/test_spec_links.py +++ b/lints/test_spec_links.py @@ -10,12 +10,12 @@ LINK_REGEXES = { r"<(https?://(w3c.github.io|www.w3.org)/[^>]+)>`_", # reStructuredText } -base_path = Path(__file__).parent +base_path = Path(__file__).parent.parent spec_cache = {} errors = set() for ext in ("md", "rs", "rst"): - for file in Path(__file__).parent.rglob(f"*.{ext}"): + for file in base_path.rglob(f"*.{ext}"): content = file.read_text() for link_regex in LINK_REGEXES: for m in re.finditer(link_regex, content): diff --git a/oxrocksdb-sys/Cargo.toml b/oxrocksdb-sys/Cargo.toml index 5aa666bf..1c99afd2 100644 --- a/oxrocksdb-sys/Cargo.toml +++ b/oxrocksdb-sys/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "oxrocksdb-sys" -version = "0.3.20" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] +version.workspace = true +authors.workspace = true license = "GPL-2.0 OR Apache-2.0" repository = "https://github.com/oxigraph/oxigraph/tree/main/oxrocksdb-sys" readme = "README.md" @@ -9,14 +9,18 @@ description = """ Rust bindings for RocksDB for Oxigraph usage. """ documentation = "https://docs.rs/oxrocksdb-sys" -edition = "2021" -rust-version = "1.60" +edition.workspace = true +rust-version.workspace = true build = "build.rs" links = "rocksdb" +[features] +pkg-config = ["dep:pkg-config"] + [dependencies] -libc = "0.2" +libc.workspace = true [build-dependencies] -bindgen = "0.66" -cc = { version = "=1.0.79", features = ["parallel"] } +bindgen.workspace = true +cc = { workspace = true, features = ["parallel"] } +pkg-config = { workspace = true, optional = true } diff --git a/oxrocksdb-sys/README.md b/oxrocksdb-sys/README.md index f4587db6..15b9cdbd 100644 --- a/oxrocksdb-sys/README.md +++ b/oxrocksdb-sys/README.md @@ -3,4 +3,9 @@ Oxigraph RocksDB bindings [RocksDB](http://rocksdb.org/) bindings for [Oxigraph](https://oxigraph.org). +By default it builds RocksDB as part of this crate. +It is also possible to dynamically link to RocksDB using the disabled by default `pkg-config` feature. +In this case [pkg-config](https://crates.io/crates/pkg-config) will be used to link to RocksDB. +Refer to this crate documentation if you want to configure the library lookup. + Based on [librocksdb-sys](https://crates.io/crates/librocksdb-sys) under Apache v2 license. diff --git a/oxrocksdb-sys/api/c.cc b/oxrocksdb-sys/api/c.cc index 49c5e55a..b62ee7ff 100644 --- a/oxrocksdb-sys/api/c.cc +++ b/oxrocksdb-sys/api/c.cc @@ -1,7 +1,98 @@ -#include "../rocksdb/db/c.cc" - #include "c.h" +#include <rocksdb/db.h> +#include <rocksdb/utilities/checkpoint.h> +#include <rocksdb/utilities/transaction_db.h> + +#include <vector> + +using ROCKSDB_NAMESPACE::Checkpoint; +using ROCKSDB_NAMESPACE::ColumnFamilyDescriptor; +using ROCKSDB_NAMESPACE::ColumnFamilyHandle; +using ROCKSDB_NAMESPACE::ColumnFamilyOptions; +using ROCKSDB_NAMESPACE::CompactRangeOptions; +using ROCKSDB_NAMESPACE::DB; +using ROCKSDB_NAMESPACE::DBOptions; +using ROCKSDB_NAMESPACE::FlushOptions; +using ROCKSDB_NAMESPACE::IngestExternalFileOptions; +using ROCKSDB_NAMESPACE::Iterator; +using ROCKSDB_NAMESPACE::Options; +using ROCKSDB_NAMESPACE::PinnableSlice; +using ROCKSDB_NAMESPACE::ReadOptions; +using ROCKSDB_NAMESPACE::Slice; +using ROCKSDB_NAMESPACE::SstFileWriter; +using ROCKSDB_NAMESPACE::Status; +using ROCKSDB_NAMESPACE::Transaction; +using ROCKSDB_NAMESPACE::TransactionDB; +using ROCKSDB_NAMESPACE::TransactionDBOptions; +using ROCKSDB_NAMESPACE::WriteOptions; +using std::vector; + +// From RocksDB +extern "C" { +struct rocksdb_t { + DB* rep; +}; + +struct rocksdb_column_family_handle_t { + ColumnFamilyHandle* rep; +}; + +struct rocksdb_compactoptions_t { + CompactRangeOptions rep; + Slice full_history_ts_low; +}; + +struct rocksdb_flushoptions_t { + FlushOptions rep; +}; + +struct rocksdb_ingestexternalfileoptions_t { + IngestExternalFileOptions rep; +}; + +struct rocksdb_iterator_t { + Iterator* rep; +}; + +struct rocksdb_options_t { + Options rep; +}; + +struct rocksdb_pinnableslice_t { + PinnableSlice rep; +}; + +struct rocksdb_readoptions_t { + ReadOptions rep; + // stack variables to set pointers to in ReadOptions + Slice upper_bound; + Slice lower_bound; + Slice timestamp; + Slice iter_start_ts; +}; + +struct rocksdb_sstfilewriter_t { + SstFileWriter* rep; +}; + +struct rocksdb_transaction_t { + Transaction* rep; +}; + +struct rocksdb_transactiondb_t { + TransactionDB* rep; +}; + +struct rocksdb_transactiondb_options_t { + TransactionDBOptions rep; +}; + +struct rocksdb_writeoptions_t { + WriteOptions rep; +}; +} + static bool SaveStatus(rocksdb_status_t* target, const Status source) { target->code = static_cast<rocksdb_status_code_t>(source.code()); target->subcode = static_cast<rocksdb_status_subcode_t>(source.subcode()); @@ -42,7 +133,7 @@ rocksdb_t* rocksdb_open_for_read_only_column_families_with_status( const rocksdb_options_t* const* column_family_options, rocksdb_column_family_handle_t** column_family_handles, unsigned char error_if_wal_file_exists, rocksdb_status_t* statusptr) { - std::vector<ColumnFamilyDescriptor> column_families; + vector<ColumnFamilyDescriptor> column_families; for (int i = 0; i < num_column_families; i++) { column_families.emplace_back(ColumnFamilyDescriptor( std::string(column_family_names[i]), @@ -50,7 +141,7 @@ rocksdb_t* rocksdb_open_for_read_only_column_families_with_status( } DB* db; - std::vector<ColumnFamilyHandle*> handles; + vector<ColumnFamilyHandle*> handles; if (SaveStatus(statusptr, DB::OpenForReadOnly(DBOptions(db_options->rep), std::string(name), column_families, &handles, &db, @@ -81,14 +172,14 @@ rocksdb_t* rocksdb_open_as_secondary_column_families_with_status( const rocksdb_options_t* const* column_family_options, rocksdb_column_family_handle_t** column_family_handles, rocksdb_status_t* statusptr) { - std::vector<ColumnFamilyDescriptor> column_families; + vector<ColumnFamilyDescriptor> column_families; for (int i = 0; i != num_column_families; ++i) { column_families.emplace_back( std::string(column_family_names[i]), ColumnFamilyOptions(column_family_options[i]->rep)); } DB* db; - std::vector<ColumnFamilyHandle*> handles; + vector<ColumnFamilyHandle*> handles; if (SaveStatus(statusptr, DB::OpenAsSecondary( DBOptions(db_options->rep), std::string(name), std::string(secondary_path), column_families, @@ -127,7 +218,7 @@ rocksdb_transactiondb_t* rocksdb_transactiondb_open_column_families_with_status( const rocksdb_options_t* const* column_family_options, rocksdb_column_family_handle_t** column_family_handles, rocksdb_status_t* statusptr) { - std::vector<ColumnFamilyDescriptor> column_families; + vector<ColumnFamilyDescriptor> column_families; for (int i = 0; i < num_column_families; i++) { column_families.emplace_back(ColumnFamilyDescriptor( std::string(column_family_names[i]), @@ -135,7 +226,7 @@ rocksdb_transactiondb_t* rocksdb_transactiondb_open_column_families_with_status( } TransactionDB* txn_db; - std::vector<ColumnFamilyHandle*> handles; + vector<ColumnFamilyHandle*> handles; if (SaveStatus(statusptr, TransactionDB::Open(options->rep, txn_db_options->rep, std::string(name), column_families, @@ -181,11 +272,15 @@ void rocksdb_transactiondb_put_cf_with_status( Slice(key, keylen), Slice(val, vallen))); } -void rocksdb_transactiondb_flush_cf_with_status( +void rocksdb_transactiondb_flush_cfs_with_status( rocksdb_transactiondb_t* db, const rocksdb_flushoptions_t* options, - rocksdb_column_family_handle_t* column_family, + rocksdb_column_family_handle_t** column_families, int num_column_families, rocksdb_status_t* statusptr) { - SaveStatus(statusptr, db->rep->Flush(options->rep, column_family->rep)); + vector<ColumnFamilyHandle*> column_family_handles(num_column_families); + for (int i = 0; i < num_column_families; i++) { + column_family_handles[i] = column_families[i]->rep; + } + SaveStatus(statusptr, db->rep->Flush(options->rep, column_family_handles)); } void rocksdb_transactiondb_compact_range_cf_opt_with_status( @@ -205,10 +300,10 @@ void rocksdb_transactiondb_compact_range_cf_opt_with_status( void rocksdb_transactiondb_ingest_external_files_with_status( rocksdb_transactiondb_t* db, const rocksdb_ingestexternalfilearg_t* list, const size_t list_len, rocksdb_status_t* statusptr) { - std::vector<rocksdb::IngestExternalFileArg> args(list_len); + vector<rocksdb::IngestExternalFileArg> args(list_len); for (size_t i = 0; i < list_len; ++i) { args[i].column_family = list[i].column_family->rep; - std::vector<std::string> files(list[i].external_files_len); + vector<std::string> files(list[i].external_files_len); for (size_t j = 0; j < list[i].external_files_len; ++j) { files[j] = std::string(list[i].external_files[j]); } diff --git a/oxrocksdb-sys/api/c.h b/oxrocksdb-sys/api/c.h index c0b2887d..8b7c173e 100644 --- a/oxrocksdb-sys/api/c.h +++ b/oxrocksdb-sys/api/c.h @@ -1,6 +1,6 @@ #pragma once -#include "../rocksdb/include/rocksdb/c.h" +#include <rocksdb/c.h> #ifdef __cplusplus extern "C" { @@ -114,9 +114,10 @@ extern ROCKSDB_LIBRARY_API void rocksdb_transactiondb_put_cf_with_status( rocksdb_column_family_handle_t* column_family, const char* key, size_t keylen, const char* val, size_t vallen, rocksdb_status_t* statusptr); -extern ROCKSDB_LIBRARY_API void rocksdb_transactiondb_flush_cf_with_status( +extern ROCKSDB_LIBRARY_API void rocksdb_transactiondb_flush_cfs_with_status( rocksdb_transactiondb_t* db, const rocksdb_flushoptions_t* options, - rocksdb_column_family_handle_t* column_family, rocksdb_status_t* statusptr); + rocksdb_column_family_handle_t** column_families, int num_column_families, + rocksdb_status_t* statusptr); extern ROCKSDB_LIBRARY_API void rocksdb_transactiondb_compact_range_cf_opt_with_status( diff --git a/oxrocksdb-sys/build.rs b/oxrocksdb-sys/build.rs index ff8a633b..8771573e 100644 --- a/oxrocksdb-sys/build.rs +++ b/oxrocksdb-sys/build.rs @@ -1,9 +1,14 @@ // Code from https://github.com/rust-rocksdb/rust-rocksdb/blob/eb2d302682418b361a80ad8f4dcf335ade60dcf5/librocksdb-sys/build.rs // License: https://github.com/rust-rocksdb/rust-rocksdb/blob/master/LICENSE -use std::env::{remove_var, set_var, var}; +use std::env::var; +#[cfg(not(feature = "pkg-config"))] +use std::env::{remove_var, set_var}; +#[cfg(not(feature = "pkg-config"))] +use std::path::Path; use std::path::PathBuf; +#[cfg(not(feature = "pkg-config"))] fn link(name: &str, bundled: bool) { let target = var("TARGET").unwrap(); let target: Vec<_> = target.split('-').collect(); @@ -16,8 +21,14 @@ fn link(name: &str, bundled: bool) { } } -fn bindgen_rocksdb() { - bindgen::Builder::default() +fn bindgen_rocksdb_api(includes: &[PathBuf]) { + println!("cargo:rerun-if-changed=api/"); + + let mut builder = bindgen::Builder::default(); + for include in includes { + builder = builder.clang_arg(format!("-I{}", include.display())); + } + builder .header("api/c.h") .ctypes_prefix("libc") .size_t_is_usize(true) @@ -30,6 +41,22 @@ fn bindgen_rocksdb() { .unwrap(); } +fn build_rocksdb_api(includes: &[PathBuf]) { + let target = var("TARGET").unwrap(); + let mut config = cc::Build::new(); + for include in includes { + config.include(include); + } + if target.contains("msvc") { + config.flag("-EHsc").flag("-std:c++17"); + } else { + config.flag("-std=c++17"); + } + config.cpp(true).file("api/c.cc").compile("oxrocksdb_api"); +} + +#[cfg(not(feature = "pkg-config"))] + fn build_rocksdb() { let target = var("TARGET").unwrap(); @@ -38,7 +65,6 @@ fn build_rocksdb() { .cpp(true) .include("rocksdb/include/") .include("rocksdb/") - .file("api/c.cc") .file("api/build_version.cc") .define("NDEBUG", Some("1")) .define("LZ4", Some("1")) @@ -127,7 +153,7 @@ fn build_rocksdb() { config.define("NOMINMAX", None); config.define("ROCKSDB_WINDOWS_UTF8_FILENAMES", None); - if target == "x86_64-pc-windows-gnu" { + if target.contains("pc-windows-gnu") { // Tell MinGW to create localtime_r wrapper of localtime_s function. config.define("_POSIX_C_SOURCE", Some("1")); // Tell MinGW to use at least Windows Vista headers instead of the ones of Windows XP. @@ -167,22 +193,22 @@ fn build_rocksdb() { if target.contains("msvc") { config.flag("-EHsc").flag("-std:c++17"); } else { - config - .flag("-std=c++17") - .flag("-Wno-invalid-offsetof") - .define("HAVE_UINT128_EXTENSION", Some("1")); + config.flag("-std=c++17").flag("-Wno-invalid-offsetof"); + if target.contains("x86_64") || target.contains("aarch64") { + config.define("HAVE_UINT128_EXTENSION", Some("1")); + } } for file in lib_sources { - if file == "db/c.cc" || file == "util/build_version.cc" { - continue; + if file != "util/build_version.cc" { + config.file(&format!("rocksdb/{file}")); } - config.file(&format!("rocksdb/{file}")); } config.compile("rocksdb"); } +#[cfg(not(feature = "pkg-config"))] fn build_lz4() { let mut config = cc::Build::new(); config @@ -196,9 +222,21 @@ fn build_lz4() { config.compile("lz4"); } +#[cfg(not(feature = "pkg-config"))] fn main() { - println!("cargo:rerun-if-changed=api/"); - bindgen_rocksdb(); + let includes = [Path::new("rocksdb/include").to_path_buf()]; build_lz4(); build_rocksdb(); + build_rocksdb_api(&includes); + bindgen_rocksdb_api(&includes); +} + +#[cfg(feature = "pkg-config")] +fn main() { + let library = pkg_config::Config::new() + .atleast_version("8.0.0") + .probe("rocksdb") + .unwrap(); + build_rocksdb_api(&library.include_paths); + bindgen_rocksdb_api(&library.include_paths); } diff --git a/oxrocksdb-sys/rocksdb b/oxrocksdb-sys/rocksdb index 1ce22dd6..2234753c 160000 --- a/oxrocksdb-sys/rocksdb +++ b/oxrocksdb-sys/rocksdb @@ -1 +1 @@ -Subproject commit 1ce22dd6376b124d17eff7d96e0809d2f4b4ae70 +Subproject commit 2234753cc7b7bd86cf7461f8189a29b2441af51d diff --git a/python/Cargo.lock b/python/Cargo.lock deleted file mode 120000 index 09fdd3b6..00000000 --- a/python/Cargo.lock +++ /dev/null @@ -1 +0,0 @@ -../Cargo.lock \ No newline at end of file diff --git a/python/Cargo.toml b/python/Cargo.toml index c9abd2fc..e1abf1be 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -1,23 +1,38 @@ [package] name = "pyoxigraph" -version = "0.3.20" -authors = ["Tpt"] -license = "MIT OR Apache-2.0" +version.workspace = true +authors.workspace = true +license.workspace = true readme = "README.md" keywords = ["RDF", "SPARQL", "graph-database", "database"] repository = "https://github.com/oxigraph/oxigraph/tree/main/python" homepage = "https://pyoxigraph.readthedocs.io/" description = "Python bindings of Oxigraph, a SPARQL database and RDF toolkit" -edition = "2021" +edition.workspace = true +rust-version.workspace = true +publish = false [lib] crate-type = ["cdylib"] name = "pyoxigraph" doctest = false +doc = false [features] -abi3 = ["pyo3/abi3-py37"] +abi3 = ["pyo3/abi3-py38"] +rocksdb-pkg-config = ["oxigraph/rocksdb-pkg-config"] [dependencies] -oxigraph = { version = "0.3.20", path="../lib", features = ["http_client"] } -pyo3 = { version = "0.19", features = ["extension-module"] } +pyo3 = { workspace = true, features = ["extension-module"] } + +[target.'cfg(any(target_family = "windows", target_os = "macos", target_os = "ios"))'.dependencies] +oxigraph = { workspace = true, features = ["http-client-native-tls"] } + +[target.'cfg(target_family = "wasm")'.dependencies] +oxigraph.workspace = true + +[target.'cfg(not(any(target_family = "windows", target_os = "macos", target_os = "ios", target_family = "wasm")))'.dependencies] +oxigraph = { workspace = true, features = ["http-client-rustls-native"] } + +[lints] +workspace = true diff --git a/python/README.md b/python/README.md index 42bb8d19..d9fae275 100644 --- a/python/README.md +++ b/python/README.md @@ -5,7 +5,7 @@   [](https://github.com/oxigraph/oxigraph/actions) -[](https://gitter.im/oxigraph/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[](https://gitter.im/oxigraph/community) Pyoxigraph is a graph database library implementing the [SPARQL](https://www.w3.org/TR/sparql11-overview/) standard. It is a Python library written on top of [Oxigraph](https://crates.io/crates/oxigraph). @@ -32,6 +32,9 @@ Pyoxigraph documentation is [available on the Oxigraph website](https://pyoxigra To build and install the development version of pyoxigraph you need to clone this git repository including submodules (`git clone --recursive https://github.com/oxigraph/oxigraph.git`) and to run `pip install .` in the `python` directory (the one this README is in). +Note that by default the installation will not use [cpython stable ABI](https://docs.python.org/3/c-api/stable.html). +Use `--features abi3` feature to use cpython stable ABI. + ## Help Feel free to use [GitHub discussions](https://github.com/oxigraph/oxigraph/discussions) or [the Gitter chat](https://gitter.im/oxigraph/community) to ask questions or talk about Oxigraph. diff --git a/python/docs/io.rst b/python/docs/io.rst index 8be36f43..edf3fba0 100644 --- a/python/docs/io.rst +++ b/python/docs/io.rst @@ -1,14 +1,21 @@ RDF Parsing and Serialization ============================= +.. py:currentmodule:: pyoxigraph Oxigraph provides functions to parse and serialize RDF files: Parsing """"""" -.. autofunction:: pyoxigraph.parse +.. autofunction:: parse Serialization """"""""""""" -.. autofunction:: pyoxigraph.serialize +.. autofunction:: serialize + + +Formats +""""""" +.. autoclass:: RdfFormat + :members: diff --git a/python/docs/migration.rst b/python/docs/migration.rst index 0911835a..3fe44d80 100644 --- a/python/docs/migration.rst +++ b/python/docs/migration.rst @@ -1,6 +1,19 @@ Migration Guide =============== +From 0.3 to 0.4 +""""""""""""""" + +* Python 3.7 and ``musllinux_1_1`` support have been removed. +* :py:class:`OSError` is now raised instead of :py:class:`IOError` on OS errors. +* The ``mime_type`` parameter have been renamed to ``format`` in I/O functions. + Using :py:class:`RdfFormat` is recommended to describe formats. +* Boolean SPARQL results are now encoded with the :py:class:`QueryBoolean` class and not a simple :py:class:`bool`. +* A `path` parameter has been added to all I/O method to read from a file. + The existing ``input`` parameter now consider :py:class:`str` values to be a serialization to parse. + For example, ``parse(path="foo.ttl")`` will parse the file ``foo.ttl`` whereas ``parse("foo", format=RdfFormat.N_TRIPLES)`` will parse a N-Triples file which content is ``foo``. + + From 0.2 to 0.3 """"""""""""""" diff --git a/python/docs/model.rst b/python/docs/model.rst index 1950e853..28a7279c 100644 --- a/python/docs/model.rst +++ b/python/docs/model.rst @@ -1,37 +1,38 @@ RDF Model ========= +.. py:currentmodule:: pyoxigraph Oxigraph provides python classes to represents basic RDF concepts: `IRIs <https://www.w3.org/TR/rdf11-concepts/#dfn-iri>`_ """"""""""""""""""""""""""""""""""""""""""""""""""""""" -.. autoclass:: pyoxigraph.NamedNode +.. autoclass:: NamedNode :members: `Blank Nodes <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node>`_ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.. autoclass:: pyoxigraph.BlankNode +.. autoclass:: BlankNode :members: `Literals <https://www.w3.org/TR/rdf11-concepts/#dfn-literal>`_ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.. autoclass:: pyoxigraph.Literal +.. autoclass:: Literal :members: `Triples <https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple>`_ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.. autoclass:: pyoxigraph.Triple +.. autoclass:: Triple :members: Quads (`triples <https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-triple>`_ in a `RDF dataset <https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset>`_) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -.. autoclass:: pyoxigraph.Quad +.. autoclass:: Quad :members: -.. autoclass:: pyoxigraph.DefaultGraph +.. autoclass:: DefaultGraph :members: diff --git a/python/docs/sparql.rst b/python/docs/sparql.rst index 4c6a0479..824a42cb 100644 --- a/python/docs/sparql.rst +++ b/python/docs/sparql.rst @@ -1,23 +1,33 @@ SPARQL utility objects -============================= +====================== +.. py:currentmodule:: pyoxigraph Oxigraph provides also some utilities related to SPARQL queries: - Variable """""""" -.. autoclass:: pyoxigraph.Variable +.. autoclass:: Variable :members: - ``SELECT`` solutions """""""""""""""""""" -.. autoclass:: pyoxigraph.QuerySolutions +.. autoclass:: QuerySolutions :members: -.. autoclass:: pyoxigraph.QuerySolution +.. autoclass:: QuerySolution + :members: + +``ASK`` results +""""""""""""""" +.. autoclass:: QueryBoolean :members: ``CONSTRUCT`` results """"""""""""""""""""" -.. autoclass:: pyoxigraph.QueryTriples +.. autoclass:: QueryTriples + :members: + +Query results parsing +""""""""""""""""""""" +.. autofunction:: parse_query_results +.. autoclass:: QueryResultsFormat :members: diff --git a/python/docs/store.rst b/python/docs/store.rst index 2fea9ab3..b6af6ef5 100644 --- a/python/docs/store.rst +++ b/python/docs/store.rst @@ -1,5 +1,6 @@ RDF Store ========= +.. py:currentmodule:: pyoxigraph -.. autoclass:: pyoxigraph.Store +.. autoclass:: Store :members: diff --git a/python/generate_stubs.py b/python/generate_stubs.py index 8a36f1b4..5626c8de 100644 --- a/python/generate_stubs.py +++ b/python/generate_stubs.py @@ -5,65 +5,60 @@ import inspect import logging import re import subprocess +from functools import reduce from typing import Any, Dict, List, Mapping, Optional, Set, Tuple, Union -def _path_to_type(*elements: str) -> ast.AST: - base: ast.AST = ast.Name(id=elements[0], ctx=AST_LOAD) +def path_to_type(*elements: str) -> ast.AST: + base: ast.AST = ast.Name(id=elements[0], ctx=ast.Load()) for e in elements[1:]: - base = ast.Attribute(value=base, attr=e, ctx=AST_LOAD) + base = ast.Attribute(value=base, attr=e, ctx=ast.Load()) return base -AST_LOAD = ast.Load() -AST_ELLIPSIS = ast.Ellipsis() -AST_STORE = ast.Store() -AST_TYPING_ANY = _path_to_type("typing", "Any") -GENERICS = { - "iterable": _path_to_type("typing", "Iterable"), - "iterator": _path_to_type("typing", "Iterator"), - "list": _path_to_type("typing", "List"), - "io": _path_to_type("typing", "IO"), -} OBJECT_MEMBERS = dict(inspect.getmembers(object)) - - BUILTINS: Dict[str, Union[None, Tuple[List[ast.AST], ast.AST]]] = { "__annotations__": None, - "__bool__": ([], _path_to_type("bool")), - "__bytes__": ([], _path_to_type("bytes")), + "__bool__": ([], path_to_type("bool")), + "__bytes__": ([], path_to_type("bytes")), "__class__": None, - "__contains__": ([AST_TYPING_ANY], _path_to_type("bool")), + "__contains__": ([path_to_type("typing", "Any")], path_to_type("bool")), "__del__": None, - "__delattr__": ([_path_to_type("str")], _path_to_type("None")), - "__delitem__": ([AST_TYPING_ANY], AST_TYPING_ANY), + "__delattr__": ([path_to_type("str")], path_to_type("None")), + "__delitem__": ([path_to_type("typing", "Any")], path_to_type("typing", "Any")), "__dict__": None, "__dir__": None, "__doc__": None, - "__eq__": ([AST_TYPING_ANY], _path_to_type("bool")), - "__format__": ([_path_to_type("str")], _path_to_type("str")), - "__ge__": ([AST_TYPING_ANY], _path_to_type("bool")), - "__getattribute__": ([_path_to_type("str")], AST_TYPING_ANY), - "__getitem__": ([AST_TYPING_ANY], AST_TYPING_ANY), - "__gt__": ([AST_TYPING_ANY], _path_to_type("bool")), - "__hash__": ([], _path_to_type("int")), - "__init__": ([], _path_to_type("None")), + "__eq__": ([path_to_type("typing", "Any")], path_to_type("bool")), + "__format__": ([path_to_type("str")], path_to_type("str")), + "__ge__": ([path_to_type("typing", "Any")], path_to_type("bool")), + "__getattribute__": ([path_to_type("str")], path_to_type("typing", "Any")), + "__getitem__": ([path_to_type("typing", "Any")], path_to_type("typing", "Any")), + "__gt__": ([path_to_type("typing", "Any")], path_to_type("bool")), + "__hash__": ([], path_to_type("int")), + "__init__": ([], path_to_type("None")), "__init_subclass__": None, - "__iter__": ([], AST_TYPING_ANY), - "__le__": ([AST_TYPING_ANY], _path_to_type("bool")), - "__len__": ([], _path_to_type("int")), - "__lt__": ([AST_TYPING_ANY], _path_to_type("bool")), + "__iter__": ([], path_to_type("typing", "Any")), + "__le__": ([path_to_type("typing", "Any")], path_to_type("bool")), + "__len__": ([], path_to_type("int")), + "__lt__": ([path_to_type("typing", "Any")], path_to_type("bool")), "__module__": None, - "__ne__": ([AST_TYPING_ANY], _path_to_type("bool")), + "__ne__": ([path_to_type("typing", "Any")], path_to_type("bool")), "__new__": None, - "__next__": ([], AST_TYPING_ANY), + "__next__": ([], path_to_type("typing", "Any")), "__reduce__": None, "__reduce_ex__": None, - "__repr__": ([], _path_to_type("str")), - "__setattr__": ([_path_to_type("str"), AST_TYPING_ANY], _path_to_type("None")), - "__setitem__": ([AST_TYPING_ANY, AST_TYPING_ANY], AST_TYPING_ANY), + "__repr__": ([], path_to_type("str")), + "__setattr__": ( + [path_to_type("str"), path_to_type("typing", "Any")], + path_to_type("None"), + ), + "__setitem__": ( + [path_to_type("typing", "Any"), path_to_type("typing", "Any")], + path_to_type("typing", "Any"), + ), "__sizeof__": None, - "__str__": ([], _path_to_type("str")), + "__str__": ([], path_to_type("str")), "__subclasshook__": None, } @@ -77,9 +72,7 @@ def module_stubs(module: Any) -> ast.Module: if member_name.startswith("__"): pass elif inspect.isclass(member_value): - classes.append( - class_stubs(member_name, member_value, element_path, types_to_import) - ) + classes.append(class_stubs(member_name, member_value, element_path, types_to_import)) elif inspect.isbuiltin(member_value): functions.append( function_stub( @@ -93,16 +86,12 @@ def module_stubs(module: Any) -> ast.Module: else: logging.warning(f"Unsupported root construction {member_name}") return ast.Module( - body=[ast.Import(names=[ast.alias(name=t)]) for t in sorted(types_to_import)] - + classes - + functions, + body=[ast.Import(names=[ast.alias(name=t)]) for t in sorted(types_to_import)] + classes + functions, type_ignores=[], ) -def class_stubs( - cls_name: str, cls_def: Any, element_path: List[str], types_to_import: Set[str] -) -> ast.ClassDef: +def class_stubs(cls_name: str, cls_def: Any, element_path: List[str], types_to_import: Set[str]) -> ast.ClassDef: attributes: List[ast.AST] = [] methods: List[ast.AST] = [] magic_methods: List[ast.AST] = [] @@ -124,20 +113,11 @@ def class_stubs( ] except ValueError as e: if "no signature found" not in str(e): - raise ValueError( - f"Error while parsing signature of {cls_name}.__init_" - ) from e - elif ( - member_value == OBJECT_MEMBERS.get(member_name) - or BUILTINS.get(member_name, ()) is None - ): + raise ValueError(f"Error while parsing signature of {cls_name}.__init_") from e + elif member_value == OBJECT_MEMBERS.get(member_name) or BUILTINS.get(member_name, ()) is None: pass elif inspect.isdatadescriptor(member_value): - attributes.extend( - data_descriptor_stub( - member_name, member_value, current_element_path, types_to_import - ) - ) + attributes.extend(data_descriptor_stub(member_name, member_value, current_element_path, types_to_import)) elif inspect.isroutine(member_value): (magic_methods if member_name.startswith("__") else methods).append( function_stub( @@ -151,22 +131,29 @@ def class_stubs( elif member_name == "__match_args__": constants.append( ast.AnnAssign( - target=ast.Name(id=member_name, ctx=AST_STORE), + target=ast.Name(id=member_name, ctx=ast.Store()), annotation=ast.Subscript( - value=_path_to_type("typing", "Tuple"), - slice=ast.Tuple( - elts=[_path_to_type("str"), ast.Ellipsis()], ctx=AST_LOAD - ), - ctx=AST_LOAD, + value=path_to_type("tuple"), + slice=ast.Tuple(elts=[path_to_type("str"), ast.Ellipsis()], ctx=ast.Load()), + ctx=ast.Load(), ), value=ast.Constant(member_value), simple=1, ) ) - else: - logging.warning( - f"Unsupported member {member_name} of class {'.'.join(element_path)}" + elif member_value is not None: + constants.append( + ast.AnnAssign( + target=ast.Name(id=member_name, ctx=ast.Store()), + annotation=concatenated_path_to_type( + member_value.__class__.__name__, element_path, types_to_import + ), + value=ast.Ellipsis(), + simple=1, + ) ) + else: + logging.warning(f"Unsupported member {member_name} of class {'.'.join(element_path)}") doc = inspect.getdoc(cls_def) doc_comment = build_doc_comment(doc) if doc else None @@ -174,15 +161,9 @@ def class_stubs( cls_name, bases=[], keywords=[], - body=( - ([doc_comment] if doc_comment else []) - + attributes - + methods - + magic_methods - + constants - ) - or [AST_ELLIPSIS], - decorator_list=[_path_to_type("typing", "final")], + body=(([doc_comment] if doc_comment else []) + attributes + methods + magic_methods + constants) + or [ast.Ellipsis()], + decorator_list=[path_to_type("typing", "final")], ) @@ -207,8 +188,8 @@ def data_descriptor_stub( ) assign = ast.AnnAssign( - target=ast.Name(id=data_desc_name, ctx=AST_STORE), - annotation=annotation or AST_TYPING_ANY, + target=ast.Name(id=data_desc_name, ctx=ast.Store()), + annotation=annotation or path_to_type("typing", "Any"), simple=1, ) doc_comment = build_doc_comment(doc_comment) if doc_comment else None @@ -237,11 +218,9 @@ def function_stub( return ast.FunctionDef( fn_name, arguments_stub(fn_name, fn_def, doc or "", element_path, types_to_import), - body or [AST_ELLIPSIS], + body or [ast.Ellipsis()], decorator_list=decorator_list, - returns=returns_stub(fn_name, doc, element_path, types_to_import) - if doc - else None, + returns=returns_stub(fn_name, doc, element_path, types_to_import) if doc else None, lineno=0, ) @@ -253,9 +232,7 @@ def arguments_stub( element_path: List[str], types_to_import: Set[str], ) -> ast.arguments: - real_parameters: Mapping[str, inspect.Parameter] = inspect.signature( - callable_def - ).parameters + real_parameters: Mapping[str, inspect.Parameter] = inspect.signature(callable_def).parameters if callable_name == "__init__": real_parameters = { "self": inspect.Parameter("self", inspect.Parameter.POSITIONAL_ONLY), @@ -285,9 +262,7 @@ def arguments_stub( if type.endswith(", optional"): optional_params.add(match[0]) type = type[:-10] - parsed_param_types[match[0]] = convert_type_from_doc( - type, element_path, types_to_import - ) + parsed_param_types[match[0]] = convert_type_from_doc(type, element_path, types_to_import) # we parse the parameters posonlyargs = [] @@ -303,9 +278,7 @@ def arguments_stub( f"The parameter {param.name} of {'.'.join(element_path)} " "has no type definition in the function documentation" ) - param_ast = ast.arg( - arg=param.name, annotation=parsed_param_types.get(param.name) - ) + param_ast = ast.arg(arg=param.name, annotation=parsed_param_types.get(param.name)) default_ast = None if param.default != param.empty: @@ -346,9 +319,7 @@ def arguments_stub( ) -def returns_stub( - callable_name: str, doc: str, element_path: List[str], types_to_import: Set[str] -) -> Optional[ast.AST]: +def returns_stub(callable_name: str, doc: str, element_path: List[str], types_to_import: Set[str]) -> Optional[ast.AST]: m = re.findall(r"^ *:rtype: *([^\n]*) *$", doc, re.MULTILINE) if len(m) == 0: builtin = BUILTINS.get(callable_name) @@ -359,22 +330,16 @@ def returns_stub( "has no type definition using :rtype: in the function documentation" ) if len(m) > 1: - raise ValueError( - f"Multiple return type annotations found with :rtype: for {'.'.join(element_path)}" - ) + raise ValueError(f"Multiple return type annotations found with :rtype: for {'.'.join(element_path)}") return convert_type_from_doc(m[0], element_path, types_to_import) -def convert_type_from_doc( - type_str: str, element_path: List[str], types_to_import: Set[str] -) -> ast.AST: +def convert_type_from_doc(type_str: str, element_path: List[str], types_to_import: Set[str]) -> ast.AST: type_str = type_str.strip() return parse_type_to_ast(type_str, element_path, types_to_import) -def parse_type_to_ast( - type_str: str, element_path: List[str], types_to_import: Set[str] -) -> ast.AST: +def parse_type_to_ast(type_str: str, element_path: List[str], types_to_import: Set[str]) -> ast.AST: # let's tokenize tokens = [] current_token = "" @@ -393,11 +358,11 @@ def parse_type_to_ast( # let's first parse nested parenthesis stack: List[List[Any]] = [[]] for token in tokens: - if token == "(": + if token == "[": children: List[str] = [] stack[-1].append(children) stack.append(children) - elif token == ")": + elif token == "]": stack.pop() else: stack[-1].append(token) @@ -412,54 +377,36 @@ def parse_type_to_ast( else: or_groups[-1].append(e) if any(not g for g in or_groups): - raise ValueError( - f"Not able to parse type '{type_str}' used by {'.'.join(element_path)}" - ) + raise ValueError(f"Not able to parse type '{type_str}' used by {'.'.join(element_path)}") new_elements: List[ast.AST] = [] for group in or_groups: if len(group) == 1 and isinstance(group[0], str): - parts = group[0].split(".") - if any(not p for p in parts): - raise ValueError( - f"Not able to parse type '{type_str}' used by {'.'.join(element_path)}" - ) - if len(parts) > 1: - types_to_import.add(parts[0]) - new_elements.append(_path_to_type(*parts)) - elif ( - len(group) == 2 - and isinstance(group[0], str) - and isinstance(group[1], list) - ): - if group[0] not in GENERICS: - raise ValueError( - f"Constructor {group[0]} is not supported in type '{type_str}' used by {'.'.join(element_path)}" - ) + new_elements.append(concatenated_path_to_type(group[0], element_path, types_to_import)) + elif len(group) == 2 and isinstance(group[0], str) and isinstance(group[1], list): new_elements.append( ast.Subscript( - value=GENERICS[group[0]], + value=concatenated_path_to_type(group[0], element_path, types_to_import), slice=parse_sequence(group[1]), - ctx=AST_LOAD, + ctx=ast.Load(), ) ) else: - raise ValueError( - f"Not able to parse type '{type_str}' used by {'.'.join(element_path)}" - ) - return ( - ast.Subscript( - value=_path_to_type("typing", "Union"), - slice=ast.Tuple(elts=new_elements, ctx=AST_LOAD), - ctx=AST_LOAD, - ) - if len(new_elements) > 1 - else new_elements[0] - ) + raise ValueError(f"Not able to parse type '{type_str}' used by {'.'.join(element_path)}") + return reduce(lambda left, right: ast.BinOp(left=left, op=ast.BitOr(), right=right), new_elements) return parse_sequence(stack[0]) +def concatenated_path_to_type(path: str, element_path: List[str], types_to_import: Set[str]) -> ast.AST: + parts = path.split(".") + if any(not p for p in parts): + raise ValueError(f"Not able to parse type '{path}' used by {'.'.join(element_path)}") + if len(parts) > 1: + types_to_import.add(".".join(parts[:-1])) + return path_to_type(*parts) + + def build_doc_comment(doc: str) -> Optional[ast.Expr]: lines = [line.strip() for line in doc.split("\n")] clean_lines = [] @@ -471,36 +418,21 @@ def build_doc_comment(doc: str) -> Optional[ast.Expr]: return ast.Expr(value=ast.Constant(text)) if text else None -def format_with_black(code: str) -> str: - result = subprocess.run( - ["python", "-m", "black", "-t", "py37", "--pyi", "-"], - input=code.encode(), - capture_output=True, - ) - result.check_returncode() - return result.stdout.decode() +def format_with_ruff(file: str) -> None: + subprocess.check_call(["python", "-m", "ruff", "format", file]) if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Extract Python type stub from a python module." - ) - parser.add_argument( - "module_name", help="Name of the Python module for which generate stubs" - ) + parser = argparse.ArgumentParser(description="Extract Python type stub from a python module.") + parser.add_argument("module_name", help="Name of the Python module for which generate stubs") parser.add_argument( "out", help="Name of the Python stub file to write to", type=argparse.FileType("wt"), ) - parser.add_argument( - "--black", help="Formats the generated stubs using Black", action="store_true" - ) + parser.add_argument("--ruff", help="Formats the generated stubs using Ruff", action="store_true") args = parser.parse_args() stub_content = ast.unparse(module_stubs(importlib.import_module(args.module_name))) - stub_content = stub_content.replace( - ", /", "" - ) # TODO: remove when targeting Python 3.8+ - if args.black: - stub_content = format_with_black(stub_content) args.out.write(stub_content) + if args.ruff: + format_with_ruff(args.out.name) diff --git a/python/pyproject.toml b/python/pyproject.toml index e17c6a01..98cf75d8 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -11,7 +11,6 @@ classifiers = [ "License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -20,7 +19,7 @@ classifiers = [ "Topic :: Database :: Database Engines/Servers", "Topic :: Software Development :: Libraries :: Python Modules", ] -requires-python = ">=3.7" +requires-python = ">=3.8" [project.urls] Changelog = "https://github.com/oxigraph/oxigraph/blob/main/CHANGELOG.md" @@ -31,6 +30,8 @@ Tracker = "https://github.com/oxigraph/oxigraph/issues" [tool.ruff] line-length = 120 + +[tool.ruff.lint] select = [ "ARG", "B", @@ -40,7 +41,6 @@ select = [ "FBT", "I", "ICN", - "ISC", "N", "PIE", "PTH", diff --git a/python/requirements.dev.txt b/python/requirements.dev.txt index 8e235e25..a47b2d4c 100644 --- a/python/requirements.dev.txt +++ b/python/requirements.dev.txt @@ -1,6 +1,6 @@ -black~=23.1 furo maturin~=1.0 mypy~=1.0 -ruff~=0.0.255 -sphinx~=5.3 +ruff~=0.2.0 +sphinx~=7.0 +sphinx-lint~=0.9.1 diff --git a/python/src/io.rs b/python/src/io.rs index c7e84757..37d97451 100644 --- a/python/src/io.rs +++ b/python/src/io.rs @@ -1,221 +1,385 @@ #![allow(clippy::needless_option_as_deref)] -use crate::model::{PyQuad, PyTriple}; -use oxigraph::io::read::{ParseError, QuadReader, TripleReader}; -use oxigraph::io::{ - DatasetFormat, DatasetParser, DatasetSerializer, GraphFormat, GraphParser, GraphSerializer, -}; -use pyo3::exceptions::{PyIOError, PySyntaxError, PyValueError}; +use crate::model::{hash, PyQuad, PyTriple}; +use oxigraph::io::{FromReadQuadReader, RdfFormat, RdfParseError, RdfParser, RdfSerializer}; +use oxigraph::model::QuadRef; +use pyo3::exceptions::{PyDeprecationWarning, PySyntaxError, PyValueError}; +use pyo3::intern; use pyo3::prelude::*; use pyo3::types::PyBytes; -use pyo3::{intern, wrap_pyfunction}; use std::cmp::max; -use std::error::Error; +use std::ffi::OsStr; use std::fs::File; -use std::io::{self, BufRead, BufReader, BufWriter, Cursor, Read, Write}; +use std::io::{self, BufWriter, Cursor, Read, Write}; use std::path::{Path, PathBuf}; - -pub fn add_to_module(module: &PyModule) -> PyResult<()> { - module.add_wrapped(wrap_pyfunction!(parse))?; - module.add_wrapped(wrap_pyfunction!(serialize)) -} +use std::sync::OnceLock; /// Parses RDF graph and dataset serialization formats. /// /// It currently supports the following formats: /// -/// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (``application/n-triples``) -/// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (``application/n-quads``) -/// * `Turtle <https://www.w3.org/TR/turtle/>`_ (``text/turtle``) -/// * `TriG <https://www.w3.org/TR/trig/>`_ (``application/trig``) -/// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (``application/rdf+xml``) +/// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) +/// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) +/// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) +/// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) +/// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) +/// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) /// -/// It supports also some MIME type aliases. +/// It supports also some media type and extension aliases. /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ -/// and ``application/xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. +/// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. /// -/// :param input: The binary I/O object or file path to read from. For example, it could be a file path as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. -/// :type input: io(bytes) or io(str) or str or pathlib.Path -/// :param mime_type: the MIME type of the RDF serialization. -/// :type mime_type: str +/// :param input: The :py:class:`str`, :py:class:`bytes` or I/O object to read from. For example, it could be the file content as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. +/// :type input: bytes or str or typing.IO[bytes] or typing.IO[str] or None, optional +/// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. +/// :type format: RdfFormat or None, optional +/// :param path: The file path to read from. Replaces the ``input`` parameter. +/// :type path: str or os.PathLike[str] or None, optional /// :param base_iri: the base IRI used to resolve the relative IRIs in the file or :py:const:`None` if relative IRI resolution should not be done. /// :type base_iri: str or None, optional +/// :param without_named_graphs: Sets that the parser must fail when parsing a named graph. +/// :type without_named_graphs: bool, optional +/// :param rename_blank_nodes: Renames the blank nodes identifiers from the ones set in the serialization to random ids. This allows to avoid identifier conflicts when merging graphs together. +/// :type rename_blank_nodes: bool, optional /// :return: an iterator of RDF triples or quads depending on the format. -/// :rtype: iterator(Triple) or iterator(Quad) -/// :raises ValueError: if the MIME type is not supported. +/// :rtype: collections.abc.Iterator[Quad] +/// :raises ValueError: if the format is not supported. /// :raises SyntaxError: if the provided data is invalid. +/// :raises OSError: if a system error happens while reading the file. /// -/// >>> input = io.BytesIO(b'<foo> <p> "1" .') -/// >>> list(parse(input, "text/turtle", base_iri="http://example.com/")) -/// [<Triple subject=<NamedNode value=http://example.com/foo> predicate=<NamedNode value=http://example.com/p> object=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#string>>>] +/// >>> list(parse(input=b'<foo> <p> "1" .', format=RdfFormat.TURTLE, base_iri="http://example.com/")) +/// [<Quad subject=<NamedNode value=http://example.com/foo> predicate=<NamedNode value=http://example.com/p> object=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#string>> graph_name=<DefaultGraph>>] #[pyfunction] -#[pyo3(signature = (input, mime_type, *, base_iri = None))] +#[pyo3(signature = (input = None, format = None, *, path = None, base_iri = None, without_named_graphs = false, rename_blank_nodes = false))] pub fn parse( - input: PyObject, - mime_type: &str, + input: Option<PyReadableInput>, + format: Option<PyRdfFormatInput>, + path: Option<PathBuf>, base_iri: Option<&str>, + without_named_graphs: bool, + rename_blank_nodes: bool, py: Python<'_>, ) -> PyResult<PyObject> { - let input = if let Ok(path) = input.extract::<PathBuf>(py) { - PyReadable::from_file(&path, py).map_err(map_io_err)? - } else { - PyReadable::from_data(input, py) - }; - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - let mut parser = GraphParser::from_format(graph_format); - if let Some(base_iri) = base_iri { - parser = parser - .with_base_iri(base_iri) - .map_err(|e| PyValueError::new_err(e.to_string()))?; - } - Ok(PyTripleReader { - inner: py.allow_threads(|| parser.read_triples(input).map_err(map_parse_error))?, - } - .into_py(py)) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - let mut parser = DatasetParser::from_format(dataset_format); - if let Some(base_iri) = base_iri { - parser = parser - .with_base_iri(base_iri) - .map_err(|e| PyValueError::new_err(e.to_string()))?; - } - Ok(PyQuadReader { - inner: py.allow_threads(|| parser.read_quads(input).map_err(map_parse_error))?, - } - .into_py(py)) - } else { - Err(PyValueError::new_err(format!( - "Not supported MIME type: {mime_type}" - ))) + let input = PyReadable::from_args(&path, input, py)?; + let format = lookup_rdf_format(format, path.as_deref())?; + let mut parser = RdfParser::from_format(format); + if let Some(base_iri) = base_iri { + parser = parser + .with_base_iri(base_iri) + .map_err(|e| PyValueError::new_err(e.to_string()))?; + } + if without_named_graphs { + parser = parser.without_named_graphs(); + } + if rename_blank_nodes { + parser = parser.rename_blank_nodes(); } + Ok(PyQuadReader { + inner: parser.parse_read(input), + file_path: path, + } + .into_py(py)) } /// Serializes an RDF graph or dataset. /// /// It currently supports the following formats: /// -/// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (``application/n-triples``) -/// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (``application/n-quads``) -/// * `Turtle <https://www.w3.org/TR/turtle/>`_ (``text/turtle``) -/// * `TriG <https://www.w3.org/TR/trig/>`_ (``application/trig``) -/// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (``application/rdf+xml``) +/// * `canonical <https://www.w3.org/TR/n-triples/#canonical-ntriples>`_ `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) +/// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) +/// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) +/// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) +/// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) +/// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) /// -/// It supports also some MIME type aliases. +/// It supports also some media type and extension aliases. /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ -/// and ``application/xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. +/// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. /// /// :param input: the RDF triples and quads to serialize. -/// :type input: iterable(Triple) or iterable(Quad) -/// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. -/// :type output: io(bytes) or str or pathlib.Path -/// :param mime_type: the MIME type of the RDF serialization. -/// :type mime_type: str -/// :rtype: None -/// :raises ValueError: if the MIME type is not supported. +/// :type input: collections.abc.Iterable[Triple] or collections.abc.Iterable[Quad] +/// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. If :py:const:`None`, a :py:class:`bytes` buffer is returned with the serialized content. +/// :type output: typing.IO[bytes] or str or os.PathLike[str] or None, optional +/// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. +/// :type format: RdfFormat or None, optional +/// :return: :py:class:`bytes` with the serialization if the ``output`` parameter is :py:const:`None`, :py:const:`None` if ``output`` is set. +/// :rtype: bytes or None +/// :raises ValueError: if the format is not supported. /// :raises TypeError: if a triple is given during a quad format serialization or reverse. +/// :raises OSError: if a system error happens while writing the file. +/// +/// >>> serialize([Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))], format=RdfFormat.TURTLE) +/// b'<http://example.com> <http://example.com/p> "1" .\n' /// +/// >>> import io /// >>> output = io.BytesIO() -/// >>> serialize([Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))], output, "text/turtle") +/// >>> serialize([Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))], output, RdfFormat.TURTLE) /// >>> output.getvalue() /// b'<http://example.com> <http://example.com/p> "1" .\n' #[pyfunction] -pub fn serialize(input: &PyAny, output: PyObject, mime_type: &str, py: Python<'_>) -> PyResult<()> { - let output = if let Ok(path) = output.extract::<PathBuf>(py) { - PyWritable::from_file(&path, py).map_err(map_io_err)? - } else { - PyWritable::from_data(output) - }; - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - let mut writer = GraphSerializer::from_format(graph_format) - .triple_writer(output) - .map_err(map_io_err)?; - for i in input.iter()? { - writer - .write(&*i?.extract::<PyRef<PyTriple>>()?) - .map_err(map_io_err)?; - } - writer.finish().map_err(map_io_err)?; - Ok(()) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - let mut writer = DatasetSerializer::from_format(dataset_format) - .quad_writer(output) - .map_err(map_io_err)?; - for i in input.iter()? { - writer - .write(&*i?.extract::<PyRef<PyQuad>>()?) - .map_err(map_io_err)?; - } - writer.finish().map_err(map_io_err)?; - Ok(()) - } else { - Err(PyValueError::new_err(format!( - "Not supported MIME type: {mime_type}" - ))) - } +#[pyo3(signature = (input, output = None, format = None))] +pub fn serialize<'a>( + input: &PyAny, + output: Option<PyWritableOutput>, + format: Option<PyRdfFormatInput>, + py: Python<'a>, +) -> PyResult<Option<&'a PyBytes>> { + PyWritable::do_write( + |output, file_path| { + let format = lookup_rdf_format(format, file_path.as_deref())?; + let mut writer = RdfSerializer::from_format(format).serialize_to_write(output); + for i in input.iter()? { + let i = i?; + if let Ok(triple) = i.extract::<PyRef<'_, PyTriple>>() { + writer.write_triple(&*triple) + } else { + let quad = i.extract::<PyRef<'_, PyQuad>>()?; + let quad = QuadRef::from(&*quad); + if !quad.graph_name.is_default_graph() && !format.supports_datasets() { + return Err(PyValueError::new_err( + "The {format} format does not support named graphs", + )); + } + writer.write_quad(quad) + }?; + } + Ok(writer.finish()?) + }, + output, + py, + ) } -#[pyclass(name = "TripleReader", module = "pyoxigraph")] -pub struct PyTripleReader { - inner: TripleReader<PyReadable>, +#[pyclass(name = "QuadReader", module = "pyoxigraph")] +pub struct PyQuadReader { + inner: FromReadQuadReader<PyReadable>, + file_path: Option<PathBuf>, } #[pymethods] -impl PyTripleReader { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { +impl PyQuadReader { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } - fn __next__(&mut self, py: Python<'_>) -> PyResult<Option<PyTriple>> { + fn __next__(&mut self, py: Python<'_>) -> PyResult<Option<PyQuad>> { py.allow_threads(|| { - self.inner + Ok(self + .inner .next() - .map(|q| Ok(q.map_err(map_parse_error)?.into())) .transpose() + .map_err(|e| map_parse_error(e, self.file_path.clone()))? + .map(PyQuad::from)) }) } } -#[pyclass(name = "QuadReader", module = "pyoxigraph")] -pub struct PyQuadReader { - inner: QuadReader<PyReadable>, +/// RDF serialization formats. +/// +/// The following formats are supported: +/// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) +/// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) +/// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) +/// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) +/// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) +/// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) +/// +/// >>> RdfFormat.N3.media_type +/// 'text/n3' +#[pyclass(name = "RdfFormat", module = "pyoxigraph")] +#[derive(Clone)] +pub struct PyRdfFormat { + inner: RdfFormat, } #[pymethods] -impl PyQuadReader { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { - slf +impl PyRdfFormat { + /// `N3 <https://w3c.github.io/N3/spec/>`_ + #[classattr] + const N3: Self = Self { + inner: RdfFormat::N3, + }; + /// `N-Quads <https://www.w3.org/TR/n-quads/>`_ + #[classattr] + const N_QUADS: Self = Self { + inner: RdfFormat::NQuads, + }; + /// `N-Triples <https://www.w3.org/TR/n-triples/>`_ + #[classattr] + const N_TRIPLES: Self = Self { + inner: RdfFormat::NTriples, + }; + /// `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ + #[classattr] + const RDF_XML: Self = Self { + inner: RdfFormat::RdfXml, + }; + /// `TriG <https://www.w3.org/TR/trig/>`_ + #[classattr] + const TRIG: Self = Self { + inner: RdfFormat::TriG, + }; + /// `Turtle <https://www.w3.org/TR/turtle/>`_ + #[classattr] + const TURTLE: Self = Self { + inner: RdfFormat::Turtle, + }; + + /// :return: the format canonical IRI according to the `Unique URIs for file formats registry <https://www.w3.org/ns/formats/>`_. + /// :rtype: str + /// + /// >>> RdfFormat.N_TRIPLES.iri + /// 'http://www.w3.org/ns/formats/N-Triples' + #[getter] + fn iri(&self) -> &'static str { + self.inner.iri() } - fn __next__(&mut self, py: Python<'_>) -> PyResult<Option<PyQuad>> { - py.allow_threads(|| { - self.inner - .next() - .map(|q| Ok(q.map_err(map_parse_error)?.into())) - .transpose() + /// :return: the format `IANA media type <https://tools.ietf.org/html/rfc2046>`_. + /// :rtype: str + /// + /// >>> RdfFormat.N_TRIPLES.media_type + /// 'application/n-triples' + #[getter] + fn media_type(&self) -> &'static str { + self.inner.media_type() + } + + /// :return: the format `IANA-registered <https://tools.ietf.org/html/rfc2046>`_ file extension. + /// :rtype: str + /// + /// >>> RdfFormat.N_TRIPLES.file_extension + /// 'nt' + #[getter] + pub fn file_extension(&self) -> &'static str { + self.inner.file_extension() + } + + /// :return: the format name. + /// :rtype: str + /// + /// >>> RdfFormat.N_TRIPLES.name + /// 'N-Triples' + #[getter] + pub const fn name(&self) -> &'static str { + self.inner.name() + } + + /// :return: if the formats supports `RDF datasets <https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-dataset>`_ and not only `RDF graphs <https://www.w3.org/TR/rdf11-concepts/#dfn-rdf-graph>`_. + /// :rtype: bool + /// + /// >>> RdfFormat.N_TRIPLES.supports_datasets + /// False + /// >>> RdfFormat.N_QUADS.supports_datasets + /// True + #[getter] + pub fn supports_datasets(&self) -> bool { + self.inner.supports_datasets() + } + + /// :return: if the formats supports `RDF-star quoted triples <https://w3c.github.io/rdf-star/cg-spec/2021-12-17.html#dfn-quoted>`_. + /// :rtype: bool + /// + /// >>> RdfFormat.N_TRIPLES.supports_rdf_star + /// True + /// >>> RdfFormat.RDF_XML.supports_rdf_star + /// False + #[getter] + pub const fn supports_rdf_star(&self) -> bool { + self.inner.supports_rdf_star() + } + + /// Looks for a known format from a media type. + /// + /// It supports some media type aliases. + /// For example, "application/xml" is going to return RDF/XML even if it is not its canonical media type. + /// + /// :param media_type: the media type. + /// :type media_type: str + /// :return: :py:class:`RdfFormat` if the media type is known or :py:const:`None` if not. + /// :rtype: RdfFormat or None + /// + /// >>> RdfFormat.from_media_type("text/turtle; charset=utf-8") + /// <RdfFormat Turtle> + #[staticmethod] + pub fn from_media_type(media_type: &str) -> Option<Self> { + Some(Self { + inner: RdfFormat::from_media_type(media_type)?, + }) + } + + /// Looks for a known format from an extension. + /// + /// It supports some aliases. + /// + /// :param extension: the extension. + /// :type extension: str + /// :return: :py:class:`RdfFormat` if the extension is known or :py:const:`None` if not. + /// :rtype: RdfFormat or None + /// + /// >>> RdfFormat.from_extension("nt") + /// <RdfFormat N-Triples> + #[staticmethod] + pub fn from_extension(extension: &str) -> Option<Self> { + Some(Self { + inner: RdfFormat::from_extension(extension)?, }) } + + fn __str__(&self) -> &'static str { + self.inner.name() + } + + fn __repr__(&self) -> String { + format!("<RdfFormat {}>", self.inner.name()) + } + + fn __hash__(&self) -> u64 { + hash(&self.inner) + } + + fn __eq__(&self, other: &Self) -> bool { + self.inner == other.inner + } + + fn __ne__(&self, other: &Self) -> bool { + self.inner != other.inner + } + + /// :rtype: RdfFormat + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { + slf + } + + /// :type memo: typing.Any + /// :rtype: RdfFormat + #[allow(unused_variables)] + fn __deepcopy__<'a>(slf: PyRef<'a, Self>, memo: &'_ PyAny) -> PyRef<'a, Self> { + slf + } } pub enum PyReadable { Bytes(Cursor<Vec<u8>>), - Io(BufReader<PyIo>), - File(BufReader<File>), + Io(PyIo), + File(File), } impl PyReadable { - pub fn from_file(file: &Path, py: Python<'_>) -> io::Result<Self> { - Ok(Self::File(BufReader::new( - py.allow_threads(|| File::open(file))?, - ))) - } - - pub fn from_data(data: PyObject, py: Python<'_>) -> Self { - if let Ok(bytes) = data.extract::<Vec<u8>>(py) { - Self::Bytes(Cursor::new(bytes)) - } else if let Ok(string) = data.extract::<String>(py) { - Self::Bytes(Cursor::new(string.into_bytes())) - } else { - Self::Io(BufReader::new(PyIo(data))) + pub fn from_args( + path: &Option<PathBuf>, + input: Option<PyReadableInput>, + py: Python<'_>, + ) -> PyResult<Self> { + match (path, input) { + (Some(_), Some(_)) => Err(PyValueError::new_err( + "input and file_path can't be both set at the same time", + )), + (Some(path), None) => Ok(Self::File(py.allow_threads(|| File::open(path))?)), + (None, Some(input)) => Ok(input.into()), + (None, None) => Err(PyValueError::new_err( + "Either input or file_path must be set", + )), } } } @@ -230,44 +394,69 @@ impl Read for PyReadable { } } -impl BufRead for PyReadable { - fn fill_buf(&mut self) -> io::Result<&[u8]> { - match self { - Self::Bytes(bytes) => bytes.fill_buf(), - Self::Io(io) => io.fill_buf(), - Self::File(file) => file.fill_buf(), - } - } +#[derive(FromPyObject)] +pub enum PyReadableInput { + String(String), + Bytes(Vec<u8>), + Io(PyObject), +} - fn consume(&mut self, amt: usize) { - match self { - Self::Bytes(bytes) => bytes.consume(amt), - Self::Io(io) => io.consume(amt), - Self::File(file) => file.consume(amt), +impl From<PyReadableInput> for PyReadable { + fn from(input: PyReadableInput) -> Self { + match input { + PyReadableInput::String(string) => Self::Bytes(Cursor::new(string.into_bytes())), + PyReadableInput::Bytes(bytes) => Self::Bytes(Cursor::new(bytes)), + PyReadableInput::Io(io) => Self::Io(PyIo(io)), } } } pub enum PyWritable { - Io(BufWriter<PyIo>), - File(BufWriter<File>), + Bytes(Vec<u8>), + Io(PyIo), + File(File), } impl PyWritable { - pub fn from_file(file: &Path, py: Python<'_>) -> io::Result<Self> { - Ok(Self::File(BufWriter::new( - py.allow_threads(|| File::create(file))?, - ))) + pub fn do_write( + write: impl FnOnce(BufWriter<Self>, Option<PathBuf>) -> PyResult<BufWriter<Self>>, + output: Option<PyWritableOutput>, + py: Python<'_>, + ) -> PyResult<Option<&PyBytes>> { + let (output, file_path) = match output { + Some(PyWritableOutput::Path(file_path)) => ( + Self::File(py.allow_threads(|| File::create(&file_path))?), + Some(file_path), + ), + Some(PyWritableOutput::Io(object)) => (Self::Io(PyIo(object)), None), + None => (Self::Bytes(Vec::new()), None), + }; + let writer = write(BufWriter::new(output), file_path)?; + py.allow_threads(|| writer.into_inner())?.close(py) } - pub fn from_data(data: PyObject) -> Self { - Self::Io(BufWriter::new(PyIo(data))) + fn close(self, py: Python<'_>) -> PyResult<Option<&PyBytes>> { + match self { + Self::Bytes(bytes) => Ok(Some(PyBytes::new(py, &bytes))), + Self::File(mut file) => { + py.allow_threads(|| { + file.flush()?; + file.sync_all() + })?; + Ok(None) + } + Self::Io(mut io) => { + py.allow_threads(|| io.flush())?; + Ok(None) + } + } } } impl Write for PyWritable { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { match self { + Self::Bytes(bytes) => bytes.write(buf), Self::Io(io) => io.write(buf), Self::File(file) => file.write(buf), } @@ -275,12 +464,19 @@ impl Write for PyWritable { fn flush(&mut self) -> io::Result<()> { match self { + Self::Bytes(_) => Ok(()), Self::Io(io) => io.flush(), Self::File(file) => file.flush(), } } } +#[derive(FromPyObject)] +pub enum PyWritableOutput { + Path(PathBuf), + Io(PyObject), +} + pub struct PyIo(PyObject); impl Read for PyIo { @@ -293,12 +489,10 @@ impl Read for PyIo { let read = self .0 .as_ref(py) - .call_method1(intern!(py, "read"), (to_read,)) - .map_err(to_io_err)?; + .call_method1(intern!(py, "read"), (to_read,))?; let bytes = read .extract::<&[u8]>() - .or_else(|e| read.extract::<&str>().map(str::as_bytes).map_err(|_| e)) - .map_err(to_io_err)?; + .or_else(|_| read.extract::<&str>().map(str::as_bytes))?; buf[..bytes.len()].copy_from_slice(bytes); Ok(bytes.len()) }) @@ -308,12 +502,11 @@ impl Read for PyIo { impl Write for PyIo { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { Python::with_gil(|py| { - self.0 + Ok(self + .0 .as_ref(py) - .call_method1(intern!(py, "write"), (PyBytes::new(py, buf),)) - .map_err(to_io_err)? - .extract::<usize>() - .map_err(to_io_err) + .call_method1(intern!(py, "write"), (PyBytes::new(py, buf),))? + .extract::<usize>()?) }) } @@ -325,25 +518,77 @@ impl Write for PyIo { } } -fn to_io_err(error: impl Into<PyErr>) -> io::Error { - io::Error::new(io::ErrorKind::Other, error.into()) +pub fn lookup_rdf_format( + format: Option<PyRdfFormatInput>, + path: Option<&Path>, +) -> PyResult<RdfFormat> { + if let Some(format) = format { + return match format { + PyRdfFormatInput::Object(format) => Ok(format.inner), + PyRdfFormatInput::MediaType(media_type) => { + deprecation_warning("Using string to specify a RDF format is deprecated, please use a RdfFormat object instead.")?; + RdfFormat::from_media_type(&media_type).ok_or_else(|| { + PyValueError::new_err(format!( + "The media type {media_type} is not supported by pyoxigraph" + )) + }) + } + }; + } + let Some(path) = path else { + return Err(PyValueError::new_err( + "The format parameter is required when a file path is not given", + )); + }; + let Some(ext) = path.extension().and_then(OsStr::to_str) else { + return Err(PyValueError::new_err(format!( + "The file name {} has no extension to guess a file format from", + path.display() + ))); + }; + RdfFormat::from_extension(ext) + .ok_or_else(|| PyValueError::new_err(format!("Not supported RDF format extension: {ext}"))) } -pub fn map_io_err(error: io::Error) -> PyErr { - if error - .get_ref() - .map_or(false, <(dyn Error + Send + Sync + 'static)>::is::<PyErr>) - { - *error.into_inner().unwrap().downcast().unwrap() - } else { - PyIOError::new_err(error.to_string()) - } +#[derive(FromPyObject)] +pub enum PyRdfFormatInput { + Object(PyRdfFormat), + MediaType(String), } -pub fn map_parse_error(error: ParseError) -> PyErr { +pub fn map_parse_error(error: RdfParseError, file_path: Option<PathBuf>) -> PyErr { match error { - ParseError::Syntax(error) => PySyntaxError::new_err(error.to_string()), - ParseError::Io(error) => map_io_err(error), + RdfParseError::Syntax(error) => { + // Python 3.9 does not support end line and end column + if python_version() >= (3, 10) { + let params = if let Some(location) = error.location() { + ( + file_path, + Some(location.start.line + 1), + Some(location.start.column + 1), + None::<Vec<u8>>, + Some(location.end.line + 1), + Some(location.end.column + 1), + ) + } else { + (None, None, None, None, None, None) + }; + PySyntaxError::new_err((error.to_string(), params)) + } else { + let params = if let Some(location) = error.location() { + ( + file_path, + Some(location.start.line + 1), + Some(location.start.column + 1), + None::<Vec<u8>>, + ) + } else { + (None, None, None, None) + }; + PySyntaxError::new_err((error.to_string(), params)) + } + } + RdfParseError::Io(error) => error.into(), } } @@ -352,21 +597,36 @@ pub fn map_parse_error(error: ParseError) -> PyErr { /// /// Code from pyo3: https://github.com/PyO3/pyo3/blob/a67180c8a42a0bc0fdc45b651b62c0644130cf47/src/python.rs#L366 #[allow(unsafe_code)] -pub fn allow_threads_unsafe<T>(f: impl FnOnce() -> T) -> T { +pub fn allow_threads_unsafe<T>(_py: Python<'_>, f: impl FnOnce() -> T) -> T { struct RestoreGuard { tstate: *mut pyo3::ffi::PyThreadState, } impl Drop for RestoreGuard { fn drop(&mut self) { + // SAFETY: not cloned so called once unsafe { pyo3::ffi::PyEval_RestoreThread(self.tstate); } } } - let _guard = RestoreGuard { - tstate: unsafe { pyo3::ffi::PyEval_SaveThread() }, - }; + // SAFETY: we have the restore part in Drop to make sure it's properly executed + let tstate = unsafe { pyo3::ffi::PyEval_SaveThread() }; + let _guard = RestoreGuard { tstate }; f() } + +pub fn python_version() -> (u8, u8) { + static VERSION: OnceLock<(u8, u8)> = OnceLock::new(); + *VERSION.get_or_init(|| { + Python::with_gil(|py| { + let v = py.version_info(); + (v.major, v.minor) + }) + }) +} + +pub fn deprecation_warning(message: &str) -> PyResult<()> { + Python::with_gil(|py| PyErr::warn(py, py.get_type::<PyDeprecationWarning>(), message, 0)) +} diff --git a/python/src/lib.rs b/python/src/lib.rs index 170d78b8..cabb8ee2 100644 --- a/python/src/lib.rs +++ b/python/src/lib.rs @@ -1,8 +1,15 @@ +#![allow( + clippy::unused_self, + clippy::trivially_copy_pass_by_ref, + unused_qualifications +)] + mod io; mod model; mod sparql; mod store; +use crate::io::*; use crate::model::*; use crate::sparql::*; use crate::store::*; @@ -25,6 +32,12 @@ fn pyoxigraph(_py: Python<'_>, module: &PyModule) -> PyResult<()> { module.add_class::<PyVariable>()?; module.add_class::<PyQuerySolutions>()?; module.add_class::<PyQuerySolution>()?; + module.add_class::<PyQueryBoolean>()?; module.add_class::<PyQueryTriples>()?; - io::add_to_module(module) + module.add_class::<PyRdfFormat>()?; + module.add_class::<PyQueryResultsFormat>()?; + module.add_wrapped(wrap_pyfunction!(parse))?; + module.add_wrapped(wrap_pyfunction!(parse_query_results))?; + module.add_wrapped(wrap_pyfunction!(serialize))?; + Ok(()) } diff --git a/python/src/model.rs b/python/src/model.rs index 26791351..5933013f 100644 --- a/python/src/model.rs +++ b/python/src/model.rs @@ -6,8 +6,7 @@ use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use pyo3::PyTypeInfo; use std::collections::hash_map::DefaultHasher; -use std::hash::Hash; -use std::hash::Hasher; +use std::hash::{Hash, Hasher}; use std::vec::IntoIter; /// An RDF `node identified by an IRI <https://www.w3.org/TR/rdf11-concepts/#dfn-iri>`_. @@ -16,7 +15,7 @@ use std::vec::IntoIter; /// :type value: str /// :raises ValueError: if the IRI is not valid according to `RFC 3987 <https://tools.ietf.org/rfc/rfc3987>`_. /// -/// The :py:func:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: +/// The :py:class:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: /// /// >>> str(NamedNode('http://example.com')) /// '<http://example.com>' @@ -96,7 +95,7 @@ impl PyNamedNode { } fn __richcmp__(&self, other: &PyAny, op: CompareOp) -> PyResult<bool> { - if let Ok(other) = other.extract::<PyRef<Self>>() { + if let Ok(other) = other.extract::<PyRef<'_, Self>>() { Ok(op.matches(self.cmp(&other))) } else if PyBlankNode::is_type_of(other) || PyLiteral::is_type_of(other) @@ -116,7 +115,7 @@ impl PyNamedNode { } /// :rtype: NamedNode - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -135,11 +134,11 @@ impl PyNamedNode { /// An RDF `blank node <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node>`_. /// -/// :param value: the `blank node ID <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node-identifier>`_ (if not present, a random blank node ID is automatically generated). +/// :param value: the `blank node identifier <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node-identifier>`_ (if not present, a random blank node identifier is automatically generated). /// :type value: str or None, optional -/// :raises ValueError: if the blank node ID is invalid according to NTriples, Turtle, and SPARQL grammars. +/// :raises ValueError: if the blank node identifier is invalid according to NTriples, Turtle, and SPARQL grammars. /// -/// The :py:func:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: +/// The :py:class:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: /// /// >>> str(BlankNode('ex')) /// '_:ex' @@ -198,7 +197,7 @@ impl PyBlankNode { .into()) } - /// :return: the `blank node ID <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node-identifier>`_. + /// :return: the `blank node identifier <https://www.w3.org/TR/rdf11-concepts/#dfn-blank-node-identifier>`_. /// :rtype: str /// /// >>> BlankNode("ex").value @@ -223,7 +222,7 @@ impl PyBlankNode { } fn __richcmp__(&self, other: &PyAny, op: CompareOp) -> PyResult<bool> { - if let Ok(other) = other.extract::<PyRef<Self>>() { + if let Ok(other) = other.extract::<PyRef<'_, Self>>() { eq_compare(self, &other, op) } else if PyNamedNode::is_type_of(other) || PyLiteral::is_type_of(other) @@ -243,7 +242,7 @@ impl PyBlankNode { } /// :rtype: BlankNode - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -270,7 +269,7 @@ impl PyBlankNode { /// :type language: str or None, optional /// :raises ValueError: if the language tag is not valid according to `RFC 5646 <https://tools.ietf.org/rfc/rfc5646>`_ (`BCP 47 <https://tools.ietf.org/rfc/bcp/bcp47>`_). /// -/// The :py:func:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: +/// The :py:class:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: /// /// >>> str(Literal('example')) /// '"example"' @@ -345,7 +344,6 @@ impl PyLiteral { /// >>> Literal('example', language='en').language /// 'en' /// >>> Literal('example').language - /// #[getter] fn language(&self) -> Option<&str> { self.inner.language() @@ -380,7 +378,7 @@ impl PyLiteral { } fn __richcmp__(&self, other: &PyAny, op: CompareOp) -> PyResult<bool> { - if let Ok(other) = other.extract::<PyRef<Self>>() { + if let Ok(other) = other.extract::<PyRef<'_, Self>>() { eq_compare(self, &other, op) } else if PyNamedNode::is_type_of(other) || PyBlankNode::is_type_of(other) @@ -406,7 +404,7 @@ impl PyLiteral { } /// :rtype: Literal - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -426,7 +424,7 @@ impl PyLiteral { /// The RDF `default graph name <https://www.w3.org/TR/rdf11-concepts/#dfn-default-graph>`_. #[pyclass(frozen, name = "DefaultGraph", module = "pyoxigraph")] #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash)] -pub struct PyDefaultGraph {} +pub struct PyDefaultGraph; impl From<PyDefaultGraph> for GraphName { fn from(_: PyDefaultGraph) -> Self { @@ -441,13 +439,6 @@ impl PyDefaultGraph { Self {} } - /// :return: the empty string. - /// :rtype: str - #[getter] - fn value(&self) -> &str { - "" - } - fn __str__(&self) -> &str { "DEFAULT" } @@ -461,7 +452,7 @@ impl PyDefaultGraph { } fn __richcmp__(&self, other: &PyAny, op: CompareOp) -> PyResult<bool> { - if let Ok(other) = other.extract::<PyRef<Self>>() { + if let Ok(other) = other.extract::<PyRef<'_, Self>>() { eq_compare(self, &other, op) } else if PyNamedNode::is_type_of(other) || PyBlankNode::is_type_of(other) @@ -481,7 +472,7 @@ impl PyDefaultGraph { } /// :rtype: DefaultGraph - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -613,7 +604,7 @@ impl IntoPy<PyObject> for PyTerm { /// :param object: the triple object. /// :type object: NamedNode or BlankNode or Literal or Triple /// -/// The :py:func:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: +/// The :py:class:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: /// /// >>> str(Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) /// '<http://example.com> <http://example.com/p> "1"' @@ -621,7 +612,7 @@ impl IntoPy<PyObject> for PyTerm { /// A triple could also be easily destructed into its components: /// /// >>> (s, p, o) = Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1')) -#[pyclass(frozen, name = "Triple", module = "pyoxigraph")] +#[pyclass(frozen, sequence, name = "Triple", module = "pyoxigraph")] #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct PyTriple { inner: Triple, @@ -742,7 +733,7 @@ impl PyTriple { } /// :rtype: Triple - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -808,7 +799,7 @@ impl IntoPy<PyObject> for PyGraphName { /// :param graph_name: the quad graph name. If not present, the default graph is assumed. /// :type graph_name: NamedNode or BlankNode or DefaultGraph or None, optional /// -/// The :py:func:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: +/// The :py:class:`str` function provides a serialization compatible with NTriples, Turtle, and SPARQL: /// /// >>> str(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) /// '<http://example.com> <http://example.com/p> "1" <http://example.com/g>' @@ -819,7 +810,7 @@ impl IntoPy<PyObject> for PyGraphName { /// A quad could also be easily destructed into its components: /// /// >>> (s, p, o, g) = Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g')) -#[pyclass(frozen, name = "Quad", module = "pyoxigraph")] +#[pyclass(frozen, sequence, name = "Quad", module = "pyoxigraph")] #[derive(Eq, PartialEq, Debug, Clone, Hash)] pub struct PyQuad { inner: Quad, @@ -979,7 +970,7 @@ impl PyQuad { } /// :rtype: Quad - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -1002,7 +993,7 @@ impl PyQuad { /// :type value: str /// :raises ValueError: if the variable name is invalid according to the SPARQL grammar. /// -/// The :py:func:`str` function provides a serialization compatible with SPARQL: +/// The :py:class:`str` function provides a serialization compatible with SPARQL: /// /// >>> str(Variable('foo')) /// '?foo' @@ -1071,7 +1062,7 @@ impl PyVariable { } /// :rtype: Variable - fn __copy__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -1100,7 +1091,7 @@ impl<'a> TryFrom<&'a PyAny> for PyNamedNodeRef<'a> { type Error = PyErr; fn try_from(value: &'a PyAny) -> PyResult<Self> { - if let Ok(node) = value.extract::<PyRef<PyNamedNode>>() { + if let Ok(node) = value.extract::<PyRef<'_, PyNamedNode>>() { Ok(Self(node)) } else { Err(PyTypeError::new_err(format!( @@ -1129,9 +1120,9 @@ impl<'a> TryFrom<&'a PyAny> for PyNamedOrBlankNodeRef<'a> { type Error = PyErr; fn try_from(value: &'a PyAny) -> PyResult<Self> { - if let Ok(node) = value.extract::<PyRef<PyNamedNode>>() { + if let Ok(node) = value.extract::<PyRef<'_, PyNamedNode>>() { Ok(Self::NamedNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyBlankNode>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyBlankNode>>() { Ok(Self::BlankNode(node)) } else { Err(PyTypeError::new_err(format!( @@ -1162,11 +1153,11 @@ impl<'a> TryFrom<&'a PyAny> for PySubjectRef<'a> { type Error = PyErr; fn try_from(value: &'a PyAny) -> PyResult<Self> { - if let Ok(node) = value.extract::<PyRef<PyNamedNode>>() { + if let Ok(node) = value.extract::<PyRef<'_, PyNamedNode>>() { Ok(Self::NamedNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyBlankNode>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyBlankNode>>() { Ok(Self::BlankNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyTriple>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyTriple>>() { Ok(Self::Triple(node)) } else { Err(PyTypeError::new_err(format!( @@ -1205,13 +1196,13 @@ impl<'a> TryFrom<&'a PyAny> for PyTermRef<'a> { type Error = PyErr; fn try_from(value: &'a PyAny) -> PyResult<Self> { - if let Ok(node) = value.extract::<PyRef<PyNamedNode>>() { + if let Ok(node) = value.extract::<PyRef<'_, PyNamedNode>>() { Ok(Self::NamedNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyBlankNode>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyBlankNode>>() { Ok(Self::BlankNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyLiteral>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyLiteral>>() { Ok(Self::Literal(node)) - } else if let Ok(node) = value.extract::<PyRef<PyTriple>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyTriple>>() { Ok(Self::Triple(node)) } else { Err(PyTypeError::new_err(format!( @@ -1248,11 +1239,11 @@ impl<'a> TryFrom<&'a PyAny> for PyGraphNameRef<'a> { type Error = PyErr; fn try_from(value: &'a PyAny) -> PyResult<Self> { - if let Ok(node) = value.extract::<PyRef<PyNamedNode>>() { + if let Ok(node) = value.extract::<PyRef<'_, PyNamedNode>>() { Ok(Self::NamedNode(node)) - } else if let Ok(node) = value.extract::<PyRef<PyBlankNode>>() { + } else if let Ok(node) = value.extract::<PyRef<'_, PyBlankNode>>() { Ok(Self::BlankNode(node)) - } else if value.extract::<PyRef<PyDefaultGraph>>().is_ok() { + } else if value.extract::<PyRef<'_, PyDefaultGraph>>().is_ok() { Ok(Self::DefaultGraph) } else { Err(PyTypeError::new_err(format!( @@ -1283,7 +1274,7 @@ fn eq_compare_other_type(op: CompareOp) -> PyResult<bool> { } } -fn hash(t: &impl Hash) -> u64 { +pub(crate) fn hash(t: &impl Hash) -> u64 { let mut s = DefaultHasher::new(); t.hash(&mut s); s.finish() @@ -1348,7 +1339,7 @@ pub struct TripleComponentsIter { #[pymethods] impl TripleComponentsIter { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -1364,7 +1355,7 @@ pub struct QuadComponentsIter { #[pymethods] impl QuadComponentsIter { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } diff --git a/python/src/sparql.rs b/python/src/sparql.rs index 01298fa6..b1133fa1 100644 --- a/python/src/sparql.rs +++ b/python/src/sparql.rs @@ -1,14 +1,23 @@ -use crate::io::{allow_threads_unsafe, map_io_err, map_parse_error}; -use crate::map_storage_error; +use crate::io::*; use crate::model::*; +use crate::store::map_storage_error; +use oxigraph::io::RdfSerializer; use oxigraph::model::Term; -use oxigraph::sparql::*; -use pyo3::basic::CompareOp; -use pyo3::exceptions::{ - PyNotImplementedError, PyRuntimeError, PySyntaxError, PyTypeError, PyValueError, +use oxigraph::sparql::results::{ + FromReadQueryResultsReader, FromReadSolutionsReader, QueryResultsFormat, + QueryResultsParseError, QueryResultsParser, QueryResultsSerializer, }; - +use oxigraph::sparql::{ + EvaluationError, Query, QueryResults, QuerySolution, QuerySolutionIter, QueryTripleIter, + Variable, +}; +use pyo3::basic::CompareOp; +use pyo3::exceptions::{PyRuntimeError, PySyntaxError, PyValueError}; use pyo3::prelude::*; +use pyo3::types::PyBytes; +use std::ffi::OsStr; +use std::io; +use std::path::{Path, PathBuf}; use std::vec::IntoIter; pub fn parse_query( @@ -17,8 +26,9 @@ pub fn parse_query( use_default_graph_as_union: bool, default_graph: Option<&PyAny>, named_graphs: Option<&PyAny>, + py: Python<'_>, ) -> PyResult<Query> { - let mut query = allow_threads_unsafe(|| Query::parse(query, base_iri)) + let mut query = allow_threads_unsafe(py, || Query::parse(query, base_iri)) .map_err(|e| map_evaluation_error(e.into()))?; if use_default_graph_as_union && default_graph.is_some() { @@ -63,9 +73,12 @@ pub fn parse_query( pub fn query_results_to_python(py: Python<'_>, results: QueryResults) -> PyObject { match results { - QueryResults::Solutions(inner) => PyQuerySolutions { inner }.into_py(py), + QueryResults::Solutions(inner) => PyQuerySolutions { + inner: PyQuerySolutionsVariant::Query(inner), + } + .into_py(py), QueryResults::Graph(inner) => PyQueryTriples { inner }.into_py(py), - QueryResults::Boolean(b) => b.into_py(py), + QueryResults::Boolean(inner) => PyQueryBoolean { inner }.into_py(py), } } @@ -88,7 +101,7 @@ pub fn query_results_to_python(py: Python<'_>, results: QueryResults) -> PyObjec /// >>> s, p, o = solution /// >>> s /// <NamedNode value=http://example.com> -#[pyclass(frozen, unsendable, name = "QuerySolution", module = "pyoxigraph")] +#[pyclass(frozen, name = "QuerySolution", module = "pyoxigraph")] pub struct PyQuerySolution { inner: QuerySolution, } @@ -108,36 +121,25 @@ impl PyQuerySolution { buffer } - fn __richcmp__(&self, other: &Self, op: CompareOp) -> PyResult<bool> { - match op { - CompareOp::Eq => Ok(self.inner == other.inner), - CompareOp::Ne => Ok(self.inner != other.inner), - _ => Err(PyNotImplementedError::new_err( - "Ordering is not implemented", - )), - } + fn __eq__(&self, other: &Self) -> bool { + self.inner == other.inner + } + + fn __ne__(&self, other: &Self) -> bool { + self.inner != other.inner } fn __len__(&self) -> usize { self.inner.len() } - fn __getitem__(&self, input: &PyAny) -> PyResult<Option<PyTerm>> { - if let Ok(key) = usize::extract(input) { - Ok(self.inner.get(key).map(|term| PyTerm::from(term.clone()))) - } else if let Ok(key) = <&str>::extract(input) { - Ok(self.inner.get(key).map(|term| PyTerm::from(term.clone()))) - } else if let Ok(key) = input.extract::<PyRef<PyVariable>>() { - Ok(self - .inner - .get(<&Variable>::from(&*key)) - .map(|term| PyTerm::from(term.clone()))) - } else { - Err(PyTypeError::new_err(format!( - "{} is not an integer of a string", - input.get_type().name()?, - ))) + fn __getitem__(&self, key: PySolutionKey<'_>) -> Option<PyTerm> { + match key { + PySolutionKey::Usize(key) => self.inner.get(key), + PySolutionKey::Str(key) => self.inner.get(key), + PySolutionKey::Variable(key) => self.inner.get(<&Variable>::from(&*key)), } + .map(|term| PyTerm::from(term.clone())) } #[allow(clippy::unnecessary_to_owned)] @@ -148,6 +150,13 @@ impl PyQuerySolution { } } +#[derive(FromPyObject)] +pub enum PySolutionKey<'a> { + Usize(usize), + Str(&'a str), + Variable(PyRef<'a, PyVariable>), +} + #[pyclass(module = "pyoxigraph")] pub struct SolutionValueIter { inner: IntoIter<Option<Term>>, @@ -155,7 +164,7 @@ pub struct SolutionValueIter { #[pymethods] impl SolutionValueIter { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -172,35 +181,195 @@ impl SolutionValueIter { /// [<QuerySolution s=<NamedNode value=http://example.com>>] #[pyclass(unsendable, name = "QuerySolutions", module = "pyoxigraph")] pub struct PyQuerySolutions { - inner: QuerySolutionIter, + inner: PyQuerySolutionsVariant, +} +enum PyQuerySolutionsVariant { + Query(QuerySolutionIter), + Reader { + iter: FromReadSolutionsReader<PyReadable>, + file_path: Option<PathBuf>, + }, } #[pymethods] impl PyQuerySolutions { /// :return: the ordered list of all variables that could appear in the query results - /// :rtype: list(Variable) + /// :rtype: list[Variable] /// /// >>> store = Store() /// >>> store.query('SELECT ?s WHERE { ?s ?p ?o }').variables /// [<Variable value=s>] #[getter] fn variables(&self) -> Vec<PyVariable> { - self.inner - .variables() - .iter() - .map(|v| v.clone().into()) - .collect() + match &self.inner { + PyQuerySolutionsVariant::Query(inner) => { + inner.variables().iter().map(|v| v.clone().into()).collect() + } + PyQuerySolutionsVariant::Reader { iter, .. } => { + iter.variables().iter().map(|v| v.clone().into()).collect() + } + } } - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + /// Writes the query results into a file. + /// + /// It currently supports the following formats: + /// + /// * `XML <https://www.w3.org/TR/rdf-sparql-XMLres/>`_ (:py:attr:`QueryResultsFormat.XML`) + /// * `JSON <https://www.w3.org/TR/sparql11-results-json/>`_ (:py:attr:`QueryResultsFormat.JSON`) + /// * `CSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.CSV`) + /// * `TSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.TSV`) + /// + /// It supports also some media type and extension aliases. + /// For example, ``application/json`` could also be used for `JSON <https://www.w3.org/TR/sparql11-results-json/>`_. + /// + /// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. If :py:const:`None`, a :py:class:`bytes` buffer is returned with the serialized content. + /// :type output: typing.IO[bytes] or str or os.PathLike[str] or None, optional + /// :param format: the format of the query results serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: QueryResultsFormat or None, optional + /// :rtype: bytes or None + /// :raises ValueError: if the format is not supported. + /// :raises OSError: if a system error happens while writing the file. + /// + /// >>> store = Store() + /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) + /// >>> results = store.query("SELECT ?s ?p ?o WHERE { ?s ?p ?o }") + /// >>> results.serialize(format=QueryResultsFormat.JSON) + /// b'{"head":{"vars":["s","p","o"]},"results":{"bindings":[{"s":{"type":"uri","value":"http://example.com"},"p":{"type":"uri","value":"http://example.com/p"},"o":{"type":"literal","value":"1"}}]}}' + #[pyo3(signature = (output = None, format = None))] + fn serialize<'a>( + &mut self, + output: Option<PyWritableOutput>, + format: Option<PyQueryResultsFormatInput>, + py: Python<'a>, + ) -> PyResult<Option<&'a PyBytes>> { + PyWritable::do_write( + |output, file_path| { + let format = lookup_query_results_format(format, file_path.as_deref())?; + let mut writer = QueryResultsSerializer::from_format(format) + .serialize_solutions_to_write( + output, + match &self.inner { + PyQuerySolutionsVariant::Query(inner) => inner.variables().to_vec(), + PyQuerySolutionsVariant::Reader { iter, .. } => { + iter.variables().to_vec() + } + }, + )?; + match &mut self.inner { + PyQuerySolutionsVariant::Query(inner) => { + for solution in inner { + writer.write(&solution.map_err(map_evaluation_error)?)?; + } + } + PyQuerySolutionsVariant::Reader { iter, file_path } => { + for solution in iter { + writer.write(&solution.map_err(|e| { + map_query_results_parse_error(e, file_path.clone()) + })?)?; + } + } + } + + Ok(writer.finish()?) + }, + output, + py, + ) + } + + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } - fn __next__(&mut self) -> PyResult<Option<PyQuerySolution>> { - Ok(allow_threads_unsafe(|| self.inner.next()) - .transpose() - .map_err(map_evaluation_error)? - .map(move |inner| PyQuerySolution { inner })) + fn __next__(&mut self, py: Python<'_>) -> PyResult<Option<PyQuerySolution>> { + Ok(match &mut self.inner { + PyQuerySolutionsVariant::Query(inner) => allow_threads_unsafe(py, || { + inner.next().transpose().map_err(map_evaluation_error) + }), + PyQuerySolutionsVariant::Reader { iter, file_path } => iter + .next() + .transpose() + .map_err(|e| map_query_results_parse_error(e, file_path.clone())), + }? + .map(move |inner| PyQuerySolution { inner })) + } +} + +/// A boolean returned by a SPARQL ``ASK`` query. +/// +/// It can be easily casted to a regular boolean using the :py:func:`bool` function. +/// +/// >>> store = Store() +/// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) +/// >>> bool(store.query('ASK { ?s ?p ?o }')) +/// True +#[pyclass(unsendable, name = "QueryBoolean", module = "pyoxigraph")] +pub struct PyQueryBoolean { + inner: bool, +} + +#[pymethods] +impl PyQueryBoolean { + /// Writes the query results into a file. + /// + /// It currently supports the following formats: + /// + /// * `XML <https://www.w3.org/TR/rdf-sparql-XMLres/>`_ (:py:attr:`QueryResultsFormat.XML`) + /// * `JSON <https://www.w3.org/TR/sparql11-results-json/>`_ (:py:attr:`QueryResultsFormat.JSON`) + /// * `CSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.CSV`) + /// * `TSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.TSV`) + /// + /// It supports also some media type and extension aliases. + /// For example, ``application/json`` could also be used for `JSON <https://www.w3.org/TR/sparql11-results-json/>`_. + /// + /// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. If :py:const:`None`, a :py:class:`bytes` buffer is returned with the serialized content. + /// :type output: typing.IO[bytes] or str or os.PathLike[str] or None, optional + /// :param format: the format of the query results serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: QueryResultsFormat or None, optional + /// :rtype: bytes or None + /// :raises ValueError: if the format is not supported. + /// :raises OSError: if a system error happens while writing the file. + /// + /// >>> store = Store() + /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) + /// >>> results = store.query("ASK { ?s ?p ?o }") + /// >>> results.serialize(format=QueryResultsFormat.JSON) + /// b'{"head":{},"boolean":true}' + #[pyo3(signature = (output = None, format = None))] + fn serialize<'a>( + &mut self, + output: Option<PyWritableOutput>, + format: Option<PyQueryResultsFormatInput>, + py: Python<'a>, + ) -> PyResult<Option<&'a PyBytes>> { + PyWritable::do_write( + |output, file_path| { + let format = lookup_query_results_format(format, file_path.as_deref())?; + py.allow_threads(|| { + Ok(QueryResultsSerializer::from_format(format) + .serialize_boolean_to_write(output, self.inner)?) + }) + }, + output, + py, + ) + } + + fn __bool__(&self) -> bool { + self.inner + } + + fn __richcmp__(&self, other: &Self, op: CompareOp) -> bool { + op.matches(self.inner.cmp(&other.inner)) + } + + fn __hash__(&self) -> u64 { + self.inner.into() + } + + fn __repr__(&self) -> String { + format!("<QueryBoolean {}>", self.inner) } } @@ -217,25 +386,354 @@ pub struct PyQueryTriples { #[pymethods] impl PyQueryTriples { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + /// Writes the query results into a file. + /// + /// It currently supports the following formats: + /// + /// * `canonical <https://www.w3.org/TR/n-triples/#canonical-ntriples>`_ `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) + /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) + /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) + /// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) + /// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) + /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) + /// + /// It supports also some media type and extension aliases. + /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ + /// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. + /// + /// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. If :py:const:`None`, a :py:class:`bytes` buffer is returned with the serialized content. + /// :type output: typing.IO[bytes] or str or os.PathLike[str] or None, optional + /// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: RdfFormat or None, optional + /// :rtype: bytes or None + /// :raises ValueError: if the format is not supported. + /// :raises OSError: if a system error happens while writing the file. + /// + /// >>> store = Store() + /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) + /// >>> results = store.query("CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o }") + /// >>> results.serialize(format=RdfFormat.N_TRIPLES) + /// b'<http://example.com> <http://example.com/p> "1" .\n' + #[pyo3(signature = (output = None, format = None))] + fn serialize<'a>( + &mut self, + output: Option<PyWritableOutput>, + format: Option<PyRdfFormatInput>, + py: Python<'a>, + ) -> PyResult<Option<&'a PyBytes>> { + PyWritable::do_write( + |output, file_path| { + let format = lookup_rdf_format(format, file_path.as_deref())?; + let mut writer = RdfSerializer::from_format(format).serialize_to_write(output); + for triple in &mut self.inner { + writer.write_triple(&triple.map_err(map_evaluation_error)?)?; + } + Ok(writer.finish()?) + }, + output, + py, + ) + } + + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } - fn __next__(&mut self) -> PyResult<Option<PyTriple>> { - Ok(allow_threads_unsafe(|| self.inner.next()) + fn __next__(&mut self, py: Python<'_>) -> PyResult<Option<PyTriple>> { + Ok(allow_threads_unsafe(py, || self.inner.next()) .transpose() .map_err(map_evaluation_error)? .map(Into::into)) } } +/// Parses SPARQL query results. +/// +/// It currently supports the following formats: +/// +/// * `XML <https://www.w3.org/TR/rdf-sparql-XMLres/>`_ (:py:attr:`QueryResultsFormat.XML`) +/// * `JSON <https://www.w3.org/TR/sparql11-results-json/>`_ (:py:attr:`QueryResultsFormat.JSON`) +/// * `TSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.TSV`) +/// +/// It supports also some media type and extension aliases. +/// For example, ``application/json`` could also be used for `JSON <https://www.w3.org/TR/sparql11-results-json/>`_. +/// +/// :param input: The :py:class:`str`, :py:class:`bytes` or I/O object to read from. For example, it could be the file content as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. +/// :type input: bytes or str or typing.IO[bytes] or typing.IO[str] or None, optional +/// :param format: the format of the query results serialization. If :py:const:`None`, the format is guessed from the file name extension. +/// :type format: QueryResultsFormat or None, optional +/// :param path: The file path to read from. Replaces the ``input`` parameter. +/// :type path: str or os.PathLike[str] or None, optional +/// :return: an iterator of :py:class:`QuerySolution` or a :py:class:`bool`. +/// :rtype: QuerySolutions or QueryBoolean +/// :raises ValueError: if the format is not supported. +/// :raises SyntaxError: if the provided data is invalid. +/// :raises OSError: if a system error happens while reading the file. +/// +/// >>> list(parse_query_results('?s\t?p\t?o\n<http://example.com/s>\t<http://example.com/s>\t1\n', QueryResultsFormat.TSV)) +/// [<QuerySolution s=<NamedNode value=http://example.com/s> p=<NamedNode value=http://example.com/s> o=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#integer>>>] +/// +/// >>> parse_query_results('{"head":{},"boolean":true}', QueryResultsFormat.JSON) +/// <QueryBoolean true> +#[pyfunction] +#[pyo3(signature = (input = None, format = None, *, path = None))] +pub fn parse_query_results( + input: Option<PyReadableInput>, + format: Option<PyQueryResultsFormatInput>, + path: Option<PathBuf>, + py: Python<'_>, +) -> PyResult<PyObject> { + let input = PyReadable::from_args(&path, input, py)?; + let format = lookup_query_results_format(format, path.as_deref())?; + let results = QueryResultsParser::from_format(format) + .parse_read(input) + .map_err(|e| map_query_results_parse_error(e, path.clone()))?; + Ok(match results { + FromReadQueryResultsReader::Solutions(iter) => PyQuerySolutions { + inner: PyQuerySolutionsVariant::Reader { + iter, + file_path: path, + }, + } + .into_py(py), + FromReadQueryResultsReader::Boolean(inner) => PyQueryBoolean { inner }.into_py(py), + }) +} + +/// `SPARQL query <https://www.w3.org/TR/sparql11-query/>`_ results serialization formats. +/// +/// The following formats are supported: +/// * `XML <https://www.w3.org/TR/rdf-sparql-XMLres/>`_ (:py:attr:`QueryResultsFormat.XML`) +/// * `JSON <https://www.w3.org/TR/sparql11-results-json/>`_ (:py:attr:`QueryResultsFormat.JSON`) +/// * `CSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.CSV`) +/// * `TSV <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ (:py:attr:`QueryResultsFormat.TSV`) +#[pyclass(name = "QueryResultsFormat", module = "pyoxigraph")] +#[derive(Clone)] +pub struct PyQueryResultsFormat { + inner: QueryResultsFormat, +} + +#[pymethods] +impl PyQueryResultsFormat { + /// `SPARQL Query Results CSV Format <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ + #[classattr] + const CSV: Self = Self { + inner: QueryResultsFormat::Csv, + }; + /// `SPARQL Query Results JSON Format <https://www.w3.org/TR/sparql11-results-json/>`_ + #[classattr] + const JSON: Self = Self { + inner: QueryResultsFormat::Json, + }; + /// `SPARQL Query Results TSV Format <https://www.w3.org/TR/sparql11-results-csv-tsv/>`_ + #[classattr] + const TSV: Self = Self { + inner: QueryResultsFormat::Tsv, + }; + /// `SPARQL Query Results XML Format <https://www.w3.org/TR/rdf-sparql-XMLres/>`_ + #[classattr] + const XML: Self = Self { + inner: QueryResultsFormat::Xml, + }; + + /// :return: the format canonical IRI according to the `Unique URIs for file formats registry <https://www.w3.org/ns/formats/>`_. + /// :rtype: str + /// + /// >>> QueryResultsFormat.JSON.iri + /// 'http://www.w3.org/ns/formats/SPARQL_Results_JSON' + #[getter] + fn iri(&self) -> &'static str { + self.inner.iri() + } + + /// :return: the format `IANA media type <https://tools.ietf.org/html/rfc2046>`_. + /// :rtype: str + /// + /// >>> QueryResultsFormat.JSON.media_type + /// 'application/sparql-results+json' + #[getter] + fn media_type(&self) -> &'static str { + self.inner.media_type() + } + + /// :return: the format `IANA-registered <https://tools.ietf.org/html/rfc2046>`_ file extension. + /// :rtype: str + /// + /// >>> QueryResultsFormat.JSON.file_extension + /// 'srj' + #[getter] + fn file_extension(&self) -> &'static str { + self.inner.file_extension() + } + + /// :return: the format name. + /// :rtype: str + /// + /// >>> QueryResultsFormat.JSON.name + /// 'SPARQL Results in JSON' + #[getter] + pub const fn name(&self) -> &'static str { + self.inner.name() + } + + /// Looks for a known format from a media type. + /// + /// It supports some media type aliases. + /// For example, "application/xml" is going to return :py:const:`QueryResultsFormat.XML` even if it is not its canonical media type. + /// + /// :param media_type: the media type. + /// :type media_type: str + /// :return: :py:class:`QueryResultsFormat` if the media type is known or :py:const:`None` if not. + /// :rtype: QueryResultsFormat or None + /// + /// >>> QueryResultsFormat.from_media_type("application/sparql-results+json; charset=utf-8") + /// <QueryResultsFormat SPARQL Results in JSON> + #[staticmethod] + fn from_media_type(media_type: &str) -> Option<Self> { + Some(Self { + inner: QueryResultsFormat::from_media_type(media_type)?, + }) + } + + /// Looks for a known format from an extension. + /// + /// It supports some aliases. + /// + /// :param extension: the extension. + /// :type extension: str + /// :return: :py:class:`QueryResultsFormat` if the extension is known or :py:const:`None` if not. + /// :rtype: QueryResultsFormat or None + /// + /// >>> QueryResultsFormat.from_extension("json") + /// <QueryResultsFormat SPARQL Results in JSON> + #[staticmethod] + fn from_extension(extension: &str) -> Option<Self> { + Some(Self { + inner: QueryResultsFormat::from_extension(extension)?, + }) + } + + fn __str__(&self) -> &'static str { + self.inner.name() + } + + fn __repr__(&self) -> String { + format!("<QueryResultsFormat {}>", self.inner.name()) + } + + fn __hash__(&self) -> u64 { + hash(&self.inner) + } + + fn __eq__(&self, other: &Self) -> bool { + self.inner == other.inner + } + + fn __ne__(&self, other: &Self) -> bool { + self.inner != other.inner + } + + /// :rtype: QueryResultsFormat + fn __copy__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { + slf + } + + /// :type memo: typing.Any + /// :rtype: QueryResultsFormat + #[allow(unused_variables)] + fn __deepcopy__<'a>(slf: PyRef<'a, Self>, memo: &'_ PyAny) -> PyRef<'a, Self> { + slf + } +} + +pub fn lookup_query_results_format( + format: Option<PyQueryResultsFormatInput>, + path: Option<&Path>, +) -> PyResult<QueryResultsFormat> { + if let Some(format) = format { + return match format { + PyQueryResultsFormatInput::Object(format) => Ok(format.inner), + PyQueryResultsFormatInput::MediaType(media_type) => { + deprecation_warning("Using a string to specify a query results format is deprecated, please use a QueryResultsFormat object instead.")?; + QueryResultsFormat::from_media_type(&media_type).ok_or_else(|| { + PyValueError::new_err(format!( + "The media type {media_type} is not supported by pyoxigraph" + )) + }) + } + }; + } + let Some(path) = path else { + return Err(PyValueError::new_err( + "The format parameter is required when a file path is not given", + )); + }; + let Some(ext) = path.extension().and_then(OsStr::to_str) else { + return Err(PyValueError::new_err(format!( + "The file name {} has no extension to guess a file format from", + path.display() + ))); + }; + QueryResultsFormat::from_extension(ext) + .ok_or_else(|| PyValueError::new_err(format!("Not supported RDF format extension: {ext}"))) +} + +#[derive(FromPyObject)] +pub enum PyQueryResultsFormatInput { + Object(PyQueryResultsFormat), + MediaType(String), +} + pub fn map_evaluation_error(error: EvaluationError) -> PyErr { match error { EvaluationError::Parsing(error) => PySyntaxError::new_err(error.to_string()), EvaluationError::Storage(error) => map_storage_error(error), - EvaluationError::Io(error) => map_io_err(error), - EvaluationError::GraphParsing(error) => map_parse_error(error), - EvaluationError::Query(error) => PyValueError::new_err(error.to_string()), + EvaluationError::GraphParsing(error) => map_parse_error(error, None), + EvaluationError::ResultsParsing(error) => map_query_results_parse_error(error, None), + EvaluationError::ResultsSerialization(error) => error.into(), + EvaluationError::Service(error) => match error.downcast::<io::Error>() { + Ok(error) => (*error).into(), + Err(error) => PyRuntimeError::new_err(error.to_string()), + }, _ => PyRuntimeError::new_err(error.to_string()), } } + +pub fn map_query_results_parse_error( + error: QueryResultsParseError, + file_path: Option<PathBuf>, +) -> PyErr { + match error { + QueryResultsParseError::Syntax(error) => { + // Python 3.9 does not support end line and end column + if python_version() >= (3, 10) { + let params = if let Some(location) = error.location() { + ( + file_path, + Some(location.start.line + 1), + Some(location.start.column + 1), + None::<Vec<u8>>, + Some(location.end.line + 1), + Some(location.end.column + 1), + ) + } else { + (None, None, None, None, None, None) + }; + PySyntaxError::new_err((error.to_string(), params)) + } else { + let params = if let Some(location) = error.location() { + ( + file_path, + Some(location.start.line + 1), + Some(location.start.column + 1), + None::<Vec<u8>>, + ) + } else { + (None, None, None, None) + }; + PySyntaxError::new_err((error.to_string(), params)) + } + } + QueryResultsParseError::Io(error) => error.into(), + } +} diff --git a/python/src/store.rs b/python/src/store.rs index 957c1b5c..cbb4f975 100644 --- a/python/src/store.rs +++ b/python/src/store.rs @@ -1,14 +1,18 @@ #![allow(clippy::needless_option_as_deref)] -use crate::io::{allow_threads_unsafe, map_io_err, map_parse_error, PyReadable, PyWritable}; +use crate::io::{ + allow_threads_unsafe, lookup_rdf_format, map_parse_error, PyRdfFormatInput, PyReadable, + PyReadableInput, PyWritable, PyWritableOutput, +}; use crate::model::*; use crate::sparql::*; -use oxigraph::io::{DatasetFormat, GraphFormat}; +use oxigraph::io::RdfParser; use oxigraph::model::{GraphName, GraphNameRef}; use oxigraph::sparql::Update; use oxigraph::store::{self, LoaderError, SerializerError, StorageError, Store}; -use pyo3::exceptions::{PyIOError, PyRuntimeError, PyValueError}; +use pyo3::exceptions::{PyRuntimeError, PyValueError}; use pyo3::prelude::*; +use pyo3::types::PyBytes; use std::path::PathBuf; /// RDF store. @@ -27,10 +31,10 @@ use std::path::PathBuf; /// :param path: the path of the directory in which the store should read and write its data. If the directory does not exist, it is created. /// If no directory is provided a temporary one is created and removed when the Python garbage collector removes the store. /// In this case, the store data are kept in memory and never written on disk. -/// :type path: str or pathlib.Path or None, optional -/// :raises IOError: if the target directory contains invalid data or could not be accessed. +/// :type path: str or os.PathLike[str] or None, optional +/// :raises OSError: if the target directory contains invalid data or could not be accessed. /// -/// The :py:func:`str` function provides a serialization of the store in NQuads: +/// The :py:class:`str` function provides a serialization of the store in NQuads: /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -44,6 +48,7 @@ pub struct PyStore { #[pymethods] impl PyStore { + #[cfg(not(target_family = "wasm"))] #[new] #[pyo3(signature = (path = None))] fn new(path: Option<PathBuf>, py: Python<'_>) -> PyResult<Self> { @@ -59,6 +64,16 @@ impl PyStore { }) } + #[cfg(target_family = "wasm")] + #[new] + fn new(py: Python<'_>) -> PyResult<Self> { + py.allow_threads(|| { + Ok(Self { + inner: Store::new().map_err(map_storage_error)?, + }) + }) + } + /// Opens a read-only store from disk. /// /// Opening as read-only while having an other process writing the database is undefined behavior. @@ -68,7 +83,8 @@ impl PyStore { /// :type path: str /// :return: the opened store. /// :rtype: Store - /// :raises IOError: if the target directory contains invalid data or could not be accessed. + /// :raises OSError: if the target directory contains invalid data or could not be accessed. + #[cfg(not(target_family = "wasm"))] #[staticmethod] fn read_only(path: &str, py: Python<'_>) -> PyResult<Self> { py.allow_threads(|| { @@ -92,7 +108,8 @@ impl PyStore { /// :type secondary_path: str or None, optional /// :return: the opened store. /// :rtype: Store - /// :raises IOError: if the target directories contain invalid data or could not be accessed. + /// :raises OSError: if the target directories contain invalid data or could not be accessed. + #[cfg(not(target_family = "wasm"))] #[staticmethod] #[pyo3(signature = (primary_path, secondary_path = None))] fn secondary( @@ -117,7 +134,7 @@ impl PyStore { /// :param quad: the quad to add. /// :type quad: Quad /// :rtype: None - /// :raises IOError: if an I/O error happens during the quad insertion. + /// :raises OSError: if an error happens during the quad insertion. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -136,9 +153,9 @@ impl PyStore { /// The :py:func:`bulk_extend` method is also available for much faster loading of a large number of quads but without transactional guarantees. /// /// :param quads: the quads to add. - /// :type quads: iterable(Quad) + /// :type quads: collections.abc.Iterable[Quad] /// :rtype: None - /// :raises IOError: if an I/O error happens during the quad insertion. + /// :raises OSError: if an error happens during the quad insertion. /// /// >>> store = Store() /// >>> store.extend([Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))]) @@ -161,14 +178,15 @@ impl PyStore { /// Only a part of the data might be written to the store. /// /// :param quads: the quads to add. - /// :type quads: iterable(Quad) + /// :type quads: collections.abc.Iterable[Quad] /// :rtype: None - /// :raises IOError: if an I/O error happens during the quad insertion. + /// :raises OSError: if an error happens during the quad insertion. /// /// >>> store = Store() /// >>> store.bulk_extend([Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))]) /// >>> list(store) /// [<Quad subject=<NamedNode value=http://example.com> predicate=<NamedNode value=http://example.com/p> object=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#string>> graph_name=<NamedNode value=http://example.com/g>>] + #[cfg(not(target_family = "wasm"))] fn bulk_extend(&self, quads: &PyAny) -> PyResult<()> { self.inner .bulk_loader() @@ -183,7 +201,7 @@ impl PyStore { /// :param quad: the quad to remove. /// :type quad: Quad /// :rtype: None - /// :raises IOError: if an I/O error happens during the quad removal. + /// :raises OSError: if an error happens during the quad removal. /// /// >>> store = Store() /// >>> quad = Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g')) @@ -209,8 +227,8 @@ impl PyStore { /// :param graph_name: the quad graph name. To match only the default graph, use :py:class:`DefaultGraph`. To match everything use :py:const:`None`. /// :type graph_name: NamedNode or BlankNode or DefaultGraph or None, optional /// :return: an iterator of the quads matching the pattern. - /// :rtype: iterator(Quad) - /// :raises IOError: if an I/O error happens during the quads lookup. + /// :rtype: collections.abc.Iterator[Quad] + /// :raises OSError: if an error happens during the quads lookup. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -245,13 +263,13 @@ impl PyStore { /// :param use_default_graph_as_union: if the SPARQL query should look for triples in all the dataset graphs by default (i.e. without `GRAPH` operations). Disabled by default. /// :type use_default_graph_as_union: bool, optional /// :param default_graph: list of the graphs that should be used as the query default graph. By default, the store default graph is used. - /// :type default_graph: NamedNode or BlankNode or DefaultGraph or list(NamedNode or BlankNode or DefaultGraph) or None, optional + /// :type default_graph: NamedNode or BlankNode or DefaultGraph or list[NamedNode or BlankNode or DefaultGraph] or None, optional /// :param named_graphs: list of the named graphs that could be used in SPARQL `GRAPH` clause. By default, all the store named graphs are available. - /// :type named_graphs: list(NamedNode or BlankNode) or None, optional + /// :type named_graphs: list[NamedNode or BlankNode] or None, optional /// :return: a :py:class:`bool` for ``ASK`` queries, an iterator of :py:class:`Triple` for ``CONSTRUCT`` and ``DESCRIBE`` queries and an iterator of :py:class:`QuerySolution` for ``SELECT`` queries. - /// :rtype: QuerySolutions or QueryTriples or bool + /// :rtype: QuerySolutions or QueryBoolean or QueryTriples /// :raises SyntaxError: if the provided query is invalid. - /// :raises IOError: if an I/O error happens while reading the store. + /// :raises OSError: if an error happens while reading the store. /// /// ``SELECT`` query: /// @@ -271,7 +289,7 @@ impl PyStore { /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) - /// >>> store.query('ASK { ?s ?p ?o }') + /// >>> bool(store.query('ASK { ?s ?p ?o }')) /// True #[pyo3(signature = (query, *, base_iri = None, use_default_graph_as_union = false, default_graph = None, named_graphs = None))] fn query( @@ -289,9 +307,10 @@ impl PyStore { use_default_graph_as_union, default_graph, named_graphs, + py, )?; let results = - allow_threads_unsafe(|| self.inner.query(query)).map_err(map_evaluation_error)?; + allow_threads_unsafe(py, || self.inner.query(query)).map_err(map_evaluation_error)?; Ok(query_results_to_python(py, results)) } @@ -305,7 +324,7 @@ impl PyStore { /// :type base_iri: str or None, optional /// :rtype: None /// :raises SyntaxError: if the provided update is invalid. - /// :raises IOError: if an I/O error happens while reading the store. + /// :raises OSError: if an error happens while reading the store. /// /// ``INSERT DATA`` update: /// @@ -347,38 +366,42 @@ impl PyStore { /// /// It currently supports the following formats: /// - /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (``application/n-triples``) - /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (``application/n-quads``) - /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (``text/turtle``) - /// * `TriG <https://www.w3.org/TR/trig/>`_ (``application/trig``) - /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (``application/rdf+xml``) + /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) + /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) + /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) + /// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) + /// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) + /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) /// - /// It supports also some MIME type aliases. + /// It supports also some media type and extension aliases. /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ - /// and ``application/xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. - /// - /// :param input: The binary I/O object or file path to read from. For example, it could be a file path as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. - /// :type input: io(bytes) or io(str) or str or pathlib.Path - /// :param mime_type: the MIME type of the RDF serialization. - /// :type mime_type: str + /// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. + /// + /// :param input: The :py:class:`str`, :py:class:`bytes` or I/O object to read from. For example, it could be the file content as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. + /// :type input: bytes or str or typing.IO[bytes] or typing.IO[str] or None, optional + /// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: RdfFormat or None, optional + /// :param path: The file path to read from. Replaces the ``input`` parameter. + /// :type path: str or os.PathLike[str] or None, optional /// :param base_iri: the base IRI used to resolve the relative IRIs in the file or :py:const:`None` if relative IRI resolution should not be done. /// :type base_iri: str or None, optional /// :param to_graph: if it is a file composed of triples, the graph in which the triples should be stored. By default, the default graph is used. /// :type to_graph: NamedNode or BlankNode or DefaultGraph or None, optional /// :rtype: None - /// :raises ValueError: if the MIME type is not supported or the `to_graph` parameter is given with a quad file. + /// :raises ValueError: if the format is not supported. /// :raises SyntaxError: if the provided data is invalid. - /// :raises IOError: if an I/O error happens during a quad insertion. + /// :raises OSError: if an error happens during a quad insertion or if a system error happens while reading the file. /// /// >>> store = Store() - /// >>> store.load(io.BytesIO(b'<foo> <p> "1" .'), "text/turtle", base_iri="http://example.com/", to_graph=NamedNode("http://example.com/g")) + /// >>> store.load(input='<foo> <p> "1" .', format=RdfFormat.TURTLE, base_iri="http://example.com/", to_graph=NamedNode("http://example.com/g")) /// >>> list(store) /// [<Quad subject=<NamedNode value=http://example.com/foo> predicate=<NamedNode value=http://example.com/p> object=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#string>> graph_name=<NamedNode value=http://example.com/g>>] - #[pyo3(signature = (input, mime_type, *, base_iri = None, to_graph = None))] + #[pyo3(signature = (input = None, format = None, *, path = None, base_iri = None, to_graph = None))] fn load( &self, - input: PyObject, - mime_type: &str, + input: Option<PyReadableInput>, + format: Option<PyRdfFormatInput>, + path: Option<PathBuf>, base_iri: Option<&str>, to_graph: Option<&PyAny>, py: Python<'_>, @@ -388,35 +411,21 @@ impl PyStore { } else { None }; - let input = if let Ok(path) = input.extract::<PathBuf>(py) { - PyReadable::from_file(&path, py).map_err(map_io_err)? - } else { - PyReadable::from_data(input, py) - }; + let input = PyReadable::from_args(&path, input, py)?; + let format = lookup_rdf_format(format, path.as_deref())?; py.allow_threads(|| { - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - self.inner - .load_graph( - input, - graph_format, - to_graph_name.as_ref().unwrap_or(&GraphName::DefaultGraph), - base_iri, - ) - .map_err(map_loader_error) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - if to_graph_name.is_some() { - return Err(PyValueError::new_err( - "The target graph name parameter is not available for dataset formats", - )); - } - self.inner - .load_dataset(input, dataset_format, base_iri) - .map_err(map_loader_error) - } else { - Err(PyValueError::new_err(format!( - "Not supported MIME type: {mime_type}" - ))) + let mut parser = RdfParser::from_format(format); + if let Some(base_iri) = base_iri { + parser = parser + .with_base_iri(base_iri) + .map_err(|e| PyValueError::new_err(e.to_string()))?; } + if let Some(to_graph_name) = to_graph_name { + parser = parser.with_default_graph(to_graph_name); + } + self.inner + .load_from_read(parser, input) + .map_err(|e| map_loader_error(e, path)) }) } @@ -429,38 +438,42 @@ impl PyStore { /// /// It currently supports the following formats: /// - /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (``application/n-triples``) - /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (``application/n-quads``) - /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (``text/turtle``) - /// * `TriG <https://www.w3.org/TR/trig/>`_ (``application/trig``) - /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (``application/rdf+xml``) + /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) + /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) + /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) + /// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) + /// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) + /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) /// - /// It supports also some MIME type aliases. + /// It supports also some media type and extension aliases. /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ - /// and ``application/xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. - /// - /// :param input: The binary I/O object or file path to read from. For example, it could be a file path as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. - /// :type input: io(bytes) or io(str) or str or pathlib.Path - /// :param mime_type: the MIME type of the RDF serialization. - /// :type mime_type: str + /// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. + /// + /// :param input: The :py:class:`str`, :py:class:`bytes` or I/O object to read from. For example, it could be the file content as a string or a file reader opened in binary mode with ``open('my_file.ttl', 'rb')``. + /// :type input: bytes or str or typing.IO[bytes] or typing.IO[str] or None, optional + /// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: str or None, optional + /// :param path: The file path to read from. Replaces the ``input`` parameter. + /// :type path: str or os.PathLike[str] or None, optional /// :param base_iri: the base IRI used to resolve the relative IRIs in the file or :py:const:`None` if relative IRI resolution should not be done. /// :type base_iri: str or None, optional /// :param to_graph: if it is a file composed of triples, the graph in which the triples should be stored. By default, the default graph is used. /// :type to_graph: NamedNode or BlankNode or DefaultGraph or None, optional /// :rtype: None - /// :raises ValueError: if the MIME type is not supported or the `to_graph` parameter is given with a quad file. + /// :raises ValueError: if the format is not supported. /// :raises SyntaxError: if the provided data is invalid. - /// :raises IOError: if an I/O error happens during a quad insertion. + /// :raises OSError: if an error happens during a quad insertion or if a system error happens while reading the file. /// /// >>> store = Store() - /// >>> store.bulk_load(io.BytesIO(b'<foo> <p> "1" .'), "text/turtle", base_iri="http://example.com/", to_graph=NamedNode("http://example.com/g")) + /// >>> store.bulk_load(input=b'<foo> <p> "1" .', format=RdfFormat.TURTLE, base_iri="http://example.com/", to_graph=NamedNode("http://example.com/g")) /// >>> list(store) /// [<Quad subject=<NamedNode value=http://example.com/foo> predicate=<NamedNode value=http://example.com/p> object=<Literal value=1 datatype=<NamedNode value=http://www.w3.org/2001/XMLSchema#string>> graph_name=<NamedNode value=http://example.com/g>>] - #[pyo3(signature = (input, mime_type, *, base_iri = None, to_graph = None))] + #[pyo3(signature = (input = None, format = None, *, path = None, base_iri = None, to_graph = None))] fn bulk_load( &self, - input: PyObject, - mime_type: &str, + input: Option<PyReadableInput>, + format: Option<PyRdfFormatInput>, + path: Option<PathBuf>, base_iri: Option<&str>, to_graph: Option<&PyAny>, py: Python<'_>, @@ -470,37 +483,21 @@ impl PyStore { } else { None }; - let input = if let Ok(path) = input.extract::<PathBuf>(py) { - PyReadable::from_file(&path, py).map_err(map_io_err)? - } else { - PyReadable::from_data(input, py) - }; + let input = PyReadable::from_args(&path, input, py)?; + let format = lookup_rdf_format(format, path.as_deref())?; py.allow_threads(|| { - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - self.inner - .bulk_loader() - .load_graph( - input, - graph_format, - &to_graph_name.unwrap_or(GraphName::DefaultGraph), - base_iri, - ) - .map_err(map_loader_error) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - if to_graph_name.is_some() { - return Err(PyValueError::new_err( - "The target graph name parameter is not available for dataset formats", - )); - } - self.inner - .bulk_loader() - .load_dataset(input, dataset_format, base_iri) - .map_err(map_loader_error) - } else { - Err(PyValueError::new_err(format!( - "Not supported MIME type: {mime_type}" - ))) + let mut parser = RdfParser::from_format(format); + if let Some(base_iri) = base_iri { + parser = parser + .with_base_iri(base_iri) + .map_err(|e| PyValueError::new_err(e.to_string()))?; + } + if let Some(to_graph_name) = to_graph_name { + parser = parser.with_default_graph(to_graph_name); } + self.inner + .load_from_read(parser, input) + .map_err(|e| map_loader_error(e, path)) }) } @@ -508,81 +505,76 @@ impl PyStore { /// /// It currently supports the following formats: /// - /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (``application/n-triples``) - /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (``application/n-quads``) - /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (``text/turtle``) - /// * `TriG <https://www.w3.org/TR/trig/>`_ (``application/trig``) - /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (``application/rdf+xml``) + /// * `N-Triples <https://www.w3.org/TR/n-triples/>`_ (:py:attr:`RdfFormat.N_TRIPLES`) + /// * `N-Quads <https://www.w3.org/TR/n-quads/>`_ (:py:attr:`RdfFormat.N_QUADS`) + /// * `Turtle <https://www.w3.org/TR/turtle/>`_ (:py:attr:`RdfFormat.TURTLE`) + /// * `TriG <https://www.w3.org/TR/trig/>`_ (:py:attr:`RdfFormat.TRIG`) + /// * `N3 <https://w3c.github.io/N3/spec/>`_ (:py:attr:`RdfFormat.N3`) + /// * `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_ (:py:attr:`RdfFormat.RDF_XML`) /// - /// It supports also some MIME type aliases. + /// It supports also some media type and extension aliases. /// For example, ``application/turtle`` could also be used for `Turtle <https://www.w3.org/TR/turtle/>`_ - /// and ``application/xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. + /// and ``application/xml`` or ``xml`` for `RDF/XML <https://www.w3.org/TR/rdf-syntax-grammar/>`_. /// - /// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. - /// :type output: io(bytes) or str or pathlib.Path - /// :param mime_type: the MIME type of the RDF serialization. - /// :type mime_type: str - /// :param from_graph: if a triple based format is requested, the store graph from which dump the triples. By default, the default graph is used. + /// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``. If :py:const:`None`, a :py:class:`bytes` buffer is returned with the serialized content. + /// :type output: typing.IO[bytes] or str or os.PathLike[str] or None, optional + /// :param format: the format of the RDF serialization. If :py:const:`None`, the format is guessed from the file name extension. + /// :type format: RdfFormat or None, optional + /// :param from_graph: the store graph from which dump the triples. Required if the serialization format does not support named graphs. If it does supports named graphs the full dataset is written. /// :type from_graph: NamedNode or BlankNode or DefaultGraph or None, optional - /// :rtype: None - /// :raises ValueError: if the MIME type is not supported or the `from_graph` parameter is given with a quad syntax. - /// :raises IOError: if an I/O error happens during a quad lookup + /// :return: :py:class:`bytes` with the serialization if the ``output`` parameter is :py:const:`None`, :py:const:`None` if ``output`` is set. + /// :rtype: bytes or None + /// :raises ValueError: if the format is not supported or the `from_graph` parameter is not given with a syntax not supporting named graphs. + /// :raises OSError: if an error happens during a quad lookup or file writing. /// /// >>> store = Store() + /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))) + /// >>> store.dump(format=RdfFormat.TRIG) + /// b'<http://example.com> <http://example.com/p> "1" .\n' + /// + /// >>> import io + /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) /// >>> output = io.BytesIO() - /// >>> store.dump(output, "text/turtle", from_graph=NamedNode("http://example.com/g")) + /// >>> store.dump(output, RdfFormat.TURTLE, from_graph=NamedNode("http://example.com/g")) /// >>> output.getvalue() /// b'<http://example.com> <http://example.com/p> "1" .\n' - #[pyo3(signature = (output, mime_type, *, from_graph = None))] - fn dump( + #[pyo3(signature = (output = None, format = None, *, from_graph = None))] + fn dump<'a>( &self, - output: PyObject, - mime_type: &str, + output: Option<PyWritableOutput>, + format: Option<PyRdfFormatInput>, from_graph: Option<&PyAny>, - py: Python<'_>, - ) -> PyResult<()> { - let output = if let Ok(path) = output.extract::<PathBuf>(py) { - PyWritable::from_file(&path, py).map_err(map_io_err)? - } else { - PyWritable::from_data(output) - }; + py: Python<'a>, + ) -> PyResult<Option<&'a PyBytes>> { let from_graph_name = if let Some(graph_name) = from_graph { Some(GraphName::from(&PyGraphNameRef::try_from(graph_name)?)) } else { None }; - py.allow_threads(|| { - if let Some(graph_format) = GraphFormat::from_media_type(mime_type) { - self.inner - .dump_graph( - output, - graph_format, - &from_graph_name.unwrap_or(GraphName::DefaultGraph), - ) + PyWritable::do_write( + |output, file_path| { + py.allow_threads(|| { + let format = lookup_rdf_format(format, file_path.as_deref())?; + if let Some(from_graph_name) = &from_graph_name { + self.inner + .dump_graph_to_write(from_graph_name, format, output) + } else { + self.inner.dump_to_write(format, output) + } .map_err(map_serializer_error) - } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) { - if from_graph_name.is_some() { - return Err(PyValueError::new_err( - "The target graph name parameter is not available for dataset formats", - )); - } - self.inner - .dump_dataset(output, dataset_format) - .map_err(map_serializer_error) - } else { - Err(PyValueError::new_err(format!( - "Not supported MIME type: {mime_type}" - ))) - } - }) + }) + }, + output, + py, + ) } /// Returns an iterator over all the store named graphs. /// /// :return: an iterator of the store graph names. - /// :rtype: iterator(NamedNode or BlankNode) - /// :raises IOError: if an I/O error happens during the named graphs lookup. + /// :rtype: collections.abc.Iterator[NamedNode or BlankNode] + /// :raises OSError: if an error happens during the named graphs lookup. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -599,7 +591,7 @@ impl PyStore { /// :param graph_name: the name of the named graph. /// :type graph_name: NamedNode or BlankNode or DefaultGraph /// :rtype: bool - /// :raises IOError: if an I/O error happens during the named graph lookup. + /// :raises OSError: if an error happens during the named graph lookup. /// /// >>> store = Store() /// >>> store.add_graph(NamedNode('http://example.com/g')) @@ -620,7 +612,7 @@ impl PyStore { /// :param graph_name: the name of the name graph to add. /// :type graph_name: NamedNode or BlankNode or DefaultGraph /// :rtype: None - /// :raises IOError: if an I/O error happens during the named graph insertion. + /// :raises OSError: if an error happens during the named graph insertion. /// /// >>> store = Store() /// >>> store.add_graph(NamedNode('http://example.com/g')) @@ -647,7 +639,7 @@ impl PyStore { /// :param graph_name: the name of the name graph to clear. /// :type graph_name: NamedNode or BlankNode or DefaultGraph /// :rtype: None - /// :raises IOError: if an I/O error happens during the operation. + /// :raises OSError: if an error happens during the operation. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -672,7 +664,7 @@ impl PyStore { /// :param graph_name: the name of the name graph to remove. /// :type graph_name: NamedNode or BlankNode or DefaultGraph /// :rtype: None - /// :raises IOError: if an I/O error happens during the named graph removal. + /// :raises OSError: if an error happens during the named graph removal. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -698,7 +690,7 @@ impl PyStore { /// Clears the store by removing all its contents. /// /// :rtype: None - /// :raises IOError: if an I/O error happens during the operation. + /// :raises OSError: if an error happens during the operation. /// /// >>> store = Store() /// >>> store.add(Quad(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'), NamedNode('http://example.com/g'))) @@ -716,7 +708,8 @@ impl PyStore { /// Flushes are automatically done using background threads but might lag a little bit. /// /// :rtype: None - /// :raises IOError: if an I/O error happens during the flush. + /// :raises OSError: if an error happens during the flush. + #[cfg(not(target_family = "wasm"))] fn flush(&self, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| self.inner.flush().map_err(map_storage_error)) } @@ -726,7 +719,8 @@ impl PyStore { /// Useful to call after a batch upload or another similar operation. /// /// :rtype: None - /// :raises IOError: if an I/O error happens during the optimization. + /// :raises OSError: if an error happens during the optimization. + #[cfg(not(target_family = "wasm"))] fn optimize(&self, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| self.inner.optimize().map_err(map_storage_error)) } @@ -749,10 +743,11 @@ impl PyStore { /// If you want to move your data to another RDF storage system, you should have a look at the :py:func:`dump_dataset` function instead. /// /// :param target_directory: the directory name to save the database to. - /// :type target_directory: str + /// :type target_directory: str or os.PathLike[str] /// :rtype: None - /// :raises IOError: if an I/O error happens during the backup. - fn backup(&self, target_directory: &str, py: Python<'_>) -> PyResult<()> { + /// :raises OSError: if an error happens during the backup. + #[cfg(not(target_family = "wasm"))] + fn backup(&self, target_directory: PathBuf, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| { self.inner .backup(target_directory) @@ -790,7 +785,7 @@ pub struct QuadIter { #[pymethods] impl QuadIter { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -809,7 +804,7 @@ pub struct GraphNameIter { #[pymethods] impl GraphNameIter { - fn __iter__(slf: PyRef<'_, Self>) -> PyRef<Self> { + fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> { slf } @@ -862,22 +857,24 @@ pub fn extract_quads_pattern<'a>( pub fn map_storage_error(error: StorageError) -> PyErr { match error { - StorageError::Io(error) => PyIOError::new_err(error.to_string()), + StorageError::Io(error) => error.into(), _ => PyRuntimeError::new_err(error.to_string()), } } -pub fn map_loader_error(error: LoaderError) -> PyErr { +pub fn map_loader_error(error: LoaderError, file_path: Option<PathBuf>) -> PyErr { match error { LoaderError::Storage(error) => map_storage_error(error), - LoaderError::Parsing(error) => map_parse_error(error), + LoaderError::Parsing(error) => map_parse_error(error, file_path), + LoaderError::InvalidBaseIri { .. } => PyValueError::new_err(error.to_string()), } } pub fn map_serializer_error(error: SerializerError) -> PyErr { match error { SerializerError::Storage(error) => map_storage_error(error), - SerializerError::Io(error) => PyIOError::new_err(error.to_string()), + SerializerError::Io(error) => error.into(), + SerializerError::DatasetFormatExpected(_) => PyValueError::new_err(error.to_string()), } } diff --git a/python/tests/test_doc.py b/python/tests/test_doc.py new file mode 100644 index 00000000..c0ba505b --- /dev/null +++ b/python/tests/test_doc.py @@ -0,0 +1,37 @@ +# type: ignore +import inspect +from doctest import DocTestFinder, DocTestSuite + +import pyoxigraph + + +class ExtendedDocTestFinder(DocTestFinder): + """ + More aggressive doctest lookup + """ + + def _find(self, tests, obj, name, module, source_lines, globs, seen): + # If we've already processed this object, then ignore it. + if id(obj) in seen: + return + seen[id(obj)] = 1 + + # Find a test for this object, and add it to the list of tests. + test = self._get_test(obj, name, module, globs, source_lines) + if test is not None: + tests.append(test) + + # Look for tests in a module's contained objects. + if inspect.ismodule(obj) or inspect.isclass(obj): + for valname, val in obj.__dict__.items(): + if valname == "__doc__": + continue + # Special handling for staticmethod/classmethod. + if isinstance(val, (staticmethod, classmethod)): + val = val.__func__ + self._find(tests, val, f"{name}.{valname}", module, source_lines, globs, seen) + + +def load_tests(_loader, tests, _ignore): + tests.addTests(DocTestSuite(pyoxigraph, test_finder=ExtendedDocTestFinder())) + return tests diff --git a/python/tests/test_io.py b/python/tests/test_io.py index e7519f5d..fe137eff 100644 --- a/python/tests/test_io.py +++ b/python/tests/test_io.py @@ -1,10 +1,22 @@ +import sys import unittest from io import BytesIO, StringIO, UnsupportedOperation from tempfile import NamedTemporaryFile, TemporaryFile -from pyoxigraph import Literal, NamedNode, Quad, Triple, parse, serialize +from pyoxigraph import ( + Literal, + NamedNode, + Quad, + QueryBoolean, + QueryResultsFormat, + QuerySolutions, + RdfFormat, + parse, + parse_query_results, + serialize, +) -EXAMPLE_TRIPLE = Triple( +EXAMPLE_TRIPLE = Quad( NamedNode("http://example.com/foo"), NamedNode("http://example.com/p"), Literal("éù"), @@ -19,24 +31,48 @@ EXAMPLE_QUAD = Quad( class TestParse(unittest.TestCase): def test_parse_file(self) -> None: - with NamedTemporaryFile() as fp: + with NamedTemporaryFile(suffix=".ttl") as fp: fp.write('<foo> <p> "éù" .'.encode()) fp.flush() self.assertEqual( - list(parse(fp.name, "text/turtle", base_iri="http://example.com/")), + list(parse(path=fp.name, base_iri="http://example.com/")), [EXAMPLE_TRIPLE], ) def test_parse_not_existing_file(self) -> None: with self.assertRaises(IOError) as _: - parse("/tmp/not-existing-oxigraph-file.ttl", "text/turtle") + parse(path="/tmp/not-existing-oxigraph-file.ttl", format=RdfFormat.TURTLE) + + def test_parse_str(self) -> None: + self.assertEqual( + list( + parse( + '<foo> <p> "éù" .', + RdfFormat.TURTLE, + base_iri="http://example.com/", + ) + ), + [EXAMPLE_TRIPLE], + ) + + def test_parse_bytes(self) -> None: + self.assertEqual( + list( + parse( + '<foo> <p> "éù" .'.encode(), + RdfFormat.TURTLE, + base_iri="http://example.com/", + ) + ), + [EXAMPLE_TRIPLE], + ) def test_parse_str_io(self) -> None: self.assertEqual( list( parse( StringIO('<foo> <p> "éù" .'), - "text/turtle", + RdfFormat.TURTLE, base_iri="http://example.com/", ) ), @@ -48,7 +84,7 @@ class TestParse(unittest.TestCase): list( parse( StringIO('<foo> <p> "éù" .\n' * 1024), - "text/turtle", + RdfFormat.TURTLE, base_iri="http://example.com/", ) ), @@ -60,7 +96,7 @@ class TestParse(unittest.TestCase): list( parse( BytesIO('<foo> <p> "éù" .'.encode()), - "text/turtle", + RdfFormat.TURTLE, base_iri="http://example.com/", ) ), @@ -69,33 +105,82 @@ class TestParse(unittest.TestCase): def test_parse_io_error(self) -> None: with self.assertRaises(UnsupportedOperation) as _, TemporaryFile("wb") as fp: - list(parse(fp, mime_type="application/n-triples")) + list(parse(fp, RdfFormat.N_TRIPLES)) def test_parse_quad(self) -> None: self.assertEqual( list( parse( - StringIO('<g> { <foo> <p> "1" }'), - "application/trig", + '<g> { <foo> <p> "1" }', + RdfFormat.TRIG, base_iri="http://example.com/", ) ), [EXAMPLE_QUAD], ) + def test_parse_syntax_error(self) -> None: + with NamedTemporaryFile() as fp: + fp.write(b"@base <http://example.com/> .\n") + fp.write(b'<foo> "p" "1"') + fp.flush() + with self.assertRaises(SyntaxError) as ctx: + list(parse(path=fp.name, format=RdfFormat.TURTLE)) + self.assertEqual(ctx.exception.filename, fp.name) + self.assertEqual(ctx.exception.lineno, 2) + self.assertEqual(ctx.exception.offset, 7) + if sys.version_info >= (3, 10): + self.assertEqual(ctx.exception.end_lineno, 2) + self.assertEqual(ctx.exception.end_offset, 10) + + def test_parse_without_named_graphs(self) -> None: + with self.assertRaises(SyntaxError) as _: + list( + parse( + '<g> { <foo> <p> "1" }', + RdfFormat.TRIG, + base_iri="http://example.com/", + without_named_graphs=True, + ) + ) + + def test_parse_rename_blank_nodes(self) -> None: + self.assertNotEqual( + list( + parse( + '_:s <http://example.com/p> "o" .', + RdfFormat.N_TRIPLES, + rename_blank_nodes=True, + ) + ), + list( + parse( + '_:s <http://example.com/p> "o" .', + RdfFormat.N_TRIPLES, + rename_blank_nodes=True, + ) + ), + ) + class TestSerialize(unittest.TestCase): + def test_serialize_to_bytes(self) -> None: + self.assertEqual( + (serialize([EXAMPLE_TRIPLE.triple], None, RdfFormat.TURTLE) or b"").decode(), + '<http://example.com/foo> <http://example.com/p> "éù" .\n', + ) + def test_serialize_to_bytes_io(self) -> None: output = BytesIO() - serialize([EXAMPLE_TRIPLE], output, "text/turtle") + serialize([EXAMPLE_TRIPLE.triple], output, RdfFormat.TURTLE) self.assertEqual( output.getvalue().decode(), '<http://example.com/foo> <http://example.com/p> "éù" .\n', ) def test_serialize_to_file(self) -> None: - with NamedTemporaryFile() as fp: - serialize([EXAMPLE_TRIPLE], fp.name, "text/turtle") + with NamedTemporaryFile(suffix=".ttl") as fp: + serialize([EXAMPLE_TRIPLE], fp.name) self.assertEqual( fp.read().decode(), '<http://example.com/foo> <http://example.com/p> "éù" .\n', @@ -103,12 +188,79 @@ class TestSerialize(unittest.TestCase): def test_serialize_io_error(self) -> None: with self.assertRaises(UnsupportedOperation) as _, TemporaryFile("rb") as fp: - serialize([EXAMPLE_TRIPLE], fp, "text/turtle") + serialize([EXAMPLE_TRIPLE], fp, RdfFormat.TURTLE) def test_serialize_quad(self) -> None: output = BytesIO() - serialize([EXAMPLE_QUAD], output, "application/trig") + serialize([EXAMPLE_QUAD], output, RdfFormat.TRIG) self.assertEqual( output.getvalue(), - b'<http://example.com/g> { <http://example.com/foo> <http://example.com/p> "1" }\n', + b'<http://example.com/g> {\n\t<http://example.com/foo> <http://example.com/p> "1" .\n}\n', ) + + +class TestParseQuerySolutions(unittest.TestCase): + def test_parse_file(self) -> None: + with NamedTemporaryFile(suffix=".tsv") as fp: + fp.write(b'?s\t?p\t?o\n<http://example.com/s>\t<http://example.com/s>\t"1"\n') + fp.flush() + r = parse_query_results(path=fp.name) + self.assertIsInstance(r, QuerySolutions) + results = list(r) # type: ignore[arg-type] + self.assertEqual(results[0]["s"], NamedNode("http://example.com/s")) + self.assertEqual(results[0][2], Literal("1")) + + def test_parse_not_existing_file(self) -> None: + with self.assertRaises(IOError) as _: + parse_query_results(path="/tmp/not-existing-oxigraph-file.ttl", format=QueryResultsFormat.JSON) + + def test_parse_str(self) -> None: + result = parse_query_results("true", QueryResultsFormat.TSV) + self.assertIsInstance(result, QueryBoolean) + self.assertTrue(result) + + def test_parse_bytes(self) -> None: + result = parse_query_results(b"false", QueryResultsFormat.TSV) + self.assertIsInstance(result, QueryBoolean) + self.assertFalse(result) + + def test_parse_str_io(self) -> None: + result = parse_query_results("true", QueryResultsFormat.TSV) + self.assertIsInstance(result, QueryBoolean) + self.assertTrue(result) + + def test_parse_bytes_io(self) -> None: + result = parse_query_results(BytesIO(b"false"), QueryResultsFormat.TSV) + self.assertIsInstance(result, QueryBoolean) + self.assertFalse(result) + + def test_parse_io_error(self) -> None: + with self.assertRaises(UnsupportedOperation) as _, TemporaryFile("wb") as fp: + parse_query_results(fp, QueryResultsFormat.XML) + + def test_parse_syntax_error_json(self) -> None: + with NamedTemporaryFile() as fp: + fp.write(b"{]") + fp.flush() + with self.assertRaises(SyntaxError) as ctx: + list(parse_query_results(path=fp.name, format=QueryResultsFormat.JSON)) # type: ignore[arg-type] + self.assertEqual(ctx.exception.filename, fp.name) + self.assertEqual(ctx.exception.lineno, 1) + self.assertEqual(ctx.exception.offset, 2) + if sys.version_info >= (3, 10): + self.assertEqual(ctx.exception.end_lineno, 1) + self.assertEqual(ctx.exception.end_offset, 3) + + def test_parse_syntax_error_tsv(self) -> None: + with NamedTemporaryFile() as fp: + fp.write(b"?a\t?test\n") + fp.write(b"1\t<foo >\n") + fp.flush() + with self.assertRaises(SyntaxError) as ctx: + list(parse_query_results(path=fp.name, format=QueryResultsFormat.TSV)) # type: ignore[arg-type] + self.assertEqual(ctx.exception.filename, fp.name) + self.assertEqual(ctx.exception.lineno, 2) + self.assertEqual(ctx.exception.offset, 3) + if sys.version_info >= (3, 10): + self.assertEqual(ctx.exception.end_lineno, 2) + self.assertEqual(ctx.exception.end_offset, 9) diff --git a/python/tests/test_model.py b/python/tests/test_model.py index 2931d06d..6bed69fd 100644 --- a/python/tests/test_model.py +++ b/python/tests/test_model.py @@ -138,9 +138,7 @@ class TestLiteral(unittest.TestCase): self.assertEqual(copy.deepcopy(number), number) def test_basic_match(self) -> None: - match_works( - self, 'Literal("foo", language="en")', 'Literal("foo", language="en")' - ) + match_works(self, 'Literal("foo", language="en")', 'Literal("foo", language="en")') match_works( self, 'Literal("1", datatype=XSD_INTEGER)', @@ -149,9 +147,7 @@ class TestLiteral(unittest.TestCase): def test_wildcard_match(self) -> None: match_works(self, 'Literal("foo", language="en")', "Literal(v, language=l)") - match_works( - self, 'Literal("1", datatype=XSD_INTEGER)', "Literal(v, datatype=d)" - ) + match_works(self, 'Literal("1", datatype=XSD_INTEGER)', "Literal(v, datatype=d)") class TestTriple(unittest.TestCase): diff --git a/python/tests/test_store.py b/python/tests/test_store.py index d6693c4e..abda28ca 100644 --- a/python/tests/test_store.py +++ b/python/tests/test_store.py @@ -1,5 +1,7 @@ +import gc +import sys import unittest -from io import BytesIO, UnsupportedOperation +from io import BytesIO, StringIO, UnsupportedOperation from pathlib import Path from tempfile import NamedTemporaryFile, TemporaryDirectory, TemporaryFile from typing import Any @@ -9,9 +11,12 @@ from pyoxigraph import ( DefaultGraph, NamedNode, Quad, + QueryBoolean, + QueryResultsFormat, QuerySolution, QuerySolutions, QueryTriples, + RdfFormat, Store, Triple, Variable, @@ -22,6 +27,7 @@ bar = NamedNode("http://bar") baz = NamedNode("http://baz") triple = Triple(foo, foo, foo) graph = NamedNode("http://graph") +is_wasm = sys.platform == "emscripten" class TestStore(unittest.TestCase): @@ -45,6 +51,7 @@ class TestStore(unittest.TestCase): ) self.assertEqual(len(store), 2) + @unittest.skipIf(is_wasm, "Not supported with WASM") def test_bulk_extend(self) -> None: store = Store() store.bulk_extend( @@ -149,9 +156,7 @@ class TestStore(unittest.TestCase): store.add(Quad(foo, bar, baz, graph)) results: Any = store.query("SELECT ?s WHERE { ?s ?p ?o }") self.assertEqual(len(list(results)), 0) - results = store.query( - "SELECT ?s WHERE { ?s ?p ?o }", use_default_graph_as_union=True - ) + results = store.query("SELECT ?s WHERE { ?s ?p ?o }", use_default_graph_as_union=True) self.assertEqual(len(list(results)), 1) results = store.query( "SELECT ?s WHERE { ?s ?p ?o }", @@ -189,6 +194,42 @@ class TestStore(unittest.TestCase): ) self.assertEqual(len(list(results)), 2) + def test_select_query_dump(self) -> None: + store = Store() + store.add(Quad(foo, bar, baz)) + results: QuerySolutions = store.query("SELECT ?s WHERE { ?s ?p ?o }") # type: ignore[assignment] + self.assertIsInstance(results, QuerySolutions) + output = BytesIO() + results.serialize(output, QueryResultsFormat.CSV) + self.assertEqual( + output.getvalue().decode(), + "s\r\nhttp://foo\r\n", + ) + + def test_ask_query_dump(self) -> None: + store = Store() + store.add(Quad(foo, bar, baz)) + results: QueryBoolean = store.query("ASK { ?s ?p ?o }") # type: ignore[assignment] + self.assertIsInstance(results, QueryBoolean) + output = BytesIO() + results.serialize(output, QueryResultsFormat.CSV) + self.assertEqual( + output.getvalue().decode(), + "true", + ) + + def test_construct_query_dump(self) -> None: + store = Store() + store.add(Quad(foo, bar, baz)) + results: QueryTriples = store.query("CONSTRUCT WHERE { ?s ?p ?o }") # type: ignore[assignment] + self.assertIsInstance(results, QueryTriples) + output = BytesIO() + results.serialize(output, RdfFormat.N_TRIPLES) + self.assertEqual( + output.getvalue().decode(), + "<http://foo> <http://bar> <http://baz> .\n", + ) + def test_update_insert_data(self) -> None: store = Store() store.update("INSERT DATA { <http://foo> <http://foo> <http://foo> }") @@ -206,6 +247,7 @@ class TestStore(unittest.TestCase): store.update("DELETE WHERE { ?v ?v ?v }") self.assertEqual(len(store), 0) + @unittest.skipIf(is_wasm, "Not supported with WASM") def test_update_load(self) -> None: store = Store() store.update("LOAD <https://www.w3.org/1999/02/22-rdf-syntax-ns>") @@ -213,9 +255,7 @@ class TestStore(unittest.TestCase): def test_update_star(self) -> None: store = Store() - store.update( - "PREFIX : <http://www.example.org/> INSERT DATA { :alice :claims << :bob :age 23 >> }" - ) + store.update("PREFIX : <http://www.example.org/> INSERT DATA { :alice :claims << :bob :age 23 >> }") results: Any = store.query( "PREFIX : <http://www.example.org/> SELECT ?p ?a WHERE { ?p :claims << :bob :age ?a >> }" ) @@ -224,16 +264,16 @@ class TestStore(unittest.TestCase): def test_load_ntriples_to_default_graph(self) -> None: store = Store() store.load( - BytesIO(b"<http://foo> <http://bar> <http://baz> ."), - mime_type="application/n-triples", + b"<http://foo> <http://bar> <http://baz> .", + RdfFormat.N_TRIPLES, ) self.assertEqual(set(store), {Quad(foo, bar, baz, DefaultGraph())}) def test_load_ntriples_to_named_graph(self) -> None: store = Store() store.load( - BytesIO(b"<http://foo> <http://bar> <http://baz> ."), - mime_type="application/n-triples", + "<http://foo> <http://bar> <http://baz> .", + RdfFormat.N_TRIPLES, to_graph=graph, ) self.assertEqual(set(store), {Quad(foo, bar, baz, graph)}) @@ -242,7 +282,7 @@ class TestStore(unittest.TestCase): store = Store() store.load( BytesIO(b"<http://foo> <http://bar> <> ."), - mime_type="text/turtle", + RdfFormat.TURTLE, base_iri="http://baz", ) self.assertEqual(set(store), {Quad(foo, bar, baz, DefaultGraph())}) @@ -250,38 +290,37 @@ class TestStore(unittest.TestCase): def test_load_nquads(self) -> None: store = Store() store.load( - BytesIO(b"<http://foo> <http://bar> <http://baz> <http://graph>."), - mime_type="application/n-quads", + StringIO("<http://foo> <http://bar> <http://baz> <http://graph>."), + RdfFormat.N_QUADS, ) self.assertEqual(set(store), {Quad(foo, bar, baz, graph)}) def test_load_trig_with_base_iri(self) -> None: store = Store() store.load( - BytesIO(b"<http://graph> { <http://foo> <http://bar> <> . }"), - mime_type="application/trig", + "<http://graph> { <http://foo> <http://bar> <> . }", + RdfFormat.TRIG, base_iri="http://baz", ) self.assertEqual(set(store), {Quad(foo, bar, baz, graph)}) def test_load_file(self) -> None: - with NamedTemporaryFile(delete=False) as fp: - file_name = Path(fp.name) + with NamedTemporaryFile(suffix=".nq") as fp: fp.write(b"<http://foo> <http://bar> <http://baz> <http://graph>.") - store = Store() - store.load(file_name, mime_type="application/n-quads") - file_name.unlink() - self.assertEqual(set(store), {Quad(foo, bar, baz, graph)}) + fp.flush() + store = Store() + store.load(path=fp.name) + self.assertEqual(set(store), {Quad(foo, bar, baz, graph)}) def test_load_with_io_error(self) -> None: with self.assertRaises(UnsupportedOperation) as _, TemporaryFile("wb") as fp: - Store().load(fp, mime_type="application/n-triples") + Store().load(fp, RdfFormat.N_TRIPLES) def test_dump_ntriples(self) -> None: store = Store() store.add(Quad(foo, bar, baz, graph)) output = BytesIO() - store.dump(output, "application/n-triples", from_graph=graph) + store.dump(output, RdfFormat.N_TRIPLES, from_graph=graph) self.assertEqual( output.getvalue(), b"<http://foo> <http://bar> <http://baz> .\n", @@ -290,10 +329,8 @@ class TestStore(unittest.TestCase): def test_dump_nquads(self) -> None: store = Store() store.add(Quad(foo, bar, baz, graph)) - output = BytesIO() - store.dump(output, "application/n-quads") self.assertEqual( - output.getvalue(), + store.dump(format=RdfFormat.N_QUADS), b"<http://foo> <http://bar> <http://baz> <http://graph> .\n", ) @@ -302,26 +339,29 @@ class TestStore(unittest.TestCase): store.add(Quad(foo, bar, baz, graph)) store.add(Quad(foo, bar, baz)) output = BytesIO() - store.dump(output, "application/trig") + store.dump(output, RdfFormat.TRIG) self.assertEqual( output.getvalue(), - b"<http://foo> <http://bar> <http://baz> .\n<http://graph> { <http://foo> <http://bar> <http://baz> }\n", + b"<http://foo> <http://bar> <http://baz> .\n" + b"<http://graph> {\n\t<http://foo> <http://bar> <http://baz> .\n}\n", ) def test_dump_file(self) -> None: with NamedTemporaryFile(delete=False) as fp: + store = Store() + store.add(Quad(foo, bar, baz, graph)) file_name = Path(fp.name) - store = Store() - store.add(Quad(foo, bar, baz, graph)) - store.dump(file_name, "application/n-quads") - self.assertEqual( - file_name.read_text(), - "<http://foo> <http://bar> <http://baz> <http://graph> .\n", - ) + store.dump(file_name, RdfFormat.N_QUADS) + self.assertEqual( + file_name.read_text(), + "<http://foo> <http://bar> <http://baz> <http://graph> .\n", + ) def test_dump_with_io_error(self) -> None: + store = Store() + store.add(Quad(foo, bar, bar)) with self.assertRaises(OSError) as _, TemporaryFile("rb") as fp: - Store().dump(fp, mime_type="application/rdf+xml") + store.dump(fp, RdfFormat.TRIG) def test_write_in_read(self) -> None: store = Store() @@ -345,15 +385,18 @@ class TestStore(unittest.TestCase): self.assertEqual(list(store.named_graphs()), []) self.assertEqual(list(store), []) + @unittest.skipIf(is_wasm, "Not supported with WASM") def test_read_only(self) -> None: quad = Quad(foo, bar, baz, graph) with TemporaryDirectory() as dir: store = Store(dir) store.add(quad) del store + gc.collect() store = Store.read_only(dir) self.assertEqual(list(store), [quad]) + @unittest.skipIf(is_wasm, "Not supported with WASM") def test_secondary(self) -> None: quad = Quad(foo, bar, baz, graph) with TemporaryDirectory() as dir: diff --git a/rustfmt.toml b/rustfmt.toml index d51f7320..751c75da 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,3 +1,10 @@ +force_explicit_abi = true +format_code_in_doc_comments = true +format_macro_matchers = true +imports_granularity = "Module" newline_style = "Unix" +normalize_comments = true +normalize_doc_attributes = true +group_imports = "One" use_field_init_shorthand = true -use_try_shorthand = true \ No newline at end of file +use_try_shorthand = true diff --git a/server b/server new file mode 120000 index 00000000..76ec9f59 --- /dev/null +++ b/server @@ -0,0 +1 @@ +cli \ No newline at end of file diff --git a/server/Cargo.toml b/server/Cargo.toml deleted file mode 100644 index e46ddaba..00000000 --- a/server/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "oxigraph_server" -version = "0.3.20" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" -readme = "README.md" -repository = "https://github.com/oxigraph/oxigraph/tree/main/server" -homepage = "https://oxigraph.org/server/" -description = """ -Oxigraph SPARQL HTTP server -""" -edition = "2021" -rust-version = "1.60" - -[dependencies] -anyhow = "1" -oxhttp = { version = "0.1", features = ["rayon"] } -clap = { version = "=4.0", features = ["derive"] } -clap_lex = "=0.3.0" -oxigraph = { version = "0.3.20", path = "../lib", features = ["http_client"] } -sparesults = { version = "0.1.8", path = "../lib/sparesults", features = ["rdf-star"] } -rand = "0.8" -url = "2" -oxiri = "0.2" -flate2 = "=1.0.26" -rayon-core = "1" - -[dev-dependencies] -assert_cmd = "=2.0.8" -assert_fs = "=1.0.10" -tempfile = "=3.6.0" -escargot = "=0.5.7" -ignore = "=0.4.18" -is-terminal = "=0.4.7" -predicates = "2" -predicates-core = "=1.0.5" -predicates-tree = "=1.0.7" \ No newline at end of file diff --git a/testsuite/Cargo.toml b/testsuite/Cargo.toml index e27113cf..1302d710 100644 --- a/testsuite/Cargo.toml +++ b/testsuite/Cargo.toml @@ -1,22 +1,31 @@ [package] -name = "oxigraph_testsuite" +name = "oxigraph-testsuite" version = "0.0.0" -authors = ["Tpt <thomas@pellissier-tanon.fr>"] -license = "MIT OR Apache-2.0" -readme = "../README.md" -repository = "https://github.com/oxigraph/oxigraph" +authors.workspace = true +license.workspace = true description = """ Implementation of W3C testsuites for Oxigraph """ -edition = "2021" +edition.workspace = true +rust-version.workspace = true publish = false [dependencies] -anyhow = "1" -clap = { version = "4", features = ["derive"] } -time = { version = "0.3", features = ["formatting"] } -oxigraph = { path = "../lib" } -text-diff = "0.4" +anyhow.workspace = true +clap = { workspace = true, features = ["derive"] } +oxigraph.workspace = true +oxttl.workspace = true +spargebra.workspace = true +sparopt.workspace = true +text-diff.workspace = true +time = { workspace = true, features = ["formatting"] } [dev-dependencies] -criterion = "0.4" +codspeed-criterion-compat.workspace = true + +[lints] +workspace = true + +[[bench]] +name = "parser" +harness = false diff --git a/testsuite/N3 b/testsuite/N3 new file mode 160000 index 00000000..1425e335 --- /dev/null +++ b/testsuite/N3 @@ -0,0 +1 @@ +Subproject commit 1425e33527f725262103a6640eadb242d80a9b22 diff --git a/testsuite/benches/parser.rs b/testsuite/benches/parser.rs new file mode 100644 index 00000000..364b4009 --- /dev/null +++ b/testsuite/benches/parser.rs @@ -0,0 +1,127 @@ +#![allow(clippy::print_stderr)] + +use anyhow::Result; +use codspeed_criterion_compat::{ + criterion_group, criterion_main, BenchmarkId, Criterion, Throughput, +}; +use oxigraph_testsuite::files::read_file; +use oxigraph_testsuite::manifest::TestManifest; +use std::io::Read; + +fn test_data_from_testsuite(manifest_uri: String, include_tests_types: &[&str]) -> Result<Vec<u8>> { + let manifest = TestManifest::new([manifest_uri]); + let mut data = Vec::default(); + for test in manifest { + let test = test?; + if include_tests_types.contains(&test.kind.as_str()) { + read_file(&test.action.unwrap())?.read_to_end(&mut data)?; + data.push(b'\n'); + } + } + Ok(data) +} + +fn ntriples_test_data() -> Result<Vec<u8>> { + test_data_from_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-triples/manifest.ttl".to_owned(), + &["http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax"], + ) +} + +fn turtle_test_data() -> Result<Vec<u8>> { + test_data_from_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-turtle/manifest.ttl".to_owned(), + &[ + "http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax", + "http://www.w3.org/ns/rdftest#TestTurtleEval", + ], + ) +} + +fn parse_bench( + c: &mut Criterion, + parser_name: &str, + data_name: &str, + data: &[u8], + bench: impl Fn(&[u8]), +) { + let mut group = c.benchmark_group(parser_name); + group.throughput(Throughput::Bytes(data.len() as u64)); + group.bench_with_input(BenchmarkId::from_parameter(data_name), &data, |b, data| { + b.iter(|| bench(data)) + }); + group.finish(); +} + +fn parse_ntriples(c: &mut Criterion, name: &str, data: &[u8]) { + parse_bench(c, "oxttl ntriples", name, data, |data| { + let mut parser = oxttl::NTriplesParser::new().parse(); + parser.extend_from_slice(data); + parser.end(); + while let Some(result) = parser.read_next() { + result.unwrap(); + } + }); +} + +fn parse_turtle(c: &mut Criterion, name: &str, data: &[u8]) { + parse_bench(c, "oxttl turtle", name, data, |data| { + let mut parser = oxttl::TurtleParser::new().parse(); + parser.extend_from_slice(data); + parser.end(); + while let Some(result) = parser.read_next() { + result.unwrap(); + } + }); +} + +fn bench_parse_ntriples_with_ntriples(c: &mut Criterion) { + parse_ntriples( + c, + "ntriples", + &match ntriples_test_data() { + Ok(d) => d, + Err(e) => { + eprintln!("{e}"); + return; + } + }, + ) +} + +fn bench_parse_ntriples_with_turtle(c: &mut Criterion) { + parse_turtle( + c, + "ntriples", + &match ntriples_test_data() { + Ok(d) => d, + Err(e) => { + eprintln!("{e}"); + return; + } + }, + ) +} + +fn bench_parse_turtle_with_turtle(c: &mut Criterion) { + parse_turtle( + c, + "turtle", + &match turtle_test_data() { + Ok(d) => d, + Err(e) => { + eprintln!("{e}"); + return; + } + }, + ) +} + +criterion_group!( + w3c_testsuite, + bench_parse_ntriples_with_ntriples, + bench_parse_ntriples_with_turtle, + bench_parse_turtle_with_turtle +); + +criterion_main!(w3c_testsuite); diff --git a/testsuite/oxigraph-tests/parser-error/invalid_iri.nt b/testsuite/oxigraph-tests/parser-error/invalid_iri.nt new file mode 100644 index 00000000..021c7911 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_iri.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . +<http://example.com/s> <http:// /p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_iri_comment.nt b/testsuite/oxigraph-tests/parser-error/invalid_iri_comment.nt new file mode 100644 index 00000000..7c8d2120 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_iri_comment.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . # foo +<http://example.com/s> <http:// /p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_iri_comment_crlf.nt b/testsuite/oxigraph-tests/parser-error/invalid_iri_comment_crlf.nt new file mode 100644 index 00000000..7c8d2120 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_iri_comment_crlf.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . # foo +<http://example.com/s> <http:// /p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_iri_crlf.nt b/testsuite/oxigraph-tests/parser-error/invalid_iri_crlf.nt new file mode 100644 index 00000000..021c7911 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_iri_crlf.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . +<http://example.com/s> <http:// /p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_iri_error.txt b/testsuite/oxigraph-tests/parser-error/invalid_iri_error.txt new file mode 100644 index 00000000..26729063 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_iri_error.txt @@ -0,0 +1 @@ +Parser error between at line 2 between columns 24 and column 36: Invalid IRI code point ' ' \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-error/invalid_predicate.nt b/testsuite/oxigraph-tests/parser-error/invalid_predicate.nt new file mode 100644 index 00000000..63e6fd7a --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_predicate.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . +<http://example.com/s> "p" <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_predicate_error.txt b/testsuite/oxigraph-tests/parser-error/invalid_predicate_error.txt new file mode 100644 index 00000000..469dd19f --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_predicate_error.txt @@ -0,0 +1 @@ +Parser error between at line 2 between columns 24 and column 27: "p" is not a valid predicate \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-error/invalid_string_escape.nt b/testsuite/oxigraph-tests/parser-error/invalid_string_escape.nt new file mode 100644 index 00000000..8a625fce --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_string_escape.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> "fooé \a baré" . diff --git a/testsuite/oxigraph-tests/parser-error/invalid_string_escape_error.txt b/testsuite/oxigraph-tests/parser-error/invalid_string_escape_error.txt new file mode 100644 index 00000000..f5e45857 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/invalid_string_escape_error.txt @@ -0,0 +1 @@ +Parser error between at line 1 between columns 53 and column 55: Unexpected escape character '\a' \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-error/manifest.ttl b/testsuite/oxigraph-tests/parser-error/manifest.ttl new file mode 100644 index 00000000..86159b38 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/manifest.ttl @@ -0,0 +1,66 @@ +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix rdft: <http://www.w3.org/ns/rdftest#> . + +<> + rdf:type mf:Manifest ; + rdfs:comment "Oxigraph parser error test cases" ; + mf:entries ( + <#invalid_iri> + <#invalid_iri_crlf> + <#invalid_iri_comment> + <#invalid_iri_comment_crlf> + <#invalid_string_escape> + <#unexpected_eof> + <#unexpected_eof_crlf> + <#invalid_predicate> + ) . + +<#invalid_iri> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad IRI" ; + mf:action <invalid_iri.nt> ; + mf:result <invalid_iri_error.txt> . + +<#invalid_iri_crlf> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad IRI" ; + mf:action <invalid_iri_crlf.nt> ; + mf:result <invalid_iri_error.txt> . + +<#invalid_iri_comment> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad IRI" ; + mf:action <invalid_iri_comment.nt> ; + mf:result <invalid_iri_error.txt> . + +<#invalid_iri_comment_crlf> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad IRI" ; + mf:action <invalid_iri_comment_crlf.nt> ; + mf:result <invalid_iri_error.txt> . + +<#invalid_string_escape> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad string escape" ; + mf:action <invalid_string_escape.nt> ; + mf:result <invalid_string_escape_error.txt> . + +<#unexpected_eof> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "unexpected end of file" ; + mf:action <unexpected_eof.nt> ; + mf:result <unexpected_eof_error.txt> . + +<#unexpected_eof_crlf> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "unexpected end of file" ; + mf:action <unexpected_eof_crlf.nt> ; + mf:result <unexpected_eof_error.txt> . + +<#invalid_predicate> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "invalid predicate" ; + mf:action <invalid_predicate.nt> ; + mf:result <invalid_predicate_error.txt> . diff --git a/testsuite/oxigraph-tests/parser-error/unexpected_eof.nt b/testsuite/oxigraph-tests/parser-error/unexpected_eof.nt new file mode 100644 index 00000000..8c0a4ca2 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/unexpected_eof.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o +bé \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-error/unexpected_eof_crlf.nt b/testsuite/oxigraph-tests/parser-error/unexpected_eof_crlf.nt new file mode 100644 index 00000000..8c0a4ca2 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/unexpected_eof_crlf.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o +bé \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-error/unexpected_eof_error.txt b/testsuite/oxigraph-tests/parser-error/unexpected_eof_error.txt new file mode 100644 index 00000000..bfd7f451 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-error/unexpected_eof_error.txt @@ -0,0 +1 @@ +Parser error at line 2 column 3: Unexpected end of file \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser-recovery/invalid_bnode.nt b/testsuite/oxigraph-tests/parser-recovery/invalid_bnode.nt new file mode 100644 index 00000000..6fd51f08 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/invalid_bnode.nt @@ -0,0 +1,2 @@ +_:` <http://example.com/pb> <http://example.com/o> . +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-recovery/invalid_iri.nt b/testsuite/oxigraph-tests/parser-recovery/invalid_iri.nt new file mode 100644 index 00000000..37ddd42d --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/invalid_iri.nt @@ -0,0 +1,2 @@ +<http:// /s> <http://example.com/p> <http://example.com/o> . +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-recovery/invalid_string.nt b/testsuite/oxigraph-tests/parser-recovery/invalid_string.nt new file mode 100644 index 00000000..19c3240c --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/invalid_string.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> "\a" . +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-recovery/iri2_spo.nt b/testsuite/oxigraph-tests/parser-recovery/iri2_spo.nt new file mode 100644 index 00000000..ee1a2a6f --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/iri2_spo.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . +<http://example.com/s> <http://example.com/p> <http://example.com/o2> . diff --git a/testsuite/oxigraph-tests/parser-recovery/iri2_string_spo.nt b/testsuite/oxigraph-tests/parser-recovery/iri2_string_spo.nt new file mode 100644 index 00000000..2563a4f7 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/iri2_string_spo.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> "o" . +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-recovery/iri_spo.nt b/testsuite/oxigraph-tests/parser-recovery/iri_spo.nt new file mode 100644 index 00000000..8b7355c8 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/iri_spo.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser-recovery/iri_string_spo.nt b/testsuite/oxigraph-tests/parser-recovery/iri_string_spo.nt new file mode 100644 index 00000000..24548279 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/iri_string_spo.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> "o" . diff --git a/testsuite/oxigraph-tests/parser-recovery/manifest.ttl b/testsuite/oxigraph-tests/parser-recovery/manifest.ttl new file mode 100644 index 00000000..37a102bc --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/manifest.ttl @@ -0,0 +1,129 @@ +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix ox: <https://github.com/oxigraph/oxigraph/tests#> . + +<> + rdf:type mf:Manifest ; + rdfs:comment "Oxigraph parser recovery test cases" ; + mf:entries ( + <#invalid_iri_nt> + <#invalid_iri_ttl> + <#invalid_iri_n3> + <#invalid_bnode_nt> + <#invalid_bnode_ttl> + <#invalid_bnode_n3> + <#invalid_string_nt> + <#invalid_string_ttl> + <#invalid_string_n3> + <#missing_dot_at_end_of_triple_with_iri_middle_nt> + <#missing_dot_at_end_of_triple_with_iri_middle_ttl> + <#missing_dot_at_end_of_triple_with_iri_end_nt> + <#missing_dot_at_end_of_triple_with_iri_end_ttl> + <#missing_dot_at_end_of_triple_with_string_middle_nt> + <#missing_dot_at_end_of_triple_with_string_middle_ttl> + <#missing_dot_at_end_of_triple_with_string_end_nt> + <#missing_dot_at_end_of_triple_with_string_end_ttl> + ) . + +<#invalid_iri_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "IRI with space" ; + mf:action <invalid_iri.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_iri_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "IRI with space" ; + mf:action <invalid_iri.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_iri_n3> + rdf:type ox:TestN3Recovery ; + mf:name "IRI with space" ; + mf:action <invalid_iri.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_bnode_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "bad character in blank node" ; + mf:action <invalid_bnode.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_bnode_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "bad character in blank node" ; + mf:action <invalid_bnode.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_bnode_n3> + rdf:type ox:TestN3Recovery ; + mf:name "bad character in blank node" ; + mf:action <invalid_bnode.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_string_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "invalid escape sequence in string" ; + mf:action <invalid_string.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_string_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "invalid escape sequence in string" ; + mf:action <invalid_string.nt> ; + mf:result <iri_spo.nt> . + +<#invalid_string_n3> + rdf:type ox:TestN3Recovery ; + mf:name "invalid escape sequence in string" ; + mf:action <invalid_string.nt> ; + mf:result <iri_spo.nt> . + +<#missing_dot_at_end_of_triple_with_iri_middle_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_iri_middle.nt> ; + mf:result <iri2_spo.nt> . + +<#missing_dot_at_end_of_triple_with_iri_middle_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_iri_middle.nt> ; + mf:result <iri2_spo.nt> . + +<#missing_dot_at_end_of_triple_with_iri_end_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_iri_end.nt> ; + mf:result <iri_spo.nt> . + +<#missing_dot_at_end_of_triple_with_iri_end_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_iri_end.nt> ; + mf:result <iri_spo.nt> . + +<#missing_dot_at_end_of_triple_with_string_middle_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_string_middle.nt> ; + mf:result <iri2_string_spo.nt> . + +<#missing_dot_at_end_of_triple_with_string_middle_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_string_middle.nt> ; + mf:result <iri2_string_spo.nt> . + +<#missing_dot_at_end_of_triple_with_string_end_nt> + rdf:type ox:TestNTripleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_string_end.nt> ; + mf:result <iri_string_spo.nt> . + +<#missing_dot_at_end_of_triple_with_string_end_ttl> + rdf:type ox:TestTurtleRecovery ; + mf:name "missing dot at the end of a triple" ; + mf:action <missing_dot_at_end_of_triple_with_string_end.nt> ; + mf:result <iri_string_spo.nt> . diff --git a/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_end.nt b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_end.nt new file mode 100644 index 00000000..ff536e88 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_end.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> diff --git a/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_middle.nt b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_middle.nt new file mode 100644 index 00000000..117f53b0 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_iri_middle.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o> +<http://example.com/s> <http://example.com/p> <http://example.com/o2> . diff --git a/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_end.nt b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_end.nt new file mode 100644 index 00000000..ff0896c3 --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_end.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> "o" diff --git a/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_middle.nt b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_middle.nt new file mode 100644 index 00000000..bdd80d3c --- /dev/null +++ b/testsuite/oxigraph-tests/parser-recovery/missing_dot_at_end_of_triple_with_string_middle.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> "o" +<http://example.com/s> <http://example.com/p> <http://example.com/o> . diff --git a/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.nt b/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.nt new file mode 100644 index 00000000..ebcd4fdf --- /dev/null +++ b/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.nt @@ -0,0 +1,2 @@ +<http://example.com/s> <http://example.com/p> "foo"@base . +<http://example.com/s> <http://example.com/p> "bar"@prefix . diff --git a/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.ttl b/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.ttl new file mode 100644 index 00000000..183a0b35 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/at_keywords_as_lang_tag.ttl @@ -0,0 +1,3 @@ +@prefix : <http://example.com/> . + +:s :p "foo"@base , "bar"@prefix . diff --git a/testsuite/oxigraph-tests/parser/bad_lang.ttl b/testsuite/oxigraph-tests/parser/bad_lang.ttl new file mode 100644 index 00000000..1491033d --- /dev/null +++ b/testsuite/oxigraph-tests/parser/bad_lang.ttl @@ -0,0 +1 @@ +<http://foo> <http://foo> "foo"@badlanguagetag . \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser/bad_parentheses.ttl b/testsuite/oxigraph-tests/parser/bad_parentheses.ttl new file mode 100644 index 00000000..32ae5d04 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/bad_parentheses.ttl @@ -0,0 +1,2 @@ +(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + diff --git a/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.nt b/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.nt new file mode 100644 index 00000000..c975cc52 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.nt @@ -0,0 +1,2 @@ +<urn:zamaudio:ZaMultiComp#preset001> <http://lv2plug.in/ns/ext/state#state> _:1 . + diff --git a/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.ttl b/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.ttl new file mode 100644 index 00000000..5972050b --- /dev/null +++ b/testsuite/oxigraph-tests/parser/blank_node_with_linebreak.ttl @@ -0,0 +1,6 @@ +@prefix state: <http://lv2plug.in/ns/ext/state#> . + +<urn:zamaudio:ZaMultiComp#preset001> + state:state [ + ] . + diff --git a/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nq b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nq new file mode 100644 index 00000000..d0a345c1 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nq @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o.> . diff --git a/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nt b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nt new file mode 100644 index 00000000..d0a345c1 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.nt @@ -0,0 +1 @@ +<http://example.com/s> <http://example.com/p> <http://example.com/o.> . diff --git a/testsuite/oxigraph-tests/parser/escaped_trailing_dot.trig b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.trig new file mode 100644 index 00000000..9017defa --- /dev/null +++ b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.trig @@ -0,0 +1,2 @@ +@prefix ex: <http://example.com/> . +ex:s ex:p ex:o\. . diff --git a/testsuite/oxigraph-tests/parser/escaped_trailing_dot.ttl b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.ttl new file mode 100644 index 00000000..9017defa --- /dev/null +++ b/testsuite/oxigraph-tests/parser/escaped_trailing_dot.ttl @@ -0,0 +1,2 @@ +@prefix ex: <http://example.com/> . +ex:s ex:p ex:o\. . diff --git a/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nq b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nq new file mode 100644 index 00000000..d789d008 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nq @@ -0,0 +1,3 @@ +<http://example.com/prefix/s> <http://example.com/prefix/p> <http://example.com/true/o> . +<http://example.com/base/s> <http://example.com/base/p> <http://example.com/false/o> . +<http://example.com/graph/s> <http://example.com/graph/p> <http://example.com/graph/o> <http://example.com/graph/g> . diff --git a/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nt b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nt new file mode 100644 index 00000000..30ae19ae --- /dev/null +++ b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.nt @@ -0,0 +1,2 @@ +<http://example.com/prefix/s> <http://example.com/prefix/p> <http://example.com/true/o> . +<http://example.com/base/s> <http://example.com/base/p> <http://example.com/false/o> . diff --git a/testsuite/oxigraph-tests/parser/keyword_vs_prefix.trig b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.trig new file mode 100644 index 00000000..b293904f --- /dev/null +++ b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.trig @@ -0,0 +1,10 @@ +base <http://example.com/> +prefix prefix: <prefix/> +prefix base: <base/> +prefix graph: <graph/> +prefix true: <true/> +prefix false: <false/> + +prefix:s prefix:p true:o . +base:s base:p false:o . +graph:g { graph:s graph:p graph:o . } diff --git a/testsuite/oxigraph-tests/parser/keyword_vs_prefix.ttl b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.ttl new file mode 100644 index 00000000..37a94cd8 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/keyword_vs_prefix.ttl @@ -0,0 +1,8 @@ +base <http://example.com/> +prefix prefix: <prefix/> +prefix base: <base/> +prefix true: <true/> +prefix false: <false/> + +prefix:s prefix:p true:o . +base:s base:p false:o . diff --git a/testsuite/oxigraph-tests/parser/language_normalization.nt b/testsuite/oxigraph-tests/parser/language_normalization.nt new file mode 100644 index 00000000..23267c1e --- /dev/null +++ b/testsuite/oxigraph-tests/parser/language_normalization.nt @@ -0,0 +1 @@ +<http://foo> <http://foo> "foo"@en-us . \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser/language_normalization.rdf b/testsuite/oxigraph-tests/parser/language_normalization.rdf new file mode 100644 index 00000000..56520f45 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/language_normalization.rdf @@ -0,0 +1,4 @@ +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:foo="http://foo"> + <rdf:Description rdf:about="http://foo" xml:lang="en-US" foo:="foo"> + </rdf:Description> +</rdf:RDF> \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser/language_normalization.ttl b/testsuite/oxigraph-tests/parser/language_normalization.ttl new file mode 100644 index 00000000..ea2f650d --- /dev/null +++ b/testsuite/oxigraph-tests/parser/language_normalization.ttl @@ -0,0 +1 @@ +<http://foo> <http://foo> "foo"@en-US . \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser/literal_value_space.nt b/testsuite/oxigraph-tests/parser/literal_value_space.nt new file mode 100644 index 00000000..e91cd772 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/literal_value_space.nt @@ -0,0 +1 @@ +<http://example.com/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> " bar\n" . diff --git a/testsuite/oxigraph-tests/parser/literal_value_space.rdf b/testsuite/oxigraph-tests/parser/literal_value_space.rdf new file mode 100644 index 00000000..326d4194 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/literal_value_space.rdf @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="http://example.com/foo"> + <rdf:value> bar +</rdf:value> + </rdf:Description> +</rdf:RDF> diff --git a/testsuite/oxigraph-tests/parser/manifest.ttl b/testsuite/oxigraph-tests/parser/manifest.ttl new file mode 100644 index 00000000..af3e80b5 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/manifest.ttl @@ -0,0 +1,104 @@ +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix rdft: <http://www.w3.org/ns/rdftest#> . + +<> + rdf:type mf:Manifest ; + rdfs:comment "Oxigraph parsers test case" ; + mf:entries ( + <#blank_node_with_linebreak> + <#bad_lang> + <#language_normalization_ttl> + <#language_normalization_xml> + <#xml_entities> + <#xml_nested_entities> + <#literal_value_space> + <#bad_parentheses> + <#keyword_vs_prefix_ttl> + <#keyword_vs_prefix_trig> + <#at_keywords_as_lang_tag> + <#escaped_trailing_dot_ttl> + <#escaped_trailing_dot_trig> + ) . + +<#no_end_line_jump> + rdf:type rdft:TestNTriplesPositiveSyntax ; + mf:name "No line jump at the end of the file" ; + mf:action <no_end_line_jump.nt> . + +<#blank_node_with_linebreak> + rdf:type rdft:TestTurtleEval ; + mf:name "blank node with linebreak" ; + mf:action <blank_node_with_linebreak.ttl> ; + mf:result <blank_node_with_linebreak.nt> . + +<#language_normalization_ttl> + rdf:type rdft:TestTurtleEval ; + mf:name "language case normalization" ; + mf:action <language_normalization.ttl> ; + mf:result <language_normalization.nt> . + +<#language_normalization_xml> + rdf:type rdft:TestXMLEval ; + mf:name "language case normalization" ; + mf:action <language_normalization.rdf> ; + mf:result <language_normalization.nt> . + +<#bad_lang> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad language tag" ; + mf:action <bad_lang.ttl> . + +<#xml_entities> + rdf:type rdft:TestXMLEval ; + mf:name "custom XML entities" ; + mf:action <xml_entities.rdf> ; + mf:result <xml_entities.nt> . + +<#xml_nested_entities> + rdf:type rdft:TestXMLEval ; + mf:name "custom XML entities with nested definitions" ; + mf:action <xml_nested_entities.rdf> ; + mf:result <xml_nested_entities.nt> . + +<#literal_value_space> + rdf:type rdft:TestXMLEval ; + mf:name "spaces in literal values" ; + mf:action <literal_value_space.rdf> ; + mf:result <literal_value_space.nt> . + +<#bad_parentheses> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "a lot of parentheses that might generate a stack overflow" ; + mf:action <bad_parentheses.ttl> . + +<#keyword_vs_prefix_ttl> + rdf:type rdft:TestTurtleEval ; + mf:name "usage of keywords as prefix" ; + mf:action <keyword_vs_prefix.ttl> ; + mf:result <keyword_vs_prefix.nt> . + +<#keyword_vs_prefix_trig> + rdf:type rdft:TestTrigEval ; + mf:name "usage of keywords as prefix" ; + mf:action <keyword_vs_prefix.trig> ; + mf:result <keyword_vs_prefix.nq> . + +<#at_keywords_as_lang_tag> + rdf:type rdft:TestTurtleEval ; + mf:name "usage of at keywords as language tags" ; + mf:action <at_keywords_as_lang_tag.ttl> ; + mf:result <at_keywords_as_lang_tag.nt> . + +<#escaped_trailing_dot_ttl> + rdf:type rdft:TestTurtleEval ; + mf:name "escaped dot at the end of a local name" ; + mf:action <escaped_trailing_dot.ttl> ; + mf:result <escaped_trailing_dot.nt> . + +<#escaped_trailing_dot_trig> + rdf:type rdft:TestTrigEval ; + mf:name "escaped dot at the end of a local name" ; + mf:action <escaped_trailing_dot.trig> ; + mf:result <escaped_trailing_dot.nq> . diff --git a/testsuite/oxigraph-tests/parser/no_end_line_jump.nt b/testsuite/oxigraph-tests/parser/no_end_line_jump.nt new file mode 100644 index 00000000..fc13f999 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/no_end_line_jump.nt @@ -0,0 +1 @@ +<http://example.com> <http://example.com> <http://example.com> . \ No newline at end of file diff --git a/testsuite/oxigraph-tests/parser/xml_entities.nt b/testsuite/oxigraph-tests/parser/xml_entities.nt new file mode 100644 index 00000000..d4ed18f0 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/xml_entities.nt @@ -0,0 +1 @@ +<http://example.com/foo> <http://example.com/2/test> "bar"^^<http://www.w3.org/2001/XMLSchema#string> . diff --git a/testsuite/oxigraph-tests/parser/xml_entities.rdf b/testsuite/oxigraph-tests/parser/xml_entities.rdf new file mode 100644 index 00000000..9d14dfb3 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/xml_entities.rdf @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!DOCTYPE rdf:RDF [ + <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > + <!ENTITY ex "http://example.com/"> +]> +<rdf:RDF xmlns:ex2="&ex;2/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="&ex;foo"> + <ex2:test rdf:datatype="&xsd;string">bar</ex2:test> + </rdf:Description> +</rdf:RDF> diff --git a/testsuite/oxigraph-tests/parser/xml_nested_entities.nt b/testsuite/oxigraph-tests/parser/xml_nested_entities.nt new file mode 100644 index 00000000..d4ed18f0 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/xml_nested_entities.nt @@ -0,0 +1 @@ +<http://example.com/foo> <http://example.com/2/test> "bar"^^<http://www.w3.org/2001/XMLSchema#string> . diff --git a/testsuite/oxigraph-tests/parser/xml_nested_entities.rdf b/testsuite/oxigraph-tests/parser/xml_nested_entities.rdf new file mode 100644 index 00000000..5be2e9d7 --- /dev/null +++ b/testsuite/oxigraph-tests/parser/xml_nested_entities.rdf @@ -0,0 +1,15 @@ +<?xml version="1.0"?> + +<!DOCTYPE rdf:RDF [ + <!ENTITY ex "http://example.com/"> + <!ENTITY w3 "http://www.w3.org"> + <!ENTITY rdf "&w3;/1999/02/22-rdf-syntax-ns#"> + <!ENTITY rdfs "&w3;/2000/01/rdf-schema#"> + <!ENTITY xsd "&w3;/2001/XMLSchema#"> +]> + +<rdf:RDF xmlns:ex2="&ex;2/" xmlns:rdf="&rdf;"> + <rdf:Description rdf:about="&ex;foo"> + <ex2:test rdf:datatype="&xsd;string">bar</ex2:test> + </rdf:Description> +</rdf:RDF> \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_input.rq b/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_input.rq new file mode 100644 index 00000000..c71b46cb --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_input.rq @@ -0,0 +1,9 @@ +PREFIX ex: <http://example.com/> + +SELECT ?s ?o WHERE { + ?m2 ex:p2 ?o . + ?s ex:p1 ?m1 , ?m2 . + ?m1 ex:p2 ?o . + ?s ex:p1prime ?m1 . + ?s a ex:C . +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_output.rq b/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_output.rq new file mode 100644 index 00000000..040c11e3 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bgp_join_reordering_output.rq @@ -0,0 +1,10 @@ +PREFIX ex: <http://example.com/> + +SELECT ?s ?o WHERE { + ?s a ex:C . + ?s ex:p1 ?m1 . + ?s ex:p1prime ?m1 . + ?s ex:p1 ?m2 . + ?m2 ex:p2 ?o . + ?m1 ex:p2 ?o . +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_input.rq b/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_input.rq new file mode 100644 index 00000000..2ebda3b4 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_input.rq @@ -0,0 +1,4 @@ +SELECT ?a ?o WHERE { + ?s ?p ?o . + FILTER(BOUND(?a)) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_output.rq b/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_output.rq new file mode 100644 index 00000000..493c0c64 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bind_always_false_output.rq @@ -0,0 +1,3 @@ +SELECT ?a ?o WHERE { + VALUES () {} +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_input.rq b/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_input.rq new file mode 100644 index 00000000..1230938d --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_input.rq @@ -0,0 +1,4 @@ +SELECT ?s WHERE { + ?s ?p ?o . + FILTER(BOUND(?s)) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_output.rq b/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_output.rq new file mode 100644 index 00000000..89aeaa3d --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/bind_always_true_output.rq @@ -0,0 +1,3 @@ +SELECT ?s WHERE { + ?s ?p ?o +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/empty_union_input.rq b/testsuite/oxigraph-tests/sparql-optimization/empty_union_input.rq new file mode 100644 index 00000000..dc8de6f4 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/empty_union_input.rq @@ -0,0 +1,3 @@ +SELECT ?o WHERE { + { ?s ?p ?o } UNION { VALUES () {} } +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/empty_union_output.rq b/testsuite/oxigraph-tests/sparql-optimization/empty_union_output.rq new file mode 100644 index 00000000..e0da523f --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/empty_union_output.rq @@ -0,0 +1,3 @@ +SELECT ?o WHERE { + ?s ?p ?o . +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_input.rq b/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_input.rq new file mode 100644 index 00000000..015a2163 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_input.rq @@ -0,0 +1,5 @@ +SELECT ?s1 ?s2 ?o1 ?o2 WHERE { + ?s1 ?p1 ?o1 . + ?s2 ?p2 ?o2 . + FILTER(?p1 = ?p2) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_output.rq b/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_output.rq new file mode 100644 index 00000000..8e3c96c7 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/equal_to_same_term_output.rq @@ -0,0 +1,5 @@ +SELECT ?s1 ?s2 ?o1 ?o2 WHERE { + ?s1 ?p1 ?o1 . + ?s2 ?p2 ?o2 . + FILTER(sameTerm(?p2, ?p1)) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_input.rq b/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_input.rq new file mode 100644 index 00000000..e3615fa7 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_input.rq @@ -0,0 +1,4 @@ +SELECT ?s WHERE { + ?s ?p ?o . + FILTER(EXISTS { VALUES () {}}) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_output.rq b/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_output.rq new file mode 100644 index 00000000..13583411 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/exists_always_false_output.rq @@ -0,0 +1,3 @@ +SELECT ?s WHERE { + VALUES() {} +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/false_and_something_input.rq b/testsuite/oxigraph-tests/sparql-optimization/false_and_something_input.rq new file mode 100644 index 00000000..2123e97a --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/false_and_something_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(false && ?o1 = ?o2) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/false_and_something_output.rq b/testsuite/oxigraph-tests/sparql-optimization/false_and_something_output.rq new file mode 100644 index 00000000..ba012e0a --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/false_and_something_output.rq @@ -0,0 +1,3 @@ +SELECT ?o1 ?o2 WHERE { + VALUES () {} +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/false_or_something_input.rq b/testsuite/oxigraph-tests/sparql-optimization/false_or_something_input.rq new file mode 100644 index 00000000..3710d7eb --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/false_or_something_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(false || ?o1 = ?o2) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/false_or_something_output.rq b/testsuite/oxigraph-tests/sparql-optimization/false_or_something_output.rq new file mode 100644 index 00000000..95741032 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/false_or_something_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 = ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/if_always_false_input.rq b/testsuite/oxigraph-tests/sparql-optimization/if_always_false_input.rq new file mode 100644 index 00000000..6c8aa537 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/if_always_false_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(IF(false, ?o1 = ?o2, ?o1 != ?o2)) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/if_always_false_output.rq b/testsuite/oxigraph-tests/sparql-optimization/if_always_false_output.rq new file mode 100644 index 00000000..c64ec6ea --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/if_always_false_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 != ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/if_always_true_input.rq b/testsuite/oxigraph-tests/sparql-optimization/if_always_true_input.rq new file mode 100644 index 00000000..52a63e4b --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/if_always_true_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(IF(true, ?o1 = ?o2, ?o1 != ?o2)) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/if_always_true_output.rq b/testsuite/oxigraph-tests/sparql-optimization/if_always_true_output.rq new file mode 100644 index 00000000..95741032 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/if_always_true_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 = ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/manifest.ttl b/testsuite/oxigraph-tests/sparql-optimization/manifest.ttl new file mode 100644 index 00000000..c509fe79 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/manifest.ttl @@ -0,0 +1,132 @@ +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix : <https://github.com/oxigraph/oxigraph/tests/sparql-optimization/manifest#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix ox: <https://github.com/oxigraph/oxigraph/tests#> . + +<> rdf:type mf:Manifest ; + rdfs:label "Oxigraph SPARQL optimization tests" ; + mf:entries + ( + :unbound_filter + :unbound_bind + :something_or_true + :true_or_something + :something_or_false + :false_or_something + :something_and_true + :true_and_something + :something_and_false + :false_and_something + :equal_to_same_term + :bind_always_true + :bind_always_false + :if_always_true + :if_always_false + :exists_always_false + :push_filter + :push_optional_filter + :empty_union + :bgp_join_reordering + ) . + + +:unbound_filter rdf:type ox:QueryOptimizationTest ; + mf:name "unbound variable in filter" ; + mf:action <unbound_filter_input.rq> ; + mf:result <unbound_filter_output.rq> . + +:unbound_bind rdf:type ox:QueryOptimizationTest ; + mf:name "unbound variable in bindr" ; + mf:action <unbound_bind_input.rq> ; + mf:result <unbound_bind_output.rq> . + +:something_or_true rdf:type ox:QueryOptimizationTest ; + mf:name "something || true" ; + mf:action <something_or_true_input.rq> ; + mf:result <something_or_true_output.rq> . + +:true_or_something rdf:type ox:QueryOptimizationTest ; + mf:name "true || something" ; + mf:action <true_or_something_input.rq> ; + mf:result <true_or_something_output.rq> . + +:something_or_false rdf:type ox:QueryOptimizationTest ; + mf:name "something || false" ; + mf:action <something_or_false_input.rq> ; + mf:result <something_or_false_output.rq> . + +:false_or_something rdf:type ox:QueryOptimizationTest ; + mf:name "false || something" ; + mf:action <false_or_something_input.rq> ; + mf:result <false_or_something_output.rq> . + +:something_and_true rdf:type ox:QueryOptimizationTest ; + mf:name "something && true" ; + mf:action <something_and_true_input.rq> ; + mf:result <something_and_true_output.rq> . + +:true_and_something rdf:type ox:QueryOptimizationTest ; + mf:name "true && something" ; + mf:action <true_and_something_input.rq> ; + mf:result <true_and_something_output.rq> . + +:something_and_false rdf:type ox:QueryOptimizationTest ; + mf:name "something && false" ; + mf:action <something_and_false_input.rq> ; + mf:result <something_and_false_output.rq> . + +:false_and_something rdf:type ox:QueryOptimizationTest ; + mf:name "false && something" ; + mf:action <false_and_something_input.rq> ; + mf:result <false_and_something_output.rq> . + +:equal_to_same_term a ox:QueryOptimizationTest ; + mf:name "equal to same term" ; + mf:action <equal_to_same_term_input.rq> ; + mf:result <equal_to_same_term_output.rq> . + +:bind_always_true rdf:type ox:QueryOptimizationTest ; + mf:name "BIND() always true" ; + mf:action <bind_always_true_input.rq> ; + mf:result <bind_always_true_output.rq> . + +:bind_always_false rdf:type ox:QueryOptimizationTest ; + mf:name "BIND() always false" ; + mf:action <bind_always_false_input.rq> ; + mf:result <bind_always_false_output.rq> . + +:if_always_true rdf:type ox:QueryOptimizationTest ; + mf:name "IF() always true" ; + mf:action <if_always_true_input.rq> ; + mf:result <if_always_true_output.rq> . + +:if_always_false rdf:type ox:QueryOptimizationTest ; + mf:name "IF() always false" ; + mf:action <if_always_false_input.rq> ; + mf:result <if_always_false_output.rq> . + +:exists_always_false rdf:type ox:QueryOptimizationTest ; + mf:name "EXISTS {} always false" ; + mf:action <exists_always_false_input.rq> ; + mf:result <exists_always_false_output.rq> . + +:push_filter rdf:type ox:QueryOptimizationTest ; + mf:name "push filter down" ; + mf:action <push_filter_input.rq> ; + mf:result <push_filter_output.rq> . + +:push_optional_filter rdf:type ox:QueryOptimizationTest ; + mf:name "push OPTIONAL filter down" ; + mf:action <push_optional_filter_input.rq> ; + mf:result <push_optional_filter_output.rq> . + +:empty_union rdf:type ox:QueryOptimizationTest ; + mf:name "empty UNION" ; + mf:action <empty_union_input.rq> ; + mf:result <empty_union_output.rq> . + +:bgp_join_reordering rdf:type ox:QueryOptimizationTest ; + mf:name "BGP join reordering" ; + mf:action <bgp_join_reordering_input.rq> ; + mf:result <bgp_join_reordering_output.rq> . diff --git a/testsuite/oxigraph-tests/sparql-optimization/push_filter_input.rq b/testsuite/oxigraph-tests/sparql-optimization/push_filter_input.rq new file mode 100644 index 00000000..58e64a8e --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/push_filter_input.rq @@ -0,0 +1,11 @@ +PREFIX : <http://example.com/> + +SELECT ?o1 ?o2 ?o4 ?o5 WHERE { + ?s :p1 ?o1 ; :p4 ?o4 ; :p5 ?o5 . + LATERAL { ?s :p2 ?o2 } + MINUS { ?s :p3 ?o3 } + FILTER(?o1 = 1) + FILTER(?o2 = 2) + FILTER(?o4 = 4) + FILTER(?o1 = ?o5) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/push_filter_output.rq b/testsuite/oxigraph-tests/sparql-optimization/push_filter_output.rq new file mode 100644 index 00000000..3cecb4b3 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/push_filter_output.rq @@ -0,0 +1,18 @@ +PREFIX : <http://example.com/> + +SELECT ?o1 ?o2 ?o4 ?o5 WHERE { + { + { + { + { ?s :p1 ?o1 FILTER(1 = ?o1) } + LATERAL { ?s :p4 ?o4 } + FILTER(?o4 = 4) + } + LATERAL { ?s :p5 ?o5 } + FILTER(?o5 = ?o1) + } + LATERAL { ?s :p2 ?o2 } + FILTER(?o2 = 2) + } + MINUS { ?s :p3 ?o3 } +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_input.rq b/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_input.rq new file mode 100644 index 00000000..a78e08e3 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_input.rq @@ -0,0 +1,5 @@ +SELECT ?s ?o WHERE { + ?s a ?t . + OPTIONAL { { ?s ?p ?o } UNION { ?s ?p ?o2 } FILTER(?o = 1) } + OPTIONAL { { ?s ?p ?o } UNION { ?s ?p2 ?o2 } FILTER(?o = ?t) } +} \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_output.rq b/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_output.rq new file mode 100644 index 00000000..067f0d87 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/push_optional_filter_output.rq @@ -0,0 +1,5 @@ +SELECT ?s ?o WHERE { + ?s a ?t . + LATERAL { VALUES () {()} OPTIONAL { { ?s ?p ?o FILTER(1 = ?o) } UNION { ?s ?p ?o2 FILTER(1 = ?o) } } } + LATERAL { VALUES () {()} OPTIONAL { { ?s ?p ?o } UNION { ?s ?p2 ?o2 } FILTER(?t = ?o) } } +} \ No newline at end of file diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_and_false_input.rq b/testsuite/oxigraph-tests/sparql-optimization/something_and_false_input.rq new file mode 100644 index 00000000..c99ca675 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_and_false_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o1 = ?o2 && false) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_and_false_output.rq b/testsuite/oxigraph-tests/sparql-optimization/something_and_false_output.rq new file mode 100644 index 00000000..ba012e0a --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_and_false_output.rq @@ -0,0 +1,3 @@ +SELECT ?o1 ?o2 WHERE { + VALUES () {} +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_and_true_input.rq b/testsuite/oxigraph-tests/sparql-optimization/something_and_true_input.rq new file mode 100644 index 00000000..de09d711 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_and_true_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o1 = ?o2 && true) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_and_true_output.rq b/testsuite/oxigraph-tests/sparql-optimization/something_and_true_output.rq new file mode 100644 index 00000000..95741032 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_and_true_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 = ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_or_false_input.rq b/testsuite/oxigraph-tests/sparql-optimization/something_or_false_input.rq new file mode 100644 index 00000000..495bbd1b --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_or_false_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o1 = ?o2 || false) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_or_false_output.rq b/testsuite/oxigraph-tests/sparql-optimization/something_or_false_output.rq new file mode 100644 index 00000000..95741032 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_or_false_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 = ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_or_true_input.rq b/testsuite/oxigraph-tests/sparql-optimization/something_or_true_input.rq new file mode 100644 index 00000000..1a1c3ca6 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_or_true_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o1 = ?o2 || true) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/something_or_true_output.rq b/testsuite/oxigraph-tests/sparql-optimization/something_or_true_output.rq new file mode 100644 index 00000000..7af27485 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/something_or_true_output.rq @@ -0,0 +1,3 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/true_and_something_input.rq b/testsuite/oxigraph-tests/sparql-optimization/true_and_something_input.rq new file mode 100644 index 00000000..3e34f239 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/true_and_something_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(true && ?o1 = ?o2) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/true_and_something_output.rq b/testsuite/oxigraph-tests/sparql-optimization/true_and_something_output.rq new file mode 100644 index 00000000..95741032 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/true_and_something_output.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(?o2 = ?o1) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/true_or_something_input.rq b/testsuite/oxigraph-tests/sparql-optimization/true_or_something_input.rq new file mode 100644 index 00000000..a47c54f7 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/true_or_something_input.rq @@ -0,0 +1,4 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . + FILTER(true || ?o1 = ?o2) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/true_or_something_output.rq b/testsuite/oxigraph-tests/sparql-optimization/true_or_something_output.rq new file mode 100644 index 00000000..7af27485 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/true_or_something_output.rq @@ -0,0 +1,3 @@ +SELECT ?o1 ?o2 WHERE { + ?s ?p ?o1 , ?o2 . +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_input.rq b/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_input.rq new file mode 100644 index 00000000..25808725 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_input.rq @@ -0,0 +1,3 @@ +SELECT ?o WHERE { + BIND(?a AS ?o) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_output.rq b/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_output.rq new file mode 100644 index 00000000..7ef17038 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/unbound_bind_output.rq @@ -0,0 +1,3 @@ +SELECT ?o WHERE { + VALUES () { () } +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_input.rq b/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_input.rq new file mode 100644 index 00000000..273ed694 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_input.rq @@ -0,0 +1,4 @@ +SELECT ?o WHERE { + ?s ?p ?o . + FILTER(?a) +} diff --git a/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_output.rq b/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_output.rq new file mode 100644 index 00000000..36ac8cf8 --- /dev/null +++ b/testsuite/oxigraph-tests/sparql-optimization/unbound_filter_output.rq @@ -0,0 +1,3 @@ +SELECT ?o WHERE { + VALUES () {} +} diff --git a/testsuite/rdf-canon b/testsuite/rdf-canon new file mode 160000 index 00000000..eaf67e39 --- /dev/null +++ b/testsuite/rdf-canon @@ -0,0 +1 @@ +Subproject commit eaf67e398b2358f9987c9550443c109d43ce89b1 diff --git a/testsuite/rdf-tests b/testsuite/rdf-tests index fb410326..8bd6d803 160000 --- a/testsuite/rdf-tests +++ b/testsuite/rdf-tests @@ -1 +1 @@ -Subproject commit fb41032699d22b9991bba2e427b805b3b82648b6 +Subproject commit 8bd6d803093bc80750c0d01343166c9742ddd08c diff --git a/testsuite/serd-tests/LICENSE b/testsuite/serd-tests/LICENSE new file mode 100644 index 00000000..977d7b6e --- /dev/null +++ b/testsuite/serd-tests/LICENSE @@ -0,0 +1,13 @@ +Copyright 2011-2022 David Robillard <d@drobilla.net> + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/testsuite/serd-tests/README.md b/testsuite/serd-tests/README.md new file mode 100644 index 00000000..985f0c59 --- /dev/null +++ b/testsuite/serd-tests/README.md @@ -0,0 +1 @@ +Testsuite from [Serd](https://drobilla.net/software/serd) project. diff --git a/testsuite/serd-tests/bad/bad-00.ttl b/testsuite/serd-tests/bad/bad-00.ttl new file mode 100644 index 00000000..b1a1b361 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-00.ttl @@ -0,0 +1,2 @@ +# prefix name must end in a : +@prefix a <#> . diff --git a/testsuite/serd-tests/bad/bad-01.ttl b/testsuite/serd-tests/bad/bad-01.ttl new file mode 100644 index 00000000..533bc21d --- /dev/null +++ b/testsuite/serd-tests/bad/bad-01.ttl @@ -0,0 +1,3 @@ +# Forbidden by RDF - predicate cannot be blank +@prefix : <http://example.org/base#> . +:a [ :b :c ] :d . diff --git a/testsuite/serd-tests/bad/bad-02.ttl b/testsuite/serd-tests/bad/bad-02.ttl new file mode 100644 index 00000000..fd2014d0 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-02.ttl @@ -0,0 +1,3 @@ +# Forbidden by RDF - predicate cannot be blank +@prefix : <http://example.org/base#> . +:a [] :b . diff --git a/testsuite/serd-tests/bad/bad-03.ttl b/testsuite/serd-tests/bad/bad-03.ttl new file mode 100644 index 00000000..07a372f1 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-03.ttl @@ -0,0 +1,3 @@ +# 'a' only allowed as a predicate +@prefix : <http://example.org/base#> . +a :a :b . diff --git a/testsuite/serd-tests/bad/bad-04.ttl b/testsuite/serd-tests/bad/bad-04.ttl new file mode 100644 index 00000000..ee7246c8 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-04.ttl @@ -0,0 +1,3 @@ +# No comma is allowed in collections +@prefix : <http://example.org/stuff/1.0/> . +:a :b ( "apple", "banana" ) . diff --git a/testsuite/serd-tests/bad/bad-05.ttl b/testsuite/serd-tests/bad/bad-05.ttl new file mode 100644 index 00000000..387015fe --- /dev/null +++ b/testsuite/serd-tests/bad/bad-05.ttl @@ -0,0 +1,4 @@ +# N3 {}s are not in Turtle +@prefix : <http://example.org/stuff/1.0/> . +{ :a :b :c . } :d :e . + diff --git a/testsuite/serd-tests/bad/bad-06.ttl b/testsuite/serd-tests/bad/bad-06.ttl new file mode 100644 index 00000000..a8f1a0fc --- /dev/null +++ b/testsuite/serd-tests/bad/bad-06.ttl @@ -0,0 +1,3 @@ +# is and of are not in turtle +@prefix : <http://example.org/stuff/1.0/> . +:a is :b of :c . diff --git a/testsuite/serd-tests/bad/bad-07.ttl b/testsuite/serd-tests/bad/bad-07.ttl new file mode 100644 index 00000000..18ea4fa6 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-07.ttl @@ -0,0 +1,4 @@ +# paths are not in turtle +@prefix : <http://example.org/stuff/1.0/> . +:a.:b.:c . +:a^:b^:c . diff --git a/testsuite/serd-tests/bad/bad-08.ttl b/testsuite/serd-tests/bad/bad-08.ttl new file mode 100644 index 00000000..07918f9a --- /dev/null +++ b/testsuite/serd-tests/bad/bad-08.ttl @@ -0,0 +1,2 @@ +@keywords something. +# @keywords is not in turtle diff --git a/testsuite/serd-tests/bad/bad-09.ttl b/testsuite/serd-tests/bad/bad-09.ttl new file mode 100644 index 00000000..d2d76c13 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-09.ttl @@ -0,0 +1,3 @@ +# implies is not in turtle +@prefix : <http://example.org/stuff/1.0/> . +:a => :b . diff --git a/testsuite/serd-tests/bad/bad-10.ttl b/testsuite/serd-tests/bad/bad-10.ttl new file mode 100644 index 00000000..b5ef1f55 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-10.ttl @@ -0,0 +1,3 @@ +# equivalence is not in turtle +@prefix : <http://example.org/stuff/1.0/> . +:a = :b . diff --git a/testsuite/serd-tests/bad/bad-11.ttl b/testsuite/serd-tests/bad/bad-11.ttl new file mode 100644 index 00000000..09e7b6a0 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-11.ttl @@ -0,0 +1,3 @@ +# @forAll is not in turtle +@prefix : <http://example.org/stuff/1.0/> . +@forAll :x . diff --git a/testsuite/serd-tests/bad/bad-12.ttl b/testsuite/serd-tests/bad/bad-12.ttl new file mode 100644 index 00000000..cef48ff8 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-12.ttl @@ -0,0 +1,3 @@ +# @forSome is not in turtle +@prefix : <http://example.org/stuff/1.0/> . +@forSome :x . diff --git a/testsuite/serd-tests/bad/bad-13.ttl b/testsuite/serd-tests/bad/bad-13.ttl new file mode 100644 index 00000000..91accf2b --- /dev/null +++ b/testsuite/serd-tests/bad/bad-13.ttl @@ -0,0 +1,3 @@ +# <= is not in turtle +@prefix : <http://example.org/stuff/1.0/> . +:a <= :b . diff --git a/testsuite/serd-tests/bad/bad-14.ttl b/testsuite/serd-tests/bad/bad-14.ttl new file mode 100644 index 00000000..f4a7acf5 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-14.ttl @@ -0,0 +1,6 @@ +# Test long literals with missing end +@prefix : <http://example.org/ex#> . +:a :b """a long + literal +with +newlines diff --git a/testsuite/serd-tests/bad/bad-base.ttl b/testsuite/serd-tests/bad/bad-base.ttl new file mode 100644 index 00000000..85421999 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-base.ttl @@ -0,0 +1 @@ +@base "I'm quite certain this is not a URI" . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-blank-syntax.ttl b/testsuite/serd-tests/bad/bad-blank-syntax.ttl new file mode 100644 index 00000000..6c7117a2 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-blank-syntax.ttl @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> _|invalid . diff --git a/testsuite/serd-tests/bad/bad-blank.ttl b/testsuite/serd-tests/bad/bad-blank.ttl new file mode 100644 index 00000000..a6543f2d --- /dev/null +++ b/testsuite/serd-tests/bad/bad-blank.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +_:.bad a eg:Thing . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-bom.ttl b/testsuite/serd-tests/bad/bad-bom.ttl new file mode 100644 index 00000000..67993884 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-bom.ttl @@ -0,0 +1,3 @@ +ﻴ# This file starts with the first two bytes of the UTF-8 Byte Order Mark + +<http://example.org/thing> a <http://example.org/Thing> . diff --git a/testsuite/serd-tests/bad/bad-char-in-local.ttl b/testsuite/serd-tests/bad/bad-char-in-local.ttl new file mode 100644 index 00000000..973cc0a2 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-char-in-local.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:�bad <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-char-in-prefix.ttl b/testsuite/serd-tests/bad/bad-char-in-prefix.ttl new file mode 100644 index 00000000..b54e0274 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-char-in-prefix.ttl @@ -0,0 +1 @@ +bad�:s <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-char-in-uri.ttl b/testsuite/serd-tests/bad/bad-char-in-uri.ttl new file mode 100644 index 00000000..49f9c0d4 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-char-in-uri.ttl @@ -0,0 +1 @@ +<���://a.example/s> <http://a.eoampl�/p> "\u0006!#[]\u007F" . diff --git a/testsuite/serd-tests/bad/bad-datatype-syntax.ttl b/testsuite/serd-tests/bad/bad-datatype-syntax.ttl new file mode 100644 index 00000000..541c25d4 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-datatype-syntax.ttl @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> "value"^<http://example.org/t> . diff --git a/testsuite/serd-tests/bad/bad-datatype.ttl b/testsuite/serd-tests/bad/bad-datatype.ttl new file mode 100644 index 00000000..0dd6018f --- /dev/null +++ b/testsuite/serd-tests/bad/bad-datatype.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> "hello"^^"not-a-uri" . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-dot-after-subject.ttl b/testsuite/serd-tests/bad/bad-dot-after-subject.ttl new file mode 100644 index 00000000..e76e0ea2 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-dot-after-subject.ttl @@ -0,0 +1 @@ +<http://example.org/s> . <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-dot-in-collection.ttl b/testsuite/serd-tests/bad/bad-dot-in-collection.ttl new file mode 100644 index 00000000..d2d35bc2 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-dot-in-collection.ttl @@ -0,0 +1 @@ +[ <http://example.org/p> (1. diff --git a/testsuite/serd-tests/bad/bad-eof-after-quotes.ttl b/testsuite/serd-tests/bad/bad-eof-after-quotes.ttl new file mode 100644 index 00000000..40e429cb --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-after-quotes.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment "" \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-at-string-start.ttl b/testsuite/serd-tests/bad/bad-eof-at-string-start.ttl new file mode 100644 index 00000000..93d20bcc --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-at-string-start.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment " \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-blank.ttl b/testsuite/serd-tests/bad/bad-eof-in-blank.ttl new file mode 100644 index 00000000..8cf4ee84 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-blank.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:thing [ eg:comment "Thing" \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-escape.ttl b/testsuite/serd-tests/bad/bad-eof-in-escape.ttl new file mode 100644 index 00000000..24b4eec6 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-escape.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment """\uA \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-lang-suffix.ttl b/testsuite/serd-tests/bad/bad-eof-in-lang-suffix.ttl new file mode 100644 index 00000000..f46a7763 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-lang-suffix.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment "That ain't no language"@en-x \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-lang.ttl b/testsuite/serd-tests/bad/bad-eof-in-lang.ttl new file mode 100644 index 00000000..bfdffd02 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-lang.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment "That ain't no language"@a \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-list.ttl b/testsuite/serd-tests/bad/bad-eof-in-list.ttl new file mode 100644 index 00000000..13eeb88d --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-list.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:thing ( eg:car eg:cdr \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-long-string.ttl b/testsuite/serd-tests/bad/bad-eof-in-long-string.ttl new file mode 100644 index 00000000..2ef179a8 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-long-string.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment """This is the string that never ends \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-object-list.ttl b/testsuite/serd-tests/bad/bad-eof-in-object-list.ttl new file mode 100644 index 00000000..9bbcd17a --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-object-list.ttl @@ -0,0 +1,2 @@ +@prefix eg: <http://example.org/> . +<> eg:p eg:o , \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-object-list2.ttl b/testsuite/serd-tests/bad/bad-eof-in-object-list2.ttl new file mode 100644 index 00000000..9186fb9f --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-object-list2.ttl @@ -0,0 +1,2 @@ +@prefix eg: <http://example.org/> . +<> eg:p eg:o ; eg:p1 eg:o2 , \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-predicate-list.ttl b/testsuite/serd-tests/bad/bad-eof-in-predicate-list.ttl new file mode 100644 index 00000000..eab5b05b --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-predicate-list.ttl @@ -0,0 +1,2 @@ +@prefix eg: <http://example.org/> . +<> eg:p eg:o ; \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-string.ttl b/testsuite/serd-tests/bad/bad-eof-in-string.ttl new file mode 100644 index 00000000..bb6e817f --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-string.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment "This is the string that never ends \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-triple-quote.ttl b/testsuite/serd-tests/bad/bad-eof-in-triple-quote.ttl new file mode 100644 index 00000000..fb935441 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-triple-quote.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:comment """Hello"" \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-uri-scheme.nt b/testsuite/serd-tests/bad/bad-eof-in-uri-scheme.nt new file mode 100644 index 00000000..de892dcf --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-uri-scheme.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <ht \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-eof-in-uri.ttl b/testsuite/serd-tests/bad/bad-eof-in-uri.ttl new file mode 100644 index 00000000..07b6e6ab --- /dev/null +++ b/testsuite/serd-tests/bad/bad-eof-in-uri.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:uri <http://example.org/dontstop \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-escape.ttl b/testsuite/serd-tests/bad/bad-escape.ttl new file mode 100644 index 00000000..c03f395f --- /dev/null +++ b/testsuite/serd-tests/bad/bad-escape.ttl @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/comment> """\!""" . diff --git a/testsuite/serd-tests/bad/bad-ext-namedblank-op.ttl b/testsuite/serd-tests/bad/bad-ext-namedblank-op.ttl new file mode 100644 index 00000000..5e648393 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-ext-namedblank-op.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s eg:p [ =: _:o ; eg:name "o" ] . diff --git a/testsuite/serd-tests/bad/bad-graph-blank-label.trig b/testsuite/serd-tests/bad/bad-graph-blank-label.trig new file mode 100644 index 00000000..8b329db3 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-graph-blank-label.trig @@ -0,0 +1,3 @@ +PREFIX : <http://example/> + +GRAPH [ :p :o ] { :s :p :o } diff --git a/testsuite/serd-tests/bad/bad-hex-digit.ttl b/testsuite/serd-tests/bad/bad-hex-digit.ttl new file mode 100644 index 00000000..85816ced --- /dev/null +++ b/testsuite/serd-tests/bad/bad-hex-digit.ttl @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/comment> "\uABCG" . diff --git a/testsuite/serd-tests/bad/bad-id-clash.ttl b/testsuite/serd-tests/bad/bad-id-clash.ttl new file mode 100644 index 00000000..c1536840 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-id-clash.ttl @@ -0,0 +1,2 @@ +_:b1 a _:b2 . +_:b2 a _:B1 . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-lang.ttl b/testsuite/serd-tests/bad/bad-lang.ttl new file mode 100644 index 00000000..01e04328 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-lang.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> "hello"@\bad . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-list.ttl b/testsuite/serd-tests/bad/bad-list.ttl new file mode 100644 index 00000000..5606658e --- /dev/null +++ b/testsuite/serd-tests/bad/bad-list.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> <http://example.org/valid> , invalid . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-list2.ttl b/testsuite/serd-tests/bad/bad-list2.ttl new file mode 100644 index 00000000..18584209 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-list2.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<> eg:thing ( . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-long-literal-in-list.ttl b/testsuite/serd-tests/bad/bad-long-literal-in-list.ttl new file mode 100644 index 00000000..f10b4c3d --- /dev/null +++ b/testsuite/serd-tests/bad/bad-long-literal-in-list.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> ("""") . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-missing-semi.ttl b/testsuite/serd-tests/bad/bad-missing-semi.ttl new file mode 100644 index 00000000..f8838805 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-missing-semi.ttl @@ -0,0 +1,3 @@ +@prefix a: <http://example.org/> . +a:s1 a:p1 a:o1 +a:s2 a:p2 a:o2 . diff --git a/testsuite/serd-tests/bad/bad-missing-uri-scheme.nt b/testsuite/serd-tests/bad/bad-missing-uri-scheme.nt new file mode 100644 index 00000000..5d7bc724 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-missing-uri-scheme.nt @@ -0,0 +1 @@ +<foo> <bar> <baz> . diff --git a/testsuite/serd-tests/bad/bad-misspelled-base.ttl b/testsuite/serd-tests/bad/bad-misspelled-base.ttl new file mode 100644 index 00000000..c8ae227a --- /dev/null +++ b/testsuite/serd-tests/bad/bad-misspelled-base.ttl @@ -0,0 +1 @@ +@baze eg: <http://example.org/> . diff --git a/testsuite/serd-tests/bad/bad-misspelled-prefix.ttl b/testsuite/serd-tests/bad/bad-misspelled-prefix.ttl new file mode 100644 index 00000000..8c9d57f6 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-misspelled-prefix.ttl @@ -0,0 +1 @@ +@prefox eg: <http://example.org/> . diff --git a/testsuite/serd-tests/bad/bad-namespace.ttl b/testsuite/serd-tests/bad/bad-namespace.ttl new file mode 100644 index 00000000..0dd78d33 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-namespace.ttl @@ -0,0 +1 @@ +@prefix eg: "what?" . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-ns.ttl b/testsuite/serd-tests/bad/bad-ns.ttl new file mode 100644 index 00000000..4410573e --- /dev/null +++ b/testsuite/serd-tests/bad/bad-ns.ttl @@ -0,0 +1 @@ +<> a badprefix:Thing . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-null-byte.ttl b/testsuite/serd-tests/bad/bad-null-byte.ttl new file mode 100644 index 00000000..4f2cb404 Binary files /dev/null and b/testsuite/serd-tests/bad/bad-null-byte.ttl differ diff --git a/testsuite/serd-tests/bad/bad-num.ttl b/testsuite/serd-tests/bad/bad-num.ttl new file mode 100644 index 00000000..7685f0e0 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-num.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> .hello . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-object.ttl b/testsuite/serd-tests/bad/bad-object.ttl new file mode 100644 index 00000000..9fc6da18 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-object.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:thing a four . diff --git a/testsuite/serd-tests/bad/bad-object2.ttl b/testsuite/serd-tests/bad/bad-object2.ttl new file mode 100644 index 00000000..9293d168 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-object2.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:thing a fives . diff --git a/testsuite/serd-tests/bad/bad-pn-escape.ttl b/testsuite/serd-tests/bad/bad-pn-escape.ttl new file mode 100644 index 00000000..2b363e89 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-pn-escape.ttl @@ -0,0 +1,2 @@ +@prefix : <http://example.org/> . +:s :p :\a diff --git a/testsuite/serd-tests/bad/bad-prefix.ttl b/testsuite/serd-tests/bad/bad-prefix.ttl new file mode 100644 index 00000000..6c286355 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-prefix.ttl @@ -0,0 +1 @@ +@prefix _invalid <http://example.org/> . diff --git a/testsuite/serd-tests/bad/bad-quote-in-uri.ttl b/testsuite/serd-tests/bad/bad-quote-in-uri.ttl new file mode 100644 index 00000000..30711241 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-quote-in-uri.ttl @@ -0,0 +1 @@ +<http://example.org/"s"> <http://example.org/p> <http://example.org/o> . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-semicolon-after-subject.ttl b/testsuite/serd-tests/bad/bad-semicolon-after-subject.ttl new file mode 100644 index 00000000..582c6ea0 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-semicolon-after-subject.ttl @@ -0,0 +1 @@ +<http://example.org/s> ; <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-string.ttl b/testsuite/serd-tests/bad/bad-string.ttl new file mode 100644 index 00000000..0bdea42c --- /dev/null +++ b/testsuite/serd-tests/bad/bad-string.ttl @@ -0,0 +1 @@ +<> <http://example.org/pred> "hello \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-subject.ttl b/testsuite/serd-tests/bad/bad-subject.ttl new file mode 100644 index 00000000..b98ea39b --- /dev/null +++ b/testsuite/serd-tests/bad/bad-subject.ttl @@ -0,0 +1 @@ +invalid.:thing a invalid.Thing . diff --git a/testsuite/serd-tests/bad/bad-uri-escape.ttl b/testsuite/serd-tests/bad/bad-uri-escape.ttl new file mode 100644 index 00000000..16c63754 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-uri-escape.ttl @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/comment> <http://example.org/\!> . diff --git a/testsuite/serd-tests/bad/bad-uri-scheme-start.nt b/testsuite/serd-tests/bad/bad-uri-scheme-start.nt new file mode 100644 index 00000000..cd3fd70f --- /dev/null +++ b/testsuite/serd-tests/bad/bad-uri-scheme-start.nt @@ -0,0 +1 @@ +<2http://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-uri-scheme.nt b/testsuite/serd-tests/bad/bad-uri-scheme.nt new file mode 100644 index 00000000..1329edcd --- /dev/null +++ b/testsuite/serd-tests/bad/bad-uri-scheme.nt @@ -0,0 +1 @@ +<b@d://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/bad-uri-truncated.nt b/testsuite/serd-tests/bad/bad-uri-truncated.nt new file mode 100644 index 00000000..22d29e4b --- /dev/null +++ b/testsuite/serd-tests/bad/bad-uri-truncated.nt @@ -0,0 +1 @@ +<foo \ No newline at end of file diff --git a/testsuite/serd-tests/bad/bad-verb.ttl b/testsuite/serd-tests/bad/bad-verb.ttl new file mode 100644 index 00000000..56a134f3 --- /dev/null +++ b/testsuite/serd-tests/bad/bad-verb.ttl @@ -0,0 +1,2 @@ +@prefix a: <http://example.org/> . +a:thing x a:Thing . \ No newline at end of file diff --git a/testsuite/serd-tests/bad/invalid-char-in-local.ttl b/testsuite/serd-tests/bad/invalid-char-in-local.ttl new file mode 100644 index 00000000..520c2404 --- /dev/null +++ b/testsuite/serd-tests/bad/invalid-char-in-local.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:¿invalid <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/invalid-char-in-prefix.ttl b/testsuite/serd-tests/bad/invalid-char-in-prefix.ttl new file mode 100644 index 00000000..79547803 --- /dev/null +++ b/testsuite/serd-tests/bad/invalid-char-in-prefix.ttl @@ -0,0 +1 @@ +invalid¿:s <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/bad/manifest.ttl b/testsuite/serd-tests/bad/manifest.ttl new file mode 100644 index 00000000..6199c1f2 --- /dev/null +++ b/testsuite/serd-tests/bad/manifest.ttl @@ -0,0 +1,449 @@ +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix rdft: <http://www.w3.org/ns/rdftest#> . + +<> + rdf:type mf:Manifest ; + rdfs:comment "Serd bad syntax test cases" ; + mf:entries ( + <#bad-00> + <#bad-01> + <#bad-02> + <#bad-03> + <#bad-04> + <#bad-05> + <#bad-06> + <#bad-07> + <#bad-08> + <#bad-09> + <#bad-10> + <#bad-11> + <#bad-12> + <#bad-13> + <#bad-14> + <#bad-base> + <#bad-blank> + <#bad-blank-syntax> + <#bad-bom> + <#bad-char-in-local> + <#bad-char-in-prefix> + <#bad-char-in-uri> + <#bad-datatype-syntax> + <#bad-datatype> + <#bad-dot-after-subject> + <#bad-dot-in-collection> + <#bad-eof-after-quotes> + <#bad-eof-at-string-start> + <#bad-eof-in-blank> + <#bad-eof-in-escape> + <#bad-eof-in-lang-suffix> + <#bad-eof-in-lang> + <#bad-eof-in-list> + <#bad-eof-in-object-list2> + <#bad-eof-in-object-list> + <#bad-eof-in-predicate-list> + <#bad-eof-in-long-string> + <#bad-eof-in-string> + <#bad-eof-in-triple-quote> + <#bad-eof-in-uri> + <#bad-eof-in-uri-scheme> + <#bad-escape> + <#bad-ext-namedblank-op> + <#bad-graph-blank-label> + <#bad-hex-digit> + # Not in the spec <#bad-id-clash> + <#bad-lang> + <#bad-list2> + <#bad-list> + <#bad-long-literal-in-list> + <#bad-missing-semi> + <#bad-misspelled-base> + <#bad-misspelled-prefix> + <#bad-namespace> + <#bad-ns> + <#bad-null-byte> + <#bad-num> + <#bad-object2> + <#bad-object> + <#bad-pn-escape> + <#bad-prefix> + <#bad-quote-in-uri> + <#bad-semicolon-after-subject> + <#bad-string> + <#bad-subject> + <#bad-uri-escape> + <#bad-verb> + <#invalid-char-in-local> + <#invalid-char-in-prefix> + <#bad-missing-uri-scheme.nt> + <#bad-uri-scheme.nt> + <#bad-uri-scheme-start.nt> + <#bad-uri-truncated.nt> + ) . + +<#bad-00> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-00" ; + mf:action <bad-00.ttl> . + +<#bad-01> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-01" ; + mf:action <bad-01.ttl> . + +<#bad-02> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-02" ; + mf:action <bad-02.ttl> . + +<#bad-03> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-03" ; + mf:action <bad-03.ttl> . + +<#bad-04> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-04" ; + mf:action <bad-04.ttl> . + +<#bad-05> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-05" ; + mf:action <bad-05.ttl> . + +<#bad-06> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-06" ; + mf:action <bad-06.ttl> . + +<#bad-07> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-07" ; + mf:action <bad-07.ttl> . + +<#bad-08> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-08" ; + mf:action <bad-08.ttl> . + +<#bad-09> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-09" ; + mf:action <bad-09.ttl> . + +<#bad-10> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-10" ; + mf:action <bad-10.ttl> . + +<#bad-11> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-11" ; + mf:action <bad-11.ttl> . + +<#bad-12> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-12" ; + mf:action <bad-12.ttl> . + +<#bad-13> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-13" ; + mf:action <bad-13.ttl> . + +<#bad-14> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-14" ; + mf:action <bad-14.ttl> . + +<#bad-base> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-base" ; + mf:action <bad-base.ttl> . + +<#bad-blank> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-blank" ; + mf:action <bad-blank.ttl> . + +<#bad-blank-syntax> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-blank-syntax" ; + mf:action <bad-blank-syntax.ttl> . + +<#bad-bom> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-bom" ; + mf:action <bad-bom.ttl> . + +<#bad-char-in-local> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-char-in-local" ; + mf:action <bad-char-in-local.ttl> . + +<#bad-char-in-prefix> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-char-in-prefix" ; + mf:action <bad-char-in-prefix.ttl> . + +<#bad-char-in-uri> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-char-in-uri" ; + mf:action <bad-char-in-uri.ttl> . + +<#bad-datatype-syntax> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-datatype-syntax" ; + mf:action <bad-datatype-syntax.ttl> . + +<#bad-datatype> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-datatype" ; + mf:action <bad-datatype.ttl> . + +<#bad-dot-after-subject> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-dot-after-subject" ; + mf:action <bad-dot-after-subject.ttl> . + +<#bad-dot-in-collection> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-dot-in-collection" ; + mf:action <bad-dot-in-collection.ttl> . + +<#bad-eof-after-quotes> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-after-quotes" ; + mf:action <bad-eof-after-quotes.ttl> . + +<#bad-eof-at-string-start> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-at-string-start" ; + mf:action <bad-eof-at-string-start.ttl> . + +<#bad-eof-in-blank> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-blank" ; + mf:action <bad-eof-in-blank.ttl> . + +<#bad-eof-in-escape> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-escape" ; + mf:action <bad-eof-in-escape.ttl> . + +<#bad-eof-in-lang-suffix> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-lang-suffix" ; + mf:action <bad-eof-in-lang-suffix.ttl> . + +<#bad-eof-in-lang> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-lang" ; + mf:action <bad-eof-in-lang.ttl> . + +<#bad-eof-in-list> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-list" ; + mf:action <bad-eof-in-list.ttl> . + +<#bad-eof-in-object-list2> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-object-list2" ; + mf:action <bad-eof-in-object-list2.ttl> . + +<#bad-eof-in-object-list> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-object-list" ; + mf:action <bad-eof-in-object-list.ttl> . + +<#bad-eof-in-predicate-list> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-predicate-list" ; + mf:action <bad-eof-in-predicate-list.ttl> . + +<#bad-eof-in-long-string> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-long-string" ; + mf:action <bad-eof-in-long-string.ttl> . + +<#bad-eof-in-string> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-string" ; + mf:action <bad-eof-in-string.ttl> . + +<#bad-eof-in-triple-quote> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-triple-quote" ; + mf:action <bad-eof-in-triple-quote.ttl> . + +<#bad-eof-in-uri> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-eof-in-uri" ; + mf:action <bad-eof-in-uri.ttl> . + +<#bad-eof-in-uri-scheme> + rdf:type rdft:TestNTriplesNegativeSyntax ; + mf:name "bad-eof-in-uri-scheme" ; + mf:action <bad-eof-in-uri-scheme.nt> . + +<#bad-escape> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-escape" ; + mf:action <bad-escape.ttl> . + +<#bad-ext-namedblank-op> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-ext-namedblank-op" ; + mf:action <bad-ext-namedblank-op.ttl> . + +<#bad-graph-blank-label> + rdf:type rdft:TestTrigNegativeSyntax ; + mf:name "bad-graph-blank-label" ; + mf:action <bad-graph-blank-label.trig> . + +<#bad-hex-digit> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-hex-digit" ; + mf:action <bad-hex-digit.ttl> . + +<#bad-id-clash> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-id-clash" ; + mf:action <bad-id-clash.ttl> . + +<#bad-lang> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-lang" ; + mf:action <bad-lang.ttl> . + +<#bad-list2> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-list2" ; + mf:action <bad-list2.ttl> . + +<#bad-list> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-list" ; + mf:action <bad-list.ttl> . + +<#bad-long-literal-in-list> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-long-literal-in-list" ; + mf:action <bad-long-literal-in-list.ttl> . + +<#bad-missing-semi> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-missing-semi" ; + mf:action <bad-missing-semi.ttl> . + +<#bad-misspelled-base> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-misspelled-base" ; + mf:action <bad-misspelled-base.ttl> . + +<#bad-misspelled-prefix> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-misspelled-prefix" ; + mf:action <bad-misspelled-prefix.ttl> . + +<#bad-namespace> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-namespace" ; + mf:action <bad-namespace.ttl> . + +<#bad-ns> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-ns" ; + mf:action <bad-ns.ttl> . + +<#bad-null-byte> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-null-byte" ; + mf:action <bad-null-byte.ttl> . + +<#bad-num> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-num" ; + mf:action <bad-num.ttl> . + +<#bad-object2> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-object2" ; + mf:action <bad-object2.ttl> . + +<#bad-object> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-object" ; + mf:action <bad-object.ttl> . + +<#bad-pn-escape> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-pn-escape" ; + mf:action <bad-pn-escape.ttl> . + +<#bad-prefix> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-prefix" ; + mf:action <bad-prefix.ttl> . + +<#bad-quote-in-uri> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-quote-in-uri" ; + mf:action <bad-quote-in-uri.ttl> . + +<#bad-semicolon-after-subject> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-semicolon-after-subject" ; + mf:action <bad-semicolon-after-subject.ttl> . + +<#bad-string> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-string" ; + mf:action <bad-string.ttl> . + +<#bad-subject> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-subject" ; + mf:action <bad-subject.ttl> . + +<#bad-uri-escape> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-uri-escape" ; + mf:action <bad-uri-escape.ttl> . + +<#bad-verb> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "bad-verb" ; + mf:action <bad-verb.ttl> . + +<#invalid-char-in-local> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "invalid-char-in-local" ; + mf:action <invalid-char-in-local.ttl> . + +<#invalid-char-in-prefix> + rdf:type rdft:TestTurtleNegativeSyntax ; + mf:name "invalid-char-in-prefix" ; + mf:action <invalid-char-in-prefix.ttl> . + +<#bad-missing-uri-scheme.nt> + rdf:type rdft:TestNTriplesNegativeSyntax ; + mf:name "bad-missing-uri-scheme" ; + mf:action <bad-missing-uri-scheme.nt> . + +<#bad-uri-scheme.nt> + rdf:type rdft:TestNTriplesNegativeSyntax ; + mf:name "bad-uri-scheme" ; + mf:action <bad-uri-scheme.nt> . + +<#bad-uri-scheme-start.nt> + rdf:type rdft:TestNTriplesNegativeSyntax ; + mf:name "bad-uri-scheme-start" ; + mf:action <bad-uri-scheme-start.nt> . + +<#bad-uri-truncated.nt> + rdf:type rdft:TestNTriplesNegativeSyntax ; + mf:name "bad-uri-truncated" ; + mf:action <bad-uri-truncated.nt> . + diff --git a/testsuite/serd-tests/good/README.txt b/testsuite/serd-tests/good/README.txt new file mode 100644 index 00000000..37460e60 --- /dev/null +++ b/testsuite/serd-tests/good/README.txt @@ -0,0 +1,20 @@ +These are the tests for the Turtle Terse RDF Triple Language +that must be passed by conformant systems. See + http://www.dajobe.org/2004/01/turtle/ +for the full conformance information. + +The format is a set of good tests and bad tests. + +Good tests are a pair of files: + abc.ttl abc.out +which are the input Turtle file and the expected output RDF triples, +written in N-Triples. + +bad tests are of the form + bad-XX.ttl +which must fail. + +The tests should be performed with an assumed base URI +of http://www.w3.org/2001/sw/DataAccess/df1/tests/ + +Dave diff --git a/testsuite/serd-tests/good/UTF-8.nt b/testsuite/serd-tests/good/UTF-8.nt new file mode 100644 index 00000000..c6c67bcb --- /dev/null +++ b/testsuite/serd-tests/good/UTF-8.nt @@ -0,0 +1,2 @@ +<http://drobilla.net/sw/serd/test/good/UTF-8.ttl> <http://www.w3.org/2000/01/rdf-schema#comment> "\nUTF-8 encoded sample plain-text file\n\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\u203E\n\nMarkus Kuhn [\u02C8ma\u02B3k\u028As ku\u02D0n] <http://www.cl.cam.ac.uk/~mgk25/> \u2014 2002-07-25\n\n\nThe ASCII compatible UTF-8 encoding used in this plain-text file\nis defined in Unicode, ISO 10646-1, and RFC 2279.\n\n\nUsing Unicode/UTF-8, you can write in emails and source code things such as\n\nMathematics and sciences:\n\n \u222E E\u22C5da = Q, n \u2192 \u221E, \u2211 f(i) = \u220F g(i), \u23A7\u23A1\u239B\u250C\u2500\u2500\u2500\u2500\u2500\u2510\u239E\u23A4\u23AB\n \u23AA\u23A2\u239C\u2502a\u00B2+b\u00B3 \u239F\u23A5\u23AA\n \u2200x\u2208\u211D: \u2308x\u2309 = \u2212\u230A\u2212x\u230B, \u03B1 \u2227 \u00AC\u03B2 = \u00AC(\u00AC\u03B1 \u2228 \u03B2), \u23AA\u23A2\u239C\u2502\u2500\u2500\u2500\u2500\u2500 \u239F\u23A5\u23AA\n \u23AA\u23A2\u239C\u23B7 c\u2088 \u239F\u23A5\u23AA\n \u2115 \u2286 \u2115\u2080 \u2282 \u2124 \u2282 \u211A \u2282 \u211D \u2282 \u2102, \u23A8\u23A2\u239C \u239F\u23A5\u23AC\n \u23AA\u23A2\u239C \u221E \u239F\u23A5\u23AA\n \u22A5 < a \u2260 b \u2261 c \u2264 d \u226A \u22A4 \u21D2 (\u27E6A\u27E7 \u21D4 \u27EAB\u27EB), \u23AA\u23A2\u239C \u23B2 \u239F\u23A5\u23AA\n \u23AA\u23A2\u239C \u23B3a\u2071-b\u2071\u239F\u23A5\u23AA\n 2H\u2082 + O\u2082 \u21CC 2H\u2082O, R = 4.7 k\u03A9, \u2300 200 mm \u23A9\u23A3\u239Di=1 \u23A0\u23A6\u23AD\n\nLinguistics and dictionaries:\n\n \u00F0i \u0131nt\u0259\u02C8n\u00E6\u0283\u0259n\u0259l f\u0259\u02C8n\u025Bt\u0131k \u0259so\u028Asi\u02C8e\u0131\u0283n\n Y [\u02C8\u028Fpsil\u0254n], Yen [j\u025Bn], Yoga [\u02C8jo\u02D0g\u0251]\n\nAPL:\n\n ((V\u2373V)=\u2373\u2374V)/V\u2190,V \u2337\u2190\u2373\u2192\u2374\u2206\u2207\u2283\u203E\u234E\u2355\u2308\n\nNicer typography in plain text files:\n\n \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n \u2551 \u2551\n \u2551 \u2022 \u2018single\u2019 and \u201Cdouble\u201D quotes \u2551\n \u2551 \u2551\n \u2551 \u2022 Curly apostrophes: \u201CWe\u2019ve been here\u201D \u2551\n \u2551 \u2551\n \u2551 \u2022 Latin-1 apostrophe and accents: '\u00B4` \u2551\n \u2551 \u2551\n \u2551 \u2022 \u201Adeutsche\u2018 \u201EAnf\u00FChrungszeichen\u201C \u2551\n \u2551 \u2551\n \u2551 \u2022 \u2020, \u2021, \u2030, \u2022, 3\u20134, \u2014, \u22125/+5, \u2122, \u2026 \u2551\n \u2551 \u2551\n \u2551 \u2022 ASCII safety test: 1lI|, 0OD, 8B \u2551\n \u2551 \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E \u2551\n \u2551 \u2022 the euro symbol: \u2502 14.95 \u20AC \u2502 \u2551\n \u2551 \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F \u2551\n \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n\nCombining characters:\n\n STARG\u039B\u030ATE SG-1, a = v\u0307 = r\u0308, a\u20D1 \u22A5 b\u20D1\n\nGreek (in Polytonic):\n\n The Greek anthem:\n\n \u03A3\u1F72 \u03B3\u03BD\u03C9\u03C1\u1F77\u03B6\u03C9 \u1F00\u03C0\u1F78 \u03C4\u1F74\u03BD \u03BA\u1F79\u03C8\u03B7\n \u03C4\u03BF\u1FE6 \u03C3\u03C0\u03B1\u03B8\u03B9\u03BF\u1FE6 \u03C4\u1F74\u03BD \u03C4\u03C1\u03BF\u03BC\u03B5\u03C1\u1F75,\n \u03C3\u1F72 \u03B3\u03BD\u03C9\u03C1\u1F77\u03B6\u03C9 \u1F00\u03C0\u1F78 \u03C4\u1F74\u03BD \u1F44\u03C8\u03B7\n \u03C0\u03BF\u1F7A \u03BC\u1F72 \u03B2\u1F77\u03B1 \u03BC\u03B5\u03C4\u03C1\u1F71\u03B5\u03B9 \u03C4\u1F74 \u03B3\u1FC6.\n\n \u1FBF\u0391\u03C0\u1FBF \u03C4\u1F70 \u03BA\u1F79\u03BA\u03BA\u03B1\u03BB\u03B1 \u03B2\u03B3\u03B1\u03BB\u03BC\u1F73\u03BD\u03B7\n \u03C4\u1FF6\u03BD \u1FFE\u0395\u03BB\u03BB\u1F75\u03BD\u03C9\u03BD \u03C4\u1F70 \u1F31\u03B5\u03C1\u1F71\n \u03BA\u03B1\u1F76 \u03C3\u1F70\u03BD \u03C0\u03C1\u1FF6\u03C4\u03B1 \u1F00\u03BD\u03B4\u03C1\u03B5\u03B9\u03C9\u03BC\u1F73\u03BD\u03B7\n \u03C7\u03B1\u1FD6\u03C1\u03B5, \u1F66 \u03C7\u03B1\u1FD6\u03C1\u03B5, \u1FBF\u0395\u03BB\u03B5\u03C5\u03B8\u03B5\u03C1\u03B9\u1F71!\n\n From a speech of Demosthenes in the 4th century BC:\n\n \u039F\u1F50\u03C7\u1F76 \u03C4\u03B1\u1F50\u03C4\u1F70 \u03C0\u03B1\u03C1\u1F77\u03C3\u03C4\u03B1\u03C4\u03B1\u1F77 \u03BC\u03BF\u03B9 \u03B3\u03B9\u03B3\u03BD\u1F7D\u03C3\u03BA\u03B5\u03B9\u03BD, \u1F66 \u1F04\u03BD\u03B4\u03C1\u03B5\u03C2 \u1FBF\u0391\u03B8\u03B7\u03BD\u03B1\u1FD6\u03BF\u03B9,\n \u1F45\u03C4\u03B1\u03BD \u03C4\u1FBF \u03B5\u1F30\u03C2 \u03C4\u1F70 \u03C0\u03C1\u1F71\u03B3\u03BC\u03B1\u03C4\u03B1 \u1F00\u03C0\u03BF\u03B2\u03BB\u1F73\u03C8\u03C9 \u03BA\u03B1\u1F76 \u1F45\u03C4\u03B1\u03BD \u03C0\u03C1\u1F78\u03C2 \u03C4\u03BF\u1F7A\u03C2\n \u03BB\u1F79\u03B3\u03BF\u03C5\u03C2 \u03BF\u1F53\u03C2 \u1F00\u03BA\u03BF\u1F7B\u03C9\u0387 \u03C4\u03BF\u1F7A\u03C2 \u03BC\u1F72\u03BD \u03B3\u1F70\u03C1 \u03BB\u1F79\u03B3\u03BF\u03C5\u03C2 \u03C0\u03B5\u03C1\u1F76 \u03C4\u03BF\u1FE6\n \u03C4\u03B9\u03BC\u03C9\u03C1\u1F75\u03C3\u03B1\u03C3\u03B8\u03B1\u03B9 \u03A6\u1F77\u03BB\u03B9\u03C0\u03C0\u03BF\u03BD \u1F41\u03C1\u1FF6 \u03B3\u03B9\u03B3\u03BD\u03BF\u03BC\u1F73\u03BD\u03BF\u03C5\u03C2, \u03C4\u1F70 \u03B4\u1F72 \u03C0\u03C1\u1F71\u03B3\u03BC\u03B1\u03C4\u1FBF\n \u03B5\u1F30\u03C2 \u03C4\u03BF\u1FE6\u03C4\u03BF \u03C0\u03C1\u03BF\u1F75\u03BA\u03BF\u03BD\u03C4\u03B1, \u1F65\u03C3\u03B8\u1FBF \u1F45\u03C0\u03C9\u03C2 \u03BC\u1F74 \u03C0\u03B5\u03B9\u03C3\u1F79\u03BC\u03B5\u03B8\u1FBF \u03B1\u1F50\u03C4\u03BF\u1F76\n \u03C0\u03C1\u1F79\u03C4\u03B5\u03C1\u03BF\u03BD \u03BA\u03B1\u03BA\u1FF6\u03C2 \u03C3\u03BA\u1F73\u03C8\u03B1\u03C3\u03B8\u03B1\u03B9 \u03B4\u1F73\u03BF\u03BD. \u03BF\u1F50\u03B4\u1F73\u03BD \u03BF\u1F56\u03BD \u1F04\u03BB\u03BB\u03BF \u03BC\u03BF\u03B9 \u03B4\u03BF\u03BA\u03BF\u1FE6\u03C3\u03B9\u03BD\n \u03BF\u1F31 \u03C4\u1F70 \u03C4\u03BF\u03B9\u03B1\u1FE6\u03C4\u03B1 \u03BB\u1F73\u03B3\u03BF\u03BD\u03C4\u03B5\u03C2 \u1F22 \u03C4\u1F74\u03BD \u1F51\u03C0\u1F79\u03B8\u03B5\u03C3\u03B9\u03BD, \u03C0\u03B5\u03C1\u1F76 \u1F27\u03C2 \u03B2\u03BF\u03C5\u03BB\u03B5\u1F7B\u03B5\u03C3\u03B8\u03B1\u03B9,\n \u03BF\u1F50\u03C7\u1F76 \u03C4\u1F74\u03BD \u03BF\u1F56\u03C3\u03B1\u03BD \u03C0\u03B1\u03C1\u03B9\u03C3\u03C4\u1F71\u03BD\u03C4\u03B5\u03C2 \u1F51\u03BC\u1FD6\u03BD \u1F01\u03BC\u03B1\u03C1\u03C4\u1F71\u03BD\u03B5\u03B9\u03BD. \u1F10\u03B3\u1F7C \u03B4\u1F73, \u1F45\u03C4\u03B9 \u03BC\u1F73\u03BD\n \u03C0\u03BF\u03C4\u1FBF \u1F10\u03BE\u1FC6\u03BD \u03C4\u1FC7 \u03C0\u1F79\u03BB\u03B5\u03B9 \u03BA\u03B1\u1F76 \u03C4\u1F70 \u03B1\u1F51\u03C4\u1FC6\u03C2 \u1F14\u03C7\u03B5\u03B9\u03BD \u1F00\u03C3\u03C6\u03B1\u03BB\u1FF6\u03C2 \u03BA\u03B1\u1F76 \u03A6\u1F77\u03BB\u03B9\u03C0\u03C0\u03BF\u03BD\n \u03C4\u03B9\u03BC\u03C9\u03C1\u1F75\u03C3\u03B1\u03C3\u03B8\u03B1\u03B9, \u03BA\u03B1\u1F76 \u03BC\u1F71\u03BB\u1FBF \u1F00\u03BA\u03C1\u03B9\u03B2\u1FF6\u03C2 \u03BF\u1F36\u03B4\u03B1\u0387 \u1F10\u03C0\u1FBF \u1F10\u03BC\u03BF\u1FE6 \u03B3\u1F71\u03C1, \u03BF\u1F50 \u03C0\u1F71\u03BB\u03B1\u03B9\n \u03B3\u1F73\u03B3\u03BF\u03BD\u03B5\u03BD \u03C4\u03B1\u1FE6\u03C4\u1FBF \u1F00\u03BC\u03C6\u1F79\u03C4\u03B5\u03C1\u03B1\u0387 \u03BD\u1FE6\u03BD \u03BC\u1F73\u03BD\u03C4\u03BF\u03B9 \u03C0\u1F73\u03C0\u03B5\u03B9\u03C3\u03BC\u03B1\u03B9 \u03C4\u03BF\u1FE6\u03B8\u1FBF \u1F31\u03BA\u03B1\u03BD\u1F78\u03BD\n \u03C0\u03C1\u03BF\u03BB\u03B1\u03B2\u03B5\u1FD6\u03BD \u1F21\u03BC\u1FD6\u03BD \u03B5\u1F36\u03BD\u03B1\u03B9 \u03C4\u1F74\u03BD \u03C0\u03C1\u1F7D\u03C4\u03B7\u03BD, \u1F45\u03C0\u03C9\u03C2 \u03C4\u03BF\u1F7A\u03C2 \u03C3\u03C5\u03BC\u03BC\u1F71\u03C7\u03BF\u03C5\u03C2\n \u03C3\u1F7D\u03C3\u03BF\u03BC\u03B5\u03BD. \u1F10\u1F70\u03BD \u03B3\u1F70\u03C1 \u03C4\u03BF\u1FE6\u03C4\u03BF \u03B2\u03B5\u03B2\u03B1\u1F77\u03C9\u03C2 \u1F51\u03C0\u1F71\u03C1\u03BE\u1FC3, \u03C4\u1F79\u03C4\u03B5 \u03BA\u03B1\u1F76 \u03C0\u03B5\u03C1\u1F76 \u03C4\u03BF\u1FE6\n \u03C4\u1F77\u03BD\u03B1 \u03C4\u03B9\u03BC\u03C9\u03C1\u1F75\u03C3\u03B5\u03C4\u03B1\u1F77 \u03C4\u03B9\u03C2 \u03BA\u03B1\u1F76 \u1F43\u03BD \u03C4\u03C1\u1F79\u03C0\u03BF\u03BD \u1F10\u03BE\u1F73\u03C3\u03C4\u03B1\u03B9 \u03C3\u03BA\u03BF\u03C0\u03B5\u1FD6\u03BD\u0387 \u03C0\u03C1\u1F76\u03BD \u03B4\u1F72\n \u03C4\u1F74\u03BD \u1F00\u03C1\u03C7\u1F74\u03BD \u1F40\u03C1\u03B8\u1FF6\u03C2 \u1F51\u03C0\u03BF\u03B8\u1F73\u03C3\u03B8\u03B1\u03B9, \u03BC\u1F71\u03C4\u03B1\u03B9\u03BF\u03BD \u1F21\u03B3\u03BF\u1FE6\u03BC\u03B1\u03B9 \u03C0\u03B5\u03C1\u1F76 \u03C4\u1FC6\u03C2\n \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u1FC6\u03C2 \u1F41\u03BD\u03C4\u03B9\u03BD\u03BF\u1FE6\u03BD \u03C0\u03BF\u03B9\u03B5\u1FD6\u03C3\u03B8\u03B1\u03B9 \u03BB\u1F79\u03B3\u03BF\u03BD.\n\n \u0394\u03B7\u03BC\u03BF\u03C3\u03B8\u1F73\u03BD\u03BF\u03C5\u03C2, \u0393\u1FFD \u1FBF\u039F\u03BB\u03C5\u03BD\u03B8\u03B9\u03B1\u03BA\u1F78\u03C2\n\nGeorgian:\n\n From a Unicode conference invitation:\n\n \u10D2\u10D7\u10EE\u10DD\u10D5\u10D7 \u10D0\u10EE\u10DA\u10D0\u10D5\u10D4 \u10D2\u10D0\u10D8\u10D0\u10E0\u10DD\u10D7 \u10E0\u10D4\u10D2\u10D8\u10E1\u10E2\u10E0\u10D0\u10EA\u10D8\u10D0 Unicode-\u10D8\u10E1 \u10DB\u10D4\u10D0\u10D7\u10D4 \u10E1\u10D0\u10D4\u10E0\u10D7\u10D0\u10E8\u10DD\u10E0\u10D8\u10E1\u10DD\n \u10D9\u10DD\u10DC\u10E4\u10D4\u10E0\u10D4\u10DC\u10EA\u10D8\u10D0\u10D6\u10D4 \u10D3\u10D0\u10E1\u10D0\u10E1\u10EC\u10E0\u10D4\u10D1\u10D0\u10D3, \u10E0\u10DD\u10DB\u10D4\u10DA\u10D8\u10EA \u10D2\u10D0\u10D8\u10DB\u10D0\u10E0\u10D7\u10D4\u10D1\u10D0 10-12 \u10DB\u10D0\u10E0\u10E2\u10E1,\n \u10E5. \u10DB\u10D0\u10D8\u10DC\u10EA\u10E8\u10D8, \u10D2\u10D4\u10E0\u10DB\u10D0\u10DC\u10D8\u10D0\u10E8\u10D8. \u10D9\u10DD\u10DC\u10E4\u10D4\u10E0\u10D4\u10DC\u10EA\u10D8\u10D0 \u10E8\u10D4\u10F0\u10D9\u10E0\u10D4\u10D1\u10E1 \u10D4\u10E0\u10D7\u10D0\u10D3 \u10DB\u10E1\u10DD\u10E4\u10DA\u10D8\u10DD\u10E1\n \u10D4\u10E5\u10E1\u10DE\u10D4\u10E0\u10E2\u10D4\u10D1\u10E1 \u10D8\u10E1\u10D4\u10D7 \u10D3\u10D0\u10E0\u10D2\u10D4\u10D1\u10E8\u10D8 \u10E0\u10DD\u10D2\u10DD\u10E0\u10D8\u10EA\u10D0\u10D0 \u10D8\u10DC\u10E2\u10D4\u10E0\u10DC\u10D4\u10E2\u10D8 \u10D3\u10D0 Unicode-\u10D8,\n \u10D8\u10DC\u10E2\u10D4\u10E0\u10DC\u10D0\u10EA\u10D8\u10DD\u10DC\u10D0\u10DA\u10D8\u10D6\u10D0\u10EA\u10D8\u10D0 \u10D3\u10D0 \u10DA\u10DD\u10D9\u10D0\u10DA\u10D8\u10D6\u10D0\u10EA\u10D8\u10D0, Unicode-\u10D8\u10E1 \u10D2\u10D0\u10DB\u10DD\u10E7\u10D4\u10DC\u10D4\u10D1\u10D0\n \u10DD\u10DE\u10D4\u10E0\u10D0\u10EA\u10D8\u10E3\u10DA \u10E1\u10D8\u10E1\u10E2\u10D4\u10DB\u10D4\u10D1\u10E1\u10D0, \u10D3\u10D0 \u10D2\u10D0\u10DB\u10DD\u10E7\u10D4\u10DC\u10D4\u10D1\u10D8\u10D7 \u10DE\u10E0\u10DD\u10D2\u10E0\u10D0\u10DB\u10D4\u10D1\u10E8\u10D8, \u10E8\u10E0\u10D8\u10E4\u10E2\u10D4\u10D1\u10E8\u10D8,\n \u10E2\u10D4\u10E5\u10E1\u10E2\u10D4\u10D1\u10D8\u10E1 \u10D3\u10D0\u10DB\u10E3\u10E8\u10D0\u10D5\u10D4\u10D1\u10D0\u10E1\u10D0 \u10D3\u10D0 \u10DB\u10E0\u10D0\u10D5\u10D0\u10DA\u10D4\u10DC\u10DD\u10D5\u10D0\u10DC \u10D9\u10DD\u10DB\u10DE\u10D8\u10E3\u10E2\u10D4\u10E0\u10E3\u10DA \u10E1\u10D8\u10E1\u10E2\u10D4\u10DB\u10D4\u10D1\u10E8\u10D8.\n\nRussian:\n\n From a Unicode conference invitation:\n\n \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0442\u0435\u0441\u044C \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0430 \u0414\u0435\u0441\u044F\u0442\u0443\u044E \u041C\u0435\u0436\u0434\u0443\u043D\u0430\u0440\u043E\u0434\u043D\u0443\u044E \u041A\u043E\u043D\u0444\u0435\u0440\u0435\u043D\u0446\u0438\u044E \u043F\u043E\n Unicode, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u043E\u0441\u0442\u043E\u0438\u0442\u0441\u044F 10-12 \u043C\u0430\u0440\u0442\u0430 1997 \u0433\u043E\u0434\u0430 \u0432 \u041C\u0430\u0439\u043D\u0446\u0435 \u0432 \u0413\u0435\u0440\u043C\u0430\u043D\u0438\u0438.\n \u041A\u043E\u043D\u0444\u0435\u0440\u0435\u043D\u0446\u0438\u044F \u0441\u043E\u0431\u0435\u0440\u0435\u0442 \u0448\u0438\u0440\u043E\u043A\u0438\u0439 \u043A\u0440\u0443\u0433 \u044D\u043A\u0441\u043F\u0435\u0440\u0442\u043E\u0432 \u043F\u043E \u0432\u043E\u043F\u0440\u043E\u0441\u0430\u043C \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u043E\u0433\u043E\n \u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0430 \u0438 Unicode, \u043B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u043D\u0442\u0435\u0440\u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u043E\u043F\u043B\u043E\u0449\u0435\u043D\u0438\u044E \u0438\n \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044E Unicode \u0432 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0445 \u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u044B\u0445\n \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445, \u0448\u0440\u0438\u0444\u0442\u0430\u0445, \u0432\u0435\u0440\u0441\u0442\u043A\u0435 \u0438 \u043C\u043D\u043E\u0433\u043E\u044F\u0437\u044B\u0447\u043D\u044B\u0445 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u043D\u044B\u0445 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0445.\n\nThai (UCS Level 2):\n\n Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese\n classic 'San Gua'):\n\n [----------------------------|------------------------]\n \u0E4F \u0E41\u0E1C\u0E48\u0E19\u0E14\u0E34\u0E19\u0E2E\u0E31\u0E48\u0E19\u0E40\u0E2A\u0E37\u0E48\u0E2D\u0E21\u0E42\u0E17\u0E23\u0E21\u0E41\u0E2A\u0E19\u0E2A\u0E31\u0E07\u0E40\u0E27\u0E0A \u0E1E\u0E23\u0E30\u0E1B\u0E01\u0E40\u0E01\u0E28\u0E01\u0E2D\u0E07\u0E1A\u0E39\u0E4A\u0E01\u0E39\u0E49\u0E02\u0E36\u0E49\u0E19\u0E43\u0E2B\u0E21\u0E48\n \u0E2A\u0E34\u0E1A\u0E2A\u0E2D\u0E07\u0E01\u0E29\u0E31\u0E15\u0E23\u0E34\u0E22\u0E4C\u0E01\u0E48\u0E2D\u0E19\u0E2B\u0E19\u0E49\u0E32\u0E41\u0E25\u0E16\u0E31\u0E14\u0E44\u0E1B \u0E2A\u0E2D\u0E07\u0E2D\u0E07\u0E04\u0E4C\u0E44\u0E0B\u0E23\u0E49\u0E42\u0E07\u0E48\u0E40\u0E02\u0E25\u0E32\u0E40\u0E1A\u0E32\u0E1B\u0E31\u0E0D\u0E0D\u0E32\n \u0E17\u0E23\u0E07\u0E19\u0E31\u0E1A\u0E16\u0E37\u0E2D\u0E02\u0E31\u0E19\u0E17\u0E35\u0E40\u0E1B\u0E47\u0E19\u0E17\u0E35\u0E48\u0E1E\u0E36\u0E48\u0E07 \u0E1A\u0E49\u0E32\u0E19\u0E40\u0E21\u0E37\u0E2D\u0E07\u0E08\u0E36\u0E07\u0E27\u0E34\u0E1B\u0E23\u0E34\u0E15\u0E40\u0E1B\u0E47\u0E19\u0E19\u0E31\u0E01\u0E2B\u0E19\u0E32\n \u0E42\u0E2E\u0E08\u0E34\u0E4B\u0E19\u0E40\u0E23\u0E35\u0E22\u0E01\u0E17\u0E31\u0E1E\u0E17\u0E31\u0E48\u0E27\u0E2B\u0E31\u0E27\u0E40\u0E21\u0E37\u0E2D\u0E07\u0E21\u0E32 \u0E2B\u0E21\u0E32\u0E22\u0E08\u0E30\u0E06\u0E48\u0E32\u0E21\u0E14\u0E0A\u0E31\u0E48\u0E27\u0E15\u0E31\u0E27\u0E2A\u0E33\u0E04\u0E31\u0E0D\n \u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E02\u0E31\u0E1A\u0E44\u0E2A\u0E44\u0E25\u0E48\u0E40\u0E2A\u0E37\u0E2D\u0E08\u0E32\u0E01\u0E40\u0E04\u0E2B\u0E32 \u0E23\u0E31\u0E1A\u0E2B\u0E21\u0E32\u0E1B\u0E48\u0E32\u0E40\u0E02\u0E49\u0E32\u0E21\u0E32\u0E40\u0E25\u0E22\u0E2D\u0E32\u0E2A\u0E31\u0E0D\n \u0E1D\u0E48\u0E32\u0E22\u0E2D\u0E49\u0E2D\u0E07\u0E2D\u0E38\u0E49\u0E19\u0E22\u0E38\u0E41\u0E22\u0E01\u0E43\u0E2B\u0E49\u0E41\u0E15\u0E01\u0E01\u0E31\u0E19 \u0E43\u0E0A\u0E49\u0E2A\u0E32\u0E27\u0E19\u0E31\u0E49\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E0A\u0E19\u0E27\u0E19\u0E0A\u0E37\u0E48\u0E19\u0E0A\u0E27\u0E19\u0E43\u0E08\n \u0E1E\u0E25\u0E31\u0E19\u0E25\u0E34\u0E09\u0E38\u0E22\u0E01\u0E38\u0E22\u0E01\u0E35\u0E01\u0E25\u0E31\u0E1A\u0E01\u0E48\u0E2D\u0E40\u0E2B\u0E15\u0E38 \u0E0A\u0E48\u0E32\u0E07\u0E2D\u0E32\u0E40\u0E1E\u0E28\u0E08\u0E23\u0E34\u0E07\u0E2B\u0E19\u0E32\u0E1F\u0E49\u0E32\u0E23\u0E49\u0E2D\u0E07\u0E44\u0E2B\u0E49\n \u0E15\u0E49\u0E2D\u0E07\u0E23\u0E1A\u0E23\u0E32\u0E06\u0E48\u0E32\u0E1F\u0E31\u0E19\u0E08\u0E19\u0E1A\u0E23\u0E23\u0E25\u0E31\u0E22 \u0E24\u0E45\u0E2B\u0E32\u0E43\u0E04\u0E23\u0E04\u0E49\u0E33\u0E0A\u0E39\u0E01\u0E39\u0E49\u0E1A\u0E23\u0E23\u0E25\u0E31\u0E07\u0E01\u0E4C \u0E2F\n\n (The above is a two-column text. If combining characters are handled\n correctly, the lines of the second column should be aligned with the\n | character above.)\n\nEthiopian:\n\n Proverbs in the Amharic language:\n\n \u1230\u121B\u12ED \u12A0\u12ED\u1273\u1228\u1235 \u1295\u1309\u1225 \u12A0\u12ED\u12A8\u1230\u1235\u1362\n \u1265\u120B \u12AB\u1208\u129D \u12A5\u1295\u12F0\u12A0\u1263\u1274 \u1260\u1246\u1218\u1320\u129D\u1362\n \u130C\u1325 \u12EB\u1208\u1264\u1271 \u1241\u121D\u1325\u1293 \u1290\u12CD\u1362\n \u12F0\u1200 \u1260\u1215\u120D\u1219 \u1245\u1264 \u1263\u12ED\u1320\u1323 \u1295\u1323\u1275 \u1260\u1308\u12F0\u1208\u12CD\u1362\n \u12E8\u12A0\u134D \u12C8\u1208\u121D\u1273 \u1260\u1245\u1264 \u12A0\u12ED\u1273\u123D\u121D\u1362\n \u12A0\u12ED\u1325 \u1260\u1260\u120B \u12F3\u12CB \u1270\u1218\u1273\u1362\n \u1232\u1270\u1228\u1309\u1219 \u12ED\u12F0\u1228\u130D\u1219\u1362\n \u1240\u1235 \u1260\u1240\u1235\u1365 \u12D5\u1295\u1241\u120B\u120D \u1260\u12A5\u130D\u1229 \u12ED\u1204\u12F3\u120D\u1362\n \u12F5\u122D \u1262\u12EB\u1265\u122D \u12A0\u1295\u1260\u1233 \u12EB\u1235\u122D\u1362\n \u1230\u12CD \u12A5\u1295\u12F0\u1264\u1271 \u12A5\u1295\u1305 \u12A5\u1295\u12F0 \u1309\u1228\u1264\u1271 \u12A0\u12ED\u1270\u12F3\u12F0\u122D\u121D\u1362\n \u12A5\u130D\u12DC\u122D \u12E8\u12A8\u1348\u1270\u12CD\u1295 \u1309\u122E\u122E \u1233\u12ED\u12D8\u130B\u12CD \u12A0\u12ED\u12F5\u122D\u121D\u1362\n \u12E8\u130E\u1228\u1264\u1275 \u120C\u1263\u1365 \u1262\u12EB\u12E9\u1275 \u12ED\u1235\u1245 \u1263\u12EB\u12E9\u1275 \u12EB\u1320\u120D\u1245\u1362\n \u1225\u122B \u12A8\u1218\u134D\u1273\u1275 \u120D\u1304\u1295 \u120B\u134B\u1273\u1275\u1362\n \u12D3\u1263\u12ED \u121B\u12F0\u122A\u12EB \u12E8\u1208\u12CD\u1365 \u130D\u1295\u12F5 \u12ED\u12DE \u12ED\u12DE\u122B\u120D\u1362\n \u12E8\u12A5\u1235\u120B\u121D \u12A0\u1308\u1229 \u1218\u12AB \u12E8\u12A0\u121E\u122B \u12A0\u1308\u1229 \u12CB\u122D\u12AB\u1362\n \u1270\u1295\u130B\u120E \u1262\u1270\u1349 \u1270\u1218\u120D\u1236 \u1263\u1349\u1362\n \u12C8\u12F3\u1305\u1205 \u121B\u122D \u1262\u1206\u1295 \u1328\u122D\u1235\u1205 \u12A0\u1275\u120B\u1230\u12CD\u1362\n \u12A5\u130D\u122D\u1205\u1295 \u1260\u134D\u122B\u123D\u1205 \u120D\u12AD \u12D8\u122D\u130B\u1362\n\nRunes:\n\n \u16BB\u16D6 \u16B3\u16B9\u16AB\u16A6 \u16A6\u16AB\u16CF \u16BB\u16D6 \u16D2\u16A2\u16DE\u16D6 \u16A9\u16BE \u16A6\u16AB\u16D7 \u16DA\u16AA\u16BE\u16DE\u16D6 \u16BE\u16A9\u16B1\u16A6\u16B9\u16D6\u16AA\u16B1\u16DE\u16A2\u16D7 \u16B9\u16C1\u16A6 \u16A6\u16AA \u16B9\u16D6\u16E5\u16AB\n\n (Old English, which transcribed into Latin reads 'He cwaeth that he\n bude thaem lande northweardum with that Westsae.' and means 'He said\n that he lived in the northern land near the Western Sea.')\n\nBraille:\n\n \u284C\u2801\u2827\u2811 \u283C\u2801\u2812 \u284D\u281C\u2807\u2811\u2839\u2830\u280E \u2863\u2815\u280C\n\n \u284D\u281C\u2807\u2811\u2839 \u283A\u2801\u280E \u2819\u2811\u2801\u2819\u2812 \u281E\u2815 \u2803\u2811\u281B\u2814 \u283A\u280A\u2839\u2832 \u2879\u283B\u2811 \u280A\u280E \u281D\u2815 \u2819\u2833\u2803\u281E\n \u2831\u2801\u281E\u2811\u2827\u283B \u2801\u2803\u2833\u281E \u2839\u2801\u281E\u2832 \u2879\u2811 \u2817\u2811\u281B\u280A\u280C\u283B \u2815\u280B \u2819\u280A\u280E \u2803\u2825\u2817\u280A\u2801\u2807 \u283A\u2801\u280E\n \u280E\u280A\u281B\u281D\u282B \u2803\u2839 \u2839\u2811 \u280A\u2807\u283B\u281B\u2839\u280D\u2801\u281D\u2802 \u2839\u2811 \u280A\u2807\u283B\u2805\u2802 \u2839\u2811 \u2825\u281D\u2819\u283B\u281E\u2801\u2805\u283B\u2802\n \u2801\u281D\u2819 \u2839\u2811 \u2821\u280A\u2811\u280B \u280D\u2833\u2817\u281D\u283B\u2832 \u284E\u280A\u2817\u2815\u2815\u281B\u2811 \u280E\u280A\u281B\u281D\u282B \u280A\u281E\u2832 \u2841\u281D\u2819\n \u284E\u280A\u2817\u2815\u2815\u281B\u2811\u2830\u280E \u281D\u2801\u280D\u2811 \u283A\u2801\u280E \u281B\u2815\u2815\u2819 \u2825\u280F\u2815\u281D \u2830\u2861\u2801\u281D\u281B\u2811\u2802 \u280B\u2815\u2817 \u2801\u281D\u2839\u2839\u2814\u281B \u2819\u2811\n \u2821\u2815\u280E\u2811 \u281E\u2815 \u280F\u2825\u281E \u2819\u280A\u280E \u2819\u2801\u281D\u2819 \u281E\u2815\u2832\n\n \u2855\u2807\u2819 \u284D\u281C\u2807\u2811\u2839 \u283A\u2801\u280E \u2801\u280E \u2819\u2811\u2801\u2819 \u2801\u280E \u2801 \u2819\u2815\u2815\u2817\u2824\u281D\u2801\u280A\u2807\u2832\n\n \u284D\u2814\u2819\u2816 \u284A \u2819\u2815\u281D\u2830\u281E \u280D\u2811\u2801\u281D \u281E\u2815 \u280E\u2801\u2839 \u2839\u2801\u281E \u284A \u2805\u281D\u282A\u2802 \u2815\u280B \u280D\u2839\n \u282A\u281D \u2805\u281D\u282A\u2807\u282B\u281B\u2811\u2802 \u2831\u2801\u281E \u2839\u283B\u2811 \u280A\u280E \u280F\u281C\u281E\u280A\u280A\u2825\u2807\u281C\u2807\u2839 \u2819\u2811\u2801\u2819 \u2801\u2803\u2833\u281E\n \u2801 \u2819\u2815\u2815\u2817\u2824\u281D\u2801\u280A\u2807\u2832 \u284A \u280D\u280A\u2823\u281E \u2819\u2801\u2827\u2811 \u2803\u2811\u2832 \u2814\u280A\u2807\u2814\u282B\u2802 \u280D\u2839\u280E\u2811\u2807\u280B\u2802 \u281E\u2815\n \u2817\u2811\u281B\u281C\u2819 \u2801 \u280A\u2815\u280B\u280B\u2814\u2824\u281D\u2801\u280A\u2807 \u2801\u280E \u2839\u2811 \u2819\u2811\u2801\u2819\u2811\u280C \u280F\u280A\u2811\u280A\u2811 \u2815\u280B \u280A\u2817\u2815\u281D\u280D\u2815\u281D\u281B\u283B\u2839\n \u2814 \u2839\u2811 \u281E\u2817\u2801\u2819\u2811\u2832 \u2843\u2825\u281E \u2839\u2811 \u283A\u280A\u280E\u2819\u2815\u280D \u2815\u280B \u2833\u2817 \u2801\u281D\u280A\u2811\u280C\u2815\u2817\u280E\n \u280A\u280E \u2814 \u2839\u2811 \u280E\u280A\u280D\u280A\u2807\u2811\u2806 \u2801\u281D\u2819 \u280D\u2839 \u2825\u281D\u2819\u2801\u2807\u2807\u282A\u282B \u2819\u2801\u281D\u2819\u280E\n \u2829\u2801\u2807\u2807 \u281D\u2815\u281E \u2819\u280A\u280C\u2825\u2817\u2803 \u280A\u281E\u2802 \u2815\u2817 \u2839\u2811 \u284A\u2833\u281D\u281E\u2817\u2839\u2830\u280E \u2819\u2815\u281D\u2811 \u280B\u2815\u2817\u2832 \u2879\u2833\n \u283A\u280A\u2807\u2807 \u2839\u283B\u2811\u280B\u2815\u2817\u2811 \u280F\u283B\u280D\u280A\u281E \u280D\u2811 \u281E\u2815 \u2817\u2811\u280F\u2811\u2801\u281E\u2802 \u2811\u280D\u280F\u2819\u2801\u281E\u280A\u280A\u2801\u2807\u2807\u2839\u2802 \u2839\u2801\u281E\n \u284D\u281C\u2807\u2811\u2839 \u283A\u2801\u280E \u2801\u280E \u2819\u2811\u2801\u2819 \u2801\u280E \u2801 \u2819\u2815\u2815\u2817\u2824\u281D\u2801\u280A\u2807\u2832\n\n (The first couple of paragraphs of \"A Christmas Carol\" by Dickens)\n\nCompact font selection example text:\n\n ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789\n abcdefghijklmnopqrstuvwxyz \u00A3\u00A9\u00B5\u00C0\u00C6\u00D6\u00DE\u00DF\u00E9\u00F6\u00FF\n \u2013\u2014\u2018\u201C\u201D\u201E\u2020\u2022\u2026\u2030\u2122\u0153\u0160\u0178\u017E\u20AC \u0391\u0392\u0393\u0394\u03A9\u03B1\u03B2\u03B3\u03B4\u03C9 \u0410\u0411\u0412\u0413\u0414\u0430\u0431\u0432\u0433\u0434\n \u2200\u2202\u2208\u211D\u2227\u222A\u2261\u221E \u2191\u2197\u21A8\u21BB\u21E3 \u2510\u253C\u2554\u2558\u2591\u25BA\u263A\u2640 \uFB01\uFFFD\u2440\u2082\u1F20\u1E02\u04E5\u1E84\u0250\u02D0\u234E\u05D0\u0531\u10D0\n\nGreetings in various languages:\n\n Hello world, \u039A\u03B1\u03BB\u03B7\u03BC\u1F73\u03C1\u03B1 \u03BA\u1F79\u03C3\u03BC\u03B5, \u30B3\u30F3\u30CB\u30C1\u30CF\n\nBox drawing alignment tests: \u2588\n \u2589\n \u2554\u2550\u2550\u2566\u2550\u2550\u2557 \u250C\u2500\u2500\u252C\u2500\u2500\u2510 \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u250F\u2501\u2501\u2533\u2501\u2501\u2513 \u250E\u2512\u250F\u2511 \u2577 \u257B \u250F\u252F\u2513 \u250C\u2530\u2510 \u258A \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n \u2551\u250C\u2500\u2568\u2500\u2510\u2551 \u2502\u2554\u2550\u2567\u2550\u2557\u2502 \u2502\u2552\u2550\u256A\u2550\u2555\u2502 \u2502\u2553\u2500\u2541\u2500\u2556\u2502 \u2503\u250C\u2500\u2542\u2500\u2510\u2503 \u2517\u2543\u2544\u2519 \u2576\u253C\u2574\u257A\u254B\u2578\u2520\u253C\u2528 \u251D\u254B\u2525 \u258B \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n \u2551\u2502\u2572 \u2571\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257F \u2502\u2503 \u250D\u2545\u2546\u2513 \u2575 \u2579 \u2517\u2537\u251B \u2514\u2538\u2518 \u258C \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n \u2560\u2561 \u2573 \u255E\u2563 \u251C\u2562 \u255F\u2524 \u251C\u253C\u2500\u253C\u2500\u253C\u2524 \u251C\u256B\u2500\u2542\u2500\u256B\u2524 \u2523\u253F\u257E\u253C\u257C\u253F\u252B \u2515\u251B\u2516\u251A \u250C\u2504\u2504\u2510 \u254E \u250F\u2505\u2505\u2513 \u250B \u258D \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n \u2551\u2502\u2571 \u2572\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257D \u2502\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258E\n \u2551\u2514\u2500\u2565\u2500\u2518\u2551 \u2502\u255A\u2550\u2564\u2550\u255D\u2502 \u2502\u2558\u2550\u256A\u2550\u255B\u2502 \u2502\u2559\u2500\u2540\u2500\u255C\u2502 \u2503\u2514\u2500\u2542\u2500\u2518\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258F\n \u255A\u2550\u2550\u2569\u2550\u2550\u255D \u2514\u2500\u2500\u2534\u2500\u2500\u2518 \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2517\u2501\u2501\u253B\u2501\u2501\u251B \u2597\u2584\u2596\u259B\u2580\u259C \u2514\u254C\u254C\u2518 \u254E \u2517\u254D\u254D\u251B \u250B \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\n \u259D\u2580\u2598\u2599\u2584\u259F\n" . +<http://drobilla.net/sw/serd/test/good/UTF-8.ttl> <http://www.w3.org/2000/01/rdf-schema#comment> "\n Two byte Unicode escape: \u00E0\n Largest Unicode escape in Turtle: \U0010FFFF\n" . diff --git a/testsuite/serd-tests/good/UTF-8.ttl b/testsuite/serd-tests/good/UTF-8.ttl new file mode 100644 index 00000000..01ab2bab --- /dev/null +++ b/testsuite/serd-tests/good/UTF-8.ttl @@ -0,0 +1,219 @@ +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<> rdfs:comment """ +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkʊs kuːn] <http://www.cl.cam.ac.uk/~mgk25/> — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ + 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn + Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] + +APL: + + ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ + +Nicer typography in plain text files: + + ╔══════════════════════════════════════════╗ + ║ ║ + ║ • ‘single’ and “double” quotes ║ + ║ ║ + ║ • Curly apostrophes: “We’ve been here” ║ + ║ ║ + ║ • Latin-1 apostrophe and accents: '´` ║ + ║ ║ + ║ • ‚deutsche‘ „Anführungszeichen“ ║ + ║ ║ + ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║ + ║ ║ + ║ • ASCII safety test: 1lI|, 0OD, 8B ║ + ║ ╭─────────╮ ║ + ║ • the euro symbol: │ 14.95 € │ ║ + ║ ╰─────────╯ ║ + ╚══════════════════════════════════════════╝ + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωρίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν τρομερή, + σὲ γνωρίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετράει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱερά + καὶ σὰν πρῶτα ἀνδρειωμένη + χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! + + From a speech of Demosthenes in the 4th century BC: + + Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ + τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ + εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ + πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, + οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν + ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι + γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους + σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ + τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ + τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς + τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო + კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, + ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს + ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, + ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება + ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, + ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + Зарегистрируйтесь сейчас на Десятую Международную Конференцию по + Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. + Конференция соберет широкий круг экспертов по вопросам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных системах и программных + приложениях, шрифтах, верстке и многоязычных компьютерных системах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ + สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา + โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ + เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ + ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስ። + ብላ ካለኝ እንደአባቴ በቆመጠኝ። + ጌጥ ያለቤቱ ቁምጥና ነው። + ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። + የአፍ ወለምታ በቅቤ አይታሽም። + አይጥ በበላ ዳዋ ተመታ። + ሲተረጉሙ ይደረግሙ። + ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። + ድር ቢያብር አንበሳ ያስር። + ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። + እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። + የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። + ሥራ ከመፍታት ልጄን ላፋታት። + ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። + የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። + ተንጋሎ ቢተፉ ተመልሶ ባፉ። + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። + እግርህን በፍራሽህ ልክ ዘርጋ። + +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with that Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ + + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ + ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ + ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ + ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ + ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ + + ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ + ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ + ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ + ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ + ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ + ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ + ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд + ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა + +Greetings in various languages: + + Hello world, Καλημέρα κόσμε, コンニチハ + +Box drawing alignment tests: █ + ▉ + ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ + ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ + ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ + ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ + ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ + ▝▀▘▙▄▟ +""" . +<> rdfs:comment """ + Two byte Unicode escape: \u00E0 + Largest Unicode escape in Turtle: \U0010FFFF +""" . diff --git a/testsuite/serd-tests/good/base.nt b/testsuite/serd-tests/good/base.nt new file mode 100644 index 00000000..4e8e4c82 --- /dev/null +++ b/testsuite/serd-tests/good/base.nt @@ -0,0 +1 @@ +<http://drobilla.net/sw/serd/test/good/foo> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://drobilla.net/sw/serd/test/good/Bar> . diff --git a/testsuite/serd-tests/good/base.ttl b/testsuite/serd-tests/good/base.ttl new file mode 100644 index 00000000..4c437937 --- /dev/null +++ b/testsuite/serd-tests/good/base.ttl @@ -0,0 +1,3 @@ +<foo> + a <Bar> . + diff --git a/testsuite/serd-tests/good/manifest.ttl b/testsuite/serd-tests/good/manifest.ttl new file mode 100644 index 00000000..085878f0 --- /dev/null +++ b/testsuite/serd-tests/good/manifest.ttl @@ -0,0 +1,319 @@ +@prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix rdft: <http://www.w3.org/ns/rdftest#> . + +<> + rdf:type mf:Manifest ; + rdfs:comment "Serd good syntax test cases" ; + mf:entries ( + <#base> + <#test-14> + <#test-15> + <#test-16> + <#test-18> + <#test-30> + <#test-a-without-whitespace> + <#test-backspace> + <#test-base-nopath> + <#test-base-query> + <#test-blank-cont> + <#test-blank-in-list> + <#test-blank-node-statement> + <#test-blankdot> + # We do not support BOM <#test-bom> + <#test-cr> + <#test-delete> + <#test-digit-start-pname> + <#test-empty-path-base> + <#test-empty> + <#test-eof-at-page-end> + # We prefer to decode before IRI validation <#test-escapes> + # this is an extension <#test-ext-namedblank-iri> + # this is an extension <#test-ext-namedblank-prefix> + <#test-form-feed> + <#test-id> + <#test-lang> + <#test-list-in-blank> + <#test-list-subject> + <#test-list> + <#test-long-string> + <#test-several-eaten-dots> + <#test-no-spaces> + <#test-non-curie-uri> + <#test-num> + # We prefer to raise an error on invalid unicode code points <#test-out-of-range-unicode> + <#test-prefix> + <#test-pretty> + <#test-rel> + <#test-semi-dot> + # We validate URI escaping <#test-uri-escape> + <#test-uri> + <#test-utf8-uri> + <#UTF-8> + ) . + +<#base> + rdf:type rdft:TestTurtleEval ; + mf:name "base" ; + mf:action <base.ttl> ; + mf:result <base.nt> . + +<#test-14> + rdf:type rdft:TestTurtleEval ; + mf:name "test-14" ; + mf:action <test-14.ttl> ; + mf:result <test-14.nt> . + +<#test-15> + rdf:type rdft:TestTurtleEval ; + mf:name "test-15" ; + mf:action <test-15.ttl> ; + mf:result <test-15.nt> . + +<#test-16> + rdf:type rdft:TestTurtleEval ; + mf:name "test-16" ; + mf:action <test-16.ttl> ; + mf:result <test-16.nt> . + +<#test-18> + rdf:type rdft:TestTurtleEval ; + mf:name "test-18" ; + mf:action <test-18.ttl> ; + mf:result <test-18.nt> . + +<#test-30> + rdf:type rdft:TestTurtleEval ; + mf:name "test-30" ; + mf:action <test-30.ttl> ; + mf:result <test-30.nt> . + +<#test-a-without-whitespace> + rdf:type rdft:TestTurtleEval ; + mf:name "test-a-without-whitespace" ; + mf:action <test-a-without-whitespace.ttl> ; + mf:result <test-a-without-whitespace.nt> . + +<#test-backspace> + rdf:type rdft:TestTurtleEval ; + mf:name "test-backspace" ; + mf:action <test-backspace.ttl> ; + mf:result <test-backspace.nt> . + +<#test-base-nopath> + rdf:type rdft:TestTurtleEval ; + mf:name "test-base-nopath" ; + mf:action <test-base-nopath.ttl> ; + mf:result <test-base-nopath.nt> . + +<#test-base-query> + rdf:type rdft:TestTurtleEval ; + mf:name "test-base-query" ; + mf:action <test-base-query.ttl> ; + mf:result <test-base-query.nt> . + +<#test-blank-cont> + rdf:type rdft:TestTurtleEval ; + mf:name "test-blank-cont" ; + mf:action <test-blank-cont.ttl> ; + mf:result <test-blank-cont.nt> . + +<#test-blankdot> + rdf:type rdft:TestTurtleEval ; + mf:name "test-blankdot" ; + mf:action <test-blankdot.ttl> ; + mf:result <test-blankdot.nt> . + +<#test-blank-in-list> + rdf:type rdft:TestTurtleEval ; + mf:name "test-blank-in-list" ; + mf:action <test-blank-in-list.ttl> ; + mf:result <test-blank-in-list.nt> . + +<#test-blank-node-statement> + rdf:type rdft:TestTurtleEval ; + mf:name "test-blank-node-statement" ; + mf:action <test-blank-node-statement.ttl> ; + mf:result <test-blank-node-statement.nt> . + +<#test-bom> + rdf:type rdft:TestTurtleEval ; + mf:name "test-bom" ; + mf:action <test-bom.ttl> ; + mf:result <test-bom.nt> . + +<#test-cr> + rdf:type rdft:TestTurtleEval ; + mf:name "test-cr" ; + mf:action <test-cr.ttl> ; + mf:result <test-cr.nt> . + +<#test-delete> + rdf:type rdft:TestTurtleEval ; + mf:name "test-delete" ; + mf:action <test-delete.ttl> ; + mf:result <test-delete.nt> . + +<#test-digit-start-pname> + rdf:type rdft:TestTurtleEval ; + mf:name "test-digit-start-pname" ; + mf:action <test-digit-start-pname.ttl> ; + mf:result <test-digit-start-pname.nt> . + +<#test-empty-path-base> + rdf:type rdft:TestTurtleEval ; + mf:name "test-empty-path-base" ; + mf:action <test-empty-path-base.ttl> ; + mf:result <test-empty-path-base.nt> . + +<#test-empty> + rdf:type rdft:TestTurtleEval ; + mf:name "test-empty" ; + mf:action <test-empty.ttl> ; + mf:result <test-empty.nt> . + +<#test-eof-at-page-end> + rdf:type rdft:TestTurtleEval ; + mf:name "test-eof-at-page-end" ; + mf:action <test-eof-at-page-end.ttl> ; + mf:result <test-eof-at-page-end.nt> . + +<#test-escapes> + rdf:type rdft:TestTurtleEval ; + mf:name "test-escapes" ; + mf:action <test-escapes.ttl> ; + mf:result <test-escapes.nt> . + +<#test-ext-namedblank-iri> + rdf:type rdft:TestTurtleEval ; + mf:name "test-ext-namedblank-iri" ; + mf:action <test-ext-namedblank-iri.ttl> ; + mf:result <test-ext-namedblank-iri.nt> . + +<#test-ext-namedblank-prefix> + rdf:type rdft:TestTurtleEval ; + mf:name "test-ext-namedblank-prefix" ; + mf:action <test-ext-namedblank-prefix.ttl> ; + mf:result <test-ext-namedblank-prefix.nt> . + +<#test-form-feed> + rdf:type rdft:TestTurtleEval ; + mf:name "test-form-feed" ; + mf:action <test-form-feed.ttl> ; + mf:result <test-form-feed.nt> . + +<#test-id> + rdf:type rdft:TestTurtleEval ; + mf:name "test-id" ; + mf:action <test-id.ttl> ; + mf:result <test-id.nt> . + +<#test-lang> + rdf:type rdft:TestTurtleEval ; + mf:name "test-lang" ; + mf:action <test-lang.ttl> ; + mf:result <test-lang.nt> . + +<#test-list-in-blank> + rdf:type rdft:TestTurtleEval ; + mf:name "test-list-in-blank" ; + mf:action <test-list-in-blank.ttl> ; + mf:result <test-list-in-blank.nt> . + +<#test-list-subject> + rdf:type rdft:TestTurtleEval ; + mf:name "test-list-subject" ; + mf:action <test-list-subject.ttl> ; + mf:result <test-list-subject.nt> . + +<#test-list> + rdf:type rdft:TestTurtleEval ; + mf:name "test-list" ; + mf:action <test-list.ttl> ; + mf:result <test-list.nt> . + +<#test-long-string> + rdf:type rdft:TestTurtleEval ; + mf:name "test-long-string" ; + mf:action <test-long-string.ttl> ; + mf:result <test-long-string.nt> . + +<#test-several-eaten-dots> + rdf:type rdft:TestTrigEval ; + mf:name "test-several-eaten-dots" ; + mf:action <test-several-eaten-dots.trig> ; + mf:result <test-several-eaten-dots.nq> . + +<#test-no-spaces> + rdf:type rdft:TestTurtleEval ; + mf:name "test-no-spaces" ; + mf:action <test-no-spaces.ttl> ; + mf:result <test-no-spaces.nt> . + +<#test-non-curie-uri> + rdf:type rdft:TestTurtleEval ; + mf:name "test-non-curie-uri" ; + mf:action <test-non-curie-uri.ttl> ; + mf:result <test-non-curie-uri.nt> . + +<#test-num> + rdf:type rdft:TestTurtleEval ; + mf:name "test-num" ; + mf:action <test-num.ttl> ; + mf:result <test-num.nt> . + +<#test-out-of-range-unicode> + rdf:type rdft:TestTurtleEval ; + mf:name "test-out-of-range-unicode" ; + mf:action <test-out-of-range-unicode.ttl> ; + mf:result <test-out-of-range-unicode.nt> . + +<#test-prefix> + rdf:type rdft:TestTurtleEval ; + mf:name "test-prefix" ; + mf:action <test-prefix.ttl> ; + mf:result <test-prefix.nt> . + +<#test-pretty> + rdf:type rdft:TestTurtleEval ; + mf:name "test-pretty" ; + mf:action <test-pretty.ttl> ; + mf:result <test-pretty.nt> . + +<#test-rel> + rdf:type rdft:TestTurtleEval ; + mf:name "test-rel" ; + mf:action <test-rel.ttl> ; + mf:result <test-rel.nt> . + +<#test-semi-dot> + rdf:type rdft:TestTurtleEval ; + mf:name "test-semi-dot" ; + mf:action <test-semi-dot.ttl> ; + mf:result <test-semi-dot.nt> . + +<#test-uri-escape> + rdf:type rdft:TestTurtleEval ; + mf:name "test-uri-escape" ; + mf:action <test-uri-escape.ttl> ; + mf:result <test-uri-escape.nt> . + +<#test-uri> + rdf:type rdft:TestTurtleEval ; + mf:name "test-uri" ; + mf:action <test-uri.ttl> ; + mf:result <test-uri.nt> . + +<#test-utf8-uri> + rdf:type rdft:TestTurtleEval ; + mf:name "test-utf8-uri" ; + mf:action <test-utf8-uri.ttl> ; + mf:result <test-utf8-uri.nt> . + +<#UTF-8> + rdf:type rdft:TestTurtleEval ; + mf:name "UTF-8" ; + mf:action <UTF-8.ttl> ; + mf:result <UTF-8.nt> . + diff --git a/testsuite/serd-tests/good/qualify-in.ttl b/testsuite/serd-tests/good/qualify-in.ttl new file mode 100644 index 00000000..d938b7bd --- /dev/null +++ b/testsuite/serd-tests/good/qualify-in.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +<http://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/good/qualify-out.ttl b/testsuite/serd-tests/good/qualify-out.ttl new file mode 100644 index 00000000..97f67a53 --- /dev/null +++ b/testsuite/serd-tests/good/qualify-out.ttl @@ -0,0 +1,5 @@ +@prefix eg: <http://example.org/> . + +eg:s + eg:p eg:o . + diff --git a/testsuite/serd-tests/good/test-14.nt b/testsuite/serd-tests/good/test-14.nt new file mode 100644 index 00000000..791b3a7a --- /dev/null +++ b/testsuite/serd-tests/good/test-14.nt @@ -0,0 +1,10000 @@ +<http://example.org/ns#a1> <http://example.org/ns#a1> <http://example.org/ns#a1> . +<http://example.org/ns#a2> <http://example.org/ns#a2> <http://example.org/ns#a2> . +<http://example.org/ns#a3> <http://example.org/ns#a3> <http://example.org/ns#a3> . +<http://example.org/ns#a4> <http://example.org/ns#a4> <http://example.org/ns#a4> . +<http://example.org/ns#a5> <http://example.org/ns#a5> <http://example.org/ns#a5> . +<http://example.org/ns#a6> <http://example.org/ns#a6> <http://example.org/ns#a6> . +<http://example.org/ns#a7> <http://example.org/ns#a7> <http://example.org/ns#a7> . +<http://example.org/ns#a8> <http://example.org/ns#a8> <http://example.org/ns#a8> . +<http://example.org/ns#a9> <http://example.org/ns#a9> <http://example.org/ns#a9> . +<http://example.org/ns#a10> <http://example.org/ns#a10> <http://example.org/ns#a10> . +<http://example.org/ns#a11> <http://example.org/ns#a11> <http://example.org/ns#a11> . +<http://example.org/ns#a12> <http://example.org/ns#a12> <http://example.org/ns#a12> . +<http://example.org/ns#a13> <http://example.org/ns#a13> <http://example.org/ns#a13> . +<http://example.org/ns#a14> <http://example.org/ns#a14> <http://example.org/ns#a14> . +<http://example.org/ns#a15> <http://example.org/ns#a15> <http://example.org/ns#a15> . +<http://example.org/ns#a16> <http://example.org/ns#a16> <http://example.org/ns#a16> . +<http://example.org/ns#a17> <http://example.org/ns#a17> <http://example.org/ns#a17> . +<http://example.org/ns#a18> <http://example.org/ns#a18> <http://example.org/ns#a18> . +<http://example.org/ns#a19> <http://example.org/ns#a19> <http://example.org/ns#a19> . +<http://example.org/ns#a20> <http://example.org/ns#a20> <http://example.org/ns#a20> . +<http://example.org/ns#a21> <http://example.org/ns#a21> <http://example.org/ns#a21> . +<http://example.org/ns#a22> <http://example.org/ns#a22> <http://example.org/ns#a22> . +<http://example.org/ns#a23> <http://example.org/ns#a23> <http://example.org/ns#a23> . +<http://example.org/ns#a24> <http://example.org/ns#a24> <http://example.org/ns#a24> . +<http://example.org/ns#a25> <http://example.org/ns#a25> <http://example.org/ns#a25> . +<http://example.org/ns#a26> <http://example.org/ns#a26> <http://example.org/ns#a26> . +<http://example.org/ns#a27> <http://example.org/ns#a27> <http://example.org/ns#a27> . +<http://example.org/ns#a28> <http://example.org/ns#a28> <http://example.org/ns#a28> . +<http://example.org/ns#a29> <http://example.org/ns#a29> <http://example.org/ns#a29> . +<http://example.org/ns#a30> <http://example.org/ns#a30> <http://example.org/ns#a30> . +<http://example.org/ns#a31> <http://example.org/ns#a31> <http://example.org/ns#a31> . +<http://example.org/ns#a32> <http://example.org/ns#a32> <http://example.org/ns#a32> . +<http://example.org/ns#a33> <http://example.org/ns#a33> <http://example.org/ns#a33> . +<http://example.org/ns#a34> <http://example.org/ns#a34> <http://example.org/ns#a34> . +<http://example.org/ns#a35> <http://example.org/ns#a35> <http://example.org/ns#a35> . +<http://example.org/ns#a36> <http://example.org/ns#a36> <http://example.org/ns#a36> . +<http://example.org/ns#a37> <http://example.org/ns#a37> <http://example.org/ns#a37> . +<http://example.org/ns#a38> <http://example.org/ns#a38> <http://example.org/ns#a38> . +<http://example.org/ns#a39> <http://example.org/ns#a39> <http://example.org/ns#a39> . +<http://example.org/ns#a40> <http://example.org/ns#a40> <http://example.org/ns#a40> . +<http://example.org/ns#a41> <http://example.org/ns#a41> <http://example.org/ns#a41> . +<http://example.org/ns#a42> <http://example.org/ns#a42> <http://example.org/ns#a42> . +<http://example.org/ns#a43> <http://example.org/ns#a43> <http://example.org/ns#a43> . +<http://example.org/ns#a44> <http://example.org/ns#a44> <http://example.org/ns#a44> . +<http://example.org/ns#a45> <http://example.org/ns#a45> <http://example.org/ns#a45> . +<http://example.org/ns#a46> <http://example.org/ns#a46> <http://example.org/ns#a46> . +<http://example.org/ns#a47> <http://example.org/ns#a47> <http://example.org/ns#a47> . +<http://example.org/ns#a48> <http://example.org/ns#a48> <http://example.org/ns#a48> . +<http://example.org/ns#a49> <http://example.org/ns#a49> <http://example.org/ns#a49> . +<http://example.org/ns#a50> <http://example.org/ns#a50> <http://example.org/ns#a50> . +<http://example.org/ns#a51> <http://example.org/ns#a51> <http://example.org/ns#a51> . +<http://example.org/ns#a52> <http://example.org/ns#a52> <http://example.org/ns#a52> . +<http://example.org/ns#a53> <http://example.org/ns#a53> <http://example.org/ns#a53> . +<http://example.org/ns#a54> <http://example.org/ns#a54> <http://example.org/ns#a54> . +<http://example.org/ns#a55> <http://example.org/ns#a55> <http://example.org/ns#a55> . +<http://example.org/ns#a56> <http://example.org/ns#a56> <http://example.org/ns#a56> . +<http://example.org/ns#a57> <http://example.org/ns#a57> <http://example.org/ns#a57> . +<http://example.org/ns#a58> <http://example.org/ns#a58> <http://example.org/ns#a58> . +<http://example.org/ns#a59> <http://example.org/ns#a59> <http://example.org/ns#a59> . +<http://example.org/ns#a60> <http://example.org/ns#a60> <http://example.org/ns#a60> . +<http://example.org/ns#a61> <http://example.org/ns#a61> <http://example.org/ns#a61> . +<http://example.org/ns#a62> <http://example.org/ns#a62> <http://example.org/ns#a62> . +<http://example.org/ns#a63> <http://example.org/ns#a63> <http://example.org/ns#a63> . +<http://example.org/ns#a64> <http://example.org/ns#a64> <http://example.org/ns#a64> . +<http://example.org/ns#a65> <http://example.org/ns#a65> <http://example.org/ns#a65> . +<http://example.org/ns#a66> <http://example.org/ns#a66> <http://example.org/ns#a66> . +<http://example.org/ns#a67> <http://example.org/ns#a67> <http://example.org/ns#a67> . +<http://example.org/ns#a68> <http://example.org/ns#a68> <http://example.org/ns#a68> . +<http://example.org/ns#a69> <http://example.org/ns#a69> <http://example.org/ns#a69> . +<http://example.org/ns#a70> <http://example.org/ns#a70> <http://example.org/ns#a70> . +<http://example.org/ns#a71> <http://example.org/ns#a71> <http://example.org/ns#a71> . +<http://example.org/ns#a72> <http://example.org/ns#a72> <http://example.org/ns#a72> . +<http://example.org/ns#a73> <http://example.org/ns#a73> <http://example.org/ns#a73> . +<http://example.org/ns#a74> <http://example.org/ns#a74> <http://example.org/ns#a74> . +<http://example.org/ns#a75> <http://example.org/ns#a75> <http://example.org/ns#a75> . +<http://example.org/ns#a76> <http://example.org/ns#a76> <http://example.org/ns#a76> . +<http://example.org/ns#a77> <http://example.org/ns#a77> <http://example.org/ns#a77> . +<http://example.org/ns#a78> <http://example.org/ns#a78> <http://example.org/ns#a78> . +<http://example.org/ns#a79> <http://example.org/ns#a79> <http://example.org/ns#a79> . +<http://example.org/ns#a80> <http://example.org/ns#a80> <http://example.org/ns#a80> . +<http://example.org/ns#a81> <http://example.org/ns#a81> <http://example.org/ns#a81> . +<http://example.org/ns#a82> <http://example.org/ns#a82> <http://example.org/ns#a82> . +<http://example.org/ns#a83> <http://example.org/ns#a83> <http://example.org/ns#a83> . +<http://example.org/ns#a84> <http://example.org/ns#a84> <http://example.org/ns#a84> . +<http://example.org/ns#a85> <http://example.org/ns#a85> <http://example.org/ns#a85> . +<http://example.org/ns#a86> <http://example.org/ns#a86> <http://example.org/ns#a86> . +<http://example.org/ns#a87> <http://example.org/ns#a87> <http://example.org/ns#a87> . +<http://example.org/ns#a88> <http://example.org/ns#a88> <http://example.org/ns#a88> . +<http://example.org/ns#a89> <http://example.org/ns#a89> <http://example.org/ns#a89> . +<http://example.org/ns#a90> <http://example.org/ns#a90> <http://example.org/ns#a90> . +<http://example.org/ns#a91> <http://example.org/ns#a91> <http://example.org/ns#a91> . +<http://example.org/ns#a92> <http://example.org/ns#a92> <http://example.org/ns#a92> . +<http://example.org/ns#a93> <http://example.org/ns#a93> <http://example.org/ns#a93> . +<http://example.org/ns#a94> <http://example.org/ns#a94> <http://example.org/ns#a94> . +<http://example.org/ns#a95> <http://example.org/ns#a95> <http://example.org/ns#a95> . +<http://example.org/ns#a96> <http://example.org/ns#a96> <http://example.org/ns#a96> . +<http://example.org/ns#a97> <http://example.org/ns#a97> <http://example.org/ns#a97> . +<http://example.org/ns#a98> <http://example.org/ns#a98> <http://example.org/ns#a98> . +<http://example.org/ns#a99> <http://example.org/ns#a99> <http://example.org/ns#a99> . +<http://example.org/ns#a100> <http://example.org/ns#a100> <http://example.org/ns#a100> . +<http://example.org/ns#a101> <http://example.org/ns#a101> <http://example.org/ns#a101> . +<http://example.org/ns#a102> <http://example.org/ns#a102> <http://example.org/ns#a102> . +<http://example.org/ns#a103> <http://example.org/ns#a103> <http://example.org/ns#a103> . +<http://example.org/ns#a104> <http://example.org/ns#a104> <http://example.org/ns#a104> . +<http://example.org/ns#a105> <http://example.org/ns#a105> <http://example.org/ns#a105> . +<http://example.org/ns#a106> <http://example.org/ns#a106> <http://example.org/ns#a106> . +<http://example.org/ns#a107> <http://example.org/ns#a107> <http://example.org/ns#a107> . +<http://example.org/ns#a108> <http://example.org/ns#a108> <http://example.org/ns#a108> . +<http://example.org/ns#a109> <http://example.org/ns#a109> <http://example.org/ns#a109> . +<http://example.org/ns#a110> <http://example.org/ns#a110> <http://example.org/ns#a110> . +<http://example.org/ns#a111> <http://example.org/ns#a111> <http://example.org/ns#a111> . +<http://example.org/ns#a112> <http://example.org/ns#a112> <http://example.org/ns#a112> . +<http://example.org/ns#a113> <http://example.org/ns#a113> <http://example.org/ns#a113> . +<http://example.org/ns#a114> <http://example.org/ns#a114> <http://example.org/ns#a114> . +<http://example.org/ns#a115> <http://example.org/ns#a115> <http://example.org/ns#a115> . +<http://example.org/ns#a116> <http://example.org/ns#a116> <http://example.org/ns#a116> . +<http://example.org/ns#a117> <http://example.org/ns#a117> <http://example.org/ns#a117> . +<http://example.org/ns#a118> <http://example.org/ns#a118> <http://example.org/ns#a118> . +<http://example.org/ns#a119> <http://example.org/ns#a119> <http://example.org/ns#a119> . +<http://example.org/ns#a120> <http://example.org/ns#a120> <http://example.org/ns#a120> . +<http://example.org/ns#a121> <http://example.org/ns#a121> <http://example.org/ns#a121> . +<http://example.org/ns#a122> <http://example.org/ns#a122> <http://example.org/ns#a122> . +<http://example.org/ns#a123> <http://example.org/ns#a123> <http://example.org/ns#a123> . +<http://example.org/ns#a124> <http://example.org/ns#a124> <http://example.org/ns#a124> . +<http://example.org/ns#a125> <http://example.org/ns#a125> <http://example.org/ns#a125> . +<http://example.org/ns#a126> <http://example.org/ns#a126> <http://example.org/ns#a126> . +<http://example.org/ns#a127> <http://example.org/ns#a127> <http://example.org/ns#a127> . +<http://example.org/ns#a128> <http://example.org/ns#a128> <http://example.org/ns#a128> . +<http://example.org/ns#a129> <http://example.org/ns#a129> <http://example.org/ns#a129> . +<http://example.org/ns#a130> <http://example.org/ns#a130> <http://example.org/ns#a130> . +<http://example.org/ns#a131> <http://example.org/ns#a131> <http://example.org/ns#a131> . +<http://example.org/ns#a132> <http://example.org/ns#a132> <http://example.org/ns#a132> . +<http://example.org/ns#a133> <http://example.org/ns#a133> <http://example.org/ns#a133> . +<http://example.org/ns#a134> <http://example.org/ns#a134> <http://example.org/ns#a134> . +<http://example.org/ns#a135> <http://example.org/ns#a135> <http://example.org/ns#a135> . +<http://example.org/ns#a136> <http://example.org/ns#a136> <http://example.org/ns#a136> . +<http://example.org/ns#a137> <http://example.org/ns#a137> <http://example.org/ns#a137> . +<http://example.org/ns#a138> <http://example.org/ns#a138> <http://example.org/ns#a138> . +<http://example.org/ns#a139> <http://example.org/ns#a139> <http://example.org/ns#a139> . +<http://example.org/ns#a140> <http://example.org/ns#a140> <http://example.org/ns#a140> . +<http://example.org/ns#a141> <http://example.org/ns#a141> <http://example.org/ns#a141> . +<http://example.org/ns#a142> <http://example.org/ns#a142> <http://example.org/ns#a142> . +<http://example.org/ns#a143> <http://example.org/ns#a143> <http://example.org/ns#a143> . +<http://example.org/ns#a144> <http://example.org/ns#a144> <http://example.org/ns#a144> . +<http://example.org/ns#a145> <http://example.org/ns#a145> <http://example.org/ns#a145> . +<http://example.org/ns#a146> <http://example.org/ns#a146> <http://example.org/ns#a146> . +<http://example.org/ns#a147> <http://example.org/ns#a147> <http://example.org/ns#a147> . +<http://example.org/ns#a148> <http://example.org/ns#a148> <http://example.org/ns#a148> . +<http://example.org/ns#a149> <http://example.org/ns#a149> <http://example.org/ns#a149> . +<http://example.org/ns#a150> <http://example.org/ns#a150> <http://example.org/ns#a150> . +<http://example.org/ns#a151> <http://example.org/ns#a151> <http://example.org/ns#a151> . +<http://example.org/ns#a152> <http://example.org/ns#a152> <http://example.org/ns#a152> . +<http://example.org/ns#a153> <http://example.org/ns#a153> <http://example.org/ns#a153> . +<http://example.org/ns#a154> <http://example.org/ns#a154> <http://example.org/ns#a154> . +<http://example.org/ns#a155> <http://example.org/ns#a155> <http://example.org/ns#a155> . +<http://example.org/ns#a156> <http://example.org/ns#a156> <http://example.org/ns#a156> . +<http://example.org/ns#a157> <http://example.org/ns#a157> <http://example.org/ns#a157> . +<http://example.org/ns#a158> <http://example.org/ns#a158> <http://example.org/ns#a158> . +<http://example.org/ns#a159> <http://example.org/ns#a159> <http://example.org/ns#a159> . +<http://example.org/ns#a160> <http://example.org/ns#a160> <http://example.org/ns#a160> . +<http://example.org/ns#a161> <http://example.org/ns#a161> <http://example.org/ns#a161> . +<http://example.org/ns#a162> <http://example.org/ns#a162> <http://example.org/ns#a162> . +<http://example.org/ns#a163> <http://example.org/ns#a163> <http://example.org/ns#a163> . +<http://example.org/ns#a164> <http://example.org/ns#a164> <http://example.org/ns#a164> . +<http://example.org/ns#a165> <http://example.org/ns#a165> <http://example.org/ns#a165> . +<http://example.org/ns#a166> <http://example.org/ns#a166> <http://example.org/ns#a166> . +<http://example.org/ns#a167> <http://example.org/ns#a167> <http://example.org/ns#a167> . +<http://example.org/ns#a168> <http://example.org/ns#a168> <http://example.org/ns#a168> . +<http://example.org/ns#a169> <http://example.org/ns#a169> <http://example.org/ns#a169> . +<http://example.org/ns#a170> <http://example.org/ns#a170> <http://example.org/ns#a170> . +<http://example.org/ns#a171> <http://example.org/ns#a171> <http://example.org/ns#a171> . +<http://example.org/ns#a172> <http://example.org/ns#a172> <http://example.org/ns#a172> . +<http://example.org/ns#a173> <http://example.org/ns#a173> <http://example.org/ns#a173> . +<http://example.org/ns#a174> <http://example.org/ns#a174> <http://example.org/ns#a174> . +<http://example.org/ns#a175> <http://example.org/ns#a175> <http://example.org/ns#a175> . +<http://example.org/ns#a176> <http://example.org/ns#a176> <http://example.org/ns#a176> . +<http://example.org/ns#a177> <http://example.org/ns#a177> <http://example.org/ns#a177> . +<http://example.org/ns#a178> <http://example.org/ns#a178> <http://example.org/ns#a178> . +<http://example.org/ns#a179> <http://example.org/ns#a179> <http://example.org/ns#a179> . +<http://example.org/ns#a180> <http://example.org/ns#a180> <http://example.org/ns#a180> . +<http://example.org/ns#a181> <http://example.org/ns#a181> <http://example.org/ns#a181> . +<http://example.org/ns#a182> <http://example.org/ns#a182> <http://example.org/ns#a182> . +<http://example.org/ns#a183> <http://example.org/ns#a183> <http://example.org/ns#a183> . +<http://example.org/ns#a184> <http://example.org/ns#a184> <http://example.org/ns#a184> . +<http://example.org/ns#a185> <http://example.org/ns#a185> <http://example.org/ns#a185> . +<http://example.org/ns#a186> <http://example.org/ns#a186> <http://example.org/ns#a186> . +<http://example.org/ns#a187> <http://example.org/ns#a187> <http://example.org/ns#a187> . +<http://example.org/ns#a188> <http://example.org/ns#a188> <http://example.org/ns#a188> . +<http://example.org/ns#a189> <http://example.org/ns#a189> <http://example.org/ns#a189> . +<http://example.org/ns#a190> <http://example.org/ns#a190> <http://example.org/ns#a190> . +<http://example.org/ns#a191> <http://example.org/ns#a191> <http://example.org/ns#a191> . +<http://example.org/ns#a192> <http://example.org/ns#a192> <http://example.org/ns#a192> . +<http://example.org/ns#a193> <http://example.org/ns#a193> <http://example.org/ns#a193> . +<http://example.org/ns#a194> <http://example.org/ns#a194> <http://example.org/ns#a194> . +<http://example.org/ns#a195> <http://example.org/ns#a195> <http://example.org/ns#a195> . +<http://example.org/ns#a196> <http://example.org/ns#a196> <http://example.org/ns#a196> . +<http://example.org/ns#a197> <http://example.org/ns#a197> <http://example.org/ns#a197> . +<http://example.org/ns#a198> <http://example.org/ns#a198> <http://example.org/ns#a198> . +<http://example.org/ns#a199> <http://example.org/ns#a199> <http://example.org/ns#a199> . +<http://example.org/ns#a200> <http://example.org/ns#a200> <http://example.org/ns#a200> . +<http://example.org/ns#a201> <http://example.org/ns#a201> <http://example.org/ns#a201> . +<http://example.org/ns#a202> <http://example.org/ns#a202> <http://example.org/ns#a202> . +<http://example.org/ns#a203> <http://example.org/ns#a203> <http://example.org/ns#a203> . +<http://example.org/ns#a204> <http://example.org/ns#a204> <http://example.org/ns#a204> . +<http://example.org/ns#a205> <http://example.org/ns#a205> <http://example.org/ns#a205> . +<http://example.org/ns#a206> <http://example.org/ns#a206> <http://example.org/ns#a206> . +<http://example.org/ns#a207> <http://example.org/ns#a207> <http://example.org/ns#a207> . +<http://example.org/ns#a208> <http://example.org/ns#a208> <http://example.org/ns#a208> . +<http://example.org/ns#a209> <http://example.org/ns#a209> <http://example.org/ns#a209> . +<http://example.org/ns#a210> <http://example.org/ns#a210> <http://example.org/ns#a210> . +<http://example.org/ns#a211> <http://example.org/ns#a211> <http://example.org/ns#a211> . +<http://example.org/ns#a212> <http://example.org/ns#a212> <http://example.org/ns#a212> . +<http://example.org/ns#a213> <http://example.org/ns#a213> <http://example.org/ns#a213> . +<http://example.org/ns#a214> <http://example.org/ns#a214> <http://example.org/ns#a214> . +<http://example.org/ns#a215> <http://example.org/ns#a215> <http://example.org/ns#a215> . +<http://example.org/ns#a216> <http://example.org/ns#a216> <http://example.org/ns#a216> . +<http://example.org/ns#a217> <http://example.org/ns#a217> <http://example.org/ns#a217> . +<http://example.org/ns#a218> <http://example.org/ns#a218> <http://example.org/ns#a218> . +<http://example.org/ns#a219> <http://example.org/ns#a219> <http://example.org/ns#a219> . +<http://example.org/ns#a220> <http://example.org/ns#a220> <http://example.org/ns#a220> . +<http://example.org/ns#a221> <http://example.org/ns#a221> <http://example.org/ns#a221> . +<http://example.org/ns#a222> <http://example.org/ns#a222> <http://example.org/ns#a222> . +<http://example.org/ns#a223> <http://example.org/ns#a223> <http://example.org/ns#a223> . +<http://example.org/ns#a224> <http://example.org/ns#a224> <http://example.org/ns#a224> . +<http://example.org/ns#a225> <http://example.org/ns#a225> <http://example.org/ns#a225> . +<http://example.org/ns#a226> <http://example.org/ns#a226> <http://example.org/ns#a226> . +<http://example.org/ns#a227> <http://example.org/ns#a227> <http://example.org/ns#a227> . +<http://example.org/ns#a228> <http://example.org/ns#a228> <http://example.org/ns#a228> . +<http://example.org/ns#a229> <http://example.org/ns#a229> <http://example.org/ns#a229> . +<http://example.org/ns#a230> <http://example.org/ns#a230> <http://example.org/ns#a230> . +<http://example.org/ns#a231> <http://example.org/ns#a231> <http://example.org/ns#a231> . +<http://example.org/ns#a232> <http://example.org/ns#a232> <http://example.org/ns#a232> . +<http://example.org/ns#a233> <http://example.org/ns#a233> <http://example.org/ns#a233> . +<http://example.org/ns#a234> <http://example.org/ns#a234> <http://example.org/ns#a234> . +<http://example.org/ns#a235> <http://example.org/ns#a235> <http://example.org/ns#a235> . +<http://example.org/ns#a236> <http://example.org/ns#a236> <http://example.org/ns#a236> . +<http://example.org/ns#a237> <http://example.org/ns#a237> <http://example.org/ns#a237> . +<http://example.org/ns#a238> <http://example.org/ns#a238> <http://example.org/ns#a238> . +<http://example.org/ns#a239> <http://example.org/ns#a239> <http://example.org/ns#a239> . +<http://example.org/ns#a240> <http://example.org/ns#a240> <http://example.org/ns#a240> . +<http://example.org/ns#a241> <http://example.org/ns#a241> <http://example.org/ns#a241> . +<http://example.org/ns#a242> <http://example.org/ns#a242> <http://example.org/ns#a242> . +<http://example.org/ns#a243> <http://example.org/ns#a243> <http://example.org/ns#a243> . +<http://example.org/ns#a244> <http://example.org/ns#a244> <http://example.org/ns#a244> . +<http://example.org/ns#a245> <http://example.org/ns#a245> <http://example.org/ns#a245> . +<http://example.org/ns#a246> <http://example.org/ns#a246> <http://example.org/ns#a246> . +<http://example.org/ns#a247> <http://example.org/ns#a247> <http://example.org/ns#a247> . +<http://example.org/ns#a248> <http://example.org/ns#a248> <http://example.org/ns#a248> . +<http://example.org/ns#a249> <http://example.org/ns#a249> <http://example.org/ns#a249> . +<http://example.org/ns#a250> <http://example.org/ns#a250> <http://example.org/ns#a250> . +<http://example.org/ns#a251> <http://example.org/ns#a251> <http://example.org/ns#a251> . +<http://example.org/ns#a252> <http://example.org/ns#a252> <http://example.org/ns#a252> . +<http://example.org/ns#a253> <http://example.org/ns#a253> <http://example.org/ns#a253> . +<http://example.org/ns#a254> <http://example.org/ns#a254> <http://example.org/ns#a254> . +<http://example.org/ns#a255> <http://example.org/ns#a255> <http://example.org/ns#a255> . +<http://example.org/ns#a256> <http://example.org/ns#a256> <http://example.org/ns#a256> . +<http://example.org/ns#a257> <http://example.org/ns#a257> <http://example.org/ns#a257> . +<http://example.org/ns#a258> <http://example.org/ns#a258> <http://example.org/ns#a258> . +<http://example.org/ns#a259> <http://example.org/ns#a259> <http://example.org/ns#a259> . +<http://example.org/ns#a260> <http://example.org/ns#a260> <http://example.org/ns#a260> . +<http://example.org/ns#a261> <http://example.org/ns#a261> <http://example.org/ns#a261> . +<http://example.org/ns#a262> <http://example.org/ns#a262> <http://example.org/ns#a262> . +<http://example.org/ns#a263> <http://example.org/ns#a263> <http://example.org/ns#a263> . +<http://example.org/ns#a264> <http://example.org/ns#a264> <http://example.org/ns#a264> . +<http://example.org/ns#a265> <http://example.org/ns#a265> <http://example.org/ns#a265> . +<http://example.org/ns#a266> <http://example.org/ns#a266> <http://example.org/ns#a266> . +<http://example.org/ns#a267> <http://example.org/ns#a267> <http://example.org/ns#a267> . +<http://example.org/ns#a268> <http://example.org/ns#a268> <http://example.org/ns#a268> . +<http://example.org/ns#a269> <http://example.org/ns#a269> <http://example.org/ns#a269> . +<http://example.org/ns#a270> <http://example.org/ns#a270> <http://example.org/ns#a270> . +<http://example.org/ns#a271> <http://example.org/ns#a271> <http://example.org/ns#a271> . +<http://example.org/ns#a272> <http://example.org/ns#a272> <http://example.org/ns#a272> . +<http://example.org/ns#a273> <http://example.org/ns#a273> <http://example.org/ns#a273> . +<http://example.org/ns#a274> <http://example.org/ns#a274> <http://example.org/ns#a274> . +<http://example.org/ns#a275> <http://example.org/ns#a275> <http://example.org/ns#a275> . +<http://example.org/ns#a276> <http://example.org/ns#a276> <http://example.org/ns#a276> . +<http://example.org/ns#a277> <http://example.org/ns#a277> <http://example.org/ns#a277> . +<http://example.org/ns#a278> <http://example.org/ns#a278> <http://example.org/ns#a278> . +<http://example.org/ns#a279> <http://example.org/ns#a279> <http://example.org/ns#a279> . +<http://example.org/ns#a280> <http://example.org/ns#a280> <http://example.org/ns#a280> . +<http://example.org/ns#a281> <http://example.org/ns#a281> <http://example.org/ns#a281> . +<http://example.org/ns#a282> <http://example.org/ns#a282> <http://example.org/ns#a282> . +<http://example.org/ns#a283> <http://example.org/ns#a283> <http://example.org/ns#a283> . +<http://example.org/ns#a284> <http://example.org/ns#a284> <http://example.org/ns#a284> . +<http://example.org/ns#a285> <http://example.org/ns#a285> <http://example.org/ns#a285> . +<http://example.org/ns#a286> <http://example.org/ns#a286> <http://example.org/ns#a286> . +<http://example.org/ns#a287> <http://example.org/ns#a287> <http://example.org/ns#a287> . +<http://example.org/ns#a288> <http://example.org/ns#a288> <http://example.org/ns#a288> . +<http://example.org/ns#a289> <http://example.org/ns#a289> <http://example.org/ns#a289> . +<http://example.org/ns#a290> <http://example.org/ns#a290> <http://example.org/ns#a290> . +<http://example.org/ns#a291> <http://example.org/ns#a291> <http://example.org/ns#a291> . +<http://example.org/ns#a292> <http://example.org/ns#a292> <http://example.org/ns#a292> . +<http://example.org/ns#a293> <http://example.org/ns#a293> <http://example.org/ns#a293> . +<http://example.org/ns#a294> <http://example.org/ns#a294> <http://example.org/ns#a294> . +<http://example.org/ns#a295> <http://example.org/ns#a295> <http://example.org/ns#a295> . +<http://example.org/ns#a296> <http://example.org/ns#a296> <http://example.org/ns#a296> . +<http://example.org/ns#a297> <http://example.org/ns#a297> <http://example.org/ns#a297> . +<http://example.org/ns#a298> <http://example.org/ns#a298> <http://example.org/ns#a298> . +<http://example.org/ns#a299> <http://example.org/ns#a299> <http://example.org/ns#a299> . +<http://example.org/ns#a300> <http://example.org/ns#a300> <http://example.org/ns#a300> . +<http://example.org/ns#a301> <http://example.org/ns#a301> <http://example.org/ns#a301> . +<http://example.org/ns#a302> <http://example.org/ns#a302> <http://example.org/ns#a302> . +<http://example.org/ns#a303> <http://example.org/ns#a303> <http://example.org/ns#a303> . +<http://example.org/ns#a304> <http://example.org/ns#a304> <http://example.org/ns#a304> . +<http://example.org/ns#a305> <http://example.org/ns#a305> <http://example.org/ns#a305> . +<http://example.org/ns#a306> <http://example.org/ns#a306> <http://example.org/ns#a306> . +<http://example.org/ns#a307> <http://example.org/ns#a307> <http://example.org/ns#a307> . +<http://example.org/ns#a308> <http://example.org/ns#a308> <http://example.org/ns#a308> . +<http://example.org/ns#a309> <http://example.org/ns#a309> <http://example.org/ns#a309> . +<http://example.org/ns#a310> <http://example.org/ns#a310> <http://example.org/ns#a310> . +<http://example.org/ns#a311> <http://example.org/ns#a311> <http://example.org/ns#a311> . +<http://example.org/ns#a312> <http://example.org/ns#a312> <http://example.org/ns#a312> . +<http://example.org/ns#a313> <http://example.org/ns#a313> <http://example.org/ns#a313> . +<http://example.org/ns#a314> <http://example.org/ns#a314> <http://example.org/ns#a314> . +<http://example.org/ns#a315> <http://example.org/ns#a315> <http://example.org/ns#a315> . +<http://example.org/ns#a316> <http://example.org/ns#a316> <http://example.org/ns#a316> . +<http://example.org/ns#a317> <http://example.org/ns#a317> <http://example.org/ns#a317> . +<http://example.org/ns#a318> <http://example.org/ns#a318> <http://example.org/ns#a318> . +<http://example.org/ns#a319> <http://example.org/ns#a319> <http://example.org/ns#a319> . +<http://example.org/ns#a320> <http://example.org/ns#a320> <http://example.org/ns#a320> . +<http://example.org/ns#a321> <http://example.org/ns#a321> <http://example.org/ns#a321> . +<http://example.org/ns#a322> <http://example.org/ns#a322> <http://example.org/ns#a322> . +<http://example.org/ns#a323> <http://example.org/ns#a323> <http://example.org/ns#a323> . +<http://example.org/ns#a324> <http://example.org/ns#a324> <http://example.org/ns#a324> . +<http://example.org/ns#a325> <http://example.org/ns#a325> <http://example.org/ns#a325> . +<http://example.org/ns#a326> <http://example.org/ns#a326> <http://example.org/ns#a326> . +<http://example.org/ns#a327> <http://example.org/ns#a327> <http://example.org/ns#a327> . +<http://example.org/ns#a328> <http://example.org/ns#a328> <http://example.org/ns#a328> . +<http://example.org/ns#a329> <http://example.org/ns#a329> <http://example.org/ns#a329> . +<http://example.org/ns#a330> <http://example.org/ns#a330> <http://example.org/ns#a330> . +<http://example.org/ns#a331> <http://example.org/ns#a331> <http://example.org/ns#a331> . +<http://example.org/ns#a332> <http://example.org/ns#a332> <http://example.org/ns#a332> . +<http://example.org/ns#a333> <http://example.org/ns#a333> <http://example.org/ns#a333> . +<http://example.org/ns#a334> <http://example.org/ns#a334> <http://example.org/ns#a334> . +<http://example.org/ns#a335> <http://example.org/ns#a335> <http://example.org/ns#a335> . +<http://example.org/ns#a336> <http://example.org/ns#a336> <http://example.org/ns#a336> . +<http://example.org/ns#a337> <http://example.org/ns#a337> <http://example.org/ns#a337> . +<http://example.org/ns#a338> <http://example.org/ns#a338> <http://example.org/ns#a338> . +<http://example.org/ns#a339> <http://example.org/ns#a339> <http://example.org/ns#a339> . +<http://example.org/ns#a340> <http://example.org/ns#a340> <http://example.org/ns#a340> . +<http://example.org/ns#a341> <http://example.org/ns#a341> <http://example.org/ns#a341> . +<http://example.org/ns#a342> <http://example.org/ns#a342> <http://example.org/ns#a342> . +<http://example.org/ns#a343> <http://example.org/ns#a343> <http://example.org/ns#a343> . +<http://example.org/ns#a344> <http://example.org/ns#a344> <http://example.org/ns#a344> . +<http://example.org/ns#a345> <http://example.org/ns#a345> <http://example.org/ns#a345> . +<http://example.org/ns#a346> <http://example.org/ns#a346> <http://example.org/ns#a346> . +<http://example.org/ns#a347> <http://example.org/ns#a347> <http://example.org/ns#a347> . +<http://example.org/ns#a348> <http://example.org/ns#a348> <http://example.org/ns#a348> . +<http://example.org/ns#a349> <http://example.org/ns#a349> <http://example.org/ns#a349> . +<http://example.org/ns#a350> <http://example.org/ns#a350> <http://example.org/ns#a350> . +<http://example.org/ns#a351> <http://example.org/ns#a351> <http://example.org/ns#a351> . +<http://example.org/ns#a352> <http://example.org/ns#a352> <http://example.org/ns#a352> . +<http://example.org/ns#a353> <http://example.org/ns#a353> <http://example.org/ns#a353> . +<http://example.org/ns#a354> <http://example.org/ns#a354> <http://example.org/ns#a354> . +<http://example.org/ns#a355> <http://example.org/ns#a355> <http://example.org/ns#a355> . +<http://example.org/ns#a356> <http://example.org/ns#a356> <http://example.org/ns#a356> . +<http://example.org/ns#a357> <http://example.org/ns#a357> <http://example.org/ns#a357> . +<http://example.org/ns#a358> <http://example.org/ns#a358> <http://example.org/ns#a358> . +<http://example.org/ns#a359> <http://example.org/ns#a359> <http://example.org/ns#a359> . +<http://example.org/ns#a360> <http://example.org/ns#a360> <http://example.org/ns#a360> . +<http://example.org/ns#a361> <http://example.org/ns#a361> <http://example.org/ns#a361> . +<http://example.org/ns#a362> <http://example.org/ns#a362> <http://example.org/ns#a362> . +<http://example.org/ns#a363> <http://example.org/ns#a363> <http://example.org/ns#a363> . +<http://example.org/ns#a364> <http://example.org/ns#a364> <http://example.org/ns#a364> . +<http://example.org/ns#a365> <http://example.org/ns#a365> <http://example.org/ns#a365> . +<http://example.org/ns#a366> <http://example.org/ns#a366> <http://example.org/ns#a366> . +<http://example.org/ns#a367> <http://example.org/ns#a367> <http://example.org/ns#a367> . +<http://example.org/ns#a368> <http://example.org/ns#a368> <http://example.org/ns#a368> . +<http://example.org/ns#a369> <http://example.org/ns#a369> <http://example.org/ns#a369> . +<http://example.org/ns#a370> <http://example.org/ns#a370> <http://example.org/ns#a370> . +<http://example.org/ns#a371> <http://example.org/ns#a371> <http://example.org/ns#a371> . +<http://example.org/ns#a372> <http://example.org/ns#a372> <http://example.org/ns#a372> . +<http://example.org/ns#a373> <http://example.org/ns#a373> <http://example.org/ns#a373> . +<http://example.org/ns#a374> <http://example.org/ns#a374> <http://example.org/ns#a374> . +<http://example.org/ns#a375> <http://example.org/ns#a375> <http://example.org/ns#a375> . +<http://example.org/ns#a376> <http://example.org/ns#a376> <http://example.org/ns#a376> . +<http://example.org/ns#a377> <http://example.org/ns#a377> <http://example.org/ns#a377> . +<http://example.org/ns#a378> <http://example.org/ns#a378> <http://example.org/ns#a378> . +<http://example.org/ns#a379> <http://example.org/ns#a379> <http://example.org/ns#a379> . +<http://example.org/ns#a380> <http://example.org/ns#a380> <http://example.org/ns#a380> . +<http://example.org/ns#a381> <http://example.org/ns#a381> <http://example.org/ns#a381> . +<http://example.org/ns#a382> <http://example.org/ns#a382> <http://example.org/ns#a382> . +<http://example.org/ns#a383> <http://example.org/ns#a383> <http://example.org/ns#a383> . +<http://example.org/ns#a384> <http://example.org/ns#a384> <http://example.org/ns#a384> . +<http://example.org/ns#a385> <http://example.org/ns#a385> <http://example.org/ns#a385> . +<http://example.org/ns#a386> <http://example.org/ns#a386> <http://example.org/ns#a386> . +<http://example.org/ns#a387> <http://example.org/ns#a387> <http://example.org/ns#a387> . +<http://example.org/ns#a388> <http://example.org/ns#a388> <http://example.org/ns#a388> . +<http://example.org/ns#a389> <http://example.org/ns#a389> <http://example.org/ns#a389> . +<http://example.org/ns#a390> <http://example.org/ns#a390> <http://example.org/ns#a390> . +<http://example.org/ns#a391> <http://example.org/ns#a391> <http://example.org/ns#a391> . +<http://example.org/ns#a392> <http://example.org/ns#a392> <http://example.org/ns#a392> . +<http://example.org/ns#a393> <http://example.org/ns#a393> <http://example.org/ns#a393> . +<http://example.org/ns#a394> <http://example.org/ns#a394> <http://example.org/ns#a394> . +<http://example.org/ns#a395> <http://example.org/ns#a395> <http://example.org/ns#a395> . +<http://example.org/ns#a396> <http://example.org/ns#a396> <http://example.org/ns#a396> . +<http://example.org/ns#a397> <http://example.org/ns#a397> <http://example.org/ns#a397> . +<http://example.org/ns#a398> <http://example.org/ns#a398> <http://example.org/ns#a398> . +<http://example.org/ns#a399> <http://example.org/ns#a399> <http://example.org/ns#a399> . +<http://example.org/ns#a400> <http://example.org/ns#a400> <http://example.org/ns#a400> . +<http://example.org/ns#a401> <http://example.org/ns#a401> <http://example.org/ns#a401> . +<http://example.org/ns#a402> <http://example.org/ns#a402> <http://example.org/ns#a402> . +<http://example.org/ns#a403> <http://example.org/ns#a403> <http://example.org/ns#a403> . +<http://example.org/ns#a404> <http://example.org/ns#a404> <http://example.org/ns#a404> . +<http://example.org/ns#a405> <http://example.org/ns#a405> <http://example.org/ns#a405> . +<http://example.org/ns#a406> <http://example.org/ns#a406> <http://example.org/ns#a406> . +<http://example.org/ns#a407> <http://example.org/ns#a407> <http://example.org/ns#a407> . +<http://example.org/ns#a408> <http://example.org/ns#a408> <http://example.org/ns#a408> . +<http://example.org/ns#a409> <http://example.org/ns#a409> <http://example.org/ns#a409> . +<http://example.org/ns#a410> <http://example.org/ns#a410> <http://example.org/ns#a410> . +<http://example.org/ns#a411> <http://example.org/ns#a411> <http://example.org/ns#a411> . +<http://example.org/ns#a412> <http://example.org/ns#a412> <http://example.org/ns#a412> . +<http://example.org/ns#a413> <http://example.org/ns#a413> <http://example.org/ns#a413> . +<http://example.org/ns#a414> <http://example.org/ns#a414> <http://example.org/ns#a414> . +<http://example.org/ns#a415> <http://example.org/ns#a415> <http://example.org/ns#a415> . +<http://example.org/ns#a416> <http://example.org/ns#a416> <http://example.org/ns#a416> . +<http://example.org/ns#a417> <http://example.org/ns#a417> <http://example.org/ns#a417> . +<http://example.org/ns#a418> <http://example.org/ns#a418> <http://example.org/ns#a418> . +<http://example.org/ns#a419> <http://example.org/ns#a419> <http://example.org/ns#a419> . +<http://example.org/ns#a420> <http://example.org/ns#a420> <http://example.org/ns#a420> . +<http://example.org/ns#a421> <http://example.org/ns#a421> <http://example.org/ns#a421> . +<http://example.org/ns#a422> <http://example.org/ns#a422> <http://example.org/ns#a422> . +<http://example.org/ns#a423> <http://example.org/ns#a423> <http://example.org/ns#a423> . +<http://example.org/ns#a424> <http://example.org/ns#a424> <http://example.org/ns#a424> . +<http://example.org/ns#a425> <http://example.org/ns#a425> <http://example.org/ns#a425> . +<http://example.org/ns#a426> <http://example.org/ns#a426> <http://example.org/ns#a426> . +<http://example.org/ns#a427> <http://example.org/ns#a427> <http://example.org/ns#a427> . +<http://example.org/ns#a428> <http://example.org/ns#a428> <http://example.org/ns#a428> . +<http://example.org/ns#a429> <http://example.org/ns#a429> <http://example.org/ns#a429> . +<http://example.org/ns#a430> <http://example.org/ns#a430> <http://example.org/ns#a430> . +<http://example.org/ns#a431> <http://example.org/ns#a431> <http://example.org/ns#a431> . +<http://example.org/ns#a432> <http://example.org/ns#a432> <http://example.org/ns#a432> . +<http://example.org/ns#a433> <http://example.org/ns#a433> <http://example.org/ns#a433> . +<http://example.org/ns#a434> <http://example.org/ns#a434> <http://example.org/ns#a434> . +<http://example.org/ns#a435> <http://example.org/ns#a435> <http://example.org/ns#a435> . +<http://example.org/ns#a436> <http://example.org/ns#a436> <http://example.org/ns#a436> . +<http://example.org/ns#a437> <http://example.org/ns#a437> <http://example.org/ns#a437> . +<http://example.org/ns#a438> <http://example.org/ns#a438> <http://example.org/ns#a438> . +<http://example.org/ns#a439> <http://example.org/ns#a439> <http://example.org/ns#a439> . +<http://example.org/ns#a440> <http://example.org/ns#a440> <http://example.org/ns#a440> . +<http://example.org/ns#a441> <http://example.org/ns#a441> <http://example.org/ns#a441> . +<http://example.org/ns#a442> <http://example.org/ns#a442> <http://example.org/ns#a442> . +<http://example.org/ns#a443> <http://example.org/ns#a443> <http://example.org/ns#a443> . +<http://example.org/ns#a444> <http://example.org/ns#a444> <http://example.org/ns#a444> . +<http://example.org/ns#a445> <http://example.org/ns#a445> <http://example.org/ns#a445> . +<http://example.org/ns#a446> <http://example.org/ns#a446> <http://example.org/ns#a446> . +<http://example.org/ns#a447> <http://example.org/ns#a447> <http://example.org/ns#a447> . +<http://example.org/ns#a448> <http://example.org/ns#a448> <http://example.org/ns#a448> . +<http://example.org/ns#a449> <http://example.org/ns#a449> <http://example.org/ns#a449> . +<http://example.org/ns#a450> <http://example.org/ns#a450> <http://example.org/ns#a450> . +<http://example.org/ns#a451> <http://example.org/ns#a451> <http://example.org/ns#a451> . +<http://example.org/ns#a452> <http://example.org/ns#a452> <http://example.org/ns#a452> . +<http://example.org/ns#a453> <http://example.org/ns#a453> <http://example.org/ns#a453> . +<http://example.org/ns#a454> <http://example.org/ns#a454> <http://example.org/ns#a454> . +<http://example.org/ns#a455> <http://example.org/ns#a455> <http://example.org/ns#a455> . +<http://example.org/ns#a456> <http://example.org/ns#a456> <http://example.org/ns#a456> . +<http://example.org/ns#a457> <http://example.org/ns#a457> <http://example.org/ns#a457> . +<http://example.org/ns#a458> <http://example.org/ns#a458> <http://example.org/ns#a458> . +<http://example.org/ns#a459> <http://example.org/ns#a459> <http://example.org/ns#a459> . +<http://example.org/ns#a460> <http://example.org/ns#a460> <http://example.org/ns#a460> . +<http://example.org/ns#a461> <http://example.org/ns#a461> <http://example.org/ns#a461> . +<http://example.org/ns#a462> <http://example.org/ns#a462> <http://example.org/ns#a462> . +<http://example.org/ns#a463> <http://example.org/ns#a463> <http://example.org/ns#a463> . +<http://example.org/ns#a464> <http://example.org/ns#a464> <http://example.org/ns#a464> . +<http://example.org/ns#a465> <http://example.org/ns#a465> <http://example.org/ns#a465> . +<http://example.org/ns#a466> <http://example.org/ns#a466> <http://example.org/ns#a466> . +<http://example.org/ns#a467> <http://example.org/ns#a467> <http://example.org/ns#a467> . +<http://example.org/ns#a468> <http://example.org/ns#a468> <http://example.org/ns#a468> . +<http://example.org/ns#a469> <http://example.org/ns#a469> <http://example.org/ns#a469> . +<http://example.org/ns#a470> <http://example.org/ns#a470> <http://example.org/ns#a470> . +<http://example.org/ns#a471> <http://example.org/ns#a471> <http://example.org/ns#a471> . +<http://example.org/ns#a472> <http://example.org/ns#a472> <http://example.org/ns#a472> . +<http://example.org/ns#a473> <http://example.org/ns#a473> <http://example.org/ns#a473> . +<http://example.org/ns#a474> <http://example.org/ns#a474> <http://example.org/ns#a474> . +<http://example.org/ns#a475> <http://example.org/ns#a475> <http://example.org/ns#a475> . +<http://example.org/ns#a476> <http://example.org/ns#a476> <http://example.org/ns#a476> . +<http://example.org/ns#a477> <http://example.org/ns#a477> <http://example.org/ns#a477> . +<http://example.org/ns#a478> <http://example.org/ns#a478> <http://example.org/ns#a478> . +<http://example.org/ns#a479> <http://example.org/ns#a479> <http://example.org/ns#a479> . +<http://example.org/ns#a480> <http://example.org/ns#a480> <http://example.org/ns#a480> . +<http://example.org/ns#a481> <http://example.org/ns#a481> <http://example.org/ns#a481> . +<http://example.org/ns#a482> <http://example.org/ns#a482> <http://example.org/ns#a482> . +<http://example.org/ns#a483> <http://example.org/ns#a483> <http://example.org/ns#a483> . +<http://example.org/ns#a484> <http://example.org/ns#a484> <http://example.org/ns#a484> . +<http://example.org/ns#a485> <http://example.org/ns#a485> <http://example.org/ns#a485> . +<http://example.org/ns#a486> <http://example.org/ns#a486> <http://example.org/ns#a486> . +<http://example.org/ns#a487> <http://example.org/ns#a487> <http://example.org/ns#a487> . +<http://example.org/ns#a488> <http://example.org/ns#a488> <http://example.org/ns#a488> . +<http://example.org/ns#a489> <http://example.org/ns#a489> <http://example.org/ns#a489> . +<http://example.org/ns#a490> <http://example.org/ns#a490> <http://example.org/ns#a490> . +<http://example.org/ns#a491> <http://example.org/ns#a491> <http://example.org/ns#a491> . +<http://example.org/ns#a492> <http://example.org/ns#a492> <http://example.org/ns#a492> . +<http://example.org/ns#a493> <http://example.org/ns#a493> <http://example.org/ns#a493> . +<http://example.org/ns#a494> <http://example.org/ns#a494> <http://example.org/ns#a494> . +<http://example.org/ns#a495> <http://example.org/ns#a495> <http://example.org/ns#a495> . +<http://example.org/ns#a496> <http://example.org/ns#a496> <http://example.org/ns#a496> . +<http://example.org/ns#a497> <http://example.org/ns#a497> <http://example.org/ns#a497> . +<http://example.org/ns#a498> <http://example.org/ns#a498> <http://example.org/ns#a498> . +<http://example.org/ns#a499> <http://example.org/ns#a499> <http://example.org/ns#a499> . +<http://example.org/ns#a500> <http://example.org/ns#a500> <http://example.org/ns#a500> . +<http://example.org/ns#a501> <http://example.org/ns#a501> <http://example.org/ns#a501> . +<http://example.org/ns#a502> <http://example.org/ns#a502> <http://example.org/ns#a502> . +<http://example.org/ns#a503> <http://example.org/ns#a503> <http://example.org/ns#a503> . +<http://example.org/ns#a504> <http://example.org/ns#a504> <http://example.org/ns#a504> . +<http://example.org/ns#a505> <http://example.org/ns#a505> <http://example.org/ns#a505> . +<http://example.org/ns#a506> <http://example.org/ns#a506> <http://example.org/ns#a506> . +<http://example.org/ns#a507> <http://example.org/ns#a507> <http://example.org/ns#a507> . +<http://example.org/ns#a508> <http://example.org/ns#a508> <http://example.org/ns#a508> . +<http://example.org/ns#a509> <http://example.org/ns#a509> <http://example.org/ns#a509> . +<http://example.org/ns#a510> <http://example.org/ns#a510> <http://example.org/ns#a510> . +<http://example.org/ns#a511> <http://example.org/ns#a511> <http://example.org/ns#a511> . +<http://example.org/ns#a512> <http://example.org/ns#a512> <http://example.org/ns#a512> . +<http://example.org/ns#a513> <http://example.org/ns#a513> <http://example.org/ns#a513> . +<http://example.org/ns#a514> <http://example.org/ns#a514> <http://example.org/ns#a514> . +<http://example.org/ns#a515> <http://example.org/ns#a515> <http://example.org/ns#a515> . +<http://example.org/ns#a516> <http://example.org/ns#a516> <http://example.org/ns#a516> . +<http://example.org/ns#a517> <http://example.org/ns#a517> <http://example.org/ns#a517> . +<http://example.org/ns#a518> <http://example.org/ns#a518> <http://example.org/ns#a518> . +<http://example.org/ns#a519> <http://example.org/ns#a519> <http://example.org/ns#a519> . +<http://example.org/ns#a520> <http://example.org/ns#a520> <http://example.org/ns#a520> . +<http://example.org/ns#a521> <http://example.org/ns#a521> <http://example.org/ns#a521> . +<http://example.org/ns#a522> <http://example.org/ns#a522> <http://example.org/ns#a522> . +<http://example.org/ns#a523> <http://example.org/ns#a523> <http://example.org/ns#a523> . +<http://example.org/ns#a524> <http://example.org/ns#a524> <http://example.org/ns#a524> . +<http://example.org/ns#a525> <http://example.org/ns#a525> <http://example.org/ns#a525> . +<http://example.org/ns#a526> <http://example.org/ns#a526> <http://example.org/ns#a526> . +<http://example.org/ns#a527> <http://example.org/ns#a527> <http://example.org/ns#a527> . +<http://example.org/ns#a528> <http://example.org/ns#a528> <http://example.org/ns#a528> . +<http://example.org/ns#a529> <http://example.org/ns#a529> <http://example.org/ns#a529> . +<http://example.org/ns#a530> <http://example.org/ns#a530> <http://example.org/ns#a530> . +<http://example.org/ns#a531> <http://example.org/ns#a531> <http://example.org/ns#a531> . +<http://example.org/ns#a532> <http://example.org/ns#a532> <http://example.org/ns#a532> . +<http://example.org/ns#a533> <http://example.org/ns#a533> <http://example.org/ns#a533> . +<http://example.org/ns#a534> <http://example.org/ns#a534> <http://example.org/ns#a534> . +<http://example.org/ns#a535> <http://example.org/ns#a535> <http://example.org/ns#a535> . +<http://example.org/ns#a536> <http://example.org/ns#a536> <http://example.org/ns#a536> . +<http://example.org/ns#a537> <http://example.org/ns#a537> <http://example.org/ns#a537> . +<http://example.org/ns#a538> <http://example.org/ns#a538> <http://example.org/ns#a538> . +<http://example.org/ns#a539> <http://example.org/ns#a539> <http://example.org/ns#a539> . +<http://example.org/ns#a540> <http://example.org/ns#a540> <http://example.org/ns#a540> . +<http://example.org/ns#a541> <http://example.org/ns#a541> <http://example.org/ns#a541> . +<http://example.org/ns#a542> <http://example.org/ns#a542> <http://example.org/ns#a542> . +<http://example.org/ns#a543> <http://example.org/ns#a543> <http://example.org/ns#a543> . +<http://example.org/ns#a544> <http://example.org/ns#a544> <http://example.org/ns#a544> . +<http://example.org/ns#a545> <http://example.org/ns#a545> <http://example.org/ns#a545> . +<http://example.org/ns#a546> <http://example.org/ns#a546> <http://example.org/ns#a546> . +<http://example.org/ns#a547> <http://example.org/ns#a547> <http://example.org/ns#a547> . +<http://example.org/ns#a548> <http://example.org/ns#a548> <http://example.org/ns#a548> . +<http://example.org/ns#a549> <http://example.org/ns#a549> <http://example.org/ns#a549> . +<http://example.org/ns#a550> <http://example.org/ns#a550> <http://example.org/ns#a550> . +<http://example.org/ns#a551> <http://example.org/ns#a551> <http://example.org/ns#a551> . +<http://example.org/ns#a552> <http://example.org/ns#a552> <http://example.org/ns#a552> . +<http://example.org/ns#a553> <http://example.org/ns#a553> <http://example.org/ns#a553> . +<http://example.org/ns#a554> <http://example.org/ns#a554> <http://example.org/ns#a554> . +<http://example.org/ns#a555> <http://example.org/ns#a555> <http://example.org/ns#a555> . +<http://example.org/ns#a556> <http://example.org/ns#a556> <http://example.org/ns#a556> . +<http://example.org/ns#a557> <http://example.org/ns#a557> <http://example.org/ns#a557> . +<http://example.org/ns#a558> <http://example.org/ns#a558> <http://example.org/ns#a558> . +<http://example.org/ns#a559> <http://example.org/ns#a559> <http://example.org/ns#a559> . +<http://example.org/ns#a560> <http://example.org/ns#a560> <http://example.org/ns#a560> . +<http://example.org/ns#a561> <http://example.org/ns#a561> <http://example.org/ns#a561> . +<http://example.org/ns#a562> <http://example.org/ns#a562> <http://example.org/ns#a562> . +<http://example.org/ns#a563> <http://example.org/ns#a563> <http://example.org/ns#a563> . +<http://example.org/ns#a564> <http://example.org/ns#a564> <http://example.org/ns#a564> . +<http://example.org/ns#a565> <http://example.org/ns#a565> <http://example.org/ns#a565> . +<http://example.org/ns#a566> <http://example.org/ns#a566> <http://example.org/ns#a566> . +<http://example.org/ns#a567> <http://example.org/ns#a567> <http://example.org/ns#a567> . +<http://example.org/ns#a568> <http://example.org/ns#a568> <http://example.org/ns#a568> . +<http://example.org/ns#a569> <http://example.org/ns#a569> <http://example.org/ns#a569> . +<http://example.org/ns#a570> <http://example.org/ns#a570> <http://example.org/ns#a570> . +<http://example.org/ns#a571> <http://example.org/ns#a571> <http://example.org/ns#a571> . +<http://example.org/ns#a572> <http://example.org/ns#a572> <http://example.org/ns#a572> . +<http://example.org/ns#a573> <http://example.org/ns#a573> <http://example.org/ns#a573> . +<http://example.org/ns#a574> <http://example.org/ns#a574> <http://example.org/ns#a574> . +<http://example.org/ns#a575> <http://example.org/ns#a575> <http://example.org/ns#a575> . +<http://example.org/ns#a576> <http://example.org/ns#a576> <http://example.org/ns#a576> . +<http://example.org/ns#a577> <http://example.org/ns#a577> <http://example.org/ns#a577> . +<http://example.org/ns#a578> <http://example.org/ns#a578> <http://example.org/ns#a578> . +<http://example.org/ns#a579> <http://example.org/ns#a579> <http://example.org/ns#a579> . +<http://example.org/ns#a580> <http://example.org/ns#a580> <http://example.org/ns#a580> . +<http://example.org/ns#a581> <http://example.org/ns#a581> <http://example.org/ns#a581> . +<http://example.org/ns#a582> <http://example.org/ns#a582> <http://example.org/ns#a582> . +<http://example.org/ns#a583> <http://example.org/ns#a583> <http://example.org/ns#a583> . +<http://example.org/ns#a584> <http://example.org/ns#a584> <http://example.org/ns#a584> . +<http://example.org/ns#a585> <http://example.org/ns#a585> <http://example.org/ns#a585> . +<http://example.org/ns#a586> <http://example.org/ns#a586> <http://example.org/ns#a586> . +<http://example.org/ns#a587> <http://example.org/ns#a587> <http://example.org/ns#a587> . +<http://example.org/ns#a588> <http://example.org/ns#a588> <http://example.org/ns#a588> . +<http://example.org/ns#a589> <http://example.org/ns#a589> <http://example.org/ns#a589> . +<http://example.org/ns#a590> <http://example.org/ns#a590> <http://example.org/ns#a590> . +<http://example.org/ns#a591> <http://example.org/ns#a591> <http://example.org/ns#a591> . +<http://example.org/ns#a592> <http://example.org/ns#a592> <http://example.org/ns#a592> . +<http://example.org/ns#a593> <http://example.org/ns#a593> <http://example.org/ns#a593> . +<http://example.org/ns#a594> <http://example.org/ns#a594> <http://example.org/ns#a594> . +<http://example.org/ns#a595> <http://example.org/ns#a595> <http://example.org/ns#a595> . +<http://example.org/ns#a596> <http://example.org/ns#a596> <http://example.org/ns#a596> . +<http://example.org/ns#a597> <http://example.org/ns#a597> <http://example.org/ns#a597> . +<http://example.org/ns#a598> <http://example.org/ns#a598> <http://example.org/ns#a598> . +<http://example.org/ns#a599> <http://example.org/ns#a599> <http://example.org/ns#a599> . +<http://example.org/ns#a600> <http://example.org/ns#a600> <http://example.org/ns#a600> . +<http://example.org/ns#a601> <http://example.org/ns#a601> <http://example.org/ns#a601> . +<http://example.org/ns#a602> <http://example.org/ns#a602> <http://example.org/ns#a602> . +<http://example.org/ns#a603> <http://example.org/ns#a603> <http://example.org/ns#a603> . +<http://example.org/ns#a604> <http://example.org/ns#a604> <http://example.org/ns#a604> . +<http://example.org/ns#a605> <http://example.org/ns#a605> <http://example.org/ns#a605> . +<http://example.org/ns#a606> <http://example.org/ns#a606> <http://example.org/ns#a606> . +<http://example.org/ns#a607> <http://example.org/ns#a607> <http://example.org/ns#a607> . +<http://example.org/ns#a608> <http://example.org/ns#a608> <http://example.org/ns#a608> . +<http://example.org/ns#a609> <http://example.org/ns#a609> <http://example.org/ns#a609> . +<http://example.org/ns#a610> <http://example.org/ns#a610> <http://example.org/ns#a610> . +<http://example.org/ns#a611> <http://example.org/ns#a611> <http://example.org/ns#a611> . +<http://example.org/ns#a612> <http://example.org/ns#a612> <http://example.org/ns#a612> . +<http://example.org/ns#a613> <http://example.org/ns#a613> <http://example.org/ns#a613> . +<http://example.org/ns#a614> <http://example.org/ns#a614> <http://example.org/ns#a614> . +<http://example.org/ns#a615> <http://example.org/ns#a615> <http://example.org/ns#a615> . +<http://example.org/ns#a616> <http://example.org/ns#a616> <http://example.org/ns#a616> . +<http://example.org/ns#a617> <http://example.org/ns#a617> <http://example.org/ns#a617> . +<http://example.org/ns#a618> <http://example.org/ns#a618> <http://example.org/ns#a618> . +<http://example.org/ns#a619> <http://example.org/ns#a619> <http://example.org/ns#a619> . +<http://example.org/ns#a620> <http://example.org/ns#a620> <http://example.org/ns#a620> . +<http://example.org/ns#a621> <http://example.org/ns#a621> <http://example.org/ns#a621> . +<http://example.org/ns#a622> <http://example.org/ns#a622> <http://example.org/ns#a622> . +<http://example.org/ns#a623> <http://example.org/ns#a623> <http://example.org/ns#a623> . +<http://example.org/ns#a624> <http://example.org/ns#a624> <http://example.org/ns#a624> . +<http://example.org/ns#a625> <http://example.org/ns#a625> <http://example.org/ns#a625> . +<http://example.org/ns#a626> <http://example.org/ns#a626> <http://example.org/ns#a626> . +<http://example.org/ns#a627> <http://example.org/ns#a627> <http://example.org/ns#a627> . +<http://example.org/ns#a628> <http://example.org/ns#a628> <http://example.org/ns#a628> . +<http://example.org/ns#a629> <http://example.org/ns#a629> <http://example.org/ns#a629> . +<http://example.org/ns#a630> <http://example.org/ns#a630> <http://example.org/ns#a630> . +<http://example.org/ns#a631> <http://example.org/ns#a631> <http://example.org/ns#a631> . +<http://example.org/ns#a632> <http://example.org/ns#a632> <http://example.org/ns#a632> . +<http://example.org/ns#a633> <http://example.org/ns#a633> <http://example.org/ns#a633> . +<http://example.org/ns#a634> <http://example.org/ns#a634> <http://example.org/ns#a634> . +<http://example.org/ns#a635> <http://example.org/ns#a635> <http://example.org/ns#a635> . +<http://example.org/ns#a636> <http://example.org/ns#a636> <http://example.org/ns#a636> . +<http://example.org/ns#a637> <http://example.org/ns#a637> <http://example.org/ns#a637> . +<http://example.org/ns#a638> <http://example.org/ns#a638> <http://example.org/ns#a638> . +<http://example.org/ns#a639> <http://example.org/ns#a639> <http://example.org/ns#a639> . +<http://example.org/ns#a640> <http://example.org/ns#a640> <http://example.org/ns#a640> . +<http://example.org/ns#a641> <http://example.org/ns#a641> <http://example.org/ns#a641> . +<http://example.org/ns#a642> <http://example.org/ns#a642> <http://example.org/ns#a642> . +<http://example.org/ns#a643> <http://example.org/ns#a643> <http://example.org/ns#a643> . +<http://example.org/ns#a644> <http://example.org/ns#a644> <http://example.org/ns#a644> . +<http://example.org/ns#a645> <http://example.org/ns#a645> <http://example.org/ns#a645> . +<http://example.org/ns#a646> <http://example.org/ns#a646> <http://example.org/ns#a646> . +<http://example.org/ns#a647> <http://example.org/ns#a647> <http://example.org/ns#a647> . +<http://example.org/ns#a648> <http://example.org/ns#a648> <http://example.org/ns#a648> . +<http://example.org/ns#a649> <http://example.org/ns#a649> <http://example.org/ns#a649> . +<http://example.org/ns#a650> <http://example.org/ns#a650> <http://example.org/ns#a650> . +<http://example.org/ns#a651> <http://example.org/ns#a651> <http://example.org/ns#a651> . +<http://example.org/ns#a652> <http://example.org/ns#a652> <http://example.org/ns#a652> . +<http://example.org/ns#a653> <http://example.org/ns#a653> <http://example.org/ns#a653> . +<http://example.org/ns#a654> <http://example.org/ns#a654> <http://example.org/ns#a654> . +<http://example.org/ns#a655> <http://example.org/ns#a655> <http://example.org/ns#a655> . +<http://example.org/ns#a656> <http://example.org/ns#a656> <http://example.org/ns#a656> . +<http://example.org/ns#a657> <http://example.org/ns#a657> <http://example.org/ns#a657> . +<http://example.org/ns#a658> <http://example.org/ns#a658> <http://example.org/ns#a658> . +<http://example.org/ns#a659> <http://example.org/ns#a659> <http://example.org/ns#a659> . +<http://example.org/ns#a660> <http://example.org/ns#a660> <http://example.org/ns#a660> . +<http://example.org/ns#a661> <http://example.org/ns#a661> <http://example.org/ns#a661> . +<http://example.org/ns#a662> <http://example.org/ns#a662> <http://example.org/ns#a662> . +<http://example.org/ns#a663> <http://example.org/ns#a663> <http://example.org/ns#a663> . +<http://example.org/ns#a664> <http://example.org/ns#a664> <http://example.org/ns#a664> . +<http://example.org/ns#a665> <http://example.org/ns#a665> <http://example.org/ns#a665> . +<http://example.org/ns#a666> <http://example.org/ns#a666> <http://example.org/ns#a666> . +<http://example.org/ns#a667> <http://example.org/ns#a667> <http://example.org/ns#a667> . +<http://example.org/ns#a668> <http://example.org/ns#a668> <http://example.org/ns#a668> . +<http://example.org/ns#a669> <http://example.org/ns#a669> <http://example.org/ns#a669> . +<http://example.org/ns#a670> <http://example.org/ns#a670> <http://example.org/ns#a670> . +<http://example.org/ns#a671> <http://example.org/ns#a671> <http://example.org/ns#a671> . +<http://example.org/ns#a672> <http://example.org/ns#a672> <http://example.org/ns#a672> . +<http://example.org/ns#a673> <http://example.org/ns#a673> <http://example.org/ns#a673> . +<http://example.org/ns#a674> <http://example.org/ns#a674> <http://example.org/ns#a674> . +<http://example.org/ns#a675> <http://example.org/ns#a675> <http://example.org/ns#a675> . +<http://example.org/ns#a676> <http://example.org/ns#a676> <http://example.org/ns#a676> . +<http://example.org/ns#a677> <http://example.org/ns#a677> <http://example.org/ns#a677> . +<http://example.org/ns#a678> <http://example.org/ns#a678> <http://example.org/ns#a678> . +<http://example.org/ns#a679> <http://example.org/ns#a679> <http://example.org/ns#a679> . +<http://example.org/ns#a680> <http://example.org/ns#a680> <http://example.org/ns#a680> . +<http://example.org/ns#a681> <http://example.org/ns#a681> <http://example.org/ns#a681> . +<http://example.org/ns#a682> <http://example.org/ns#a682> <http://example.org/ns#a682> . +<http://example.org/ns#a683> <http://example.org/ns#a683> <http://example.org/ns#a683> . +<http://example.org/ns#a684> <http://example.org/ns#a684> <http://example.org/ns#a684> . +<http://example.org/ns#a685> <http://example.org/ns#a685> <http://example.org/ns#a685> . +<http://example.org/ns#a686> <http://example.org/ns#a686> <http://example.org/ns#a686> . +<http://example.org/ns#a687> <http://example.org/ns#a687> <http://example.org/ns#a687> . +<http://example.org/ns#a688> <http://example.org/ns#a688> <http://example.org/ns#a688> . +<http://example.org/ns#a689> <http://example.org/ns#a689> <http://example.org/ns#a689> . +<http://example.org/ns#a690> <http://example.org/ns#a690> <http://example.org/ns#a690> . +<http://example.org/ns#a691> <http://example.org/ns#a691> <http://example.org/ns#a691> . +<http://example.org/ns#a692> <http://example.org/ns#a692> <http://example.org/ns#a692> . +<http://example.org/ns#a693> <http://example.org/ns#a693> <http://example.org/ns#a693> . +<http://example.org/ns#a694> <http://example.org/ns#a694> <http://example.org/ns#a694> . +<http://example.org/ns#a695> <http://example.org/ns#a695> <http://example.org/ns#a695> . +<http://example.org/ns#a696> <http://example.org/ns#a696> <http://example.org/ns#a696> . +<http://example.org/ns#a697> <http://example.org/ns#a697> <http://example.org/ns#a697> . +<http://example.org/ns#a698> <http://example.org/ns#a698> <http://example.org/ns#a698> . +<http://example.org/ns#a699> <http://example.org/ns#a699> <http://example.org/ns#a699> . +<http://example.org/ns#a700> <http://example.org/ns#a700> <http://example.org/ns#a700> . +<http://example.org/ns#a701> <http://example.org/ns#a701> <http://example.org/ns#a701> . +<http://example.org/ns#a702> <http://example.org/ns#a702> <http://example.org/ns#a702> . +<http://example.org/ns#a703> <http://example.org/ns#a703> <http://example.org/ns#a703> . +<http://example.org/ns#a704> <http://example.org/ns#a704> <http://example.org/ns#a704> . +<http://example.org/ns#a705> <http://example.org/ns#a705> <http://example.org/ns#a705> . +<http://example.org/ns#a706> <http://example.org/ns#a706> <http://example.org/ns#a706> . +<http://example.org/ns#a707> <http://example.org/ns#a707> <http://example.org/ns#a707> . +<http://example.org/ns#a708> <http://example.org/ns#a708> <http://example.org/ns#a708> . +<http://example.org/ns#a709> <http://example.org/ns#a709> <http://example.org/ns#a709> . +<http://example.org/ns#a710> <http://example.org/ns#a710> <http://example.org/ns#a710> . +<http://example.org/ns#a711> <http://example.org/ns#a711> <http://example.org/ns#a711> . +<http://example.org/ns#a712> <http://example.org/ns#a712> <http://example.org/ns#a712> . +<http://example.org/ns#a713> <http://example.org/ns#a713> <http://example.org/ns#a713> . +<http://example.org/ns#a714> <http://example.org/ns#a714> <http://example.org/ns#a714> . +<http://example.org/ns#a715> <http://example.org/ns#a715> <http://example.org/ns#a715> . +<http://example.org/ns#a716> <http://example.org/ns#a716> <http://example.org/ns#a716> . +<http://example.org/ns#a717> <http://example.org/ns#a717> <http://example.org/ns#a717> . +<http://example.org/ns#a718> <http://example.org/ns#a718> <http://example.org/ns#a718> . +<http://example.org/ns#a719> <http://example.org/ns#a719> <http://example.org/ns#a719> . +<http://example.org/ns#a720> <http://example.org/ns#a720> <http://example.org/ns#a720> . +<http://example.org/ns#a721> <http://example.org/ns#a721> <http://example.org/ns#a721> . +<http://example.org/ns#a722> <http://example.org/ns#a722> <http://example.org/ns#a722> . +<http://example.org/ns#a723> <http://example.org/ns#a723> <http://example.org/ns#a723> . +<http://example.org/ns#a724> <http://example.org/ns#a724> <http://example.org/ns#a724> . +<http://example.org/ns#a725> <http://example.org/ns#a725> <http://example.org/ns#a725> . +<http://example.org/ns#a726> <http://example.org/ns#a726> <http://example.org/ns#a726> . +<http://example.org/ns#a727> <http://example.org/ns#a727> <http://example.org/ns#a727> . +<http://example.org/ns#a728> <http://example.org/ns#a728> <http://example.org/ns#a728> . +<http://example.org/ns#a729> <http://example.org/ns#a729> <http://example.org/ns#a729> . +<http://example.org/ns#a730> <http://example.org/ns#a730> <http://example.org/ns#a730> . +<http://example.org/ns#a731> <http://example.org/ns#a731> <http://example.org/ns#a731> . +<http://example.org/ns#a732> <http://example.org/ns#a732> <http://example.org/ns#a732> . +<http://example.org/ns#a733> <http://example.org/ns#a733> <http://example.org/ns#a733> . +<http://example.org/ns#a734> <http://example.org/ns#a734> <http://example.org/ns#a734> . +<http://example.org/ns#a735> <http://example.org/ns#a735> <http://example.org/ns#a735> . +<http://example.org/ns#a736> <http://example.org/ns#a736> <http://example.org/ns#a736> . +<http://example.org/ns#a737> <http://example.org/ns#a737> <http://example.org/ns#a737> . +<http://example.org/ns#a738> <http://example.org/ns#a738> <http://example.org/ns#a738> . +<http://example.org/ns#a739> <http://example.org/ns#a739> <http://example.org/ns#a739> . +<http://example.org/ns#a740> <http://example.org/ns#a740> <http://example.org/ns#a740> . +<http://example.org/ns#a741> <http://example.org/ns#a741> <http://example.org/ns#a741> . +<http://example.org/ns#a742> <http://example.org/ns#a742> <http://example.org/ns#a742> . +<http://example.org/ns#a743> <http://example.org/ns#a743> <http://example.org/ns#a743> . +<http://example.org/ns#a744> <http://example.org/ns#a744> <http://example.org/ns#a744> . +<http://example.org/ns#a745> <http://example.org/ns#a745> <http://example.org/ns#a745> . +<http://example.org/ns#a746> <http://example.org/ns#a746> <http://example.org/ns#a746> . +<http://example.org/ns#a747> <http://example.org/ns#a747> <http://example.org/ns#a747> . +<http://example.org/ns#a748> <http://example.org/ns#a748> <http://example.org/ns#a748> . +<http://example.org/ns#a749> <http://example.org/ns#a749> <http://example.org/ns#a749> . +<http://example.org/ns#a750> <http://example.org/ns#a750> <http://example.org/ns#a750> . +<http://example.org/ns#a751> <http://example.org/ns#a751> <http://example.org/ns#a751> . +<http://example.org/ns#a752> <http://example.org/ns#a752> <http://example.org/ns#a752> . +<http://example.org/ns#a753> <http://example.org/ns#a753> <http://example.org/ns#a753> . +<http://example.org/ns#a754> <http://example.org/ns#a754> <http://example.org/ns#a754> . +<http://example.org/ns#a755> <http://example.org/ns#a755> <http://example.org/ns#a755> . +<http://example.org/ns#a756> <http://example.org/ns#a756> <http://example.org/ns#a756> . +<http://example.org/ns#a757> <http://example.org/ns#a757> <http://example.org/ns#a757> . +<http://example.org/ns#a758> <http://example.org/ns#a758> <http://example.org/ns#a758> . +<http://example.org/ns#a759> <http://example.org/ns#a759> <http://example.org/ns#a759> . +<http://example.org/ns#a760> <http://example.org/ns#a760> <http://example.org/ns#a760> . +<http://example.org/ns#a761> <http://example.org/ns#a761> <http://example.org/ns#a761> . +<http://example.org/ns#a762> <http://example.org/ns#a762> <http://example.org/ns#a762> . +<http://example.org/ns#a763> <http://example.org/ns#a763> <http://example.org/ns#a763> . +<http://example.org/ns#a764> <http://example.org/ns#a764> <http://example.org/ns#a764> . +<http://example.org/ns#a765> <http://example.org/ns#a765> <http://example.org/ns#a765> . +<http://example.org/ns#a766> <http://example.org/ns#a766> <http://example.org/ns#a766> . +<http://example.org/ns#a767> <http://example.org/ns#a767> <http://example.org/ns#a767> . +<http://example.org/ns#a768> <http://example.org/ns#a768> <http://example.org/ns#a768> . +<http://example.org/ns#a769> <http://example.org/ns#a769> <http://example.org/ns#a769> . +<http://example.org/ns#a770> <http://example.org/ns#a770> <http://example.org/ns#a770> . +<http://example.org/ns#a771> <http://example.org/ns#a771> <http://example.org/ns#a771> . +<http://example.org/ns#a772> <http://example.org/ns#a772> <http://example.org/ns#a772> . +<http://example.org/ns#a773> <http://example.org/ns#a773> <http://example.org/ns#a773> . +<http://example.org/ns#a774> <http://example.org/ns#a774> <http://example.org/ns#a774> . +<http://example.org/ns#a775> <http://example.org/ns#a775> <http://example.org/ns#a775> . +<http://example.org/ns#a776> <http://example.org/ns#a776> <http://example.org/ns#a776> . +<http://example.org/ns#a777> <http://example.org/ns#a777> <http://example.org/ns#a777> . +<http://example.org/ns#a778> <http://example.org/ns#a778> <http://example.org/ns#a778> . +<http://example.org/ns#a779> <http://example.org/ns#a779> <http://example.org/ns#a779> . +<http://example.org/ns#a780> <http://example.org/ns#a780> <http://example.org/ns#a780> . +<http://example.org/ns#a781> <http://example.org/ns#a781> <http://example.org/ns#a781> . +<http://example.org/ns#a782> <http://example.org/ns#a782> <http://example.org/ns#a782> . +<http://example.org/ns#a783> <http://example.org/ns#a783> <http://example.org/ns#a783> . +<http://example.org/ns#a784> <http://example.org/ns#a784> <http://example.org/ns#a784> . +<http://example.org/ns#a785> <http://example.org/ns#a785> <http://example.org/ns#a785> . +<http://example.org/ns#a786> <http://example.org/ns#a786> <http://example.org/ns#a786> . +<http://example.org/ns#a787> <http://example.org/ns#a787> <http://example.org/ns#a787> . +<http://example.org/ns#a788> <http://example.org/ns#a788> <http://example.org/ns#a788> . +<http://example.org/ns#a789> <http://example.org/ns#a789> <http://example.org/ns#a789> . +<http://example.org/ns#a790> <http://example.org/ns#a790> <http://example.org/ns#a790> . +<http://example.org/ns#a791> <http://example.org/ns#a791> <http://example.org/ns#a791> . +<http://example.org/ns#a792> <http://example.org/ns#a792> <http://example.org/ns#a792> . +<http://example.org/ns#a793> <http://example.org/ns#a793> <http://example.org/ns#a793> . +<http://example.org/ns#a794> <http://example.org/ns#a794> <http://example.org/ns#a794> . +<http://example.org/ns#a795> <http://example.org/ns#a795> <http://example.org/ns#a795> . +<http://example.org/ns#a796> <http://example.org/ns#a796> <http://example.org/ns#a796> . +<http://example.org/ns#a797> <http://example.org/ns#a797> <http://example.org/ns#a797> . +<http://example.org/ns#a798> <http://example.org/ns#a798> <http://example.org/ns#a798> . +<http://example.org/ns#a799> <http://example.org/ns#a799> <http://example.org/ns#a799> . +<http://example.org/ns#a800> <http://example.org/ns#a800> <http://example.org/ns#a800> . +<http://example.org/ns#a801> <http://example.org/ns#a801> <http://example.org/ns#a801> . +<http://example.org/ns#a802> <http://example.org/ns#a802> <http://example.org/ns#a802> . +<http://example.org/ns#a803> <http://example.org/ns#a803> <http://example.org/ns#a803> . +<http://example.org/ns#a804> <http://example.org/ns#a804> <http://example.org/ns#a804> . +<http://example.org/ns#a805> <http://example.org/ns#a805> <http://example.org/ns#a805> . +<http://example.org/ns#a806> <http://example.org/ns#a806> <http://example.org/ns#a806> . +<http://example.org/ns#a807> <http://example.org/ns#a807> <http://example.org/ns#a807> . +<http://example.org/ns#a808> <http://example.org/ns#a808> <http://example.org/ns#a808> . +<http://example.org/ns#a809> <http://example.org/ns#a809> <http://example.org/ns#a809> . +<http://example.org/ns#a810> <http://example.org/ns#a810> <http://example.org/ns#a810> . +<http://example.org/ns#a811> <http://example.org/ns#a811> <http://example.org/ns#a811> . +<http://example.org/ns#a812> <http://example.org/ns#a812> <http://example.org/ns#a812> . +<http://example.org/ns#a813> <http://example.org/ns#a813> <http://example.org/ns#a813> . +<http://example.org/ns#a814> <http://example.org/ns#a814> <http://example.org/ns#a814> . +<http://example.org/ns#a815> <http://example.org/ns#a815> <http://example.org/ns#a815> . +<http://example.org/ns#a816> <http://example.org/ns#a816> <http://example.org/ns#a816> . +<http://example.org/ns#a817> <http://example.org/ns#a817> <http://example.org/ns#a817> . +<http://example.org/ns#a818> <http://example.org/ns#a818> <http://example.org/ns#a818> . +<http://example.org/ns#a819> <http://example.org/ns#a819> <http://example.org/ns#a819> . +<http://example.org/ns#a820> <http://example.org/ns#a820> <http://example.org/ns#a820> . +<http://example.org/ns#a821> <http://example.org/ns#a821> <http://example.org/ns#a821> . +<http://example.org/ns#a822> <http://example.org/ns#a822> <http://example.org/ns#a822> . +<http://example.org/ns#a823> <http://example.org/ns#a823> <http://example.org/ns#a823> . +<http://example.org/ns#a824> <http://example.org/ns#a824> <http://example.org/ns#a824> . +<http://example.org/ns#a825> <http://example.org/ns#a825> <http://example.org/ns#a825> . +<http://example.org/ns#a826> <http://example.org/ns#a826> <http://example.org/ns#a826> . +<http://example.org/ns#a827> <http://example.org/ns#a827> <http://example.org/ns#a827> . +<http://example.org/ns#a828> <http://example.org/ns#a828> <http://example.org/ns#a828> . +<http://example.org/ns#a829> <http://example.org/ns#a829> <http://example.org/ns#a829> . +<http://example.org/ns#a830> <http://example.org/ns#a830> <http://example.org/ns#a830> . +<http://example.org/ns#a831> <http://example.org/ns#a831> <http://example.org/ns#a831> . +<http://example.org/ns#a832> <http://example.org/ns#a832> <http://example.org/ns#a832> . +<http://example.org/ns#a833> <http://example.org/ns#a833> <http://example.org/ns#a833> . +<http://example.org/ns#a834> <http://example.org/ns#a834> <http://example.org/ns#a834> . +<http://example.org/ns#a835> <http://example.org/ns#a835> <http://example.org/ns#a835> . +<http://example.org/ns#a836> <http://example.org/ns#a836> <http://example.org/ns#a836> . +<http://example.org/ns#a837> <http://example.org/ns#a837> <http://example.org/ns#a837> . +<http://example.org/ns#a838> <http://example.org/ns#a838> <http://example.org/ns#a838> . +<http://example.org/ns#a839> <http://example.org/ns#a839> <http://example.org/ns#a839> . +<http://example.org/ns#a840> <http://example.org/ns#a840> <http://example.org/ns#a840> . +<http://example.org/ns#a841> <http://example.org/ns#a841> <http://example.org/ns#a841> . +<http://example.org/ns#a842> <http://example.org/ns#a842> <http://example.org/ns#a842> . +<http://example.org/ns#a843> <http://example.org/ns#a843> <http://example.org/ns#a843> . +<http://example.org/ns#a844> <http://example.org/ns#a844> <http://example.org/ns#a844> . +<http://example.org/ns#a845> <http://example.org/ns#a845> <http://example.org/ns#a845> . +<http://example.org/ns#a846> <http://example.org/ns#a846> <http://example.org/ns#a846> . +<http://example.org/ns#a847> <http://example.org/ns#a847> <http://example.org/ns#a847> . +<http://example.org/ns#a848> <http://example.org/ns#a848> <http://example.org/ns#a848> . +<http://example.org/ns#a849> <http://example.org/ns#a849> <http://example.org/ns#a849> . +<http://example.org/ns#a850> <http://example.org/ns#a850> <http://example.org/ns#a850> . +<http://example.org/ns#a851> <http://example.org/ns#a851> <http://example.org/ns#a851> . +<http://example.org/ns#a852> <http://example.org/ns#a852> <http://example.org/ns#a852> . +<http://example.org/ns#a853> <http://example.org/ns#a853> <http://example.org/ns#a853> . +<http://example.org/ns#a854> <http://example.org/ns#a854> <http://example.org/ns#a854> . +<http://example.org/ns#a855> <http://example.org/ns#a855> <http://example.org/ns#a855> . +<http://example.org/ns#a856> <http://example.org/ns#a856> <http://example.org/ns#a856> . +<http://example.org/ns#a857> <http://example.org/ns#a857> <http://example.org/ns#a857> . +<http://example.org/ns#a858> <http://example.org/ns#a858> <http://example.org/ns#a858> . +<http://example.org/ns#a859> <http://example.org/ns#a859> <http://example.org/ns#a859> . +<http://example.org/ns#a860> <http://example.org/ns#a860> <http://example.org/ns#a860> . +<http://example.org/ns#a861> <http://example.org/ns#a861> <http://example.org/ns#a861> . +<http://example.org/ns#a862> <http://example.org/ns#a862> <http://example.org/ns#a862> . +<http://example.org/ns#a863> <http://example.org/ns#a863> <http://example.org/ns#a863> . +<http://example.org/ns#a864> <http://example.org/ns#a864> <http://example.org/ns#a864> . +<http://example.org/ns#a865> <http://example.org/ns#a865> <http://example.org/ns#a865> . +<http://example.org/ns#a866> <http://example.org/ns#a866> <http://example.org/ns#a866> . +<http://example.org/ns#a867> <http://example.org/ns#a867> <http://example.org/ns#a867> . +<http://example.org/ns#a868> <http://example.org/ns#a868> <http://example.org/ns#a868> . +<http://example.org/ns#a869> <http://example.org/ns#a869> <http://example.org/ns#a869> . +<http://example.org/ns#a870> <http://example.org/ns#a870> <http://example.org/ns#a870> . +<http://example.org/ns#a871> <http://example.org/ns#a871> <http://example.org/ns#a871> . +<http://example.org/ns#a872> <http://example.org/ns#a872> <http://example.org/ns#a872> . +<http://example.org/ns#a873> <http://example.org/ns#a873> <http://example.org/ns#a873> . +<http://example.org/ns#a874> <http://example.org/ns#a874> <http://example.org/ns#a874> . +<http://example.org/ns#a875> <http://example.org/ns#a875> <http://example.org/ns#a875> . +<http://example.org/ns#a876> <http://example.org/ns#a876> <http://example.org/ns#a876> . +<http://example.org/ns#a877> <http://example.org/ns#a877> <http://example.org/ns#a877> . +<http://example.org/ns#a878> <http://example.org/ns#a878> <http://example.org/ns#a878> . +<http://example.org/ns#a879> <http://example.org/ns#a879> <http://example.org/ns#a879> . +<http://example.org/ns#a880> <http://example.org/ns#a880> <http://example.org/ns#a880> . +<http://example.org/ns#a881> <http://example.org/ns#a881> <http://example.org/ns#a881> . +<http://example.org/ns#a882> <http://example.org/ns#a882> <http://example.org/ns#a882> . +<http://example.org/ns#a883> <http://example.org/ns#a883> <http://example.org/ns#a883> . +<http://example.org/ns#a884> <http://example.org/ns#a884> <http://example.org/ns#a884> . +<http://example.org/ns#a885> <http://example.org/ns#a885> <http://example.org/ns#a885> . +<http://example.org/ns#a886> <http://example.org/ns#a886> <http://example.org/ns#a886> . +<http://example.org/ns#a887> <http://example.org/ns#a887> <http://example.org/ns#a887> . +<http://example.org/ns#a888> <http://example.org/ns#a888> <http://example.org/ns#a888> . +<http://example.org/ns#a889> <http://example.org/ns#a889> <http://example.org/ns#a889> . +<http://example.org/ns#a890> <http://example.org/ns#a890> <http://example.org/ns#a890> . +<http://example.org/ns#a891> <http://example.org/ns#a891> <http://example.org/ns#a891> . +<http://example.org/ns#a892> <http://example.org/ns#a892> <http://example.org/ns#a892> . +<http://example.org/ns#a893> <http://example.org/ns#a893> <http://example.org/ns#a893> . +<http://example.org/ns#a894> <http://example.org/ns#a894> <http://example.org/ns#a894> . +<http://example.org/ns#a895> <http://example.org/ns#a895> <http://example.org/ns#a895> . +<http://example.org/ns#a896> <http://example.org/ns#a896> <http://example.org/ns#a896> . +<http://example.org/ns#a897> <http://example.org/ns#a897> <http://example.org/ns#a897> . +<http://example.org/ns#a898> <http://example.org/ns#a898> <http://example.org/ns#a898> . +<http://example.org/ns#a899> <http://example.org/ns#a899> <http://example.org/ns#a899> . +<http://example.org/ns#a900> <http://example.org/ns#a900> <http://example.org/ns#a900> . +<http://example.org/ns#a901> <http://example.org/ns#a901> <http://example.org/ns#a901> . +<http://example.org/ns#a902> <http://example.org/ns#a902> <http://example.org/ns#a902> . +<http://example.org/ns#a903> <http://example.org/ns#a903> <http://example.org/ns#a903> . +<http://example.org/ns#a904> <http://example.org/ns#a904> <http://example.org/ns#a904> . +<http://example.org/ns#a905> <http://example.org/ns#a905> <http://example.org/ns#a905> . +<http://example.org/ns#a906> <http://example.org/ns#a906> <http://example.org/ns#a906> . +<http://example.org/ns#a907> <http://example.org/ns#a907> <http://example.org/ns#a907> . +<http://example.org/ns#a908> <http://example.org/ns#a908> <http://example.org/ns#a908> . +<http://example.org/ns#a909> <http://example.org/ns#a909> <http://example.org/ns#a909> . +<http://example.org/ns#a910> <http://example.org/ns#a910> <http://example.org/ns#a910> . +<http://example.org/ns#a911> <http://example.org/ns#a911> <http://example.org/ns#a911> . +<http://example.org/ns#a912> <http://example.org/ns#a912> <http://example.org/ns#a912> . +<http://example.org/ns#a913> <http://example.org/ns#a913> <http://example.org/ns#a913> . +<http://example.org/ns#a914> <http://example.org/ns#a914> <http://example.org/ns#a914> . +<http://example.org/ns#a915> <http://example.org/ns#a915> <http://example.org/ns#a915> . +<http://example.org/ns#a916> <http://example.org/ns#a916> <http://example.org/ns#a916> . +<http://example.org/ns#a917> <http://example.org/ns#a917> <http://example.org/ns#a917> . +<http://example.org/ns#a918> <http://example.org/ns#a918> <http://example.org/ns#a918> . +<http://example.org/ns#a919> <http://example.org/ns#a919> <http://example.org/ns#a919> . +<http://example.org/ns#a920> <http://example.org/ns#a920> <http://example.org/ns#a920> . +<http://example.org/ns#a921> <http://example.org/ns#a921> <http://example.org/ns#a921> . +<http://example.org/ns#a922> <http://example.org/ns#a922> <http://example.org/ns#a922> . +<http://example.org/ns#a923> <http://example.org/ns#a923> <http://example.org/ns#a923> . +<http://example.org/ns#a924> <http://example.org/ns#a924> <http://example.org/ns#a924> . +<http://example.org/ns#a925> <http://example.org/ns#a925> <http://example.org/ns#a925> . +<http://example.org/ns#a926> <http://example.org/ns#a926> <http://example.org/ns#a926> . +<http://example.org/ns#a927> <http://example.org/ns#a927> <http://example.org/ns#a927> . +<http://example.org/ns#a928> <http://example.org/ns#a928> <http://example.org/ns#a928> . +<http://example.org/ns#a929> <http://example.org/ns#a929> <http://example.org/ns#a929> . +<http://example.org/ns#a930> <http://example.org/ns#a930> <http://example.org/ns#a930> . +<http://example.org/ns#a931> <http://example.org/ns#a931> <http://example.org/ns#a931> . +<http://example.org/ns#a932> <http://example.org/ns#a932> <http://example.org/ns#a932> . +<http://example.org/ns#a933> <http://example.org/ns#a933> <http://example.org/ns#a933> . +<http://example.org/ns#a934> <http://example.org/ns#a934> <http://example.org/ns#a934> . +<http://example.org/ns#a935> <http://example.org/ns#a935> <http://example.org/ns#a935> . +<http://example.org/ns#a936> <http://example.org/ns#a936> <http://example.org/ns#a936> . +<http://example.org/ns#a937> <http://example.org/ns#a937> <http://example.org/ns#a937> . +<http://example.org/ns#a938> <http://example.org/ns#a938> <http://example.org/ns#a938> . +<http://example.org/ns#a939> <http://example.org/ns#a939> <http://example.org/ns#a939> . +<http://example.org/ns#a940> <http://example.org/ns#a940> <http://example.org/ns#a940> . +<http://example.org/ns#a941> <http://example.org/ns#a941> <http://example.org/ns#a941> . +<http://example.org/ns#a942> <http://example.org/ns#a942> <http://example.org/ns#a942> . +<http://example.org/ns#a943> <http://example.org/ns#a943> <http://example.org/ns#a943> . +<http://example.org/ns#a944> <http://example.org/ns#a944> <http://example.org/ns#a944> . +<http://example.org/ns#a945> <http://example.org/ns#a945> <http://example.org/ns#a945> . +<http://example.org/ns#a946> <http://example.org/ns#a946> <http://example.org/ns#a946> . +<http://example.org/ns#a947> <http://example.org/ns#a947> <http://example.org/ns#a947> . +<http://example.org/ns#a948> <http://example.org/ns#a948> <http://example.org/ns#a948> . +<http://example.org/ns#a949> <http://example.org/ns#a949> <http://example.org/ns#a949> . +<http://example.org/ns#a950> <http://example.org/ns#a950> <http://example.org/ns#a950> . +<http://example.org/ns#a951> <http://example.org/ns#a951> <http://example.org/ns#a951> . +<http://example.org/ns#a952> <http://example.org/ns#a952> <http://example.org/ns#a952> . +<http://example.org/ns#a953> <http://example.org/ns#a953> <http://example.org/ns#a953> . +<http://example.org/ns#a954> <http://example.org/ns#a954> <http://example.org/ns#a954> . +<http://example.org/ns#a955> <http://example.org/ns#a955> <http://example.org/ns#a955> . +<http://example.org/ns#a956> <http://example.org/ns#a956> <http://example.org/ns#a956> . +<http://example.org/ns#a957> <http://example.org/ns#a957> <http://example.org/ns#a957> . +<http://example.org/ns#a958> <http://example.org/ns#a958> <http://example.org/ns#a958> . +<http://example.org/ns#a959> <http://example.org/ns#a959> <http://example.org/ns#a959> . +<http://example.org/ns#a960> <http://example.org/ns#a960> <http://example.org/ns#a960> . +<http://example.org/ns#a961> <http://example.org/ns#a961> <http://example.org/ns#a961> . +<http://example.org/ns#a962> <http://example.org/ns#a962> <http://example.org/ns#a962> . +<http://example.org/ns#a963> <http://example.org/ns#a963> <http://example.org/ns#a963> . +<http://example.org/ns#a964> <http://example.org/ns#a964> <http://example.org/ns#a964> . +<http://example.org/ns#a965> <http://example.org/ns#a965> <http://example.org/ns#a965> . +<http://example.org/ns#a966> <http://example.org/ns#a966> <http://example.org/ns#a966> . +<http://example.org/ns#a967> <http://example.org/ns#a967> <http://example.org/ns#a967> . +<http://example.org/ns#a968> <http://example.org/ns#a968> <http://example.org/ns#a968> . +<http://example.org/ns#a969> <http://example.org/ns#a969> <http://example.org/ns#a969> . +<http://example.org/ns#a970> <http://example.org/ns#a970> <http://example.org/ns#a970> . +<http://example.org/ns#a971> <http://example.org/ns#a971> <http://example.org/ns#a971> . +<http://example.org/ns#a972> <http://example.org/ns#a972> <http://example.org/ns#a972> . +<http://example.org/ns#a973> <http://example.org/ns#a973> <http://example.org/ns#a973> . +<http://example.org/ns#a974> <http://example.org/ns#a974> <http://example.org/ns#a974> . +<http://example.org/ns#a975> <http://example.org/ns#a975> <http://example.org/ns#a975> . +<http://example.org/ns#a976> <http://example.org/ns#a976> <http://example.org/ns#a976> . +<http://example.org/ns#a977> <http://example.org/ns#a977> <http://example.org/ns#a977> . +<http://example.org/ns#a978> <http://example.org/ns#a978> <http://example.org/ns#a978> . +<http://example.org/ns#a979> <http://example.org/ns#a979> <http://example.org/ns#a979> . +<http://example.org/ns#a980> <http://example.org/ns#a980> <http://example.org/ns#a980> . +<http://example.org/ns#a981> <http://example.org/ns#a981> <http://example.org/ns#a981> . +<http://example.org/ns#a982> <http://example.org/ns#a982> <http://example.org/ns#a982> . +<http://example.org/ns#a983> <http://example.org/ns#a983> <http://example.org/ns#a983> . +<http://example.org/ns#a984> <http://example.org/ns#a984> <http://example.org/ns#a984> . +<http://example.org/ns#a985> <http://example.org/ns#a985> <http://example.org/ns#a985> . +<http://example.org/ns#a986> <http://example.org/ns#a986> <http://example.org/ns#a986> . +<http://example.org/ns#a987> <http://example.org/ns#a987> <http://example.org/ns#a987> . +<http://example.org/ns#a988> <http://example.org/ns#a988> <http://example.org/ns#a988> . +<http://example.org/ns#a989> <http://example.org/ns#a989> <http://example.org/ns#a989> . +<http://example.org/ns#a990> <http://example.org/ns#a990> <http://example.org/ns#a990> . +<http://example.org/ns#a991> <http://example.org/ns#a991> <http://example.org/ns#a991> . +<http://example.org/ns#a992> <http://example.org/ns#a992> <http://example.org/ns#a992> . +<http://example.org/ns#a993> <http://example.org/ns#a993> <http://example.org/ns#a993> . +<http://example.org/ns#a994> <http://example.org/ns#a994> <http://example.org/ns#a994> . +<http://example.org/ns#a995> <http://example.org/ns#a995> <http://example.org/ns#a995> . +<http://example.org/ns#a996> <http://example.org/ns#a996> <http://example.org/ns#a996> . +<http://example.org/ns#a997> <http://example.org/ns#a997> <http://example.org/ns#a997> . +<http://example.org/ns#a998> <http://example.org/ns#a998> <http://example.org/ns#a998> . +<http://example.org/ns#a999> <http://example.org/ns#a999> <http://example.org/ns#a999> . +<http://example.org/ns#a1000> <http://example.org/ns#a1000> <http://example.org/ns#a1000> . +<http://example.org/ns#a1001> <http://example.org/ns#a1001> <http://example.org/ns#a1001> . +<http://example.org/ns#a1002> <http://example.org/ns#a1002> <http://example.org/ns#a1002> . +<http://example.org/ns#a1003> <http://example.org/ns#a1003> <http://example.org/ns#a1003> . +<http://example.org/ns#a1004> <http://example.org/ns#a1004> <http://example.org/ns#a1004> . +<http://example.org/ns#a1005> <http://example.org/ns#a1005> <http://example.org/ns#a1005> . +<http://example.org/ns#a1006> <http://example.org/ns#a1006> <http://example.org/ns#a1006> . +<http://example.org/ns#a1007> <http://example.org/ns#a1007> <http://example.org/ns#a1007> . +<http://example.org/ns#a1008> <http://example.org/ns#a1008> <http://example.org/ns#a1008> . +<http://example.org/ns#a1009> <http://example.org/ns#a1009> <http://example.org/ns#a1009> . +<http://example.org/ns#a1010> <http://example.org/ns#a1010> <http://example.org/ns#a1010> . +<http://example.org/ns#a1011> <http://example.org/ns#a1011> <http://example.org/ns#a1011> . +<http://example.org/ns#a1012> <http://example.org/ns#a1012> <http://example.org/ns#a1012> . +<http://example.org/ns#a1013> <http://example.org/ns#a1013> <http://example.org/ns#a1013> . +<http://example.org/ns#a1014> <http://example.org/ns#a1014> <http://example.org/ns#a1014> . +<http://example.org/ns#a1015> <http://example.org/ns#a1015> <http://example.org/ns#a1015> . +<http://example.org/ns#a1016> <http://example.org/ns#a1016> <http://example.org/ns#a1016> . +<http://example.org/ns#a1017> <http://example.org/ns#a1017> <http://example.org/ns#a1017> . +<http://example.org/ns#a1018> <http://example.org/ns#a1018> <http://example.org/ns#a1018> . +<http://example.org/ns#a1019> <http://example.org/ns#a1019> <http://example.org/ns#a1019> . +<http://example.org/ns#a1020> <http://example.org/ns#a1020> <http://example.org/ns#a1020> . +<http://example.org/ns#a1021> <http://example.org/ns#a1021> <http://example.org/ns#a1021> . +<http://example.org/ns#a1022> <http://example.org/ns#a1022> <http://example.org/ns#a1022> . +<http://example.org/ns#a1023> <http://example.org/ns#a1023> <http://example.org/ns#a1023> . +<http://example.org/ns#a1024> <http://example.org/ns#a1024> <http://example.org/ns#a1024> . +<http://example.org/ns#a1025> <http://example.org/ns#a1025> <http://example.org/ns#a1025> . +<http://example.org/ns#a1026> <http://example.org/ns#a1026> <http://example.org/ns#a1026> . +<http://example.org/ns#a1027> <http://example.org/ns#a1027> <http://example.org/ns#a1027> . +<http://example.org/ns#a1028> <http://example.org/ns#a1028> <http://example.org/ns#a1028> . +<http://example.org/ns#a1029> <http://example.org/ns#a1029> <http://example.org/ns#a1029> . +<http://example.org/ns#a1030> <http://example.org/ns#a1030> <http://example.org/ns#a1030> . +<http://example.org/ns#a1031> <http://example.org/ns#a1031> <http://example.org/ns#a1031> . +<http://example.org/ns#a1032> <http://example.org/ns#a1032> <http://example.org/ns#a1032> . +<http://example.org/ns#a1033> <http://example.org/ns#a1033> <http://example.org/ns#a1033> . +<http://example.org/ns#a1034> <http://example.org/ns#a1034> <http://example.org/ns#a1034> . +<http://example.org/ns#a1035> <http://example.org/ns#a1035> <http://example.org/ns#a1035> . +<http://example.org/ns#a1036> <http://example.org/ns#a1036> <http://example.org/ns#a1036> . +<http://example.org/ns#a1037> <http://example.org/ns#a1037> <http://example.org/ns#a1037> . +<http://example.org/ns#a1038> <http://example.org/ns#a1038> <http://example.org/ns#a1038> . +<http://example.org/ns#a1039> <http://example.org/ns#a1039> <http://example.org/ns#a1039> . +<http://example.org/ns#a1040> <http://example.org/ns#a1040> <http://example.org/ns#a1040> . +<http://example.org/ns#a1041> <http://example.org/ns#a1041> <http://example.org/ns#a1041> . +<http://example.org/ns#a1042> <http://example.org/ns#a1042> <http://example.org/ns#a1042> . +<http://example.org/ns#a1043> <http://example.org/ns#a1043> <http://example.org/ns#a1043> . +<http://example.org/ns#a1044> <http://example.org/ns#a1044> <http://example.org/ns#a1044> . +<http://example.org/ns#a1045> <http://example.org/ns#a1045> <http://example.org/ns#a1045> . +<http://example.org/ns#a1046> <http://example.org/ns#a1046> <http://example.org/ns#a1046> . +<http://example.org/ns#a1047> <http://example.org/ns#a1047> <http://example.org/ns#a1047> . +<http://example.org/ns#a1048> <http://example.org/ns#a1048> <http://example.org/ns#a1048> . +<http://example.org/ns#a1049> <http://example.org/ns#a1049> <http://example.org/ns#a1049> . +<http://example.org/ns#a1050> <http://example.org/ns#a1050> <http://example.org/ns#a1050> . +<http://example.org/ns#a1051> <http://example.org/ns#a1051> <http://example.org/ns#a1051> . +<http://example.org/ns#a1052> <http://example.org/ns#a1052> <http://example.org/ns#a1052> . +<http://example.org/ns#a1053> <http://example.org/ns#a1053> <http://example.org/ns#a1053> . +<http://example.org/ns#a1054> <http://example.org/ns#a1054> <http://example.org/ns#a1054> . +<http://example.org/ns#a1055> <http://example.org/ns#a1055> <http://example.org/ns#a1055> . +<http://example.org/ns#a1056> <http://example.org/ns#a1056> <http://example.org/ns#a1056> . +<http://example.org/ns#a1057> <http://example.org/ns#a1057> <http://example.org/ns#a1057> . +<http://example.org/ns#a1058> <http://example.org/ns#a1058> <http://example.org/ns#a1058> . +<http://example.org/ns#a1059> <http://example.org/ns#a1059> <http://example.org/ns#a1059> . +<http://example.org/ns#a1060> <http://example.org/ns#a1060> <http://example.org/ns#a1060> . +<http://example.org/ns#a1061> <http://example.org/ns#a1061> <http://example.org/ns#a1061> . +<http://example.org/ns#a1062> <http://example.org/ns#a1062> <http://example.org/ns#a1062> . +<http://example.org/ns#a1063> <http://example.org/ns#a1063> <http://example.org/ns#a1063> . +<http://example.org/ns#a1064> <http://example.org/ns#a1064> <http://example.org/ns#a1064> . +<http://example.org/ns#a1065> <http://example.org/ns#a1065> <http://example.org/ns#a1065> . +<http://example.org/ns#a1066> <http://example.org/ns#a1066> <http://example.org/ns#a1066> . +<http://example.org/ns#a1067> <http://example.org/ns#a1067> <http://example.org/ns#a1067> . +<http://example.org/ns#a1068> <http://example.org/ns#a1068> <http://example.org/ns#a1068> . +<http://example.org/ns#a1069> <http://example.org/ns#a1069> <http://example.org/ns#a1069> . +<http://example.org/ns#a1070> <http://example.org/ns#a1070> <http://example.org/ns#a1070> . +<http://example.org/ns#a1071> <http://example.org/ns#a1071> <http://example.org/ns#a1071> . +<http://example.org/ns#a1072> <http://example.org/ns#a1072> <http://example.org/ns#a1072> . +<http://example.org/ns#a1073> <http://example.org/ns#a1073> <http://example.org/ns#a1073> . +<http://example.org/ns#a1074> <http://example.org/ns#a1074> <http://example.org/ns#a1074> . +<http://example.org/ns#a1075> <http://example.org/ns#a1075> <http://example.org/ns#a1075> . +<http://example.org/ns#a1076> <http://example.org/ns#a1076> <http://example.org/ns#a1076> . +<http://example.org/ns#a1077> <http://example.org/ns#a1077> <http://example.org/ns#a1077> . +<http://example.org/ns#a1078> <http://example.org/ns#a1078> <http://example.org/ns#a1078> . +<http://example.org/ns#a1079> <http://example.org/ns#a1079> <http://example.org/ns#a1079> . +<http://example.org/ns#a1080> <http://example.org/ns#a1080> <http://example.org/ns#a1080> . +<http://example.org/ns#a1081> <http://example.org/ns#a1081> <http://example.org/ns#a1081> . +<http://example.org/ns#a1082> <http://example.org/ns#a1082> <http://example.org/ns#a1082> . +<http://example.org/ns#a1083> <http://example.org/ns#a1083> <http://example.org/ns#a1083> . +<http://example.org/ns#a1084> <http://example.org/ns#a1084> <http://example.org/ns#a1084> . +<http://example.org/ns#a1085> <http://example.org/ns#a1085> <http://example.org/ns#a1085> . +<http://example.org/ns#a1086> <http://example.org/ns#a1086> <http://example.org/ns#a1086> . +<http://example.org/ns#a1087> <http://example.org/ns#a1087> <http://example.org/ns#a1087> . +<http://example.org/ns#a1088> <http://example.org/ns#a1088> <http://example.org/ns#a1088> . +<http://example.org/ns#a1089> <http://example.org/ns#a1089> <http://example.org/ns#a1089> . +<http://example.org/ns#a1090> <http://example.org/ns#a1090> <http://example.org/ns#a1090> . +<http://example.org/ns#a1091> <http://example.org/ns#a1091> <http://example.org/ns#a1091> . +<http://example.org/ns#a1092> <http://example.org/ns#a1092> <http://example.org/ns#a1092> . +<http://example.org/ns#a1093> <http://example.org/ns#a1093> <http://example.org/ns#a1093> . +<http://example.org/ns#a1094> <http://example.org/ns#a1094> <http://example.org/ns#a1094> . +<http://example.org/ns#a1095> <http://example.org/ns#a1095> <http://example.org/ns#a1095> . +<http://example.org/ns#a1096> <http://example.org/ns#a1096> <http://example.org/ns#a1096> . +<http://example.org/ns#a1097> <http://example.org/ns#a1097> <http://example.org/ns#a1097> . +<http://example.org/ns#a1098> <http://example.org/ns#a1098> <http://example.org/ns#a1098> . +<http://example.org/ns#a1099> <http://example.org/ns#a1099> <http://example.org/ns#a1099> . +<http://example.org/ns#a1100> <http://example.org/ns#a1100> <http://example.org/ns#a1100> . +<http://example.org/ns#a1101> <http://example.org/ns#a1101> <http://example.org/ns#a1101> . +<http://example.org/ns#a1102> <http://example.org/ns#a1102> <http://example.org/ns#a1102> . +<http://example.org/ns#a1103> <http://example.org/ns#a1103> <http://example.org/ns#a1103> . +<http://example.org/ns#a1104> <http://example.org/ns#a1104> <http://example.org/ns#a1104> . +<http://example.org/ns#a1105> <http://example.org/ns#a1105> <http://example.org/ns#a1105> . +<http://example.org/ns#a1106> <http://example.org/ns#a1106> <http://example.org/ns#a1106> . +<http://example.org/ns#a1107> <http://example.org/ns#a1107> <http://example.org/ns#a1107> . +<http://example.org/ns#a1108> <http://example.org/ns#a1108> <http://example.org/ns#a1108> . +<http://example.org/ns#a1109> <http://example.org/ns#a1109> <http://example.org/ns#a1109> . +<http://example.org/ns#a1110> <http://example.org/ns#a1110> <http://example.org/ns#a1110> . +<http://example.org/ns#a1111> <http://example.org/ns#a1111> <http://example.org/ns#a1111> . +<http://example.org/ns#a1112> <http://example.org/ns#a1112> <http://example.org/ns#a1112> . +<http://example.org/ns#a1113> <http://example.org/ns#a1113> <http://example.org/ns#a1113> . +<http://example.org/ns#a1114> <http://example.org/ns#a1114> <http://example.org/ns#a1114> . +<http://example.org/ns#a1115> <http://example.org/ns#a1115> <http://example.org/ns#a1115> . +<http://example.org/ns#a1116> <http://example.org/ns#a1116> <http://example.org/ns#a1116> . +<http://example.org/ns#a1117> <http://example.org/ns#a1117> <http://example.org/ns#a1117> . +<http://example.org/ns#a1118> <http://example.org/ns#a1118> <http://example.org/ns#a1118> . +<http://example.org/ns#a1119> <http://example.org/ns#a1119> <http://example.org/ns#a1119> . +<http://example.org/ns#a1120> <http://example.org/ns#a1120> <http://example.org/ns#a1120> . +<http://example.org/ns#a1121> <http://example.org/ns#a1121> <http://example.org/ns#a1121> . +<http://example.org/ns#a1122> <http://example.org/ns#a1122> <http://example.org/ns#a1122> . +<http://example.org/ns#a1123> <http://example.org/ns#a1123> <http://example.org/ns#a1123> . +<http://example.org/ns#a1124> <http://example.org/ns#a1124> <http://example.org/ns#a1124> . +<http://example.org/ns#a1125> <http://example.org/ns#a1125> <http://example.org/ns#a1125> . +<http://example.org/ns#a1126> <http://example.org/ns#a1126> <http://example.org/ns#a1126> . +<http://example.org/ns#a1127> <http://example.org/ns#a1127> <http://example.org/ns#a1127> . +<http://example.org/ns#a1128> <http://example.org/ns#a1128> <http://example.org/ns#a1128> . +<http://example.org/ns#a1129> <http://example.org/ns#a1129> <http://example.org/ns#a1129> . +<http://example.org/ns#a1130> <http://example.org/ns#a1130> <http://example.org/ns#a1130> . +<http://example.org/ns#a1131> <http://example.org/ns#a1131> <http://example.org/ns#a1131> . +<http://example.org/ns#a1132> <http://example.org/ns#a1132> <http://example.org/ns#a1132> . +<http://example.org/ns#a1133> <http://example.org/ns#a1133> <http://example.org/ns#a1133> . +<http://example.org/ns#a1134> <http://example.org/ns#a1134> <http://example.org/ns#a1134> . +<http://example.org/ns#a1135> <http://example.org/ns#a1135> <http://example.org/ns#a1135> . +<http://example.org/ns#a1136> <http://example.org/ns#a1136> <http://example.org/ns#a1136> . +<http://example.org/ns#a1137> <http://example.org/ns#a1137> <http://example.org/ns#a1137> . +<http://example.org/ns#a1138> <http://example.org/ns#a1138> <http://example.org/ns#a1138> . +<http://example.org/ns#a1139> <http://example.org/ns#a1139> <http://example.org/ns#a1139> . +<http://example.org/ns#a1140> <http://example.org/ns#a1140> <http://example.org/ns#a1140> . +<http://example.org/ns#a1141> <http://example.org/ns#a1141> <http://example.org/ns#a1141> . +<http://example.org/ns#a1142> <http://example.org/ns#a1142> <http://example.org/ns#a1142> . +<http://example.org/ns#a1143> <http://example.org/ns#a1143> <http://example.org/ns#a1143> . +<http://example.org/ns#a1144> <http://example.org/ns#a1144> <http://example.org/ns#a1144> . +<http://example.org/ns#a1145> <http://example.org/ns#a1145> <http://example.org/ns#a1145> . +<http://example.org/ns#a1146> <http://example.org/ns#a1146> <http://example.org/ns#a1146> . +<http://example.org/ns#a1147> <http://example.org/ns#a1147> <http://example.org/ns#a1147> . +<http://example.org/ns#a1148> <http://example.org/ns#a1148> <http://example.org/ns#a1148> . +<http://example.org/ns#a1149> <http://example.org/ns#a1149> <http://example.org/ns#a1149> . +<http://example.org/ns#a1150> <http://example.org/ns#a1150> <http://example.org/ns#a1150> . +<http://example.org/ns#a1151> <http://example.org/ns#a1151> <http://example.org/ns#a1151> . +<http://example.org/ns#a1152> <http://example.org/ns#a1152> <http://example.org/ns#a1152> . +<http://example.org/ns#a1153> <http://example.org/ns#a1153> <http://example.org/ns#a1153> . +<http://example.org/ns#a1154> <http://example.org/ns#a1154> <http://example.org/ns#a1154> . +<http://example.org/ns#a1155> <http://example.org/ns#a1155> <http://example.org/ns#a1155> . +<http://example.org/ns#a1156> <http://example.org/ns#a1156> <http://example.org/ns#a1156> . +<http://example.org/ns#a1157> <http://example.org/ns#a1157> <http://example.org/ns#a1157> . +<http://example.org/ns#a1158> <http://example.org/ns#a1158> <http://example.org/ns#a1158> . +<http://example.org/ns#a1159> <http://example.org/ns#a1159> <http://example.org/ns#a1159> . +<http://example.org/ns#a1160> <http://example.org/ns#a1160> <http://example.org/ns#a1160> . +<http://example.org/ns#a1161> <http://example.org/ns#a1161> <http://example.org/ns#a1161> . +<http://example.org/ns#a1162> <http://example.org/ns#a1162> <http://example.org/ns#a1162> . +<http://example.org/ns#a1163> <http://example.org/ns#a1163> <http://example.org/ns#a1163> . +<http://example.org/ns#a1164> <http://example.org/ns#a1164> <http://example.org/ns#a1164> . +<http://example.org/ns#a1165> <http://example.org/ns#a1165> <http://example.org/ns#a1165> . +<http://example.org/ns#a1166> <http://example.org/ns#a1166> <http://example.org/ns#a1166> . +<http://example.org/ns#a1167> <http://example.org/ns#a1167> <http://example.org/ns#a1167> . +<http://example.org/ns#a1168> <http://example.org/ns#a1168> <http://example.org/ns#a1168> . +<http://example.org/ns#a1169> <http://example.org/ns#a1169> <http://example.org/ns#a1169> . +<http://example.org/ns#a1170> <http://example.org/ns#a1170> <http://example.org/ns#a1170> . +<http://example.org/ns#a1171> <http://example.org/ns#a1171> <http://example.org/ns#a1171> . +<http://example.org/ns#a1172> <http://example.org/ns#a1172> <http://example.org/ns#a1172> . +<http://example.org/ns#a1173> <http://example.org/ns#a1173> <http://example.org/ns#a1173> . +<http://example.org/ns#a1174> <http://example.org/ns#a1174> <http://example.org/ns#a1174> . +<http://example.org/ns#a1175> <http://example.org/ns#a1175> <http://example.org/ns#a1175> . +<http://example.org/ns#a1176> <http://example.org/ns#a1176> <http://example.org/ns#a1176> . +<http://example.org/ns#a1177> <http://example.org/ns#a1177> <http://example.org/ns#a1177> . +<http://example.org/ns#a1178> <http://example.org/ns#a1178> <http://example.org/ns#a1178> . +<http://example.org/ns#a1179> <http://example.org/ns#a1179> <http://example.org/ns#a1179> . +<http://example.org/ns#a1180> <http://example.org/ns#a1180> <http://example.org/ns#a1180> . +<http://example.org/ns#a1181> <http://example.org/ns#a1181> <http://example.org/ns#a1181> . +<http://example.org/ns#a1182> <http://example.org/ns#a1182> <http://example.org/ns#a1182> . +<http://example.org/ns#a1183> <http://example.org/ns#a1183> <http://example.org/ns#a1183> . +<http://example.org/ns#a1184> <http://example.org/ns#a1184> <http://example.org/ns#a1184> . +<http://example.org/ns#a1185> <http://example.org/ns#a1185> <http://example.org/ns#a1185> . +<http://example.org/ns#a1186> <http://example.org/ns#a1186> <http://example.org/ns#a1186> . +<http://example.org/ns#a1187> <http://example.org/ns#a1187> <http://example.org/ns#a1187> . +<http://example.org/ns#a1188> <http://example.org/ns#a1188> <http://example.org/ns#a1188> . +<http://example.org/ns#a1189> <http://example.org/ns#a1189> <http://example.org/ns#a1189> . +<http://example.org/ns#a1190> <http://example.org/ns#a1190> <http://example.org/ns#a1190> . +<http://example.org/ns#a1191> <http://example.org/ns#a1191> <http://example.org/ns#a1191> . +<http://example.org/ns#a1192> <http://example.org/ns#a1192> <http://example.org/ns#a1192> . +<http://example.org/ns#a1193> <http://example.org/ns#a1193> <http://example.org/ns#a1193> . +<http://example.org/ns#a1194> <http://example.org/ns#a1194> <http://example.org/ns#a1194> . +<http://example.org/ns#a1195> <http://example.org/ns#a1195> <http://example.org/ns#a1195> . +<http://example.org/ns#a1196> <http://example.org/ns#a1196> <http://example.org/ns#a1196> . +<http://example.org/ns#a1197> <http://example.org/ns#a1197> <http://example.org/ns#a1197> . +<http://example.org/ns#a1198> <http://example.org/ns#a1198> <http://example.org/ns#a1198> . +<http://example.org/ns#a1199> <http://example.org/ns#a1199> <http://example.org/ns#a1199> . +<http://example.org/ns#a1200> <http://example.org/ns#a1200> <http://example.org/ns#a1200> . +<http://example.org/ns#a1201> <http://example.org/ns#a1201> <http://example.org/ns#a1201> . +<http://example.org/ns#a1202> <http://example.org/ns#a1202> <http://example.org/ns#a1202> . +<http://example.org/ns#a1203> <http://example.org/ns#a1203> <http://example.org/ns#a1203> . +<http://example.org/ns#a1204> <http://example.org/ns#a1204> <http://example.org/ns#a1204> . +<http://example.org/ns#a1205> <http://example.org/ns#a1205> <http://example.org/ns#a1205> . +<http://example.org/ns#a1206> <http://example.org/ns#a1206> <http://example.org/ns#a1206> . +<http://example.org/ns#a1207> <http://example.org/ns#a1207> <http://example.org/ns#a1207> . +<http://example.org/ns#a1208> <http://example.org/ns#a1208> <http://example.org/ns#a1208> . +<http://example.org/ns#a1209> <http://example.org/ns#a1209> <http://example.org/ns#a1209> . +<http://example.org/ns#a1210> <http://example.org/ns#a1210> <http://example.org/ns#a1210> . +<http://example.org/ns#a1211> <http://example.org/ns#a1211> <http://example.org/ns#a1211> . +<http://example.org/ns#a1212> <http://example.org/ns#a1212> <http://example.org/ns#a1212> . +<http://example.org/ns#a1213> <http://example.org/ns#a1213> <http://example.org/ns#a1213> . +<http://example.org/ns#a1214> <http://example.org/ns#a1214> <http://example.org/ns#a1214> . +<http://example.org/ns#a1215> <http://example.org/ns#a1215> <http://example.org/ns#a1215> . +<http://example.org/ns#a1216> <http://example.org/ns#a1216> <http://example.org/ns#a1216> . +<http://example.org/ns#a1217> <http://example.org/ns#a1217> <http://example.org/ns#a1217> . +<http://example.org/ns#a1218> <http://example.org/ns#a1218> <http://example.org/ns#a1218> . +<http://example.org/ns#a1219> <http://example.org/ns#a1219> <http://example.org/ns#a1219> . +<http://example.org/ns#a1220> <http://example.org/ns#a1220> <http://example.org/ns#a1220> . +<http://example.org/ns#a1221> <http://example.org/ns#a1221> <http://example.org/ns#a1221> . +<http://example.org/ns#a1222> <http://example.org/ns#a1222> <http://example.org/ns#a1222> . +<http://example.org/ns#a1223> <http://example.org/ns#a1223> <http://example.org/ns#a1223> . +<http://example.org/ns#a1224> <http://example.org/ns#a1224> <http://example.org/ns#a1224> . +<http://example.org/ns#a1225> <http://example.org/ns#a1225> <http://example.org/ns#a1225> . +<http://example.org/ns#a1226> <http://example.org/ns#a1226> <http://example.org/ns#a1226> . +<http://example.org/ns#a1227> <http://example.org/ns#a1227> <http://example.org/ns#a1227> . +<http://example.org/ns#a1228> <http://example.org/ns#a1228> <http://example.org/ns#a1228> . +<http://example.org/ns#a1229> <http://example.org/ns#a1229> <http://example.org/ns#a1229> . +<http://example.org/ns#a1230> <http://example.org/ns#a1230> <http://example.org/ns#a1230> . +<http://example.org/ns#a1231> <http://example.org/ns#a1231> <http://example.org/ns#a1231> . +<http://example.org/ns#a1232> <http://example.org/ns#a1232> <http://example.org/ns#a1232> . +<http://example.org/ns#a1233> <http://example.org/ns#a1233> <http://example.org/ns#a1233> . +<http://example.org/ns#a1234> <http://example.org/ns#a1234> <http://example.org/ns#a1234> . +<http://example.org/ns#a1235> <http://example.org/ns#a1235> <http://example.org/ns#a1235> . +<http://example.org/ns#a1236> <http://example.org/ns#a1236> <http://example.org/ns#a1236> . +<http://example.org/ns#a1237> <http://example.org/ns#a1237> <http://example.org/ns#a1237> . +<http://example.org/ns#a1238> <http://example.org/ns#a1238> <http://example.org/ns#a1238> . +<http://example.org/ns#a1239> <http://example.org/ns#a1239> <http://example.org/ns#a1239> . +<http://example.org/ns#a1240> <http://example.org/ns#a1240> <http://example.org/ns#a1240> . +<http://example.org/ns#a1241> <http://example.org/ns#a1241> <http://example.org/ns#a1241> . +<http://example.org/ns#a1242> <http://example.org/ns#a1242> <http://example.org/ns#a1242> . +<http://example.org/ns#a1243> <http://example.org/ns#a1243> <http://example.org/ns#a1243> . +<http://example.org/ns#a1244> <http://example.org/ns#a1244> <http://example.org/ns#a1244> . +<http://example.org/ns#a1245> <http://example.org/ns#a1245> <http://example.org/ns#a1245> . +<http://example.org/ns#a1246> <http://example.org/ns#a1246> <http://example.org/ns#a1246> . +<http://example.org/ns#a1247> <http://example.org/ns#a1247> <http://example.org/ns#a1247> . +<http://example.org/ns#a1248> <http://example.org/ns#a1248> <http://example.org/ns#a1248> . +<http://example.org/ns#a1249> <http://example.org/ns#a1249> <http://example.org/ns#a1249> . +<http://example.org/ns#a1250> <http://example.org/ns#a1250> <http://example.org/ns#a1250> . +<http://example.org/ns#a1251> <http://example.org/ns#a1251> <http://example.org/ns#a1251> . +<http://example.org/ns#a1252> <http://example.org/ns#a1252> <http://example.org/ns#a1252> . +<http://example.org/ns#a1253> <http://example.org/ns#a1253> <http://example.org/ns#a1253> . +<http://example.org/ns#a1254> <http://example.org/ns#a1254> <http://example.org/ns#a1254> . +<http://example.org/ns#a1255> <http://example.org/ns#a1255> <http://example.org/ns#a1255> . +<http://example.org/ns#a1256> <http://example.org/ns#a1256> <http://example.org/ns#a1256> . +<http://example.org/ns#a1257> <http://example.org/ns#a1257> <http://example.org/ns#a1257> . +<http://example.org/ns#a1258> <http://example.org/ns#a1258> <http://example.org/ns#a1258> . +<http://example.org/ns#a1259> <http://example.org/ns#a1259> <http://example.org/ns#a1259> . +<http://example.org/ns#a1260> <http://example.org/ns#a1260> <http://example.org/ns#a1260> . +<http://example.org/ns#a1261> <http://example.org/ns#a1261> <http://example.org/ns#a1261> . +<http://example.org/ns#a1262> <http://example.org/ns#a1262> <http://example.org/ns#a1262> . +<http://example.org/ns#a1263> <http://example.org/ns#a1263> <http://example.org/ns#a1263> . +<http://example.org/ns#a1264> <http://example.org/ns#a1264> <http://example.org/ns#a1264> . +<http://example.org/ns#a1265> <http://example.org/ns#a1265> <http://example.org/ns#a1265> . +<http://example.org/ns#a1266> <http://example.org/ns#a1266> <http://example.org/ns#a1266> . +<http://example.org/ns#a1267> <http://example.org/ns#a1267> <http://example.org/ns#a1267> . +<http://example.org/ns#a1268> <http://example.org/ns#a1268> <http://example.org/ns#a1268> . +<http://example.org/ns#a1269> <http://example.org/ns#a1269> <http://example.org/ns#a1269> . +<http://example.org/ns#a1270> <http://example.org/ns#a1270> <http://example.org/ns#a1270> . +<http://example.org/ns#a1271> <http://example.org/ns#a1271> <http://example.org/ns#a1271> . +<http://example.org/ns#a1272> <http://example.org/ns#a1272> <http://example.org/ns#a1272> . +<http://example.org/ns#a1273> <http://example.org/ns#a1273> <http://example.org/ns#a1273> . +<http://example.org/ns#a1274> <http://example.org/ns#a1274> <http://example.org/ns#a1274> . +<http://example.org/ns#a1275> <http://example.org/ns#a1275> <http://example.org/ns#a1275> . +<http://example.org/ns#a1276> <http://example.org/ns#a1276> <http://example.org/ns#a1276> . +<http://example.org/ns#a1277> <http://example.org/ns#a1277> <http://example.org/ns#a1277> . +<http://example.org/ns#a1278> <http://example.org/ns#a1278> <http://example.org/ns#a1278> . +<http://example.org/ns#a1279> <http://example.org/ns#a1279> <http://example.org/ns#a1279> . +<http://example.org/ns#a1280> <http://example.org/ns#a1280> <http://example.org/ns#a1280> . +<http://example.org/ns#a1281> <http://example.org/ns#a1281> <http://example.org/ns#a1281> . +<http://example.org/ns#a1282> <http://example.org/ns#a1282> <http://example.org/ns#a1282> . +<http://example.org/ns#a1283> <http://example.org/ns#a1283> <http://example.org/ns#a1283> . +<http://example.org/ns#a1284> <http://example.org/ns#a1284> <http://example.org/ns#a1284> . +<http://example.org/ns#a1285> <http://example.org/ns#a1285> <http://example.org/ns#a1285> . +<http://example.org/ns#a1286> <http://example.org/ns#a1286> <http://example.org/ns#a1286> . +<http://example.org/ns#a1287> <http://example.org/ns#a1287> <http://example.org/ns#a1287> . +<http://example.org/ns#a1288> <http://example.org/ns#a1288> <http://example.org/ns#a1288> . +<http://example.org/ns#a1289> <http://example.org/ns#a1289> <http://example.org/ns#a1289> . +<http://example.org/ns#a1290> <http://example.org/ns#a1290> <http://example.org/ns#a1290> . +<http://example.org/ns#a1291> <http://example.org/ns#a1291> <http://example.org/ns#a1291> . +<http://example.org/ns#a1292> <http://example.org/ns#a1292> <http://example.org/ns#a1292> . +<http://example.org/ns#a1293> <http://example.org/ns#a1293> <http://example.org/ns#a1293> . +<http://example.org/ns#a1294> <http://example.org/ns#a1294> <http://example.org/ns#a1294> . +<http://example.org/ns#a1295> <http://example.org/ns#a1295> <http://example.org/ns#a1295> . +<http://example.org/ns#a1296> <http://example.org/ns#a1296> <http://example.org/ns#a1296> . +<http://example.org/ns#a1297> <http://example.org/ns#a1297> <http://example.org/ns#a1297> . +<http://example.org/ns#a1298> <http://example.org/ns#a1298> <http://example.org/ns#a1298> . +<http://example.org/ns#a1299> <http://example.org/ns#a1299> <http://example.org/ns#a1299> . +<http://example.org/ns#a1300> <http://example.org/ns#a1300> <http://example.org/ns#a1300> . +<http://example.org/ns#a1301> <http://example.org/ns#a1301> <http://example.org/ns#a1301> . +<http://example.org/ns#a1302> <http://example.org/ns#a1302> <http://example.org/ns#a1302> . +<http://example.org/ns#a1303> <http://example.org/ns#a1303> <http://example.org/ns#a1303> . +<http://example.org/ns#a1304> <http://example.org/ns#a1304> <http://example.org/ns#a1304> . +<http://example.org/ns#a1305> <http://example.org/ns#a1305> <http://example.org/ns#a1305> . +<http://example.org/ns#a1306> <http://example.org/ns#a1306> <http://example.org/ns#a1306> . +<http://example.org/ns#a1307> <http://example.org/ns#a1307> <http://example.org/ns#a1307> . +<http://example.org/ns#a1308> <http://example.org/ns#a1308> <http://example.org/ns#a1308> . +<http://example.org/ns#a1309> <http://example.org/ns#a1309> <http://example.org/ns#a1309> . +<http://example.org/ns#a1310> <http://example.org/ns#a1310> <http://example.org/ns#a1310> . +<http://example.org/ns#a1311> <http://example.org/ns#a1311> <http://example.org/ns#a1311> . +<http://example.org/ns#a1312> <http://example.org/ns#a1312> <http://example.org/ns#a1312> . +<http://example.org/ns#a1313> <http://example.org/ns#a1313> <http://example.org/ns#a1313> . +<http://example.org/ns#a1314> <http://example.org/ns#a1314> <http://example.org/ns#a1314> . +<http://example.org/ns#a1315> <http://example.org/ns#a1315> <http://example.org/ns#a1315> . +<http://example.org/ns#a1316> <http://example.org/ns#a1316> <http://example.org/ns#a1316> . +<http://example.org/ns#a1317> <http://example.org/ns#a1317> <http://example.org/ns#a1317> . +<http://example.org/ns#a1318> <http://example.org/ns#a1318> <http://example.org/ns#a1318> . +<http://example.org/ns#a1319> <http://example.org/ns#a1319> <http://example.org/ns#a1319> . +<http://example.org/ns#a1320> <http://example.org/ns#a1320> <http://example.org/ns#a1320> . +<http://example.org/ns#a1321> <http://example.org/ns#a1321> <http://example.org/ns#a1321> . +<http://example.org/ns#a1322> <http://example.org/ns#a1322> <http://example.org/ns#a1322> . +<http://example.org/ns#a1323> <http://example.org/ns#a1323> <http://example.org/ns#a1323> . +<http://example.org/ns#a1324> <http://example.org/ns#a1324> <http://example.org/ns#a1324> . +<http://example.org/ns#a1325> <http://example.org/ns#a1325> <http://example.org/ns#a1325> . +<http://example.org/ns#a1326> <http://example.org/ns#a1326> <http://example.org/ns#a1326> . +<http://example.org/ns#a1327> <http://example.org/ns#a1327> <http://example.org/ns#a1327> . +<http://example.org/ns#a1328> <http://example.org/ns#a1328> <http://example.org/ns#a1328> . +<http://example.org/ns#a1329> <http://example.org/ns#a1329> <http://example.org/ns#a1329> . +<http://example.org/ns#a1330> <http://example.org/ns#a1330> <http://example.org/ns#a1330> . +<http://example.org/ns#a1331> <http://example.org/ns#a1331> <http://example.org/ns#a1331> . +<http://example.org/ns#a1332> <http://example.org/ns#a1332> <http://example.org/ns#a1332> . +<http://example.org/ns#a1333> <http://example.org/ns#a1333> <http://example.org/ns#a1333> . +<http://example.org/ns#a1334> <http://example.org/ns#a1334> <http://example.org/ns#a1334> . +<http://example.org/ns#a1335> <http://example.org/ns#a1335> <http://example.org/ns#a1335> . +<http://example.org/ns#a1336> <http://example.org/ns#a1336> <http://example.org/ns#a1336> . +<http://example.org/ns#a1337> <http://example.org/ns#a1337> <http://example.org/ns#a1337> . +<http://example.org/ns#a1338> <http://example.org/ns#a1338> <http://example.org/ns#a1338> . +<http://example.org/ns#a1339> <http://example.org/ns#a1339> <http://example.org/ns#a1339> . +<http://example.org/ns#a1340> <http://example.org/ns#a1340> <http://example.org/ns#a1340> . +<http://example.org/ns#a1341> <http://example.org/ns#a1341> <http://example.org/ns#a1341> . +<http://example.org/ns#a1342> <http://example.org/ns#a1342> <http://example.org/ns#a1342> . +<http://example.org/ns#a1343> <http://example.org/ns#a1343> <http://example.org/ns#a1343> . +<http://example.org/ns#a1344> <http://example.org/ns#a1344> <http://example.org/ns#a1344> . +<http://example.org/ns#a1345> <http://example.org/ns#a1345> <http://example.org/ns#a1345> . +<http://example.org/ns#a1346> <http://example.org/ns#a1346> <http://example.org/ns#a1346> . +<http://example.org/ns#a1347> <http://example.org/ns#a1347> <http://example.org/ns#a1347> . +<http://example.org/ns#a1348> <http://example.org/ns#a1348> <http://example.org/ns#a1348> . +<http://example.org/ns#a1349> <http://example.org/ns#a1349> <http://example.org/ns#a1349> . +<http://example.org/ns#a1350> <http://example.org/ns#a1350> <http://example.org/ns#a1350> . +<http://example.org/ns#a1351> <http://example.org/ns#a1351> <http://example.org/ns#a1351> . +<http://example.org/ns#a1352> <http://example.org/ns#a1352> <http://example.org/ns#a1352> . +<http://example.org/ns#a1353> <http://example.org/ns#a1353> <http://example.org/ns#a1353> . +<http://example.org/ns#a1354> <http://example.org/ns#a1354> <http://example.org/ns#a1354> . +<http://example.org/ns#a1355> <http://example.org/ns#a1355> <http://example.org/ns#a1355> . +<http://example.org/ns#a1356> <http://example.org/ns#a1356> <http://example.org/ns#a1356> . +<http://example.org/ns#a1357> <http://example.org/ns#a1357> <http://example.org/ns#a1357> . +<http://example.org/ns#a1358> <http://example.org/ns#a1358> <http://example.org/ns#a1358> . +<http://example.org/ns#a1359> <http://example.org/ns#a1359> <http://example.org/ns#a1359> . +<http://example.org/ns#a1360> <http://example.org/ns#a1360> <http://example.org/ns#a1360> . +<http://example.org/ns#a1361> <http://example.org/ns#a1361> <http://example.org/ns#a1361> . +<http://example.org/ns#a1362> <http://example.org/ns#a1362> <http://example.org/ns#a1362> . +<http://example.org/ns#a1363> <http://example.org/ns#a1363> <http://example.org/ns#a1363> . +<http://example.org/ns#a1364> <http://example.org/ns#a1364> <http://example.org/ns#a1364> . +<http://example.org/ns#a1365> <http://example.org/ns#a1365> <http://example.org/ns#a1365> . +<http://example.org/ns#a1366> <http://example.org/ns#a1366> <http://example.org/ns#a1366> . +<http://example.org/ns#a1367> <http://example.org/ns#a1367> <http://example.org/ns#a1367> . +<http://example.org/ns#a1368> <http://example.org/ns#a1368> <http://example.org/ns#a1368> . +<http://example.org/ns#a1369> <http://example.org/ns#a1369> <http://example.org/ns#a1369> . +<http://example.org/ns#a1370> <http://example.org/ns#a1370> <http://example.org/ns#a1370> . +<http://example.org/ns#a1371> <http://example.org/ns#a1371> <http://example.org/ns#a1371> . +<http://example.org/ns#a1372> <http://example.org/ns#a1372> <http://example.org/ns#a1372> . +<http://example.org/ns#a1373> <http://example.org/ns#a1373> <http://example.org/ns#a1373> . +<http://example.org/ns#a1374> <http://example.org/ns#a1374> <http://example.org/ns#a1374> . +<http://example.org/ns#a1375> <http://example.org/ns#a1375> <http://example.org/ns#a1375> . +<http://example.org/ns#a1376> <http://example.org/ns#a1376> <http://example.org/ns#a1376> . +<http://example.org/ns#a1377> <http://example.org/ns#a1377> <http://example.org/ns#a1377> . +<http://example.org/ns#a1378> <http://example.org/ns#a1378> <http://example.org/ns#a1378> . +<http://example.org/ns#a1379> <http://example.org/ns#a1379> <http://example.org/ns#a1379> . +<http://example.org/ns#a1380> <http://example.org/ns#a1380> <http://example.org/ns#a1380> . +<http://example.org/ns#a1381> <http://example.org/ns#a1381> <http://example.org/ns#a1381> . +<http://example.org/ns#a1382> <http://example.org/ns#a1382> <http://example.org/ns#a1382> . +<http://example.org/ns#a1383> <http://example.org/ns#a1383> <http://example.org/ns#a1383> . +<http://example.org/ns#a1384> <http://example.org/ns#a1384> <http://example.org/ns#a1384> . +<http://example.org/ns#a1385> <http://example.org/ns#a1385> <http://example.org/ns#a1385> . +<http://example.org/ns#a1386> <http://example.org/ns#a1386> <http://example.org/ns#a1386> . +<http://example.org/ns#a1387> <http://example.org/ns#a1387> <http://example.org/ns#a1387> . +<http://example.org/ns#a1388> <http://example.org/ns#a1388> <http://example.org/ns#a1388> . +<http://example.org/ns#a1389> <http://example.org/ns#a1389> <http://example.org/ns#a1389> . +<http://example.org/ns#a1390> <http://example.org/ns#a1390> <http://example.org/ns#a1390> . +<http://example.org/ns#a1391> <http://example.org/ns#a1391> <http://example.org/ns#a1391> . +<http://example.org/ns#a1392> <http://example.org/ns#a1392> <http://example.org/ns#a1392> . +<http://example.org/ns#a1393> <http://example.org/ns#a1393> <http://example.org/ns#a1393> . +<http://example.org/ns#a1394> <http://example.org/ns#a1394> <http://example.org/ns#a1394> . +<http://example.org/ns#a1395> <http://example.org/ns#a1395> <http://example.org/ns#a1395> . +<http://example.org/ns#a1396> <http://example.org/ns#a1396> <http://example.org/ns#a1396> . +<http://example.org/ns#a1397> <http://example.org/ns#a1397> <http://example.org/ns#a1397> . +<http://example.org/ns#a1398> <http://example.org/ns#a1398> <http://example.org/ns#a1398> . +<http://example.org/ns#a1399> <http://example.org/ns#a1399> <http://example.org/ns#a1399> . +<http://example.org/ns#a1400> <http://example.org/ns#a1400> <http://example.org/ns#a1400> . +<http://example.org/ns#a1401> <http://example.org/ns#a1401> <http://example.org/ns#a1401> . +<http://example.org/ns#a1402> <http://example.org/ns#a1402> <http://example.org/ns#a1402> . +<http://example.org/ns#a1403> <http://example.org/ns#a1403> <http://example.org/ns#a1403> . +<http://example.org/ns#a1404> <http://example.org/ns#a1404> <http://example.org/ns#a1404> . +<http://example.org/ns#a1405> <http://example.org/ns#a1405> <http://example.org/ns#a1405> . +<http://example.org/ns#a1406> <http://example.org/ns#a1406> <http://example.org/ns#a1406> . +<http://example.org/ns#a1407> <http://example.org/ns#a1407> <http://example.org/ns#a1407> . +<http://example.org/ns#a1408> <http://example.org/ns#a1408> <http://example.org/ns#a1408> . +<http://example.org/ns#a1409> <http://example.org/ns#a1409> <http://example.org/ns#a1409> . +<http://example.org/ns#a1410> <http://example.org/ns#a1410> <http://example.org/ns#a1410> . +<http://example.org/ns#a1411> <http://example.org/ns#a1411> <http://example.org/ns#a1411> . +<http://example.org/ns#a1412> <http://example.org/ns#a1412> <http://example.org/ns#a1412> . +<http://example.org/ns#a1413> <http://example.org/ns#a1413> <http://example.org/ns#a1413> . +<http://example.org/ns#a1414> <http://example.org/ns#a1414> <http://example.org/ns#a1414> . +<http://example.org/ns#a1415> <http://example.org/ns#a1415> <http://example.org/ns#a1415> . +<http://example.org/ns#a1416> <http://example.org/ns#a1416> <http://example.org/ns#a1416> . +<http://example.org/ns#a1417> <http://example.org/ns#a1417> <http://example.org/ns#a1417> . +<http://example.org/ns#a1418> <http://example.org/ns#a1418> <http://example.org/ns#a1418> . +<http://example.org/ns#a1419> <http://example.org/ns#a1419> <http://example.org/ns#a1419> . +<http://example.org/ns#a1420> <http://example.org/ns#a1420> <http://example.org/ns#a1420> . +<http://example.org/ns#a1421> <http://example.org/ns#a1421> <http://example.org/ns#a1421> . +<http://example.org/ns#a1422> <http://example.org/ns#a1422> <http://example.org/ns#a1422> . +<http://example.org/ns#a1423> <http://example.org/ns#a1423> <http://example.org/ns#a1423> . +<http://example.org/ns#a1424> <http://example.org/ns#a1424> <http://example.org/ns#a1424> . +<http://example.org/ns#a1425> <http://example.org/ns#a1425> <http://example.org/ns#a1425> . +<http://example.org/ns#a1426> <http://example.org/ns#a1426> <http://example.org/ns#a1426> . +<http://example.org/ns#a1427> <http://example.org/ns#a1427> <http://example.org/ns#a1427> . +<http://example.org/ns#a1428> <http://example.org/ns#a1428> <http://example.org/ns#a1428> . +<http://example.org/ns#a1429> <http://example.org/ns#a1429> <http://example.org/ns#a1429> . +<http://example.org/ns#a1430> <http://example.org/ns#a1430> <http://example.org/ns#a1430> . +<http://example.org/ns#a1431> <http://example.org/ns#a1431> <http://example.org/ns#a1431> . +<http://example.org/ns#a1432> <http://example.org/ns#a1432> <http://example.org/ns#a1432> . +<http://example.org/ns#a1433> <http://example.org/ns#a1433> <http://example.org/ns#a1433> . +<http://example.org/ns#a1434> <http://example.org/ns#a1434> <http://example.org/ns#a1434> . +<http://example.org/ns#a1435> <http://example.org/ns#a1435> <http://example.org/ns#a1435> . +<http://example.org/ns#a1436> <http://example.org/ns#a1436> <http://example.org/ns#a1436> . +<http://example.org/ns#a1437> <http://example.org/ns#a1437> <http://example.org/ns#a1437> . +<http://example.org/ns#a1438> <http://example.org/ns#a1438> <http://example.org/ns#a1438> . +<http://example.org/ns#a1439> <http://example.org/ns#a1439> <http://example.org/ns#a1439> . +<http://example.org/ns#a1440> <http://example.org/ns#a1440> <http://example.org/ns#a1440> . +<http://example.org/ns#a1441> <http://example.org/ns#a1441> <http://example.org/ns#a1441> . +<http://example.org/ns#a1442> <http://example.org/ns#a1442> <http://example.org/ns#a1442> . +<http://example.org/ns#a1443> <http://example.org/ns#a1443> <http://example.org/ns#a1443> . +<http://example.org/ns#a1444> <http://example.org/ns#a1444> <http://example.org/ns#a1444> . +<http://example.org/ns#a1445> <http://example.org/ns#a1445> <http://example.org/ns#a1445> . +<http://example.org/ns#a1446> <http://example.org/ns#a1446> <http://example.org/ns#a1446> . +<http://example.org/ns#a1447> <http://example.org/ns#a1447> <http://example.org/ns#a1447> . +<http://example.org/ns#a1448> <http://example.org/ns#a1448> <http://example.org/ns#a1448> . +<http://example.org/ns#a1449> <http://example.org/ns#a1449> <http://example.org/ns#a1449> . +<http://example.org/ns#a1450> <http://example.org/ns#a1450> <http://example.org/ns#a1450> . +<http://example.org/ns#a1451> <http://example.org/ns#a1451> <http://example.org/ns#a1451> . +<http://example.org/ns#a1452> <http://example.org/ns#a1452> <http://example.org/ns#a1452> . +<http://example.org/ns#a1453> <http://example.org/ns#a1453> <http://example.org/ns#a1453> . +<http://example.org/ns#a1454> <http://example.org/ns#a1454> <http://example.org/ns#a1454> . +<http://example.org/ns#a1455> <http://example.org/ns#a1455> <http://example.org/ns#a1455> . +<http://example.org/ns#a1456> <http://example.org/ns#a1456> <http://example.org/ns#a1456> . +<http://example.org/ns#a1457> <http://example.org/ns#a1457> <http://example.org/ns#a1457> . +<http://example.org/ns#a1458> <http://example.org/ns#a1458> <http://example.org/ns#a1458> . +<http://example.org/ns#a1459> <http://example.org/ns#a1459> <http://example.org/ns#a1459> . +<http://example.org/ns#a1460> <http://example.org/ns#a1460> <http://example.org/ns#a1460> . +<http://example.org/ns#a1461> <http://example.org/ns#a1461> <http://example.org/ns#a1461> . +<http://example.org/ns#a1462> <http://example.org/ns#a1462> <http://example.org/ns#a1462> . +<http://example.org/ns#a1463> <http://example.org/ns#a1463> <http://example.org/ns#a1463> . +<http://example.org/ns#a1464> <http://example.org/ns#a1464> <http://example.org/ns#a1464> . +<http://example.org/ns#a1465> <http://example.org/ns#a1465> <http://example.org/ns#a1465> . +<http://example.org/ns#a1466> <http://example.org/ns#a1466> <http://example.org/ns#a1466> . +<http://example.org/ns#a1467> <http://example.org/ns#a1467> <http://example.org/ns#a1467> . +<http://example.org/ns#a1468> <http://example.org/ns#a1468> <http://example.org/ns#a1468> . +<http://example.org/ns#a1469> <http://example.org/ns#a1469> <http://example.org/ns#a1469> . +<http://example.org/ns#a1470> <http://example.org/ns#a1470> <http://example.org/ns#a1470> . +<http://example.org/ns#a1471> <http://example.org/ns#a1471> <http://example.org/ns#a1471> . +<http://example.org/ns#a1472> <http://example.org/ns#a1472> <http://example.org/ns#a1472> . +<http://example.org/ns#a1473> <http://example.org/ns#a1473> <http://example.org/ns#a1473> . +<http://example.org/ns#a1474> <http://example.org/ns#a1474> <http://example.org/ns#a1474> . +<http://example.org/ns#a1475> <http://example.org/ns#a1475> <http://example.org/ns#a1475> . +<http://example.org/ns#a1476> <http://example.org/ns#a1476> <http://example.org/ns#a1476> . +<http://example.org/ns#a1477> <http://example.org/ns#a1477> <http://example.org/ns#a1477> . +<http://example.org/ns#a1478> <http://example.org/ns#a1478> <http://example.org/ns#a1478> . +<http://example.org/ns#a1479> <http://example.org/ns#a1479> <http://example.org/ns#a1479> . +<http://example.org/ns#a1480> <http://example.org/ns#a1480> <http://example.org/ns#a1480> . +<http://example.org/ns#a1481> <http://example.org/ns#a1481> <http://example.org/ns#a1481> . +<http://example.org/ns#a1482> <http://example.org/ns#a1482> <http://example.org/ns#a1482> . +<http://example.org/ns#a1483> <http://example.org/ns#a1483> <http://example.org/ns#a1483> . +<http://example.org/ns#a1484> <http://example.org/ns#a1484> <http://example.org/ns#a1484> . +<http://example.org/ns#a1485> <http://example.org/ns#a1485> <http://example.org/ns#a1485> . +<http://example.org/ns#a1486> <http://example.org/ns#a1486> <http://example.org/ns#a1486> . +<http://example.org/ns#a1487> <http://example.org/ns#a1487> <http://example.org/ns#a1487> . +<http://example.org/ns#a1488> <http://example.org/ns#a1488> <http://example.org/ns#a1488> . +<http://example.org/ns#a1489> <http://example.org/ns#a1489> <http://example.org/ns#a1489> . +<http://example.org/ns#a1490> <http://example.org/ns#a1490> <http://example.org/ns#a1490> . +<http://example.org/ns#a1491> <http://example.org/ns#a1491> <http://example.org/ns#a1491> . +<http://example.org/ns#a1492> <http://example.org/ns#a1492> <http://example.org/ns#a1492> . +<http://example.org/ns#a1493> <http://example.org/ns#a1493> <http://example.org/ns#a1493> . +<http://example.org/ns#a1494> <http://example.org/ns#a1494> <http://example.org/ns#a1494> . +<http://example.org/ns#a1495> <http://example.org/ns#a1495> <http://example.org/ns#a1495> . +<http://example.org/ns#a1496> <http://example.org/ns#a1496> <http://example.org/ns#a1496> . +<http://example.org/ns#a1497> <http://example.org/ns#a1497> <http://example.org/ns#a1497> . +<http://example.org/ns#a1498> <http://example.org/ns#a1498> <http://example.org/ns#a1498> . +<http://example.org/ns#a1499> <http://example.org/ns#a1499> <http://example.org/ns#a1499> . +<http://example.org/ns#a1500> <http://example.org/ns#a1500> <http://example.org/ns#a1500> . +<http://example.org/ns#a1501> <http://example.org/ns#a1501> <http://example.org/ns#a1501> . +<http://example.org/ns#a1502> <http://example.org/ns#a1502> <http://example.org/ns#a1502> . +<http://example.org/ns#a1503> <http://example.org/ns#a1503> <http://example.org/ns#a1503> . +<http://example.org/ns#a1504> <http://example.org/ns#a1504> <http://example.org/ns#a1504> . +<http://example.org/ns#a1505> <http://example.org/ns#a1505> <http://example.org/ns#a1505> . +<http://example.org/ns#a1506> <http://example.org/ns#a1506> <http://example.org/ns#a1506> . +<http://example.org/ns#a1507> <http://example.org/ns#a1507> <http://example.org/ns#a1507> . +<http://example.org/ns#a1508> <http://example.org/ns#a1508> <http://example.org/ns#a1508> . +<http://example.org/ns#a1509> <http://example.org/ns#a1509> <http://example.org/ns#a1509> . +<http://example.org/ns#a1510> <http://example.org/ns#a1510> <http://example.org/ns#a1510> . +<http://example.org/ns#a1511> <http://example.org/ns#a1511> <http://example.org/ns#a1511> . +<http://example.org/ns#a1512> <http://example.org/ns#a1512> <http://example.org/ns#a1512> . +<http://example.org/ns#a1513> <http://example.org/ns#a1513> <http://example.org/ns#a1513> . +<http://example.org/ns#a1514> <http://example.org/ns#a1514> <http://example.org/ns#a1514> . +<http://example.org/ns#a1515> <http://example.org/ns#a1515> <http://example.org/ns#a1515> . +<http://example.org/ns#a1516> <http://example.org/ns#a1516> <http://example.org/ns#a1516> . +<http://example.org/ns#a1517> <http://example.org/ns#a1517> <http://example.org/ns#a1517> . +<http://example.org/ns#a1518> <http://example.org/ns#a1518> <http://example.org/ns#a1518> . +<http://example.org/ns#a1519> <http://example.org/ns#a1519> <http://example.org/ns#a1519> . +<http://example.org/ns#a1520> <http://example.org/ns#a1520> <http://example.org/ns#a1520> . +<http://example.org/ns#a1521> <http://example.org/ns#a1521> <http://example.org/ns#a1521> . +<http://example.org/ns#a1522> <http://example.org/ns#a1522> <http://example.org/ns#a1522> . +<http://example.org/ns#a1523> <http://example.org/ns#a1523> <http://example.org/ns#a1523> . +<http://example.org/ns#a1524> <http://example.org/ns#a1524> <http://example.org/ns#a1524> . +<http://example.org/ns#a1525> <http://example.org/ns#a1525> <http://example.org/ns#a1525> . +<http://example.org/ns#a1526> <http://example.org/ns#a1526> <http://example.org/ns#a1526> . +<http://example.org/ns#a1527> <http://example.org/ns#a1527> <http://example.org/ns#a1527> . +<http://example.org/ns#a1528> <http://example.org/ns#a1528> <http://example.org/ns#a1528> . +<http://example.org/ns#a1529> <http://example.org/ns#a1529> <http://example.org/ns#a1529> . +<http://example.org/ns#a1530> <http://example.org/ns#a1530> <http://example.org/ns#a1530> . +<http://example.org/ns#a1531> <http://example.org/ns#a1531> <http://example.org/ns#a1531> . +<http://example.org/ns#a1532> <http://example.org/ns#a1532> <http://example.org/ns#a1532> . +<http://example.org/ns#a1533> <http://example.org/ns#a1533> <http://example.org/ns#a1533> . +<http://example.org/ns#a1534> <http://example.org/ns#a1534> <http://example.org/ns#a1534> . +<http://example.org/ns#a1535> <http://example.org/ns#a1535> <http://example.org/ns#a1535> . +<http://example.org/ns#a1536> <http://example.org/ns#a1536> <http://example.org/ns#a1536> . +<http://example.org/ns#a1537> <http://example.org/ns#a1537> <http://example.org/ns#a1537> . +<http://example.org/ns#a1538> <http://example.org/ns#a1538> <http://example.org/ns#a1538> . +<http://example.org/ns#a1539> <http://example.org/ns#a1539> <http://example.org/ns#a1539> . +<http://example.org/ns#a1540> <http://example.org/ns#a1540> <http://example.org/ns#a1540> . +<http://example.org/ns#a1541> <http://example.org/ns#a1541> <http://example.org/ns#a1541> . +<http://example.org/ns#a1542> <http://example.org/ns#a1542> <http://example.org/ns#a1542> . +<http://example.org/ns#a1543> <http://example.org/ns#a1543> <http://example.org/ns#a1543> . +<http://example.org/ns#a1544> <http://example.org/ns#a1544> <http://example.org/ns#a1544> . +<http://example.org/ns#a1545> <http://example.org/ns#a1545> <http://example.org/ns#a1545> . +<http://example.org/ns#a1546> <http://example.org/ns#a1546> <http://example.org/ns#a1546> . +<http://example.org/ns#a1547> <http://example.org/ns#a1547> <http://example.org/ns#a1547> . +<http://example.org/ns#a1548> <http://example.org/ns#a1548> <http://example.org/ns#a1548> . +<http://example.org/ns#a1549> <http://example.org/ns#a1549> <http://example.org/ns#a1549> . +<http://example.org/ns#a1550> <http://example.org/ns#a1550> <http://example.org/ns#a1550> . +<http://example.org/ns#a1551> <http://example.org/ns#a1551> <http://example.org/ns#a1551> . +<http://example.org/ns#a1552> <http://example.org/ns#a1552> <http://example.org/ns#a1552> . +<http://example.org/ns#a1553> <http://example.org/ns#a1553> <http://example.org/ns#a1553> . +<http://example.org/ns#a1554> <http://example.org/ns#a1554> <http://example.org/ns#a1554> . +<http://example.org/ns#a1555> <http://example.org/ns#a1555> <http://example.org/ns#a1555> . +<http://example.org/ns#a1556> <http://example.org/ns#a1556> <http://example.org/ns#a1556> . +<http://example.org/ns#a1557> <http://example.org/ns#a1557> <http://example.org/ns#a1557> . +<http://example.org/ns#a1558> <http://example.org/ns#a1558> <http://example.org/ns#a1558> . +<http://example.org/ns#a1559> <http://example.org/ns#a1559> <http://example.org/ns#a1559> . +<http://example.org/ns#a1560> <http://example.org/ns#a1560> <http://example.org/ns#a1560> . +<http://example.org/ns#a1561> <http://example.org/ns#a1561> <http://example.org/ns#a1561> . +<http://example.org/ns#a1562> <http://example.org/ns#a1562> <http://example.org/ns#a1562> . +<http://example.org/ns#a1563> <http://example.org/ns#a1563> <http://example.org/ns#a1563> . +<http://example.org/ns#a1564> <http://example.org/ns#a1564> <http://example.org/ns#a1564> . +<http://example.org/ns#a1565> <http://example.org/ns#a1565> <http://example.org/ns#a1565> . +<http://example.org/ns#a1566> <http://example.org/ns#a1566> <http://example.org/ns#a1566> . +<http://example.org/ns#a1567> <http://example.org/ns#a1567> <http://example.org/ns#a1567> . +<http://example.org/ns#a1568> <http://example.org/ns#a1568> <http://example.org/ns#a1568> . +<http://example.org/ns#a1569> <http://example.org/ns#a1569> <http://example.org/ns#a1569> . +<http://example.org/ns#a1570> <http://example.org/ns#a1570> <http://example.org/ns#a1570> . +<http://example.org/ns#a1571> <http://example.org/ns#a1571> <http://example.org/ns#a1571> . +<http://example.org/ns#a1572> <http://example.org/ns#a1572> <http://example.org/ns#a1572> . +<http://example.org/ns#a1573> <http://example.org/ns#a1573> <http://example.org/ns#a1573> . +<http://example.org/ns#a1574> <http://example.org/ns#a1574> <http://example.org/ns#a1574> . +<http://example.org/ns#a1575> <http://example.org/ns#a1575> <http://example.org/ns#a1575> . +<http://example.org/ns#a1576> <http://example.org/ns#a1576> <http://example.org/ns#a1576> . +<http://example.org/ns#a1577> <http://example.org/ns#a1577> <http://example.org/ns#a1577> . +<http://example.org/ns#a1578> <http://example.org/ns#a1578> <http://example.org/ns#a1578> . +<http://example.org/ns#a1579> <http://example.org/ns#a1579> <http://example.org/ns#a1579> . +<http://example.org/ns#a1580> <http://example.org/ns#a1580> <http://example.org/ns#a1580> . +<http://example.org/ns#a1581> <http://example.org/ns#a1581> <http://example.org/ns#a1581> . +<http://example.org/ns#a1582> <http://example.org/ns#a1582> <http://example.org/ns#a1582> . +<http://example.org/ns#a1583> <http://example.org/ns#a1583> <http://example.org/ns#a1583> . +<http://example.org/ns#a1584> <http://example.org/ns#a1584> <http://example.org/ns#a1584> . +<http://example.org/ns#a1585> <http://example.org/ns#a1585> <http://example.org/ns#a1585> . +<http://example.org/ns#a1586> <http://example.org/ns#a1586> <http://example.org/ns#a1586> . +<http://example.org/ns#a1587> <http://example.org/ns#a1587> <http://example.org/ns#a1587> . +<http://example.org/ns#a1588> <http://example.org/ns#a1588> <http://example.org/ns#a1588> . +<http://example.org/ns#a1589> <http://example.org/ns#a1589> <http://example.org/ns#a1589> . +<http://example.org/ns#a1590> <http://example.org/ns#a1590> <http://example.org/ns#a1590> . +<http://example.org/ns#a1591> <http://example.org/ns#a1591> <http://example.org/ns#a1591> . +<http://example.org/ns#a1592> <http://example.org/ns#a1592> <http://example.org/ns#a1592> . +<http://example.org/ns#a1593> <http://example.org/ns#a1593> <http://example.org/ns#a1593> . +<http://example.org/ns#a1594> <http://example.org/ns#a1594> <http://example.org/ns#a1594> . +<http://example.org/ns#a1595> <http://example.org/ns#a1595> <http://example.org/ns#a1595> . +<http://example.org/ns#a1596> <http://example.org/ns#a1596> <http://example.org/ns#a1596> . +<http://example.org/ns#a1597> <http://example.org/ns#a1597> <http://example.org/ns#a1597> . +<http://example.org/ns#a1598> <http://example.org/ns#a1598> <http://example.org/ns#a1598> . +<http://example.org/ns#a1599> <http://example.org/ns#a1599> <http://example.org/ns#a1599> . +<http://example.org/ns#a1600> <http://example.org/ns#a1600> <http://example.org/ns#a1600> . +<http://example.org/ns#a1601> <http://example.org/ns#a1601> <http://example.org/ns#a1601> . +<http://example.org/ns#a1602> <http://example.org/ns#a1602> <http://example.org/ns#a1602> . +<http://example.org/ns#a1603> <http://example.org/ns#a1603> <http://example.org/ns#a1603> . +<http://example.org/ns#a1604> <http://example.org/ns#a1604> <http://example.org/ns#a1604> . +<http://example.org/ns#a1605> <http://example.org/ns#a1605> <http://example.org/ns#a1605> . +<http://example.org/ns#a1606> <http://example.org/ns#a1606> <http://example.org/ns#a1606> . +<http://example.org/ns#a1607> <http://example.org/ns#a1607> <http://example.org/ns#a1607> . +<http://example.org/ns#a1608> <http://example.org/ns#a1608> <http://example.org/ns#a1608> . +<http://example.org/ns#a1609> <http://example.org/ns#a1609> <http://example.org/ns#a1609> . +<http://example.org/ns#a1610> <http://example.org/ns#a1610> <http://example.org/ns#a1610> . +<http://example.org/ns#a1611> <http://example.org/ns#a1611> <http://example.org/ns#a1611> . +<http://example.org/ns#a1612> <http://example.org/ns#a1612> <http://example.org/ns#a1612> . +<http://example.org/ns#a1613> <http://example.org/ns#a1613> <http://example.org/ns#a1613> . +<http://example.org/ns#a1614> <http://example.org/ns#a1614> <http://example.org/ns#a1614> . +<http://example.org/ns#a1615> <http://example.org/ns#a1615> <http://example.org/ns#a1615> . +<http://example.org/ns#a1616> <http://example.org/ns#a1616> <http://example.org/ns#a1616> . +<http://example.org/ns#a1617> <http://example.org/ns#a1617> <http://example.org/ns#a1617> . +<http://example.org/ns#a1618> <http://example.org/ns#a1618> <http://example.org/ns#a1618> . +<http://example.org/ns#a1619> <http://example.org/ns#a1619> <http://example.org/ns#a1619> . +<http://example.org/ns#a1620> <http://example.org/ns#a1620> <http://example.org/ns#a1620> . +<http://example.org/ns#a1621> <http://example.org/ns#a1621> <http://example.org/ns#a1621> . +<http://example.org/ns#a1622> <http://example.org/ns#a1622> <http://example.org/ns#a1622> . +<http://example.org/ns#a1623> <http://example.org/ns#a1623> <http://example.org/ns#a1623> . +<http://example.org/ns#a1624> <http://example.org/ns#a1624> <http://example.org/ns#a1624> . +<http://example.org/ns#a1625> <http://example.org/ns#a1625> <http://example.org/ns#a1625> . +<http://example.org/ns#a1626> <http://example.org/ns#a1626> <http://example.org/ns#a1626> . +<http://example.org/ns#a1627> <http://example.org/ns#a1627> <http://example.org/ns#a1627> . +<http://example.org/ns#a1628> <http://example.org/ns#a1628> <http://example.org/ns#a1628> . +<http://example.org/ns#a1629> <http://example.org/ns#a1629> <http://example.org/ns#a1629> . +<http://example.org/ns#a1630> <http://example.org/ns#a1630> <http://example.org/ns#a1630> . +<http://example.org/ns#a1631> <http://example.org/ns#a1631> <http://example.org/ns#a1631> . +<http://example.org/ns#a1632> <http://example.org/ns#a1632> <http://example.org/ns#a1632> . +<http://example.org/ns#a1633> <http://example.org/ns#a1633> <http://example.org/ns#a1633> . +<http://example.org/ns#a1634> <http://example.org/ns#a1634> <http://example.org/ns#a1634> . +<http://example.org/ns#a1635> <http://example.org/ns#a1635> <http://example.org/ns#a1635> . +<http://example.org/ns#a1636> <http://example.org/ns#a1636> <http://example.org/ns#a1636> . +<http://example.org/ns#a1637> <http://example.org/ns#a1637> <http://example.org/ns#a1637> . +<http://example.org/ns#a1638> <http://example.org/ns#a1638> <http://example.org/ns#a1638> . +<http://example.org/ns#a1639> <http://example.org/ns#a1639> <http://example.org/ns#a1639> . +<http://example.org/ns#a1640> <http://example.org/ns#a1640> <http://example.org/ns#a1640> . +<http://example.org/ns#a1641> <http://example.org/ns#a1641> <http://example.org/ns#a1641> . +<http://example.org/ns#a1642> <http://example.org/ns#a1642> <http://example.org/ns#a1642> . +<http://example.org/ns#a1643> <http://example.org/ns#a1643> <http://example.org/ns#a1643> . +<http://example.org/ns#a1644> <http://example.org/ns#a1644> <http://example.org/ns#a1644> . +<http://example.org/ns#a1645> <http://example.org/ns#a1645> <http://example.org/ns#a1645> . +<http://example.org/ns#a1646> <http://example.org/ns#a1646> <http://example.org/ns#a1646> . +<http://example.org/ns#a1647> <http://example.org/ns#a1647> <http://example.org/ns#a1647> . +<http://example.org/ns#a1648> <http://example.org/ns#a1648> <http://example.org/ns#a1648> . +<http://example.org/ns#a1649> <http://example.org/ns#a1649> <http://example.org/ns#a1649> . +<http://example.org/ns#a1650> <http://example.org/ns#a1650> <http://example.org/ns#a1650> . +<http://example.org/ns#a1651> <http://example.org/ns#a1651> <http://example.org/ns#a1651> . +<http://example.org/ns#a1652> <http://example.org/ns#a1652> <http://example.org/ns#a1652> . +<http://example.org/ns#a1653> <http://example.org/ns#a1653> <http://example.org/ns#a1653> . +<http://example.org/ns#a1654> <http://example.org/ns#a1654> <http://example.org/ns#a1654> . +<http://example.org/ns#a1655> <http://example.org/ns#a1655> <http://example.org/ns#a1655> . +<http://example.org/ns#a1656> <http://example.org/ns#a1656> <http://example.org/ns#a1656> . +<http://example.org/ns#a1657> <http://example.org/ns#a1657> <http://example.org/ns#a1657> . +<http://example.org/ns#a1658> <http://example.org/ns#a1658> <http://example.org/ns#a1658> . +<http://example.org/ns#a1659> <http://example.org/ns#a1659> <http://example.org/ns#a1659> . +<http://example.org/ns#a1660> <http://example.org/ns#a1660> <http://example.org/ns#a1660> . +<http://example.org/ns#a1661> <http://example.org/ns#a1661> <http://example.org/ns#a1661> . +<http://example.org/ns#a1662> <http://example.org/ns#a1662> <http://example.org/ns#a1662> . +<http://example.org/ns#a1663> <http://example.org/ns#a1663> <http://example.org/ns#a1663> . +<http://example.org/ns#a1664> <http://example.org/ns#a1664> <http://example.org/ns#a1664> . +<http://example.org/ns#a1665> <http://example.org/ns#a1665> <http://example.org/ns#a1665> . +<http://example.org/ns#a1666> <http://example.org/ns#a1666> <http://example.org/ns#a1666> . +<http://example.org/ns#a1667> <http://example.org/ns#a1667> <http://example.org/ns#a1667> . +<http://example.org/ns#a1668> <http://example.org/ns#a1668> <http://example.org/ns#a1668> . +<http://example.org/ns#a1669> <http://example.org/ns#a1669> <http://example.org/ns#a1669> . +<http://example.org/ns#a1670> <http://example.org/ns#a1670> <http://example.org/ns#a1670> . +<http://example.org/ns#a1671> <http://example.org/ns#a1671> <http://example.org/ns#a1671> . +<http://example.org/ns#a1672> <http://example.org/ns#a1672> <http://example.org/ns#a1672> . +<http://example.org/ns#a1673> <http://example.org/ns#a1673> <http://example.org/ns#a1673> . +<http://example.org/ns#a1674> <http://example.org/ns#a1674> <http://example.org/ns#a1674> . +<http://example.org/ns#a1675> <http://example.org/ns#a1675> <http://example.org/ns#a1675> . +<http://example.org/ns#a1676> <http://example.org/ns#a1676> <http://example.org/ns#a1676> . +<http://example.org/ns#a1677> <http://example.org/ns#a1677> <http://example.org/ns#a1677> . +<http://example.org/ns#a1678> <http://example.org/ns#a1678> <http://example.org/ns#a1678> . +<http://example.org/ns#a1679> <http://example.org/ns#a1679> <http://example.org/ns#a1679> . +<http://example.org/ns#a1680> <http://example.org/ns#a1680> <http://example.org/ns#a1680> . +<http://example.org/ns#a1681> <http://example.org/ns#a1681> <http://example.org/ns#a1681> . +<http://example.org/ns#a1682> <http://example.org/ns#a1682> <http://example.org/ns#a1682> . +<http://example.org/ns#a1683> <http://example.org/ns#a1683> <http://example.org/ns#a1683> . +<http://example.org/ns#a1684> <http://example.org/ns#a1684> <http://example.org/ns#a1684> . +<http://example.org/ns#a1685> <http://example.org/ns#a1685> <http://example.org/ns#a1685> . +<http://example.org/ns#a1686> <http://example.org/ns#a1686> <http://example.org/ns#a1686> . +<http://example.org/ns#a1687> <http://example.org/ns#a1687> <http://example.org/ns#a1687> . +<http://example.org/ns#a1688> <http://example.org/ns#a1688> <http://example.org/ns#a1688> . +<http://example.org/ns#a1689> <http://example.org/ns#a1689> <http://example.org/ns#a1689> . +<http://example.org/ns#a1690> <http://example.org/ns#a1690> <http://example.org/ns#a1690> . +<http://example.org/ns#a1691> <http://example.org/ns#a1691> <http://example.org/ns#a1691> . +<http://example.org/ns#a1692> <http://example.org/ns#a1692> <http://example.org/ns#a1692> . +<http://example.org/ns#a1693> <http://example.org/ns#a1693> <http://example.org/ns#a1693> . +<http://example.org/ns#a1694> <http://example.org/ns#a1694> <http://example.org/ns#a1694> . +<http://example.org/ns#a1695> <http://example.org/ns#a1695> <http://example.org/ns#a1695> . +<http://example.org/ns#a1696> <http://example.org/ns#a1696> <http://example.org/ns#a1696> . +<http://example.org/ns#a1697> <http://example.org/ns#a1697> <http://example.org/ns#a1697> . +<http://example.org/ns#a1698> <http://example.org/ns#a1698> <http://example.org/ns#a1698> . +<http://example.org/ns#a1699> <http://example.org/ns#a1699> <http://example.org/ns#a1699> . +<http://example.org/ns#a1700> <http://example.org/ns#a1700> <http://example.org/ns#a1700> . +<http://example.org/ns#a1701> <http://example.org/ns#a1701> <http://example.org/ns#a1701> . +<http://example.org/ns#a1702> <http://example.org/ns#a1702> <http://example.org/ns#a1702> . +<http://example.org/ns#a1703> <http://example.org/ns#a1703> <http://example.org/ns#a1703> . +<http://example.org/ns#a1704> <http://example.org/ns#a1704> <http://example.org/ns#a1704> . +<http://example.org/ns#a1705> <http://example.org/ns#a1705> <http://example.org/ns#a1705> . +<http://example.org/ns#a1706> <http://example.org/ns#a1706> <http://example.org/ns#a1706> . +<http://example.org/ns#a1707> <http://example.org/ns#a1707> <http://example.org/ns#a1707> . +<http://example.org/ns#a1708> <http://example.org/ns#a1708> <http://example.org/ns#a1708> . +<http://example.org/ns#a1709> <http://example.org/ns#a1709> <http://example.org/ns#a1709> . +<http://example.org/ns#a1710> <http://example.org/ns#a1710> <http://example.org/ns#a1710> . +<http://example.org/ns#a1711> <http://example.org/ns#a1711> <http://example.org/ns#a1711> . +<http://example.org/ns#a1712> <http://example.org/ns#a1712> <http://example.org/ns#a1712> . +<http://example.org/ns#a1713> <http://example.org/ns#a1713> <http://example.org/ns#a1713> . +<http://example.org/ns#a1714> <http://example.org/ns#a1714> <http://example.org/ns#a1714> . +<http://example.org/ns#a1715> <http://example.org/ns#a1715> <http://example.org/ns#a1715> . +<http://example.org/ns#a1716> <http://example.org/ns#a1716> <http://example.org/ns#a1716> . +<http://example.org/ns#a1717> <http://example.org/ns#a1717> <http://example.org/ns#a1717> . +<http://example.org/ns#a1718> <http://example.org/ns#a1718> <http://example.org/ns#a1718> . +<http://example.org/ns#a1719> <http://example.org/ns#a1719> <http://example.org/ns#a1719> . +<http://example.org/ns#a1720> <http://example.org/ns#a1720> <http://example.org/ns#a1720> . +<http://example.org/ns#a1721> <http://example.org/ns#a1721> <http://example.org/ns#a1721> . +<http://example.org/ns#a1722> <http://example.org/ns#a1722> <http://example.org/ns#a1722> . +<http://example.org/ns#a1723> <http://example.org/ns#a1723> <http://example.org/ns#a1723> . +<http://example.org/ns#a1724> <http://example.org/ns#a1724> <http://example.org/ns#a1724> . +<http://example.org/ns#a1725> <http://example.org/ns#a1725> <http://example.org/ns#a1725> . +<http://example.org/ns#a1726> <http://example.org/ns#a1726> <http://example.org/ns#a1726> . +<http://example.org/ns#a1727> <http://example.org/ns#a1727> <http://example.org/ns#a1727> . +<http://example.org/ns#a1728> <http://example.org/ns#a1728> <http://example.org/ns#a1728> . +<http://example.org/ns#a1729> <http://example.org/ns#a1729> <http://example.org/ns#a1729> . +<http://example.org/ns#a1730> <http://example.org/ns#a1730> <http://example.org/ns#a1730> . +<http://example.org/ns#a1731> <http://example.org/ns#a1731> <http://example.org/ns#a1731> . +<http://example.org/ns#a1732> <http://example.org/ns#a1732> <http://example.org/ns#a1732> . +<http://example.org/ns#a1733> <http://example.org/ns#a1733> <http://example.org/ns#a1733> . +<http://example.org/ns#a1734> <http://example.org/ns#a1734> <http://example.org/ns#a1734> . +<http://example.org/ns#a1735> <http://example.org/ns#a1735> <http://example.org/ns#a1735> . +<http://example.org/ns#a1736> <http://example.org/ns#a1736> <http://example.org/ns#a1736> . +<http://example.org/ns#a1737> <http://example.org/ns#a1737> <http://example.org/ns#a1737> . +<http://example.org/ns#a1738> <http://example.org/ns#a1738> <http://example.org/ns#a1738> . +<http://example.org/ns#a1739> <http://example.org/ns#a1739> <http://example.org/ns#a1739> . +<http://example.org/ns#a1740> <http://example.org/ns#a1740> <http://example.org/ns#a1740> . +<http://example.org/ns#a1741> <http://example.org/ns#a1741> <http://example.org/ns#a1741> . +<http://example.org/ns#a1742> <http://example.org/ns#a1742> <http://example.org/ns#a1742> . +<http://example.org/ns#a1743> <http://example.org/ns#a1743> <http://example.org/ns#a1743> . +<http://example.org/ns#a1744> <http://example.org/ns#a1744> <http://example.org/ns#a1744> . +<http://example.org/ns#a1745> <http://example.org/ns#a1745> <http://example.org/ns#a1745> . +<http://example.org/ns#a1746> <http://example.org/ns#a1746> <http://example.org/ns#a1746> . +<http://example.org/ns#a1747> <http://example.org/ns#a1747> <http://example.org/ns#a1747> . +<http://example.org/ns#a1748> <http://example.org/ns#a1748> <http://example.org/ns#a1748> . +<http://example.org/ns#a1749> <http://example.org/ns#a1749> <http://example.org/ns#a1749> . +<http://example.org/ns#a1750> <http://example.org/ns#a1750> <http://example.org/ns#a1750> . +<http://example.org/ns#a1751> <http://example.org/ns#a1751> <http://example.org/ns#a1751> . +<http://example.org/ns#a1752> <http://example.org/ns#a1752> <http://example.org/ns#a1752> . +<http://example.org/ns#a1753> <http://example.org/ns#a1753> <http://example.org/ns#a1753> . +<http://example.org/ns#a1754> <http://example.org/ns#a1754> <http://example.org/ns#a1754> . +<http://example.org/ns#a1755> <http://example.org/ns#a1755> <http://example.org/ns#a1755> . +<http://example.org/ns#a1756> <http://example.org/ns#a1756> <http://example.org/ns#a1756> . +<http://example.org/ns#a1757> <http://example.org/ns#a1757> <http://example.org/ns#a1757> . +<http://example.org/ns#a1758> <http://example.org/ns#a1758> <http://example.org/ns#a1758> . +<http://example.org/ns#a1759> <http://example.org/ns#a1759> <http://example.org/ns#a1759> . +<http://example.org/ns#a1760> <http://example.org/ns#a1760> <http://example.org/ns#a1760> . +<http://example.org/ns#a1761> <http://example.org/ns#a1761> <http://example.org/ns#a1761> . +<http://example.org/ns#a1762> <http://example.org/ns#a1762> <http://example.org/ns#a1762> . +<http://example.org/ns#a1763> <http://example.org/ns#a1763> <http://example.org/ns#a1763> . +<http://example.org/ns#a1764> <http://example.org/ns#a1764> <http://example.org/ns#a1764> . +<http://example.org/ns#a1765> <http://example.org/ns#a1765> <http://example.org/ns#a1765> . +<http://example.org/ns#a1766> <http://example.org/ns#a1766> <http://example.org/ns#a1766> . +<http://example.org/ns#a1767> <http://example.org/ns#a1767> <http://example.org/ns#a1767> . +<http://example.org/ns#a1768> <http://example.org/ns#a1768> <http://example.org/ns#a1768> . +<http://example.org/ns#a1769> <http://example.org/ns#a1769> <http://example.org/ns#a1769> . +<http://example.org/ns#a1770> <http://example.org/ns#a1770> <http://example.org/ns#a1770> . +<http://example.org/ns#a1771> <http://example.org/ns#a1771> <http://example.org/ns#a1771> . +<http://example.org/ns#a1772> <http://example.org/ns#a1772> <http://example.org/ns#a1772> . +<http://example.org/ns#a1773> <http://example.org/ns#a1773> <http://example.org/ns#a1773> . +<http://example.org/ns#a1774> <http://example.org/ns#a1774> <http://example.org/ns#a1774> . +<http://example.org/ns#a1775> <http://example.org/ns#a1775> <http://example.org/ns#a1775> . +<http://example.org/ns#a1776> <http://example.org/ns#a1776> <http://example.org/ns#a1776> . +<http://example.org/ns#a1777> <http://example.org/ns#a1777> <http://example.org/ns#a1777> . +<http://example.org/ns#a1778> <http://example.org/ns#a1778> <http://example.org/ns#a1778> . +<http://example.org/ns#a1779> <http://example.org/ns#a1779> <http://example.org/ns#a1779> . +<http://example.org/ns#a1780> <http://example.org/ns#a1780> <http://example.org/ns#a1780> . +<http://example.org/ns#a1781> <http://example.org/ns#a1781> <http://example.org/ns#a1781> . +<http://example.org/ns#a1782> <http://example.org/ns#a1782> <http://example.org/ns#a1782> . +<http://example.org/ns#a1783> <http://example.org/ns#a1783> <http://example.org/ns#a1783> . +<http://example.org/ns#a1784> <http://example.org/ns#a1784> <http://example.org/ns#a1784> . +<http://example.org/ns#a1785> <http://example.org/ns#a1785> <http://example.org/ns#a1785> . +<http://example.org/ns#a1786> <http://example.org/ns#a1786> <http://example.org/ns#a1786> . +<http://example.org/ns#a1787> <http://example.org/ns#a1787> <http://example.org/ns#a1787> . +<http://example.org/ns#a1788> <http://example.org/ns#a1788> <http://example.org/ns#a1788> . +<http://example.org/ns#a1789> <http://example.org/ns#a1789> <http://example.org/ns#a1789> . +<http://example.org/ns#a1790> <http://example.org/ns#a1790> <http://example.org/ns#a1790> . +<http://example.org/ns#a1791> <http://example.org/ns#a1791> <http://example.org/ns#a1791> . +<http://example.org/ns#a1792> <http://example.org/ns#a1792> <http://example.org/ns#a1792> . +<http://example.org/ns#a1793> <http://example.org/ns#a1793> <http://example.org/ns#a1793> . +<http://example.org/ns#a1794> <http://example.org/ns#a1794> <http://example.org/ns#a1794> . +<http://example.org/ns#a1795> <http://example.org/ns#a1795> <http://example.org/ns#a1795> . +<http://example.org/ns#a1796> <http://example.org/ns#a1796> <http://example.org/ns#a1796> . +<http://example.org/ns#a1797> <http://example.org/ns#a1797> <http://example.org/ns#a1797> . +<http://example.org/ns#a1798> <http://example.org/ns#a1798> <http://example.org/ns#a1798> . +<http://example.org/ns#a1799> <http://example.org/ns#a1799> <http://example.org/ns#a1799> . +<http://example.org/ns#a1800> <http://example.org/ns#a1800> <http://example.org/ns#a1800> . +<http://example.org/ns#a1801> <http://example.org/ns#a1801> <http://example.org/ns#a1801> . +<http://example.org/ns#a1802> <http://example.org/ns#a1802> <http://example.org/ns#a1802> . +<http://example.org/ns#a1803> <http://example.org/ns#a1803> <http://example.org/ns#a1803> . +<http://example.org/ns#a1804> <http://example.org/ns#a1804> <http://example.org/ns#a1804> . +<http://example.org/ns#a1805> <http://example.org/ns#a1805> <http://example.org/ns#a1805> . +<http://example.org/ns#a1806> <http://example.org/ns#a1806> <http://example.org/ns#a1806> . +<http://example.org/ns#a1807> <http://example.org/ns#a1807> <http://example.org/ns#a1807> . +<http://example.org/ns#a1808> <http://example.org/ns#a1808> <http://example.org/ns#a1808> . +<http://example.org/ns#a1809> <http://example.org/ns#a1809> <http://example.org/ns#a1809> . +<http://example.org/ns#a1810> <http://example.org/ns#a1810> <http://example.org/ns#a1810> . +<http://example.org/ns#a1811> <http://example.org/ns#a1811> <http://example.org/ns#a1811> . +<http://example.org/ns#a1812> <http://example.org/ns#a1812> <http://example.org/ns#a1812> . +<http://example.org/ns#a1813> <http://example.org/ns#a1813> <http://example.org/ns#a1813> . +<http://example.org/ns#a1814> <http://example.org/ns#a1814> <http://example.org/ns#a1814> . +<http://example.org/ns#a1815> <http://example.org/ns#a1815> <http://example.org/ns#a1815> . +<http://example.org/ns#a1816> <http://example.org/ns#a1816> <http://example.org/ns#a1816> . +<http://example.org/ns#a1817> <http://example.org/ns#a1817> <http://example.org/ns#a1817> . +<http://example.org/ns#a1818> <http://example.org/ns#a1818> <http://example.org/ns#a1818> . +<http://example.org/ns#a1819> <http://example.org/ns#a1819> <http://example.org/ns#a1819> . +<http://example.org/ns#a1820> <http://example.org/ns#a1820> <http://example.org/ns#a1820> . +<http://example.org/ns#a1821> <http://example.org/ns#a1821> <http://example.org/ns#a1821> . +<http://example.org/ns#a1822> <http://example.org/ns#a1822> <http://example.org/ns#a1822> . +<http://example.org/ns#a1823> <http://example.org/ns#a1823> <http://example.org/ns#a1823> . +<http://example.org/ns#a1824> <http://example.org/ns#a1824> <http://example.org/ns#a1824> . +<http://example.org/ns#a1825> <http://example.org/ns#a1825> <http://example.org/ns#a1825> . +<http://example.org/ns#a1826> <http://example.org/ns#a1826> <http://example.org/ns#a1826> . +<http://example.org/ns#a1827> <http://example.org/ns#a1827> <http://example.org/ns#a1827> . +<http://example.org/ns#a1828> <http://example.org/ns#a1828> <http://example.org/ns#a1828> . +<http://example.org/ns#a1829> <http://example.org/ns#a1829> <http://example.org/ns#a1829> . +<http://example.org/ns#a1830> <http://example.org/ns#a1830> <http://example.org/ns#a1830> . +<http://example.org/ns#a1831> <http://example.org/ns#a1831> <http://example.org/ns#a1831> . +<http://example.org/ns#a1832> <http://example.org/ns#a1832> <http://example.org/ns#a1832> . +<http://example.org/ns#a1833> <http://example.org/ns#a1833> <http://example.org/ns#a1833> . +<http://example.org/ns#a1834> <http://example.org/ns#a1834> <http://example.org/ns#a1834> . +<http://example.org/ns#a1835> <http://example.org/ns#a1835> <http://example.org/ns#a1835> . +<http://example.org/ns#a1836> <http://example.org/ns#a1836> <http://example.org/ns#a1836> . +<http://example.org/ns#a1837> <http://example.org/ns#a1837> <http://example.org/ns#a1837> . +<http://example.org/ns#a1838> <http://example.org/ns#a1838> <http://example.org/ns#a1838> . +<http://example.org/ns#a1839> <http://example.org/ns#a1839> <http://example.org/ns#a1839> . +<http://example.org/ns#a1840> <http://example.org/ns#a1840> <http://example.org/ns#a1840> . +<http://example.org/ns#a1841> <http://example.org/ns#a1841> <http://example.org/ns#a1841> . +<http://example.org/ns#a1842> <http://example.org/ns#a1842> <http://example.org/ns#a1842> . +<http://example.org/ns#a1843> <http://example.org/ns#a1843> <http://example.org/ns#a1843> . +<http://example.org/ns#a1844> <http://example.org/ns#a1844> <http://example.org/ns#a1844> . +<http://example.org/ns#a1845> <http://example.org/ns#a1845> <http://example.org/ns#a1845> . +<http://example.org/ns#a1846> <http://example.org/ns#a1846> <http://example.org/ns#a1846> . +<http://example.org/ns#a1847> <http://example.org/ns#a1847> <http://example.org/ns#a1847> . +<http://example.org/ns#a1848> <http://example.org/ns#a1848> <http://example.org/ns#a1848> . +<http://example.org/ns#a1849> <http://example.org/ns#a1849> <http://example.org/ns#a1849> . +<http://example.org/ns#a1850> <http://example.org/ns#a1850> <http://example.org/ns#a1850> . +<http://example.org/ns#a1851> <http://example.org/ns#a1851> <http://example.org/ns#a1851> . +<http://example.org/ns#a1852> <http://example.org/ns#a1852> <http://example.org/ns#a1852> . +<http://example.org/ns#a1853> <http://example.org/ns#a1853> <http://example.org/ns#a1853> . +<http://example.org/ns#a1854> <http://example.org/ns#a1854> <http://example.org/ns#a1854> . +<http://example.org/ns#a1855> <http://example.org/ns#a1855> <http://example.org/ns#a1855> . +<http://example.org/ns#a1856> <http://example.org/ns#a1856> <http://example.org/ns#a1856> . +<http://example.org/ns#a1857> <http://example.org/ns#a1857> <http://example.org/ns#a1857> . +<http://example.org/ns#a1858> <http://example.org/ns#a1858> <http://example.org/ns#a1858> . +<http://example.org/ns#a1859> <http://example.org/ns#a1859> <http://example.org/ns#a1859> . +<http://example.org/ns#a1860> <http://example.org/ns#a1860> <http://example.org/ns#a1860> . +<http://example.org/ns#a1861> <http://example.org/ns#a1861> <http://example.org/ns#a1861> . +<http://example.org/ns#a1862> <http://example.org/ns#a1862> <http://example.org/ns#a1862> . +<http://example.org/ns#a1863> <http://example.org/ns#a1863> <http://example.org/ns#a1863> . +<http://example.org/ns#a1864> <http://example.org/ns#a1864> <http://example.org/ns#a1864> . +<http://example.org/ns#a1865> <http://example.org/ns#a1865> <http://example.org/ns#a1865> . +<http://example.org/ns#a1866> <http://example.org/ns#a1866> <http://example.org/ns#a1866> . +<http://example.org/ns#a1867> <http://example.org/ns#a1867> <http://example.org/ns#a1867> . +<http://example.org/ns#a1868> <http://example.org/ns#a1868> <http://example.org/ns#a1868> . +<http://example.org/ns#a1869> <http://example.org/ns#a1869> <http://example.org/ns#a1869> . +<http://example.org/ns#a1870> <http://example.org/ns#a1870> <http://example.org/ns#a1870> . +<http://example.org/ns#a1871> <http://example.org/ns#a1871> <http://example.org/ns#a1871> . +<http://example.org/ns#a1872> <http://example.org/ns#a1872> <http://example.org/ns#a1872> . +<http://example.org/ns#a1873> <http://example.org/ns#a1873> <http://example.org/ns#a1873> . +<http://example.org/ns#a1874> <http://example.org/ns#a1874> <http://example.org/ns#a1874> . +<http://example.org/ns#a1875> <http://example.org/ns#a1875> <http://example.org/ns#a1875> . +<http://example.org/ns#a1876> <http://example.org/ns#a1876> <http://example.org/ns#a1876> . +<http://example.org/ns#a1877> <http://example.org/ns#a1877> <http://example.org/ns#a1877> . +<http://example.org/ns#a1878> <http://example.org/ns#a1878> <http://example.org/ns#a1878> . +<http://example.org/ns#a1879> <http://example.org/ns#a1879> <http://example.org/ns#a1879> . +<http://example.org/ns#a1880> <http://example.org/ns#a1880> <http://example.org/ns#a1880> . +<http://example.org/ns#a1881> <http://example.org/ns#a1881> <http://example.org/ns#a1881> . +<http://example.org/ns#a1882> <http://example.org/ns#a1882> <http://example.org/ns#a1882> . +<http://example.org/ns#a1883> <http://example.org/ns#a1883> <http://example.org/ns#a1883> . +<http://example.org/ns#a1884> <http://example.org/ns#a1884> <http://example.org/ns#a1884> . +<http://example.org/ns#a1885> <http://example.org/ns#a1885> <http://example.org/ns#a1885> . +<http://example.org/ns#a1886> <http://example.org/ns#a1886> <http://example.org/ns#a1886> . +<http://example.org/ns#a1887> <http://example.org/ns#a1887> <http://example.org/ns#a1887> . +<http://example.org/ns#a1888> <http://example.org/ns#a1888> <http://example.org/ns#a1888> . +<http://example.org/ns#a1889> <http://example.org/ns#a1889> <http://example.org/ns#a1889> . +<http://example.org/ns#a1890> <http://example.org/ns#a1890> <http://example.org/ns#a1890> . +<http://example.org/ns#a1891> <http://example.org/ns#a1891> <http://example.org/ns#a1891> . +<http://example.org/ns#a1892> <http://example.org/ns#a1892> <http://example.org/ns#a1892> . +<http://example.org/ns#a1893> <http://example.org/ns#a1893> <http://example.org/ns#a1893> . +<http://example.org/ns#a1894> <http://example.org/ns#a1894> <http://example.org/ns#a1894> . +<http://example.org/ns#a1895> <http://example.org/ns#a1895> <http://example.org/ns#a1895> . +<http://example.org/ns#a1896> <http://example.org/ns#a1896> <http://example.org/ns#a1896> . +<http://example.org/ns#a1897> <http://example.org/ns#a1897> <http://example.org/ns#a1897> . +<http://example.org/ns#a1898> <http://example.org/ns#a1898> <http://example.org/ns#a1898> . +<http://example.org/ns#a1899> <http://example.org/ns#a1899> <http://example.org/ns#a1899> . +<http://example.org/ns#a1900> <http://example.org/ns#a1900> <http://example.org/ns#a1900> . +<http://example.org/ns#a1901> <http://example.org/ns#a1901> <http://example.org/ns#a1901> . +<http://example.org/ns#a1902> <http://example.org/ns#a1902> <http://example.org/ns#a1902> . +<http://example.org/ns#a1903> <http://example.org/ns#a1903> <http://example.org/ns#a1903> . +<http://example.org/ns#a1904> <http://example.org/ns#a1904> <http://example.org/ns#a1904> . +<http://example.org/ns#a1905> <http://example.org/ns#a1905> <http://example.org/ns#a1905> . +<http://example.org/ns#a1906> <http://example.org/ns#a1906> <http://example.org/ns#a1906> . +<http://example.org/ns#a1907> <http://example.org/ns#a1907> <http://example.org/ns#a1907> . +<http://example.org/ns#a1908> <http://example.org/ns#a1908> <http://example.org/ns#a1908> . +<http://example.org/ns#a1909> <http://example.org/ns#a1909> <http://example.org/ns#a1909> . +<http://example.org/ns#a1910> <http://example.org/ns#a1910> <http://example.org/ns#a1910> . +<http://example.org/ns#a1911> <http://example.org/ns#a1911> <http://example.org/ns#a1911> . +<http://example.org/ns#a1912> <http://example.org/ns#a1912> <http://example.org/ns#a1912> . +<http://example.org/ns#a1913> <http://example.org/ns#a1913> <http://example.org/ns#a1913> . +<http://example.org/ns#a1914> <http://example.org/ns#a1914> <http://example.org/ns#a1914> . +<http://example.org/ns#a1915> <http://example.org/ns#a1915> <http://example.org/ns#a1915> . +<http://example.org/ns#a1916> <http://example.org/ns#a1916> <http://example.org/ns#a1916> . +<http://example.org/ns#a1917> <http://example.org/ns#a1917> <http://example.org/ns#a1917> . +<http://example.org/ns#a1918> <http://example.org/ns#a1918> <http://example.org/ns#a1918> . +<http://example.org/ns#a1919> <http://example.org/ns#a1919> <http://example.org/ns#a1919> . +<http://example.org/ns#a1920> <http://example.org/ns#a1920> <http://example.org/ns#a1920> . +<http://example.org/ns#a1921> <http://example.org/ns#a1921> <http://example.org/ns#a1921> . +<http://example.org/ns#a1922> <http://example.org/ns#a1922> <http://example.org/ns#a1922> . +<http://example.org/ns#a1923> <http://example.org/ns#a1923> <http://example.org/ns#a1923> . +<http://example.org/ns#a1924> <http://example.org/ns#a1924> <http://example.org/ns#a1924> . +<http://example.org/ns#a1925> <http://example.org/ns#a1925> <http://example.org/ns#a1925> . +<http://example.org/ns#a1926> <http://example.org/ns#a1926> <http://example.org/ns#a1926> . +<http://example.org/ns#a1927> <http://example.org/ns#a1927> <http://example.org/ns#a1927> . +<http://example.org/ns#a1928> <http://example.org/ns#a1928> <http://example.org/ns#a1928> . +<http://example.org/ns#a1929> <http://example.org/ns#a1929> <http://example.org/ns#a1929> . +<http://example.org/ns#a1930> <http://example.org/ns#a1930> <http://example.org/ns#a1930> . +<http://example.org/ns#a1931> <http://example.org/ns#a1931> <http://example.org/ns#a1931> . +<http://example.org/ns#a1932> <http://example.org/ns#a1932> <http://example.org/ns#a1932> . +<http://example.org/ns#a1933> <http://example.org/ns#a1933> <http://example.org/ns#a1933> . +<http://example.org/ns#a1934> <http://example.org/ns#a1934> <http://example.org/ns#a1934> . +<http://example.org/ns#a1935> <http://example.org/ns#a1935> <http://example.org/ns#a1935> . +<http://example.org/ns#a1936> <http://example.org/ns#a1936> <http://example.org/ns#a1936> . +<http://example.org/ns#a1937> <http://example.org/ns#a1937> <http://example.org/ns#a1937> . +<http://example.org/ns#a1938> <http://example.org/ns#a1938> <http://example.org/ns#a1938> . +<http://example.org/ns#a1939> <http://example.org/ns#a1939> <http://example.org/ns#a1939> . +<http://example.org/ns#a1940> <http://example.org/ns#a1940> <http://example.org/ns#a1940> . +<http://example.org/ns#a1941> <http://example.org/ns#a1941> <http://example.org/ns#a1941> . +<http://example.org/ns#a1942> <http://example.org/ns#a1942> <http://example.org/ns#a1942> . +<http://example.org/ns#a1943> <http://example.org/ns#a1943> <http://example.org/ns#a1943> . +<http://example.org/ns#a1944> <http://example.org/ns#a1944> <http://example.org/ns#a1944> . +<http://example.org/ns#a1945> <http://example.org/ns#a1945> <http://example.org/ns#a1945> . +<http://example.org/ns#a1946> <http://example.org/ns#a1946> <http://example.org/ns#a1946> . +<http://example.org/ns#a1947> <http://example.org/ns#a1947> <http://example.org/ns#a1947> . +<http://example.org/ns#a1948> <http://example.org/ns#a1948> <http://example.org/ns#a1948> . +<http://example.org/ns#a1949> <http://example.org/ns#a1949> <http://example.org/ns#a1949> . +<http://example.org/ns#a1950> <http://example.org/ns#a1950> <http://example.org/ns#a1950> . +<http://example.org/ns#a1951> <http://example.org/ns#a1951> <http://example.org/ns#a1951> . +<http://example.org/ns#a1952> <http://example.org/ns#a1952> <http://example.org/ns#a1952> . +<http://example.org/ns#a1953> <http://example.org/ns#a1953> <http://example.org/ns#a1953> . +<http://example.org/ns#a1954> <http://example.org/ns#a1954> <http://example.org/ns#a1954> . +<http://example.org/ns#a1955> <http://example.org/ns#a1955> <http://example.org/ns#a1955> . +<http://example.org/ns#a1956> <http://example.org/ns#a1956> <http://example.org/ns#a1956> . +<http://example.org/ns#a1957> <http://example.org/ns#a1957> <http://example.org/ns#a1957> . +<http://example.org/ns#a1958> <http://example.org/ns#a1958> <http://example.org/ns#a1958> . +<http://example.org/ns#a1959> <http://example.org/ns#a1959> <http://example.org/ns#a1959> . +<http://example.org/ns#a1960> <http://example.org/ns#a1960> <http://example.org/ns#a1960> . +<http://example.org/ns#a1961> <http://example.org/ns#a1961> <http://example.org/ns#a1961> . +<http://example.org/ns#a1962> <http://example.org/ns#a1962> <http://example.org/ns#a1962> . +<http://example.org/ns#a1963> <http://example.org/ns#a1963> <http://example.org/ns#a1963> . +<http://example.org/ns#a1964> <http://example.org/ns#a1964> <http://example.org/ns#a1964> . +<http://example.org/ns#a1965> <http://example.org/ns#a1965> <http://example.org/ns#a1965> . +<http://example.org/ns#a1966> <http://example.org/ns#a1966> <http://example.org/ns#a1966> . +<http://example.org/ns#a1967> <http://example.org/ns#a1967> <http://example.org/ns#a1967> . +<http://example.org/ns#a1968> <http://example.org/ns#a1968> <http://example.org/ns#a1968> . +<http://example.org/ns#a1969> <http://example.org/ns#a1969> <http://example.org/ns#a1969> . +<http://example.org/ns#a1970> <http://example.org/ns#a1970> <http://example.org/ns#a1970> . +<http://example.org/ns#a1971> <http://example.org/ns#a1971> <http://example.org/ns#a1971> . +<http://example.org/ns#a1972> <http://example.org/ns#a1972> <http://example.org/ns#a1972> . +<http://example.org/ns#a1973> <http://example.org/ns#a1973> <http://example.org/ns#a1973> . +<http://example.org/ns#a1974> <http://example.org/ns#a1974> <http://example.org/ns#a1974> . +<http://example.org/ns#a1975> <http://example.org/ns#a1975> <http://example.org/ns#a1975> . +<http://example.org/ns#a1976> <http://example.org/ns#a1976> <http://example.org/ns#a1976> . +<http://example.org/ns#a1977> <http://example.org/ns#a1977> <http://example.org/ns#a1977> . +<http://example.org/ns#a1978> <http://example.org/ns#a1978> <http://example.org/ns#a1978> . +<http://example.org/ns#a1979> <http://example.org/ns#a1979> <http://example.org/ns#a1979> . +<http://example.org/ns#a1980> <http://example.org/ns#a1980> <http://example.org/ns#a1980> . +<http://example.org/ns#a1981> <http://example.org/ns#a1981> <http://example.org/ns#a1981> . +<http://example.org/ns#a1982> <http://example.org/ns#a1982> <http://example.org/ns#a1982> . +<http://example.org/ns#a1983> <http://example.org/ns#a1983> <http://example.org/ns#a1983> . +<http://example.org/ns#a1984> <http://example.org/ns#a1984> <http://example.org/ns#a1984> . +<http://example.org/ns#a1985> <http://example.org/ns#a1985> <http://example.org/ns#a1985> . +<http://example.org/ns#a1986> <http://example.org/ns#a1986> <http://example.org/ns#a1986> . +<http://example.org/ns#a1987> <http://example.org/ns#a1987> <http://example.org/ns#a1987> . +<http://example.org/ns#a1988> <http://example.org/ns#a1988> <http://example.org/ns#a1988> . +<http://example.org/ns#a1989> <http://example.org/ns#a1989> <http://example.org/ns#a1989> . +<http://example.org/ns#a1990> <http://example.org/ns#a1990> <http://example.org/ns#a1990> . +<http://example.org/ns#a1991> <http://example.org/ns#a1991> <http://example.org/ns#a1991> . +<http://example.org/ns#a1992> <http://example.org/ns#a1992> <http://example.org/ns#a1992> . +<http://example.org/ns#a1993> <http://example.org/ns#a1993> <http://example.org/ns#a1993> . +<http://example.org/ns#a1994> <http://example.org/ns#a1994> <http://example.org/ns#a1994> . +<http://example.org/ns#a1995> <http://example.org/ns#a1995> <http://example.org/ns#a1995> . +<http://example.org/ns#a1996> <http://example.org/ns#a1996> <http://example.org/ns#a1996> . +<http://example.org/ns#a1997> <http://example.org/ns#a1997> <http://example.org/ns#a1997> . +<http://example.org/ns#a1998> <http://example.org/ns#a1998> <http://example.org/ns#a1998> . +<http://example.org/ns#a1999> <http://example.org/ns#a1999> <http://example.org/ns#a1999> . +<http://example.org/ns#a2000> <http://example.org/ns#a2000> <http://example.org/ns#a2000> . +<http://example.org/ns#a2001> <http://example.org/ns#a2001> <http://example.org/ns#a2001> . +<http://example.org/ns#a2002> <http://example.org/ns#a2002> <http://example.org/ns#a2002> . +<http://example.org/ns#a2003> <http://example.org/ns#a2003> <http://example.org/ns#a2003> . +<http://example.org/ns#a2004> <http://example.org/ns#a2004> <http://example.org/ns#a2004> . +<http://example.org/ns#a2005> <http://example.org/ns#a2005> <http://example.org/ns#a2005> . +<http://example.org/ns#a2006> <http://example.org/ns#a2006> <http://example.org/ns#a2006> . +<http://example.org/ns#a2007> <http://example.org/ns#a2007> <http://example.org/ns#a2007> . +<http://example.org/ns#a2008> <http://example.org/ns#a2008> <http://example.org/ns#a2008> . +<http://example.org/ns#a2009> <http://example.org/ns#a2009> <http://example.org/ns#a2009> . +<http://example.org/ns#a2010> <http://example.org/ns#a2010> <http://example.org/ns#a2010> . +<http://example.org/ns#a2011> <http://example.org/ns#a2011> <http://example.org/ns#a2011> . +<http://example.org/ns#a2012> <http://example.org/ns#a2012> <http://example.org/ns#a2012> . +<http://example.org/ns#a2013> <http://example.org/ns#a2013> <http://example.org/ns#a2013> . +<http://example.org/ns#a2014> <http://example.org/ns#a2014> <http://example.org/ns#a2014> . +<http://example.org/ns#a2015> <http://example.org/ns#a2015> <http://example.org/ns#a2015> . +<http://example.org/ns#a2016> <http://example.org/ns#a2016> <http://example.org/ns#a2016> . +<http://example.org/ns#a2017> <http://example.org/ns#a2017> <http://example.org/ns#a2017> . +<http://example.org/ns#a2018> <http://example.org/ns#a2018> <http://example.org/ns#a2018> . +<http://example.org/ns#a2019> <http://example.org/ns#a2019> <http://example.org/ns#a2019> . +<http://example.org/ns#a2020> <http://example.org/ns#a2020> <http://example.org/ns#a2020> . +<http://example.org/ns#a2021> <http://example.org/ns#a2021> <http://example.org/ns#a2021> . +<http://example.org/ns#a2022> <http://example.org/ns#a2022> <http://example.org/ns#a2022> . +<http://example.org/ns#a2023> <http://example.org/ns#a2023> <http://example.org/ns#a2023> . +<http://example.org/ns#a2024> <http://example.org/ns#a2024> <http://example.org/ns#a2024> . +<http://example.org/ns#a2025> <http://example.org/ns#a2025> <http://example.org/ns#a2025> . +<http://example.org/ns#a2026> <http://example.org/ns#a2026> <http://example.org/ns#a2026> . +<http://example.org/ns#a2027> <http://example.org/ns#a2027> <http://example.org/ns#a2027> . +<http://example.org/ns#a2028> <http://example.org/ns#a2028> <http://example.org/ns#a2028> . +<http://example.org/ns#a2029> <http://example.org/ns#a2029> <http://example.org/ns#a2029> . +<http://example.org/ns#a2030> <http://example.org/ns#a2030> <http://example.org/ns#a2030> . +<http://example.org/ns#a2031> <http://example.org/ns#a2031> <http://example.org/ns#a2031> . +<http://example.org/ns#a2032> <http://example.org/ns#a2032> <http://example.org/ns#a2032> . +<http://example.org/ns#a2033> <http://example.org/ns#a2033> <http://example.org/ns#a2033> . +<http://example.org/ns#a2034> <http://example.org/ns#a2034> <http://example.org/ns#a2034> . +<http://example.org/ns#a2035> <http://example.org/ns#a2035> <http://example.org/ns#a2035> . +<http://example.org/ns#a2036> <http://example.org/ns#a2036> <http://example.org/ns#a2036> . +<http://example.org/ns#a2037> <http://example.org/ns#a2037> <http://example.org/ns#a2037> . +<http://example.org/ns#a2038> <http://example.org/ns#a2038> <http://example.org/ns#a2038> . +<http://example.org/ns#a2039> <http://example.org/ns#a2039> <http://example.org/ns#a2039> . +<http://example.org/ns#a2040> <http://example.org/ns#a2040> <http://example.org/ns#a2040> . +<http://example.org/ns#a2041> <http://example.org/ns#a2041> <http://example.org/ns#a2041> . +<http://example.org/ns#a2042> <http://example.org/ns#a2042> <http://example.org/ns#a2042> . +<http://example.org/ns#a2043> <http://example.org/ns#a2043> <http://example.org/ns#a2043> . +<http://example.org/ns#a2044> <http://example.org/ns#a2044> <http://example.org/ns#a2044> . +<http://example.org/ns#a2045> <http://example.org/ns#a2045> <http://example.org/ns#a2045> . +<http://example.org/ns#a2046> <http://example.org/ns#a2046> <http://example.org/ns#a2046> . +<http://example.org/ns#a2047> <http://example.org/ns#a2047> <http://example.org/ns#a2047> . +<http://example.org/ns#a2048> <http://example.org/ns#a2048> <http://example.org/ns#a2048> . +<http://example.org/ns#a2049> <http://example.org/ns#a2049> <http://example.org/ns#a2049> . +<http://example.org/ns#a2050> <http://example.org/ns#a2050> <http://example.org/ns#a2050> . +<http://example.org/ns#a2051> <http://example.org/ns#a2051> <http://example.org/ns#a2051> . +<http://example.org/ns#a2052> <http://example.org/ns#a2052> <http://example.org/ns#a2052> . +<http://example.org/ns#a2053> <http://example.org/ns#a2053> <http://example.org/ns#a2053> . +<http://example.org/ns#a2054> <http://example.org/ns#a2054> <http://example.org/ns#a2054> . +<http://example.org/ns#a2055> <http://example.org/ns#a2055> <http://example.org/ns#a2055> . +<http://example.org/ns#a2056> <http://example.org/ns#a2056> <http://example.org/ns#a2056> . +<http://example.org/ns#a2057> <http://example.org/ns#a2057> <http://example.org/ns#a2057> . +<http://example.org/ns#a2058> <http://example.org/ns#a2058> <http://example.org/ns#a2058> . +<http://example.org/ns#a2059> <http://example.org/ns#a2059> <http://example.org/ns#a2059> . +<http://example.org/ns#a2060> <http://example.org/ns#a2060> <http://example.org/ns#a2060> . +<http://example.org/ns#a2061> <http://example.org/ns#a2061> <http://example.org/ns#a2061> . +<http://example.org/ns#a2062> <http://example.org/ns#a2062> <http://example.org/ns#a2062> . +<http://example.org/ns#a2063> <http://example.org/ns#a2063> <http://example.org/ns#a2063> . +<http://example.org/ns#a2064> <http://example.org/ns#a2064> <http://example.org/ns#a2064> . +<http://example.org/ns#a2065> <http://example.org/ns#a2065> <http://example.org/ns#a2065> . +<http://example.org/ns#a2066> <http://example.org/ns#a2066> <http://example.org/ns#a2066> . +<http://example.org/ns#a2067> <http://example.org/ns#a2067> <http://example.org/ns#a2067> . +<http://example.org/ns#a2068> <http://example.org/ns#a2068> <http://example.org/ns#a2068> . +<http://example.org/ns#a2069> <http://example.org/ns#a2069> <http://example.org/ns#a2069> . +<http://example.org/ns#a2070> <http://example.org/ns#a2070> <http://example.org/ns#a2070> . +<http://example.org/ns#a2071> <http://example.org/ns#a2071> <http://example.org/ns#a2071> . +<http://example.org/ns#a2072> <http://example.org/ns#a2072> <http://example.org/ns#a2072> . +<http://example.org/ns#a2073> <http://example.org/ns#a2073> <http://example.org/ns#a2073> . +<http://example.org/ns#a2074> <http://example.org/ns#a2074> <http://example.org/ns#a2074> . +<http://example.org/ns#a2075> <http://example.org/ns#a2075> <http://example.org/ns#a2075> . +<http://example.org/ns#a2076> <http://example.org/ns#a2076> <http://example.org/ns#a2076> . +<http://example.org/ns#a2077> <http://example.org/ns#a2077> <http://example.org/ns#a2077> . +<http://example.org/ns#a2078> <http://example.org/ns#a2078> <http://example.org/ns#a2078> . +<http://example.org/ns#a2079> <http://example.org/ns#a2079> <http://example.org/ns#a2079> . +<http://example.org/ns#a2080> <http://example.org/ns#a2080> <http://example.org/ns#a2080> . +<http://example.org/ns#a2081> <http://example.org/ns#a2081> <http://example.org/ns#a2081> . +<http://example.org/ns#a2082> <http://example.org/ns#a2082> <http://example.org/ns#a2082> . +<http://example.org/ns#a2083> <http://example.org/ns#a2083> <http://example.org/ns#a2083> . +<http://example.org/ns#a2084> <http://example.org/ns#a2084> <http://example.org/ns#a2084> . +<http://example.org/ns#a2085> <http://example.org/ns#a2085> <http://example.org/ns#a2085> . +<http://example.org/ns#a2086> <http://example.org/ns#a2086> <http://example.org/ns#a2086> . +<http://example.org/ns#a2087> <http://example.org/ns#a2087> <http://example.org/ns#a2087> . +<http://example.org/ns#a2088> <http://example.org/ns#a2088> <http://example.org/ns#a2088> . +<http://example.org/ns#a2089> <http://example.org/ns#a2089> <http://example.org/ns#a2089> . +<http://example.org/ns#a2090> <http://example.org/ns#a2090> <http://example.org/ns#a2090> . +<http://example.org/ns#a2091> <http://example.org/ns#a2091> <http://example.org/ns#a2091> . +<http://example.org/ns#a2092> <http://example.org/ns#a2092> <http://example.org/ns#a2092> . +<http://example.org/ns#a2093> <http://example.org/ns#a2093> <http://example.org/ns#a2093> . +<http://example.org/ns#a2094> <http://example.org/ns#a2094> <http://example.org/ns#a2094> . +<http://example.org/ns#a2095> <http://example.org/ns#a2095> <http://example.org/ns#a2095> . +<http://example.org/ns#a2096> <http://example.org/ns#a2096> <http://example.org/ns#a2096> . +<http://example.org/ns#a2097> <http://example.org/ns#a2097> <http://example.org/ns#a2097> . +<http://example.org/ns#a2098> <http://example.org/ns#a2098> <http://example.org/ns#a2098> . +<http://example.org/ns#a2099> <http://example.org/ns#a2099> <http://example.org/ns#a2099> . +<http://example.org/ns#a2100> <http://example.org/ns#a2100> <http://example.org/ns#a2100> . +<http://example.org/ns#a2101> <http://example.org/ns#a2101> <http://example.org/ns#a2101> . +<http://example.org/ns#a2102> <http://example.org/ns#a2102> <http://example.org/ns#a2102> . +<http://example.org/ns#a2103> <http://example.org/ns#a2103> <http://example.org/ns#a2103> . +<http://example.org/ns#a2104> <http://example.org/ns#a2104> <http://example.org/ns#a2104> . +<http://example.org/ns#a2105> <http://example.org/ns#a2105> <http://example.org/ns#a2105> . +<http://example.org/ns#a2106> <http://example.org/ns#a2106> <http://example.org/ns#a2106> . +<http://example.org/ns#a2107> <http://example.org/ns#a2107> <http://example.org/ns#a2107> . +<http://example.org/ns#a2108> <http://example.org/ns#a2108> <http://example.org/ns#a2108> . +<http://example.org/ns#a2109> <http://example.org/ns#a2109> <http://example.org/ns#a2109> . +<http://example.org/ns#a2110> <http://example.org/ns#a2110> <http://example.org/ns#a2110> . +<http://example.org/ns#a2111> <http://example.org/ns#a2111> <http://example.org/ns#a2111> . +<http://example.org/ns#a2112> <http://example.org/ns#a2112> <http://example.org/ns#a2112> . +<http://example.org/ns#a2113> <http://example.org/ns#a2113> <http://example.org/ns#a2113> . +<http://example.org/ns#a2114> <http://example.org/ns#a2114> <http://example.org/ns#a2114> . +<http://example.org/ns#a2115> <http://example.org/ns#a2115> <http://example.org/ns#a2115> . +<http://example.org/ns#a2116> <http://example.org/ns#a2116> <http://example.org/ns#a2116> . +<http://example.org/ns#a2117> <http://example.org/ns#a2117> <http://example.org/ns#a2117> . +<http://example.org/ns#a2118> <http://example.org/ns#a2118> <http://example.org/ns#a2118> . +<http://example.org/ns#a2119> <http://example.org/ns#a2119> <http://example.org/ns#a2119> . +<http://example.org/ns#a2120> <http://example.org/ns#a2120> <http://example.org/ns#a2120> . +<http://example.org/ns#a2121> <http://example.org/ns#a2121> <http://example.org/ns#a2121> . +<http://example.org/ns#a2122> <http://example.org/ns#a2122> <http://example.org/ns#a2122> . +<http://example.org/ns#a2123> <http://example.org/ns#a2123> <http://example.org/ns#a2123> . +<http://example.org/ns#a2124> <http://example.org/ns#a2124> <http://example.org/ns#a2124> . +<http://example.org/ns#a2125> <http://example.org/ns#a2125> <http://example.org/ns#a2125> . +<http://example.org/ns#a2126> <http://example.org/ns#a2126> <http://example.org/ns#a2126> . +<http://example.org/ns#a2127> <http://example.org/ns#a2127> <http://example.org/ns#a2127> . +<http://example.org/ns#a2128> <http://example.org/ns#a2128> <http://example.org/ns#a2128> . +<http://example.org/ns#a2129> <http://example.org/ns#a2129> <http://example.org/ns#a2129> . +<http://example.org/ns#a2130> <http://example.org/ns#a2130> <http://example.org/ns#a2130> . +<http://example.org/ns#a2131> <http://example.org/ns#a2131> <http://example.org/ns#a2131> . +<http://example.org/ns#a2132> <http://example.org/ns#a2132> <http://example.org/ns#a2132> . +<http://example.org/ns#a2133> <http://example.org/ns#a2133> <http://example.org/ns#a2133> . +<http://example.org/ns#a2134> <http://example.org/ns#a2134> <http://example.org/ns#a2134> . +<http://example.org/ns#a2135> <http://example.org/ns#a2135> <http://example.org/ns#a2135> . +<http://example.org/ns#a2136> <http://example.org/ns#a2136> <http://example.org/ns#a2136> . +<http://example.org/ns#a2137> <http://example.org/ns#a2137> <http://example.org/ns#a2137> . +<http://example.org/ns#a2138> <http://example.org/ns#a2138> <http://example.org/ns#a2138> . +<http://example.org/ns#a2139> <http://example.org/ns#a2139> <http://example.org/ns#a2139> . +<http://example.org/ns#a2140> <http://example.org/ns#a2140> <http://example.org/ns#a2140> . +<http://example.org/ns#a2141> <http://example.org/ns#a2141> <http://example.org/ns#a2141> . +<http://example.org/ns#a2142> <http://example.org/ns#a2142> <http://example.org/ns#a2142> . +<http://example.org/ns#a2143> <http://example.org/ns#a2143> <http://example.org/ns#a2143> . +<http://example.org/ns#a2144> <http://example.org/ns#a2144> <http://example.org/ns#a2144> . +<http://example.org/ns#a2145> <http://example.org/ns#a2145> <http://example.org/ns#a2145> . +<http://example.org/ns#a2146> <http://example.org/ns#a2146> <http://example.org/ns#a2146> . +<http://example.org/ns#a2147> <http://example.org/ns#a2147> <http://example.org/ns#a2147> . +<http://example.org/ns#a2148> <http://example.org/ns#a2148> <http://example.org/ns#a2148> . +<http://example.org/ns#a2149> <http://example.org/ns#a2149> <http://example.org/ns#a2149> . +<http://example.org/ns#a2150> <http://example.org/ns#a2150> <http://example.org/ns#a2150> . +<http://example.org/ns#a2151> <http://example.org/ns#a2151> <http://example.org/ns#a2151> . +<http://example.org/ns#a2152> <http://example.org/ns#a2152> <http://example.org/ns#a2152> . +<http://example.org/ns#a2153> <http://example.org/ns#a2153> <http://example.org/ns#a2153> . +<http://example.org/ns#a2154> <http://example.org/ns#a2154> <http://example.org/ns#a2154> . +<http://example.org/ns#a2155> <http://example.org/ns#a2155> <http://example.org/ns#a2155> . +<http://example.org/ns#a2156> <http://example.org/ns#a2156> <http://example.org/ns#a2156> . +<http://example.org/ns#a2157> <http://example.org/ns#a2157> <http://example.org/ns#a2157> . +<http://example.org/ns#a2158> <http://example.org/ns#a2158> <http://example.org/ns#a2158> . +<http://example.org/ns#a2159> <http://example.org/ns#a2159> <http://example.org/ns#a2159> . +<http://example.org/ns#a2160> <http://example.org/ns#a2160> <http://example.org/ns#a2160> . +<http://example.org/ns#a2161> <http://example.org/ns#a2161> <http://example.org/ns#a2161> . +<http://example.org/ns#a2162> <http://example.org/ns#a2162> <http://example.org/ns#a2162> . +<http://example.org/ns#a2163> <http://example.org/ns#a2163> <http://example.org/ns#a2163> . +<http://example.org/ns#a2164> <http://example.org/ns#a2164> <http://example.org/ns#a2164> . +<http://example.org/ns#a2165> <http://example.org/ns#a2165> <http://example.org/ns#a2165> . +<http://example.org/ns#a2166> <http://example.org/ns#a2166> <http://example.org/ns#a2166> . +<http://example.org/ns#a2167> <http://example.org/ns#a2167> <http://example.org/ns#a2167> . +<http://example.org/ns#a2168> <http://example.org/ns#a2168> <http://example.org/ns#a2168> . +<http://example.org/ns#a2169> <http://example.org/ns#a2169> <http://example.org/ns#a2169> . +<http://example.org/ns#a2170> <http://example.org/ns#a2170> <http://example.org/ns#a2170> . +<http://example.org/ns#a2171> <http://example.org/ns#a2171> <http://example.org/ns#a2171> . +<http://example.org/ns#a2172> <http://example.org/ns#a2172> <http://example.org/ns#a2172> . +<http://example.org/ns#a2173> <http://example.org/ns#a2173> <http://example.org/ns#a2173> . +<http://example.org/ns#a2174> <http://example.org/ns#a2174> <http://example.org/ns#a2174> . +<http://example.org/ns#a2175> <http://example.org/ns#a2175> <http://example.org/ns#a2175> . +<http://example.org/ns#a2176> <http://example.org/ns#a2176> <http://example.org/ns#a2176> . +<http://example.org/ns#a2177> <http://example.org/ns#a2177> <http://example.org/ns#a2177> . +<http://example.org/ns#a2178> <http://example.org/ns#a2178> <http://example.org/ns#a2178> . +<http://example.org/ns#a2179> <http://example.org/ns#a2179> <http://example.org/ns#a2179> . +<http://example.org/ns#a2180> <http://example.org/ns#a2180> <http://example.org/ns#a2180> . +<http://example.org/ns#a2181> <http://example.org/ns#a2181> <http://example.org/ns#a2181> . +<http://example.org/ns#a2182> <http://example.org/ns#a2182> <http://example.org/ns#a2182> . +<http://example.org/ns#a2183> <http://example.org/ns#a2183> <http://example.org/ns#a2183> . +<http://example.org/ns#a2184> <http://example.org/ns#a2184> <http://example.org/ns#a2184> . +<http://example.org/ns#a2185> <http://example.org/ns#a2185> <http://example.org/ns#a2185> . +<http://example.org/ns#a2186> <http://example.org/ns#a2186> <http://example.org/ns#a2186> . +<http://example.org/ns#a2187> <http://example.org/ns#a2187> <http://example.org/ns#a2187> . +<http://example.org/ns#a2188> <http://example.org/ns#a2188> <http://example.org/ns#a2188> . +<http://example.org/ns#a2189> <http://example.org/ns#a2189> <http://example.org/ns#a2189> . +<http://example.org/ns#a2190> <http://example.org/ns#a2190> <http://example.org/ns#a2190> . +<http://example.org/ns#a2191> <http://example.org/ns#a2191> <http://example.org/ns#a2191> . +<http://example.org/ns#a2192> <http://example.org/ns#a2192> <http://example.org/ns#a2192> . +<http://example.org/ns#a2193> <http://example.org/ns#a2193> <http://example.org/ns#a2193> . +<http://example.org/ns#a2194> <http://example.org/ns#a2194> <http://example.org/ns#a2194> . +<http://example.org/ns#a2195> <http://example.org/ns#a2195> <http://example.org/ns#a2195> . +<http://example.org/ns#a2196> <http://example.org/ns#a2196> <http://example.org/ns#a2196> . +<http://example.org/ns#a2197> <http://example.org/ns#a2197> <http://example.org/ns#a2197> . +<http://example.org/ns#a2198> <http://example.org/ns#a2198> <http://example.org/ns#a2198> . +<http://example.org/ns#a2199> <http://example.org/ns#a2199> <http://example.org/ns#a2199> . +<http://example.org/ns#a2200> <http://example.org/ns#a2200> <http://example.org/ns#a2200> . +<http://example.org/ns#a2201> <http://example.org/ns#a2201> <http://example.org/ns#a2201> . +<http://example.org/ns#a2202> <http://example.org/ns#a2202> <http://example.org/ns#a2202> . +<http://example.org/ns#a2203> <http://example.org/ns#a2203> <http://example.org/ns#a2203> . +<http://example.org/ns#a2204> <http://example.org/ns#a2204> <http://example.org/ns#a2204> . +<http://example.org/ns#a2205> <http://example.org/ns#a2205> <http://example.org/ns#a2205> . +<http://example.org/ns#a2206> <http://example.org/ns#a2206> <http://example.org/ns#a2206> . +<http://example.org/ns#a2207> <http://example.org/ns#a2207> <http://example.org/ns#a2207> . +<http://example.org/ns#a2208> <http://example.org/ns#a2208> <http://example.org/ns#a2208> . +<http://example.org/ns#a2209> <http://example.org/ns#a2209> <http://example.org/ns#a2209> . +<http://example.org/ns#a2210> <http://example.org/ns#a2210> <http://example.org/ns#a2210> . +<http://example.org/ns#a2211> <http://example.org/ns#a2211> <http://example.org/ns#a2211> . +<http://example.org/ns#a2212> <http://example.org/ns#a2212> <http://example.org/ns#a2212> . +<http://example.org/ns#a2213> <http://example.org/ns#a2213> <http://example.org/ns#a2213> . +<http://example.org/ns#a2214> <http://example.org/ns#a2214> <http://example.org/ns#a2214> . +<http://example.org/ns#a2215> <http://example.org/ns#a2215> <http://example.org/ns#a2215> . +<http://example.org/ns#a2216> <http://example.org/ns#a2216> <http://example.org/ns#a2216> . +<http://example.org/ns#a2217> <http://example.org/ns#a2217> <http://example.org/ns#a2217> . +<http://example.org/ns#a2218> <http://example.org/ns#a2218> <http://example.org/ns#a2218> . +<http://example.org/ns#a2219> <http://example.org/ns#a2219> <http://example.org/ns#a2219> . +<http://example.org/ns#a2220> <http://example.org/ns#a2220> <http://example.org/ns#a2220> . +<http://example.org/ns#a2221> <http://example.org/ns#a2221> <http://example.org/ns#a2221> . +<http://example.org/ns#a2222> <http://example.org/ns#a2222> <http://example.org/ns#a2222> . +<http://example.org/ns#a2223> <http://example.org/ns#a2223> <http://example.org/ns#a2223> . +<http://example.org/ns#a2224> <http://example.org/ns#a2224> <http://example.org/ns#a2224> . +<http://example.org/ns#a2225> <http://example.org/ns#a2225> <http://example.org/ns#a2225> . +<http://example.org/ns#a2226> <http://example.org/ns#a2226> <http://example.org/ns#a2226> . +<http://example.org/ns#a2227> <http://example.org/ns#a2227> <http://example.org/ns#a2227> . +<http://example.org/ns#a2228> <http://example.org/ns#a2228> <http://example.org/ns#a2228> . +<http://example.org/ns#a2229> <http://example.org/ns#a2229> <http://example.org/ns#a2229> . +<http://example.org/ns#a2230> <http://example.org/ns#a2230> <http://example.org/ns#a2230> . +<http://example.org/ns#a2231> <http://example.org/ns#a2231> <http://example.org/ns#a2231> . +<http://example.org/ns#a2232> <http://example.org/ns#a2232> <http://example.org/ns#a2232> . +<http://example.org/ns#a2233> <http://example.org/ns#a2233> <http://example.org/ns#a2233> . +<http://example.org/ns#a2234> <http://example.org/ns#a2234> <http://example.org/ns#a2234> . +<http://example.org/ns#a2235> <http://example.org/ns#a2235> <http://example.org/ns#a2235> . +<http://example.org/ns#a2236> <http://example.org/ns#a2236> <http://example.org/ns#a2236> . +<http://example.org/ns#a2237> <http://example.org/ns#a2237> <http://example.org/ns#a2237> . +<http://example.org/ns#a2238> <http://example.org/ns#a2238> <http://example.org/ns#a2238> . +<http://example.org/ns#a2239> <http://example.org/ns#a2239> <http://example.org/ns#a2239> . +<http://example.org/ns#a2240> <http://example.org/ns#a2240> <http://example.org/ns#a2240> . +<http://example.org/ns#a2241> <http://example.org/ns#a2241> <http://example.org/ns#a2241> . +<http://example.org/ns#a2242> <http://example.org/ns#a2242> <http://example.org/ns#a2242> . +<http://example.org/ns#a2243> <http://example.org/ns#a2243> <http://example.org/ns#a2243> . +<http://example.org/ns#a2244> <http://example.org/ns#a2244> <http://example.org/ns#a2244> . +<http://example.org/ns#a2245> <http://example.org/ns#a2245> <http://example.org/ns#a2245> . +<http://example.org/ns#a2246> <http://example.org/ns#a2246> <http://example.org/ns#a2246> . +<http://example.org/ns#a2247> <http://example.org/ns#a2247> <http://example.org/ns#a2247> . +<http://example.org/ns#a2248> <http://example.org/ns#a2248> <http://example.org/ns#a2248> . +<http://example.org/ns#a2249> <http://example.org/ns#a2249> <http://example.org/ns#a2249> . +<http://example.org/ns#a2250> <http://example.org/ns#a2250> <http://example.org/ns#a2250> . +<http://example.org/ns#a2251> <http://example.org/ns#a2251> <http://example.org/ns#a2251> . +<http://example.org/ns#a2252> <http://example.org/ns#a2252> <http://example.org/ns#a2252> . +<http://example.org/ns#a2253> <http://example.org/ns#a2253> <http://example.org/ns#a2253> . +<http://example.org/ns#a2254> <http://example.org/ns#a2254> <http://example.org/ns#a2254> . +<http://example.org/ns#a2255> <http://example.org/ns#a2255> <http://example.org/ns#a2255> . +<http://example.org/ns#a2256> <http://example.org/ns#a2256> <http://example.org/ns#a2256> . +<http://example.org/ns#a2257> <http://example.org/ns#a2257> <http://example.org/ns#a2257> . +<http://example.org/ns#a2258> <http://example.org/ns#a2258> <http://example.org/ns#a2258> . +<http://example.org/ns#a2259> <http://example.org/ns#a2259> <http://example.org/ns#a2259> . +<http://example.org/ns#a2260> <http://example.org/ns#a2260> <http://example.org/ns#a2260> . +<http://example.org/ns#a2261> <http://example.org/ns#a2261> <http://example.org/ns#a2261> . +<http://example.org/ns#a2262> <http://example.org/ns#a2262> <http://example.org/ns#a2262> . +<http://example.org/ns#a2263> <http://example.org/ns#a2263> <http://example.org/ns#a2263> . +<http://example.org/ns#a2264> <http://example.org/ns#a2264> <http://example.org/ns#a2264> . +<http://example.org/ns#a2265> <http://example.org/ns#a2265> <http://example.org/ns#a2265> . +<http://example.org/ns#a2266> <http://example.org/ns#a2266> <http://example.org/ns#a2266> . +<http://example.org/ns#a2267> <http://example.org/ns#a2267> <http://example.org/ns#a2267> . +<http://example.org/ns#a2268> <http://example.org/ns#a2268> <http://example.org/ns#a2268> . +<http://example.org/ns#a2269> <http://example.org/ns#a2269> <http://example.org/ns#a2269> . +<http://example.org/ns#a2270> <http://example.org/ns#a2270> <http://example.org/ns#a2270> . +<http://example.org/ns#a2271> <http://example.org/ns#a2271> <http://example.org/ns#a2271> . +<http://example.org/ns#a2272> <http://example.org/ns#a2272> <http://example.org/ns#a2272> . +<http://example.org/ns#a2273> <http://example.org/ns#a2273> <http://example.org/ns#a2273> . +<http://example.org/ns#a2274> <http://example.org/ns#a2274> <http://example.org/ns#a2274> . +<http://example.org/ns#a2275> <http://example.org/ns#a2275> <http://example.org/ns#a2275> . +<http://example.org/ns#a2276> <http://example.org/ns#a2276> <http://example.org/ns#a2276> . +<http://example.org/ns#a2277> <http://example.org/ns#a2277> <http://example.org/ns#a2277> . +<http://example.org/ns#a2278> <http://example.org/ns#a2278> <http://example.org/ns#a2278> . +<http://example.org/ns#a2279> <http://example.org/ns#a2279> <http://example.org/ns#a2279> . +<http://example.org/ns#a2280> <http://example.org/ns#a2280> <http://example.org/ns#a2280> . +<http://example.org/ns#a2281> <http://example.org/ns#a2281> <http://example.org/ns#a2281> . +<http://example.org/ns#a2282> <http://example.org/ns#a2282> <http://example.org/ns#a2282> . +<http://example.org/ns#a2283> <http://example.org/ns#a2283> <http://example.org/ns#a2283> . +<http://example.org/ns#a2284> <http://example.org/ns#a2284> <http://example.org/ns#a2284> . +<http://example.org/ns#a2285> <http://example.org/ns#a2285> <http://example.org/ns#a2285> . +<http://example.org/ns#a2286> <http://example.org/ns#a2286> <http://example.org/ns#a2286> . +<http://example.org/ns#a2287> <http://example.org/ns#a2287> <http://example.org/ns#a2287> . +<http://example.org/ns#a2288> <http://example.org/ns#a2288> <http://example.org/ns#a2288> . +<http://example.org/ns#a2289> <http://example.org/ns#a2289> <http://example.org/ns#a2289> . +<http://example.org/ns#a2290> <http://example.org/ns#a2290> <http://example.org/ns#a2290> . +<http://example.org/ns#a2291> <http://example.org/ns#a2291> <http://example.org/ns#a2291> . +<http://example.org/ns#a2292> <http://example.org/ns#a2292> <http://example.org/ns#a2292> . +<http://example.org/ns#a2293> <http://example.org/ns#a2293> <http://example.org/ns#a2293> . +<http://example.org/ns#a2294> <http://example.org/ns#a2294> <http://example.org/ns#a2294> . +<http://example.org/ns#a2295> <http://example.org/ns#a2295> <http://example.org/ns#a2295> . +<http://example.org/ns#a2296> <http://example.org/ns#a2296> <http://example.org/ns#a2296> . +<http://example.org/ns#a2297> <http://example.org/ns#a2297> <http://example.org/ns#a2297> . +<http://example.org/ns#a2298> <http://example.org/ns#a2298> <http://example.org/ns#a2298> . +<http://example.org/ns#a2299> <http://example.org/ns#a2299> <http://example.org/ns#a2299> . +<http://example.org/ns#a2300> <http://example.org/ns#a2300> <http://example.org/ns#a2300> . +<http://example.org/ns#a2301> <http://example.org/ns#a2301> <http://example.org/ns#a2301> . +<http://example.org/ns#a2302> <http://example.org/ns#a2302> <http://example.org/ns#a2302> . +<http://example.org/ns#a2303> <http://example.org/ns#a2303> <http://example.org/ns#a2303> . +<http://example.org/ns#a2304> <http://example.org/ns#a2304> <http://example.org/ns#a2304> . +<http://example.org/ns#a2305> <http://example.org/ns#a2305> <http://example.org/ns#a2305> . +<http://example.org/ns#a2306> <http://example.org/ns#a2306> <http://example.org/ns#a2306> . +<http://example.org/ns#a2307> <http://example.org/ns#a2307> <http://example.org/ns#a2307> . +<http://example.org/ns#a2308> <http://example.org/ns#a2308> <http://example.org/ns#a2308> . +<http://example.org/ns#a2309> <http://example.org/ns#a2309> <http://example.org/ns#a2309> . +<http://example.org/ns#a2310> <http://example.org/ns#a2310> <http://example.org/ns#a2310> . +<http://example.org/ns#a2311> <http://example.org/ns#a2311> <http://example.org/ns#a2311> . +<http://example.org/ns#a2312> <http://example.org/ns#a2312> <http://example.org/ns#a2312> . +<http://example.org/ns#a2313> <http://example.org/ns#a2313> <http://example.org/ns#a2313> . +<http://example.org/ns#a2314> <http://example.org/ns#a2314> <http://example.org/ns#a2314> . +<http://example.org/ns#a2315> <http://example.org/ns#a2315> <http://example.org/ns#a2315> . +<http://example.org/ns#a2316> <http://example.org/ns#a2316> <http://example.org/ns#a2316> . +<http://example.org/ns#a2317> <http://example.org/ns#a2317> <http://example.org/ns#a2317> . +<http://example.org/ns#a2318> <http://example.org/ns#a2318> <http://example.org/ns#a2318> . +<http://example.org/ns#a2319> <http://example.org/ns#a2319> <http://example.org/ns#a2319> . +<http://example.org/ns#a2320> <http://example.org/ns#a2320> <http://example.org/ns#a2320> . +<http://example.org/ns#a2321> <http://example.org/ns#a2321> <http://example.org/ns#a2321> . +<http://example.org/ns#a2322> <http://example.org/ns#a2322> <http://example.org/ns#a2322> . +<http://example.org/ns#a2323> <http://example.org/ns#a2323> <http://example.org/ns#a2323> . +<http://example.org/ns#a2324> <http://example.org/ns#a2324> <http://example.org/ns#a2324> . +<http://example.org/ns#a2325> <http://example.org/ns#a2325> <http://example.org/ns#a2325> . +<http://example.org/ns#a2326> <http://example.org/ns#a2326> <http://example.org/ns#a2326> . +<http://example.org/ns#a2327> <http://example.org/ns#a2327> <http://example.org/ns#a2327> . +<http://example.org/ns#a2328> <http://example.org/ns#a2328> <http://example.org/ns#a2328> . +<http://example.org/ns#a2329> <http://example.org/ns#a2329> <http://example.org/ns#a2329> . +<http://example.org/ns#a2330> <http://example.org/ns#a2330> <http://example.org/ns#a2330> . +<http://example.org/ns#a2331> <http://example.org/ns#a2331> <http://example.org/ns#a2331> . +<http://example.org/ns#a2332> <http://example.org/ns#a2332> <http://example.org/ns#a2332> . +<http://example.org/ns#a2333> <http://example.org/ns#a2333> <http://example.org/ns#a2333> . +<http://example.org/ns#a2334> <http://example.org/ns#a2334> <http://example.org/ns#a2334> . +<http://example.org/ns#a2335> <http://example.org/ns#a2335> <http://example.org/ns#a2335> . +<http://example.org/ns#a2336> <http://example.org/ns#a2336> <http://example.org/ns#a2336> . +<http://example.org/ns#a2337> <http://example.org/ns#a2337> <http://example.org/ns#a2337> . +<http://example.org/ns#a2338> <http://example.org/ns#a2338> <http://example.org/ns#a2338> . +<http://example.org/ns#a2339> <http://example.org/ns#a2339> <http://example.org/ns#a2339> . +<http://example.org/ns#a2340> <http://example.org/ns#a2340> <http://example.org/ns#a2340> . +<http://example.org/ns#a2341> <http://example.org/ns#a2341> <http://example.org/ns#a2341> . +<http://example.org/ns#a2342> <http://example.org/ns#a2342> <http://example.org/ns#a2342> . +<http://example.org/ns#a2343> <http://example.org/ns#a2343> <http://example.org/ns#a2343> . +<http://example.org/ns#a2344> <http://example.org/ns#a2344> <http://example.org/ns#a2344> . +<http://example.org/ns#a2345> <http://example.org/ns#a2345> <http://example.org/ns#a2345> . +<http://example.org/ns#a2346> <http://example.org/ns#a2346> <http://example.org/ns#a2346> . +<http://example.org/ns#a2347> <http://example.org/ns#a2347> <http://example.org/ns#a2347> . +<http://example.org/ns#a2348> <http://example.org/ns#a2348> <http://example.org/ns#a2348> . +<http://example.org/ns#a2349> <http://example.org/ns#a2349> <http://example.org/ns#a2349> . +<http://example.org/ns#a2350> <http://example.org/ns#a2350> <http://example.org/ns#a2350> . +<http://example.org/ns#a2351> <http://example.org/ns#a2351> <http://example.org/ns#a2351> . +<http://example.org/ns#a2352> <http://example.org/ns#a2352> <http://example.org/ns#a2352> . +<http://example.org/ns#a2353> <http://example.org/ns#a2353> <http://example.org/ns#a2353> . +<http://example.org/ns#a2354> <http://example.org/ns#a2354> <http://example.org/ns#a2354> . +<http://example.org/ns#a2355> <http://example.org/ns#a2355> <http://example.org/ns#a2355> . +<http://example.org/ns#a2356> <http://example.org/ns#a2356> <http://example.org/ns#a2356> . +<http://example.org/ns#a2357> <http://example.org/ns#a2357> <http://example.org/ns#a2357> . +<http://example.org/ns#a2358> <http://example.org/ns#a2358> <http://example.org/ns#a2358> . +<http://example.org/ns#a2359> <http://example.org/ns#a2359> <http://example.org/ns#a2359> . +<http://example.org/ns#a2360> <http://example.org/ns#a2360> <http://example.org/ns#a2360> . +<http://example.org/ns#a2361> <http://example.org/ns#a2361> <http://example.org/ns#a2361> . +<http://example.org/ns#a2362> <http://example.org/ns#a2362> <http://example.org/ns#a2362> . +<http://example.org/ns#a2363> <http://example.org/ns#a2363> <http://example.org/ns#a2363> . +<http://example.org/ns#a2364> <http://example.org/ns#a2364> <http://example.org/ns#a2364> . +<http://example.org/ns#a2365> <http://example.org/ns#a2365> <http://example.org/ns#a2365> . +<http://example.org/ns#a2366> <http://example.org/ns#a2366> <http://example.org/ns#a2366> . +<http://example.org/ns#a2367> <http://example.org/ns#a2367> <http://example.org/ns#a2367> . +<http://example.org/ns#a2368> <http://example.org/ns#a2368> <http://example.org/ns#a2368> . +<http://example.org/ns#a2369> <http://example.org/ns#a2369> <http://example.org/ns#a2369> . +<http://example.org/ns#a2370> <http://example.org/ns#a2370> <http://example.org/ns#a2370> . +<http://example.org/ns#a2371> <http://example.org/ns#a2371> <http://example.org/ns#a2371> . +<http://example.org/ns#a2372> <http://example.org/ns#a2372> <http://example.org/ns#a2372> . +<http://example.org/ns#a2373> <http://example.org/ns#a2373> <http://example.org/ns#a2373> . +<http://example.org/ns#a2374> <http://example.org/ns#a2374> <http://example.org/ns#a2374> . +<http://example.org/ns#a2375> <http://example.org/ns#a2375> <http://example.org/ns#a2375> . +<http://example.org/ns#a2376> <http://example.org/ns#a2376> <http://example.org/ns#a2376> . +<http://example.org/ns#a2377> <http://example.org/ns#a2377> <http://example.org/ns#a2377> . +<http://example.org/ns#a2378> <http://example.org/ns#a2378> <http://example.org/ns#a2378> . +<http://example.org/ns#a2379> <http://example.org/ns#a2379> <http://example.org/ns#a2379> . +<http://example.org/ns#a2380> <http://example.org/ns#a2380> <http://example.org/ns#a2380> . +<http://example.org/ns#a2381> <http://example.org/ns#a2381> <http://example.org/ns#a2381> . +<http://example.org/ns#a2382> <http://example.org/ns#a2382> <http://example.org/ns#a2382> . +<http://example.org/ns#a2383> <http://example.org/ns#a2383> <http://example.org/ns#a2383> . +<http://example.org/ns#a2384> <http://example.org/ns#a2384> <http://example.org/ns#a2384> . +<http://example.org/ns#a2385> <http://example.org/ns#a2385> <http://example.org/ns#a2385> . +<http://example.org/ns#a2386> <http://example.org/ns#a2386> <http://example.org/ns#a2386> . +<http://example.org/ns#a2387> <http://example.org/ns#a2387> <http://example.org/ns#a2387> . +<http://example.org/ns#a2388> <http://example.org/ns#a2388> <http://example.org/ns#a2388> . +<http://example.org/ns#a2389> <http://example.org/ns#a2389> <http://example.org/ns#a2389> . +<http://example.org/ns#a2390> <http://example.org/ns#a2390> <http://example.org/ns#a2390> . +<http://example.org/ns#a2391> <http://example.org/ns#a2391> <http://example.org/ns#a2391> . +<http://example.org/ns#a2392> <http://example.org/ns#a2392> <http://example.org/ns#a2392> . +<http://example.org/ns#a2393> <http://example.org/ns#a2393> <http://example.org/ns#a2393> . +<http://example.org/ns#a2394> <http://example.org/ns#a2394> <http://example.org/ns#a2394> . +<http://example.org/ns#a2395> <http://example.org/ns#a2395> <http://example.org/ns#a2395> . +<http://example.org/ns#a2396> <http://example.org/ns#a2396> <http://example.org/ns#a2396> . +<http://example.org/ns#a2397> <http://example.org/ns#a2397> <http://example.org/ns#a2397> . +<http://example.org/ns#a2398> <http://example.org/ns#a2398> <http://example.org/ns#a2398> . +<http://example.org/ns#a2399> <http://example.org/ns#a2399> <http://example.org/ns#a2399> . +<http://example.org/ns#a2400> <http://example.org/ns#a2400> <http://example.org/ns#a2400> . +<http://example.org/ns#a2401> <http://example.org/ns#a2401> <http://example.org/ns#a2401> . +<http://example.org/ns#a2402> <http://example.org/ns#a2402> <http://example.org/ns#a2402> . +<http://example.org/ns#a2403> <http://example.org/ns#a2403> <http://example.org/ns#a2403> . +<http://example.org/ns#a2404> <http://example.org/ns#a2404> <http://example.org/ns#a2404> . +<http://example.org/ns#a2405> <http://example.org/ns#a2405> <http://example.org/ns#a2405> . +<http://example.org/ns#a2406> <http://example.org/ns#a2406> <http://example.org/ns#a2406> . +<http://example.org/ns#a2407> <http://example.org/ns#a2407> <http://example.org/ns#a2407> . +<http://example.org/ns#a2408> <http://example.org/ns#a2408> <http://example.org/ns#a2408> . +<http://example.org/ns#a2409> <http://example.org/ns#a2409> <http://example.org/ns#a2409> . +<http://example.org/ns#a2410> <http://example.org/ns#a2410> <http://example.org/ns#a2410> . +<http://example.org/ns#a2411> <http://example.org/ns#a2411> <http://example.org/ns#a2411> . +<http://example.org/ns#a2412> <http://example.org/ns#a2412> <http://example.org/ns#a2412> . +<http://example.org/ns#a2413> <http://example.org/ns#a2413> <http://example.org/ns#a2413> . +<http://example.org/ns#a2414> <http://example.org/ns#a2414> <http://example.org/ns#a2414> . +<http://example.org/ns#a2415> <http://example.org/ns#a2415> <http://example.org/ns#a2415> . +<http://example.org/ns#a2416> <http://example.org/ns#a2416> <http://example.org/ns#a2416> . +<http://example.org/ns#a2417> <http://example.org/ns#a2417> <http://example.org/ns#a2417> . +<http://example.org/ns#a2418> <http://example.org/ns#a2418> <http://example.org/ns#a2418> . +<http://example.org/ns#a2419> <http://example.org/ns#a2419> <http://example.org/ns#a2419> . +<http://example.org/ns#a2420> <http://example.org/ns#a2420> <http://example.org/ns#a2420> . +<http://example.org/ns#a2421> <http://example.org/ns#a2421> <http://example.org/ns#a2421> . +<http://example.org/ns#a2422> <http://example.org/ns#a2422> <http://example.org/ns#a2422> . +<http://example.org/ns#a2423> <http://example.org/ns#a2423> <http://example.org/ns#a2423> . +<http://example.org/ns#a2424> <http://example.org/ns#a2424> <http://example.org/ns#a2424> . +<http://example.org/ns#a2425> <http://example.org/ns#a2425> <http://example.org/ns#a2425> . +<http://example.org/ns#a2426> <http://example.org/ns#a2426> <http://example.org/ns#a2426> . +<http://example.org/ns#a2427> <http://example.org/ns#a2427> <http://example.org/ns#a2427> . +<http://example.org/ns#a2428> <http://example.org/ns#a2428> <http://example.org/ns#a2428> . +<http://example.org/ns#a2429> <http://example.org/ns#a2429> <http://example.org/ns#a2429> . +<http://example.org/ns#a2430> <http://example.org/ns#a2430> <http://example.org/ns#a2430> . +<http://example.org/ns#a2431> <http://example.org/ns#a2431> <http://example.org/ns#a2431> . +<http://example.org/ns#a2432> <http://example.org/ns#a2432> <http://example.org/ns#a2432> . +<http://example.org/ns#a2433> <http://example.org/ns#a2433> <http://example.org/ns#a2433> . +<http://example.org/ns#a2434> <http://example.org/ns#a2434> <http://example.org/ns#a2434> . +<http://example.org/ns#a2435> <http://example.org/ns#a2435> <http://example.org/ns#a2435> . +<http://example.org/ns#a2436> <http://example.org/ns#a2436> <http://example.org/ns#a2436> . +<http://example.org/ns#a2437> <http://example.org/ns#a2437> <http://example.org/ns#a2437> . +<http://example.org/ns#a2438> <http://example.org/ns#a2438> <http://example.org/ns#a2438> . +<http://example.org/ns#a2439> <http://example.org/ns#a2439> <http://example.org/ns#a2439> . +<http://example.org/ns#a2440> <http://example.org/ns#a2440> <http://example.org/ns#a2440> . +<http://example.org/ns#a2441> <http://example.org/ns#a2441> <http://example.org/ns#a2441> . +<http://example.org/ns#a2442> <http://example.org/ns#a2442> <http://example.org/ns#a2442> . +<http://example.org/ns#a2443> <http://example.org/ns#a2443> <http://example.org/ns#a2443> . +<http://example.org/ns#a2444> <http://example.org/ns#a2444> <http://example.org/ns#a2444> . +<http://example.org/ns#a2445> <http://example.org/ns#a2445> <http://example.org/ns#a2445> . +<http://example.org/ns#a2446> <http://example.org/ns#a2446> <http://example.org/ns#a2446> . +<http://example.org/ns#a2447> <http://example.org/ns#a2447> <http://example.org/ns#a2447> . +<http://example.org/ns#a2448> <http://example.org/ns#a2448> <http://example.org/ns#a2448> . +<http://example.org/ns#a2449> <http://example.org/ns#a2449> <http://example.org/ns#a2449> . +<http://example.org/ns#a2450> <http://example.org/ns#a2450> <http://example.org/ns#a2450> . +<http://example.org/ns#a2451> <http://example.org/ns#a2451> <http://example.org/ns#a2451> . +<http://example.org/ns#a2452> <http://example.org/ns#a2452> <http://example.org/ns#a2452> . +<http://example.org/ns#a2453> <http://example.org/ns#a2453> <http://example.org/ns#a2453> . +<http://example.org/ns#a2454> <http://example.org/ns#a2454> <http://example.org/ns#a2454> . +<http://example.org/ns#a2455> <http://example.org/ns#a2455> <http://example.org/ns#a2455> . +<http://example.org/ns#a2456> <http://example.org/ns#a2456> <http://example.org/ns#a2456> . +<http://example.org/ns#a2457> <http://example.org/ns#a2457> <http://example.org/ns#a2457> . +<http://example.org/ns#a2458> <http://example.org/ns#a2458> <http://example.org/ns#a2458> . +<http://example.org/ns#a2459> <http://example.org/ns#a2459> <http://example.org/ns#a2459> . +<http://example.org/ns#a2460> <http://example.org/ns#a2460> <http://example.org/ns#a2460> . +<http://example.org/ns#a2461> <http://example.org/ns#a2461> <http://example.org/ns#a2461> . +<http://example.org/ns#a2462> <http://example.org/ns#a2462> <http://example.org/ns#a2462> . +<http://example.org/ns#a2463> <http://example.org/ns#a2463> <http://example.org/ns#a2463> . +<http://example.org/ns#a2464> <http://example.org/ns#a2464> <http://example.org/ns#a2464> . +<http://example.org/ns#a2465> <http://example.org/ns#a2465> <http://example.org/ns#a2465> . +<http://example.org/ns#a2466> <http://example.org/ns#a2466> <http://example.org/ns#a2466> . +<http://example.org/ns#a2467> <http://example.org/ns#a2467> <http://example.org/ns#a2467> . +<http://example.org/ns#a2468> <http://example.org/ns#a2468> <http://example.org/ns#a2468> . +<http://example.org/ns#a2469> <http://example.org/ns#a2469> <http://example.org/ns#a2469> . +<http://example.org/ns#a2470> <http://example.org/ns#a2470> <http://example.org/ns#a2470> . +<http://example.org/ns#a2471> <http://example.org/ns#a2471> <http://example.org/ns#a2471> . +<http://example.org/ns#a2472> <http://example.org/ns#a2472> <http://example.org/ns#a2472> . +<http://example.org/ns#a2473> <http://example.org/ns#a2473> <http://example.org/ns#a2473> . +<http://example.org/ns#a2474> <http://example.org/ns#a2474> <http://example.org/ns#a2474> . +<http://example.org/ns#a2475> <http://example.org/ns#a2475> <http://example.org/ns#a2475> . +<http://example.org/ns#a2476> <http://example.org/ns#a2476> <http://example.org/ns#a2476> . +<http://example.org/ns#a2477> <http://example.org/ns#a2477> <http://example.org/ns#a2477> . +<http://example.org/ns#a2478> <http://example.org/ns#a2478> <http://example.org/ns#a2478> . +<http://example.org/ns#a2479> <http://example.org/ns#a2479> <http://example.org/ns#a2479> . +<http://example.org/ns#a2480> <http://example.org/ns#a2480> <http://example.org/ns#a2480> . +<http://example.org/ns#a2481> <http://example.org/ns#a2481> <http://example.org/ns#a2481> . +<http://example.org/ns#a2482> <http://example.org/ns#a2482> <http://example.org/ns#a2482> . +<http://example.org/ns#a2483> <http://example.org/ns#a2483> <http://example.org/ns#a2483> . +<http://example.org/ns#a2484> <http://example.org/ns#a2484> <http://example.org/ns#a2484> . +<http://example.org/ns#a2485> <http://example.org/ns#a2485> <http://example.org/ns#a2485> . +<http://example.org/ns#a2486> <http://example.org/ns#a2486> <http://example.org/ns#a2486> . +<http://example.org/ns#a2487> <http://example.org/ns#a2487> <http://example.org/ns#a2487> . +<http://example.org/ns#a2488> <http://example.org/ns#a2488> <http://example.org/ns#a2488> . +<http://example.org/ns#a2489> <http://example.org/ns#a2489> <http://example.org/ns#a2489> . +<http://example.org/ns#a2490> <http://example.org/ns#a2490> <http://example.org/ns#a2490> . +<http://example.org/ns#a2491> <http://example.org/ns#a2491> <http://example.org/ns#a2491> . +<http://example.org/ns#a2492> <http://example.org/ns#a2492> <http://example.org/ns#a2492> . +<http://example.org/ns#a2493> <http://example.org/ns#a2493> <http://example.org/ns#a2493> . +<http://example.org/ns#a2494> <http://example.org/ns#a2494> <http://example.org/ns#a2494> . +<http://example.org/ns#a2495> <http://example.org/ns#a2495> <http://example.org/ns#a2495> . +<http://example.org/ns#a2496> <http://example.org/ns#a2496> <http://example.org/ns#a2496> . +<http://example.org/ns#a2497> <http://example.org/ns#a2497> <http://example.org/ns#a2497> . +<http://example.org/ns#a2498> <http://example.org/ns#a2498> <http://example.org/ns#a2498> . +<http://example.org/ns#a2499> <http://example.org/ns#a2499> <http://example.org/ns#a2499> . +<http://example.org/ns#a2500> <http://example.org/ns#a2500> <http://example.org/ns#a2500> . +<http://example.org/ns#a2501> <http://example.org/ns#a2501> <http://example.org/ns#a2501> . +<http://example.org/ns#a2502> <http://example.org/ns#a2502> <http://example.org/ns#a2502> . +<http://example.org/ns#a2503> <http://example.org/ns#a2503> <http://example.org/ns#a2503> . +<http://example.org/ns#a2504> <http://example.org/ns#a2504> <http://example.org/ns#a2504> . +<http://example.org/ns#a2505> <http://example.org/ns#a2505> <http://example.org/ns#a2505> . +<http://example.org/ns#a2506> <http://example.org/ns#a2506> <http://example.org/ns#a2506> . +<http://example.org/ns#a2507> <http://example.org/ns#a2507> <http://example.org/ns#a2507> . +<http://example.org/ns#a2508> <http://example.org/ns#a2508> <http://example.org/ns#a2508> . +<http://example.org/ns#a2509> <http://example.org/ns#a2509> <http://example.org/ns#a2509> . +<http://example.org/ns#a2510> <http://example.org/ns#a2510> <http://example.org/ns#a2510> . +<http://example.org/ns#a2511> <http://example.org/ns#a2511> <http://example.org/ns#a2511> . +<http://example.org/ns#a2512> <http://example.org/ns#a2512> <http://example.org/ns#a2512> . +<http://example.org/ns#a2513> <http://example.org/ns#a2513> <http://example.org/ns#a2513> . +<http://example.org/ns#a2514> <http://example.org/ns#a2514> <http://example.org/ns#a2514> . +<http://example.org/ns#a2515> <http://example.org/ns#a2515> <http://example.org/ns#a2515> . +<http://example.org/ns#a2516> <http://example.org/ns#a2516> <http://example.org/ns#a2516> . +<http://example.org/ns#a2517> <http://example.org/ns#a2517> <http://example.org/ns#a2517> . +<http://example.org/ns#a2518> <http://example.org/ns#a2518> <http://example.org/ns#a2518> . +<http://example.org/ns#a2519> <http://example.org/ns#a2519> <http://example.org/ns#a2519> . +<http://example.org/ns#a2520> <http://example.org/ns#a2520> <http://example.org/ns#a2520> . +<http://example.org/ns#a2521> <http://example.org/ns#a2521> <http://example.org/ns#a2521> . +<http://example.org/ns#a2522> <http://example.org/ns#a2522> <http://example.org/ns#a2522> . +<http://example.org/ns#a2523> <http://example.org/ns#a2523> <http://example.org/ns#a2523> . +<http://example.org/ns#a2524> <http://example.org/ns#a2524> <http://example.org/ns#a2524> . +<http://example.org/ns#a2525> <http://example.org/ns#a2525> <http://example.org/ns#a2525> . +<http://example.org/ns#a2526> <http://example.org/ns#a2526> <http://example.org/ns#a2526> . +<http://example.org/ns#a2527> <http://example.org/ns#a2527> <http://example.org/ns#a2527> . +<http://example.org/ns#a2528> <http://example.org/ns#a2528> <http://example.org/ns#a2528> . +<http://example.org/ns#a2529> <http://example.org/ns#a2529> <http://example.org/ns#a2529> . +<http://example.org/ns#a2530> <http://example.org/ns#a2530> <http://example.org/ns#a2530> . +<http://example.org/ns#a2531> <http://example.org/ns#a2531> <http://example.org/ns#a2531> . +<http://example.org/ns#a2532> <http://example.org/ns#a2532> <http://example.org/ns#a2532> . +<http://example.org/ns#a2533> <http://example.org/ns#a2533> <http://example.org/ns#a2533> . +<http://example.org/ns#a2534> <http://example.org/ns#a2534> <http://example.org/ns#a2534> . +<http://example.org/ns#a2535> <http://example.org/ns#a2535> <http://example.org/ns#a2535> . +<http://example.org/ns#a2536> <http://example.org/ns#a2536> <http://example.org/ns#a2536> . +<http://example.org/ns#a2537> <http://example.org/ns#a2537> <http://example.org/ns#a2537> . +<http://example.org/ns#a2538> <http://example.org/ns#a2538> <http://example.org/ns#a2538> . +<http://example.org/ns#a2539> <http://example.org/ns#a2539> <http://example.org/ns#a2539> . +<http://example.org/ns#a2540> <http://example.org/ns#a2540> <http://example.org/ns#a2540> . +<http://example.org/ns#a2541> <http://example.org/ns#a2541> <http://example.org/ns#a2541> . +<http://example.org/ns#a2542> <http://example.org/ns#a2542> <http://example.org/ns#a2542> . +<http://example.org/ns#a2543> <http://example.org/ns#a2543> <http://example.org/ns#a2543> . +<http://example.org/ns#a2544> <http://example.org/ns#a2544> <http://example.org/ns#a2544> . +<http://example.org/ns#a2545> <http://example.org/ns#a2545> <http://example.org/ns#a2545> . +<http://example.org/ns#a2546> <http://example.org/ns#a2546> <http://example.org/ns#a2546> . +<http://example.org/ns#a2547> <http://example.org/ns#a2547> <http://example.org/ns#a2547> . +<http://example.org/ns#a2548> <http://example.org/ns#a2548> <http://example.org/ns#a2548> . +<http://example.org/ns#a2549> <http://example.org/ns#a2549> <http://example.org/ns#a2549> . +<http://example.org/ns#a2550> <http://example.org/ns#a2550> <http://example.org/ns#a2550> . +<http://example.org/ns#a2551> <http://example.org/ns#a2551> <http://example.org/ns#a2551> . +<http://example.org/ns#a2552> <http://example.org/ns#a2552> <http://example.org/ns#a2552> . +<http://example.org/ns#a2553> <http://example.org/ns#a2553> <http://example.org/ns#a2553> . +<http://example.org/ns#a2554> <http://example.org/ns#a2554> <http://example.org/ns#a2554> . +<http://example.org/ns#a2555> <http://example.org/ns#a2555> <http://example.org/ns#a2555> . +<http://example.org/ns#a2556> <http://example.org/ns#a2556> <http://example.org/ns#a2556> . +<http://example.org/ns#a2557> <http://example.org/ns#a2557> <http://example.org/ns#a2557> . +<http://example.org/ns#a2558> <http://example.org/ns#a2558> <http://example.org/ns#a2558> . +<http://example.org/ns#a2559> <http://example.org/ns#a2559> <http://example.org/ns#a2559> . +<http://example.org/ns#a2560> <http://example.org/ns#a2560> <http://example.org/ns#a2560> . +<http://example.org/ns#a2561> <http://example.org/ns#a2561> <http://example.org/ns#a2561> . +<http://example.org/ns#a2562> <http://example.org/ns#a2562> <http://example.org/ns#a2562> . +<http://example.org/ns#a2563> <http://example.org/ns#a2563> <http://example.org/ns#a2563> . +<http://example.org/ns#a2564> <http://example.org/ns#a2564> <http://example.org/ns#a2564> . +<http://example.org/ns#a2565> <http://example.org/ns#a2565> <http://example.org/ns#a2565> . +<http://example.org/ns#a2566> <http://example.org/ns#a2566> <http://example.org/ns#a2566> . +<http://example.org/ns#a2567> <http://example.org/ns#a2567> <http://example.org/ns#a2567> . +<http://example.org/ns#a2568> <http://example.org/ns#a2568> <http://example.org/ns#a2568> . +<http://example.org/ns#a2569> <http://example.org/ns#a2569> <http://example.org/ns#a2569> . +<http://example.org/ns#a2570> <http://example.org/ns#a2570> <http://example.org/ns#a2570> . +<http://example.org/ns#a2571> <http://example.org/ns#a2571> <http://example.org/ns#a2571> . +<http://example.org/ns#a2572> <http://example.org/ns#a2572> <http://example.org/ns#a2572> . +<http://example.org/ns#a2573> <http://example.org/ns#a2573> <http://example.org/ns#a2573> . +<http://example.org/ns#a2574> <http://example.org/ns#a2574> <http://example.org/ns#a2574> . +<http://example.org/ns#a2575> <http://example.org/ns#a2575> <http://example.org/ns#a2575> . +<http://example.org/ns#a2576> <http://example.org/ns#a2576> <http://example.org/ns#a2576> . +<http://example.org/ns#a2577> <http://example.org/ns#a2577> <http://example.org/ns#a2577> . +<http://example.org/ns#a2578> <http://example.org/ns#a2578> <http://example.org/ns#a2578> . +<http://example.org/ns#a2579> <http://example.org/ns#a2579> <http://example.org/ns#a2579> . +<http://example.org/ns#a2580> <http://example.org/ns#a2580> <http://example.org/ns#a2580> . +<http://example.org/ns#a2581> <http://example.org/ns#a2581> <http://example.org/ns#a2581> . +<http://example.org/ns#a2582> <http://example.org/ns#a2582> <http://example.org/ns#a2582> . +<http://example.org/ns#a2583> <http://example.org/ns#a2583> <http://example.org/ns#a2583> . +<http://example.org/ns#a2584> <http://example.org/ns#a2584> <http://example.org/ns#a2584> . +<http://example.org/ns#a2585> <http://example.org/ns#a2585> <http://example.org/ns#a2585> . +<http://example.org/ns#a2586> <http://example.org/ns#a2586> <http://example.org/ns#a2586> . +<http://example.org/ns#a2587> <http://example.org/ns#a2587> <http://example.org/ns#a2587> . +<http://example.org/ns#a2588> <http://example.org/ns#a2588> <http://example.org/ns#a2588> . +<http://example.org/ns#a2589> <http://example.org/ns#a2589> <http://example.org/ns#a2589> . +<http://example.org/ns#a2590> <http://example.org/ns#a2590> <http://example.org/ns#a2590> . +<http://example.org/ns#a2591> <http://example.org/ns#a2591> <http://example.org/ns#a2591> . +<http://example.org/ns#a2592> <http://example.org/ns#a2592> <http://example.org/ns#a2592> . +<http://example.org/ns#a2593> <http://example.org/ns#a2593> <http://example.org/ns#a2593> . +<http://example.org/ns#a2594> <http://example.org/ns#a2594> <http://example.org/ns#a2594> . +<http://example.org/ns#a2595> <http://example.org/ns#a2595> <http://example.org/ns#a2595> . +<http://example.org/ns#a2596> <http://example.org/ns#a2596> <http://example.org/ns#a2596> . +<http://example.org/ns#a2597> <http://example.org/ns#a2597> <http://example.org/ns#a2597> . +<http://example.org/ns#a2598> <http://example.org/ns#a2598> <http://example.org/ns#a2598> . +<http://example.org/ns#a2599> <http://example.org/ns#a2599> <http://example.org/ns#a2599> . +<http://example.org/ns#a2600> <http://example.org/ns#a2600> <http://example.org/ns#a2600> . +<http://example.org/ns#a2601> <http://example.org/ns#a2601> <http://example.org/ns#a2601> . +<http://example.org/ns#a2602> <http://example.org/ns#a2602> <http://example.org/ns#a2602> . +<http://example.org/ns#a2603> <http://example.org/ns#a2603> <http://example.org/ns#a2603> . +<http://example.org/ns#a2604> <http://example.org/ns#a2604> <http://example.org/ns#a2604> . +<http://example.org/ns#a2605> <http://example.org/ns#a2605> <http://example.org/ns#a2605> . +<http://example.org/ns#a2606> <http://example.org/ns#a2606> <http://example.org/ns#a2606> . +<http://example.org/ns#a2607> <http://example.org/ns#a2607> <http://example.org/ns#a2607> . +<http://example.org/ns#a2608> <http://example.org/ns#a2608> <http://example.org/ns#a2608> . +<http://example.org/ns#a2609> <http://example.org/ns#a2609> <http://example.org/ns#a2609> . +<http://example.org/ns#a2610> <http://example.org/ns#a2610> <http://example.org/ns#a2610> . +<http://example.org/ns#a2611> <http://example.org/ns#a2611> <http://example.org/ns#a2611> . +<http://example.org/ns#a2612> <http://example.org/ns#a2612> <http://example.org/ns#a2612> . +<http://example.org/ns#a2613> <http://example.org/ns#a2613> <http://example.org/ns#a2613> . +<http://example.org/ns#a2614> <http://example.org/ns#a2614> <http://example.org/ns#a2614> . +<http://example.org/ns#a2615> <http://example.org/ns#a2615> <http://example.org/ns#a2615> . +<http://example.org/ns#a2616> <http://example.org/ns#a2616> <http://example.org/ns#a2616> . +<http://example.org/ns#a2617> <http://example.org/ns#a2617> <http://example.org/ns#a2617> . +<http://example.org/ns#a2618> <http://example.org/ns#a2618> <http://example.org/ns#a2618> . +<http://example.org/ns#a2619> <http://example.org/ns#a2619> <http://example.org/ns#a2619> . +<http://example.org/ns#a2620> <http://example.org/ns#a2620> <http://example.org/ns#a2620> . +<http://example.org/ns#a2621> <http://example.org/ns#a2621> <http://example.org/ns#a2621> . +<http://example.org/ns#a2622> <http://example.org/ns#a2622> <http://example.org/ns#a2622> . +<http://example.org/ns#a2623> <http://example.org/ns#a2623> <http://example.org/ns#a2623> . +<http://example.org/ns#a2624> <http://example.org/ns#a2624> <http://example.org/ns#a2624> . +<http://example.org/ns#a2625> <http://example.org/ns#a2625> <http://example.org/ns#a2625> . +<http://example.org/ns#a2626> <http://example.org/ns#a2626> <http://example.org/ns#a2626> . +<http://example.org/ns#a2627> <http://example.org/ns#a2627> <http://example.org/ns#a2627> . +<http://example.org/ns#a2628> <http://example.org/ns#a2628> <http://example.org/ns#a2628> . +<http://example.org/ns#a2629> <http://example.org/ns#a2629> <http://example.org/ns#a2629> . +<http://example.org/ns#a2630> <http://example.org/ns#a2630> <http://example.org/ns#a2630> . +<http://example.org/ns#a2631> <http://example.org/ns#a2631> <http://example.org/ns#a2631> . +<http://example.org/ns#a2632> <http://example.org/ns#a2632> <http://example.org/ns#a2632> . +<http://example.org/ns#a2633> <http://example.org/ns#a2633> <http://example.org/ns#a2633> . +<http://example.org/ns#a2634> <http://example.org/ns#a2634> <http://example.org/ns#a2634> . +<http://example.org/ns#a2635> <http://example.org/ns#a2635> <http://example.org/ns#a2635> . +<http://example.org/ns#a2636> <http://example.org/ns#a2636> <http://example.org/ns#a2636> . +<http://example.org/ns#a2637> <http://example.org/ns#a2637> <http://example.org/ns#a2637> . +<http://example.org/ns#a2638> <http://example.org/ns#a2638> <http://example.org/ns#a2638> . +<http://example.org/ns#a2639> <http://example.org/ns#a2639> <http://example.org/ns#a2639> . +<http://example.org/ns#a2640> <http://example.org/ns#a2640> <http://example.org/ns#a2640> . +<http://example.org/ns#a2641> <http://example.org/ns#a2641> <http://example.org/ns#a2641> . +<http://example.org/ns#a2642> <http://example.org/ns#a2642> <http://example.org/ns#a2642> . +<http://example.org/ns#a2643> <http://example.org/ns#a2643> <http://example.org/ns#a2643> . +<http://example.org/ns#a2644> <http://example.org/ns#a2644> <http://example.org/ns#a2644> . +<http://example.org/ns#a2645> <http://example.org/ns#a2645> <http://example.org/ns#a2645> . +<http://example.org/ns#a2646> <http://example.org/ns#a2646> <http://example.org/ns#a2646> . +<http://example.org/ns#a2647> <http://example.org/ns#a2647> <http://example.org/ns#a2647> . +<http://example.org/ns#a2648> <http://example.org/ns#a2648> <http://example.org/ns#a2648> . +<http://example.org/ns#a2649> <http://example.org/ns#a2649> <http://example.org/ns#a2649> . +<http://example.org/ns#a2650> <http://example.org/ns#a2650> <http://example.org/ns#a2650> . +<http://example.org/ns#a2651> <http://example.org/ns#a2651> <http://example.org/ns#a2651> . +<http://example.org/ns#a2652> <http://example.org/ns#a2652> <http://example.org/ns#a2652> . +<http://example.org/ns#a2653> <http://example.org/ns#a2653> <http://example.org/ns#a2653> . +<http://example.org/ns#a2654> <http://example.org/ns#a2654> <http://example.org/ns#a2654> . +<http://example.org/ns#a2655> <http://example.org/ns#a2655> <http://example.org/ns#a2655> . +<http://example.org/ns#a2656> <http://example.org/ns#a2656> <http://example.org/ns#a2656> . +<http://example.org/ns#a2657> <http://example.org/ns#a2657> <http://example.org/ns#a2657> . +<http://example.org/ns#a2658> <http://example.org/ns#a2658> <http://example.org/ns#a2658> . +<http://example.org/ns#a2659> <http://example.org/ns#a2659> <http://example.org/ns#a2659> . +<http://example.org/ns#a2660> <http://example.org/ns#a2660> <http://example.org/ns#a2660> . +<http://example.org/ns#a2661> <http://example.org/ns#a2661> <http://example.org/ns#a2661> . +<http://example.org/ns#a2662> <http://example.org/ns#a2662> <http://example.org/ns#a2662> . +<http://example.org/ns#a2663> <http://example.org/ns#a2663> <http://example.org/ns#a2663> . +<http://example.org/ns#a2664> <http://example.org/ns#a2664> <http://example.org/ns#a2664> . +<http://example.org/ns#a2665> <http://example.org/ns#a2665> <http://example.org/ns#a2665> . +<http://example.org/ns#a2666> <http://example.org/ns#a2666> <http://example.org/ns#a2666> . +<http://example.org/ns#a2667> <http://example.org/ns#a2667> <http://example.org/ns#a2667> . +<http://example.org/ns#a2668> <http://example.org/ns#a2668> <http://example.org/ns#a2668> . +<http://example.org/ns#a2669> <http://example.org/ns#a2669> <http://example.org/ns#a2669> . +<http://example.org/ns#a2670> <http://example.org/ns#a2670> <http://example.org/ns#a2670> . +<http://example.org/ns#a2671> <http://example.org/ns#a2671> <http://example.org/ns#a2671> . +<http://example.org/ns#a2672> <http://example.org/ns#a2672> <http://example.org/ns#a2672> . +<http://example.org/ns#a2673> <http://example.org/ns#a2673> <http://example.org/ns#a2673> . +<http://example.org/ns#a2674> <http://example.org/ns#a2674> <http://example.org/ns#a2674> . +<http://example.org/ns#a2675> <http://example.org/ns#a2675> <http://example.org/ns#a2675> . +<http://example.org/ns#a2676> <http://example.org/ns#a2676> <http://example.org/ns#a2676> . +<http://example.org/ns#a2677> <http://example.org/ns#a2677> <http://example.org/ns#a2677> . +<http://example.org/ns#a2678> <http://example.org/ns#a2678> <http://example.org/ns#a2678> . +<http://example.org/ns#a2679> <http://example.org/ns#a2679> <http://example.org/ns#a2679> . +<http://example.org/ns#a2680> <http://example.org/ns#a2680> <http://example.org/ns#a2680> . +<http://example.org/ns#a2681> <http://example.org/ns#a2681> <http://example.org/ns#a2681> . +<http://example.org/ns#a2682> <http://example.org/ns#a2682> <http://example.org/ns#a2682> . +<http://example.org/ns#a2683> <http://example.org/ns#a2683> <http://example.org/ns#a2683> . +<http://example.org/ns#a2684> <http://example.org/ns#a2684> <http://example.org/ns#a2684> . +<http://example.org/ns#a2685> <http://example.org/ns#a2685> <http://example.org/ns#a2685> . +<http://example.org/ns#a2686> <http://example.org/ns#a2686> <http://example.org/ns#a2686> . +<http://example.org/ns#a2687> <http://example.org/ns#a2687> <http://example.org/ns#a2687> . +<http://example.org/ns#a2688> <http://example.org/ns#a2688> <http://example.org/ns#a2688> . +<http://example.org/ns#a2689> <http://example.org/ns#a2689> <http://example.org/ns#a2689> . +<http://example.org/ns#a2690> <http://example.org/ns#a2690> <http://example.org/ns#a2690> . +<http://example.org/ns#a2691> <http://example.org/ns#a2691> <http://example.org/ns#a2691> . +<http://example.org/ns#a2692> <http://example.org/ns#a2692> <http://example.org/ns#a2692> . +<http://example.org/ns#a2693> <http://example.org/ns#a2693> <http://example.org/ns#a2693> . +<http://example.org/ns#a2694> <http://example.org/ns#a2694> <http://example.org/ns#a2694> . +<http://example.org/ns#a2695> <http://example.org/ns#a2695> <http://example.org/ns#a2695> . +<http://example.org/ns#a2696> <http://example.org/ns#a2696> <http://example.org/ns#a2696> . +<http://example.org/ns#a2697> <http://example.org/ns#a2697> <http://example.org/ns#a2697> . +<http://example.org/ns#a2698> <http://example.org/ns#a2698> <http://example.org/ns#a2698> . +<http://example.org/ns#a2699> <http://example.org/ns#a2699> <http://example.org/ns#a2699> . +<http://example.org/ns#a2700> <http://example.org/ns#a2700> <http://example.org/ns#a2700> . +<http://example.org/ns#a2701> <http://example.org/ns#a2701> <http://example.org/ns#a2701> . +<http://example.org/ns#a2702> <http://example.org/ns#a2702> <http://example.org/ns#a2702> . +<http://example.org/ns#a2703> <http://example.org/ns#a2703> <http://example.org/ns#a2703> . +<http://example.org/ns#a2704> <http://example.org/ns#a2704> <http://example.org/ns#a2704> . +<http://example.org/ns#a2705> <http://example.org/ns#a2705> <http://example.org/ns#a2705> . +<http://example.org/ns#a2706> <http://example.org/ns#a2706> <http://example.org/ns#a2706> . +<http://example.org/ns#a2707> <http://example.org/ns#a2707> <http://example.org/ns#a2707> . +<http://example.org/ns#a2708> <http://example.org/ns#a2708> <http://example.org/ns#a2708> . +<http://example.org/ns#a2709> <http://example.org/ns#a2709> <http://example.org/ns#a2709> . +<http://example.org/ns#a2710> <http://example.org/ns#a2710> <http://example.org/ns#a2710> . +<http://example.org/ns#a2711> <http://example.org/ns#a2711> <http://example.org/ns#a2711> . +<http://example.org/ns#a2712> <http://example.org/ns#a2712> <http://example.org/ns#a2712> . +<http://example.org/ns#a2713> <http://example.org/ns#a2713> <http://example.org/ns#a2713> . +<http://example.org/ns#a2714> <http://example.org/ns#a2714> <http://example.org/ns#a2714> . +<http://example.org/ns#a2715> <http://example.org/ns#a2715> <http://example.org/ns#a2715> . +<http://example.org/ns#a2716> <http://example.org/ns#a2716> <http://example.org/ns#a2716> . +<http://example.org/ns#a2717> <http://example.org/ns#a2717> <http://example.org/ns#a2717> . +<http://example.org/ns#a2718> <http://example.org/ns#a2718> <http://example.org/ns#a2718> . +<http://example.org/ns#a2719> <http://example.org/ns#a2719> <http://example.org/ns#a2719> . +<http://example.org/ns#a2720> <http://example.org/ns#a2720> <http://example.org/ns#a2720> . +<http://example.org/ns#a2721> <http://example.org/ns#a2721> <http://example.org/ns#a2721> . +<http://example.org/ns#a2722> <http://example.org/ns#a2722> <http://example.org/ns#a2722> . +<http://example.org/ns#a2723> <http://example.org/ns#a2723> <http://example.org/ns#a2723> . +<http://example.org/ns#a2724> <http://example.org/ns#a2724> <http://example.org/ns#a2724> . +<http://example.org/ns#a2725> <http://example.org/ns#a2725> <http://example.org/ns#a2725> . +<http://example.org/ns#a2726> <http://example.org/ns#a2726> <http://example.org/ns#a2726> . +<http://example.org/ns#a2727> <http://example.org/ns#a2727> <http://example.org/ns#a2727> . +<http://example.org/ns#a2728> <http://example.org/ns#a2728> <http://example.org/ns#a2728> . +<http://example.org/ns#a2729> <http://example.org/ns#a2729> <http://example.org/ns#a2729> . +<http://example.org/ns#a2730> <http://example.org/ns#a2730> <http://example.org/ns#a2730> . +<http://example.org/ns#a2731> <http://example.org/ns#a2731> <http://example.org/ns#a2731> . +<http://example.org/ns#a2732> <http://example.org/ns#a2732> <http://example.org/ns#a2732> . +<http://example.org/ns#a2733> <http://example.org/ns#a2733> <http://example.org/ns#a2733> . +<http://example.org/ns#a2734> <http://example.org/ns#a2734> <http://example.org/ns#a2734> . +<http://example.org/ns#a2735> <http://example.org/ns#a2735> <http://example.org/ns#a2735> . +<http://example.org/ns#a2736> <http://example.org/ns#a2736> <http://example.org/ns#a2736> . +<http://example.org/ns#a2737> <http://example.org/ns#a2737> <http://example.org/ns#a2737> . +<http://example.org/ns#a2738> <http://example.org/ns#a2738> <http://example.org/ns#a2738> . +<http://example.org/ns#a2739> <http://example.org/ns#a2739> <http://example.org/ns#a2739> . +<http://example.org/ns#a2740> <http://example.org/ns#a2740> <http://example.org/ns#a2740> . +<http://example.org/ns#a2741> <http://example.org/ns#a2741> <http://example.org/ns#a2741> . +<http://example.org/ns#a2742> <http://example.org/ns#a2742> <http://example.org/ns#a2742> . +<http://example.org/ns#a2743> <http://example.org/ns#a2743> <http://example.org/ns#a2743> . +<http://example.org/ns#a2744> <http://example.org/ns#a2744> <http://example.org/ns#a2744> . +<http://example.org/ns#a2745> <http://example.org/ns#a2745> <http://example.org/ns#a2745> . +<http://example.org/ns#a2746> <http://example.org/ns#a2746> <http://example.org/ns#a2746> . +<http://example.org/ns#a2747> <http://example.org/ns#a2747> <http://example.org/ns#a2747> . +<http://example.org/ns#a2748> <http://example.org/ns#a2748> <http://example.org/ns#a2748> . +<http://example.org/ns#a2749> <http://example.org/ns#a2749> <http://example.org/ns#a2749> . +<http://example.org/ns#a2750> <http://example.org/ns#a2750> <http://example.org/ns#a2750> . +<http://example.org/ns#a2751> <http://example.org/ns#a2751> <http://example.org/ns#a2751> . +<http://example.org/ns#a2752> <http://example.org/ns#a2752> <http://example.org/ns#a2752> . +<http://example.org/ns#a2753> <http://example.org/ns#a2753> <http://example.org/ns#a2753> . +<http://example.org/ns#a2754> <http://example.org/ns#a2754> <http://example.org/ns#a2754> . +<http://example.org/ns#a2755> <http://example.org/ns#a2755> <http://example.org/ns#a2755> . +<http://example.org/ns#a2756> <http://example.org/ns#a2756> <http://example.org/ns#a2756> . +<http://example.org/ns#a2757> <http://example.org/ns#a2757> <http://example.org/ns#a2757> . +<http://example.org/ns#a2758> <http://example.org/ns#a2758> <http://example.org/ns#a2758> . +<http://example.org/ns#a2759> <http://example.org/ns#a2759> <http://example.org/ns#a2759> . +<http://example.org/ns#a2760> <http://example.org/ns#a2760> <http://example.org/ns#a2760> . +<http://example.org/ns#a2761> <http://example.org/ns#a2761> <http://example.org/ns#a2761> . +<http://example.org/ns#a2762> <http://example.org/ns#a2762> <http://example.org/ns#a2762> . +<http://example.org/ns#a2763> <http://example.org/ns#a2763> <http://example.org/ns#a2763> . +<http://example.org/ns#a2764> <http://example.org/ns#a2764> <http://example.org/ns#a2764> . +<http://example.org/ns#a2765> <http://example.org/ns#a2765> <http://example.org/ns#a2765> . +<http://example.org/ns#a2766> <http://example.org/ns#a2766> <http://example.org/ns#a2766> . +<http://example.org/ns#a2767> <http://example.org/ns#a2767> <http://example.org/ns#a2767> . +<http://example.org/ns#a2768> <http://example.org/ns#a2768> <http://example.org/ns#a2768> . +<http://example.org/ns#a2769> <http://example.org/ns#a2769> <http://example.org/ns#a2769> . +<http://example.org/ns#a2770> <http://example.org/ns#a2770> <http://example.org/ns#a2770> . +<http://example.org/ns#a2771> <http://example.org/ns#a2771> <http://example.org/ns#a2771> . +<http://example.org/ns#a2772> <http://example.org/ns#a2772> <http://example.org/ns#a2772> . +<http://example.org/ns#a2773> <http://example.org/ns#a2773> <http://example.org/ns#a2773> . +<http://example.org/ns#a2774> <http://example.org/ns#a2774> <http://example.org/ns#a2774> . +<http://example.org/ns#a2775> <http://example.org/ns#a2775> <http://example.org/ns#a2775> . +<http://example.org/ns#a2776> <http://example.org/ns#a2776> <http://example.org/ns#a2776> . +<http://example.org/ns#a2777> <http://example.org/ns#a2777> <http://example.org/ns#a2777> . +<http://example.org/ns#a2778> <http://example.org/ns#a2778> <http://example.org/ns#a2778> . +<http://example.org/ns#a2779> <http://example.org/ns#a2779> <http://example.org/ns#a2779> . +<http://example.org/ns#a2780> <http://example.org/ns#a2780> <http://example.org/ns#a2780> . +<http://example.org/ns#a2781> <http://example.org/ns#a2781> <http://example.org/ns#a2781> . +<http://example.org/ns#a2782> <http://example.org/ns#a2782> <http://example.org/ns#a2782> . +<http://example.org/ns#a2783> <http://example.org/ns#a2783> <http://example.org/ns#a2783> . +<http://example.org/ns#a2784> <http://example.org/ns#a2784> <http://example.org/ns#a2784> . +<http://example.org/ns#a2785> <http://example.org/ns#a2785> <http://example.org/ns#a2785> . +<http://example.org/ns#a2786> <http://example.org/ns#a2786> <http://example.org/ns#a2786> . +<http://example.org/ns#a2787> <http://example.org/ns#a2787> <http://example.org/ns#a2787> . +<http://example.org/ns#a2788> <http://example.org/ns#a2788> <http://example.org/ns#a2788> . +<http://example.org/ns#a2789> <http://example.org/ns#a2789> <http://example.org/ns#a2789> . +<http://example.org/ns#a2790> <http://example.org/ns#a2790> <http://example.org/ns#a2790> . +<http://example.org/ns#a2791> <http://example.org/ns#a2791> <http://example.org/ns#a2791> . +<http://example.org/ns#a2792> <http://example.org/ns#a2792> <http://example.org/ns#a2792> . +<http://example.org/ns#a2793> <http://example.org/ns#a2793> <http://example.org/ns#a2793> . +<http://example.org/ns#a2794> <http://example.org/ns#a2794> <http://example.org/ns#a2794> . +<http://example.org/ns#a2795> <http://example.org/ns#a2795> <http://example.org/ns#a2795> . +<http://example.org/ns#a2796> <http://example.org/ns#a2796> <http://example.org/ns#a2796> . +<http://example.org/ns#a2797> <http://example.org/ns#a2797> <http://example.org/ns#a2797> . +<http://example.org/ns#a2798> <http://example.org/ns#a2798> <http://example.org/ns#a2798> . +<http://example.org/ns#a2799> <http://example.org/ns#a2799> <http://example.org/ns#a2799> . +<http://example.org/ns#a2800> <http://example.org/ns#a2800> <http://example.org/ns#a2800> . +<http://example.org/ns#a2801> <http://example.org/ns#a2801> <http://example.org/ns#a2801> . +<http://example.org/ns#a2802> <http://example.org/ns#a2802> <http://example.org/ns#a2802> . +<http://example.org/ns#a2803> <http://example.org/ns#a2803> <http://example.org/ns#a2803> . +<http://example.org/ns#a2804> <http://example.org/ns#a2804> <http://example.org/ns#a2804> . +<http://example.org/ns#a2805> <http://example.org/ns#a2805> <http://example.org/ns#a2805> . +<http://example.org/ns#a2806> <http://example.org/ns#a2806> <http://example.org/ns#a2806> . +<http://example.org/ns#a2807> <http://example.org/ns#a2807> <http://example.org/ns#a2807> . +<http://example.org/ns#a2808> <http://example.org/ns#a2808> <http://example.org/ns#a2808> . +<http://example.org/ns#a2809> <http://example.org/ns#a2809> <http://example.org/ns#a2809> . +<http://example.org/ns#a2810> <http://example.org/ns#a2810> <http://example.org/ns#a2810> . +<http://example.org/ns#a2811> <http://example.org/ns#a2811> <http://example.org/ns#a2811> . +<http://example.org/ns#a2812> <http://example.org/ns#a2812> <http://example.org/ns#a2812> . +<http://example.org/ns#a2813> <http://example.org/ns#a2813> <http://example.org/ns#a2813> . +<http://example.org/ns#a2814> <http://example.org/ns#a2814> <http://example.org/ns#a2814> . +<http://example.org/ns#a2815> <http://example.org/ns#a2815> <http://example.org/ns#a2815> . +<http://example.org/ns#a2816> <http://example.org/ns#a2816> <http://example.org/ns#a2816> . +<http://example.org/ns#a2817> <http://example.org/ns#a2817> <http://example.org/ns#a2817> . +<http://example.org/ns#a2818> <http://example.org/ns#a2818> <http://example.org/ns#a2818> . +<http://example.org/ns#a2819> <http://example.org/ns#a2819> <http://example.org/ns#a2819> . +<http://example.org/ns#a2820> <http://example.org/ns#a2820> <http://example.org/ns#a2820> . +<http://example.org/ns#a2821> <http://example.org/ns#a2821> <http://example.org/ns#a2821> . +<http://example.org/ns#a2822> <http://example.org/ns#a2822> <http://example.org/ns#a2822> . +<http://example.org/ns#a2823> <http://example.org/ns#a2823> <http://example.org/ns#a2823> . +<http://example.org/ns#a2824> <http://example.org/ns#a2824> <http://example.org/ns#a2824> . +<http://example.org/ns#a2825> <http://example.org/ns#a2825> <http://example.org/ns#a2825> . +<http://example.org/ns#a2826> <http://example.org/ns#a2826> <http://example.org/ns#a2826> . +<http://example.org/ns#a2827> <http://example.org/ns#a2827> <http://example.org/ns#a2827> . +<http://example.org/ns#a2828> <http://example.org/ns#a2828> <http://example.org/ns#a2828> . +<http://example.org/ns#a2829> <http://example.org/ns#a2829> <http://example.org/ns#a2829> . +<http://example.org/ns#a2830> <http://example.org/ns#a2830> <http://example.org/ns#a2830> . +<http://example.org/ns#a2831> <http://example.org/ns#a2831> <http://example.org/ns#a2831> . +<http://example.org/ns#a2832> <http://example.org/ns#a2832> <http://example.org/ns#a2832> . +<http://example.org/ns#a2833> <http://example.org/ns#a2833> <http://example.org/ns#a2833> . +<http://example.org/ns#a2834> <http://example.org/ns#a2834> <http://example.org/ns#a2834> . +<http://example.org/ns#a2835> <http://example.org/ns#a2835> <http://example.org/ns#a2835> . +<http://example.org/ns#a2836> <http://example.org/ns#a2836> <http://example.org/ns#a2836> . +<http://example.org/ns#a2837> <http://example.org/ns#a2837> <http://example.org/ns#a2837> . +<http://example.org/ns#a2838> <http://example.org/ns#a2838> <http://example.org/ns#a2838> . +<http://example.org/ns#a2839> <http://example.org/ns#a2839> <http://example.org/ns#a2839> . +<http://example.org/ns#a2840> <http://example.org/ns#a2840> <http://example.org/ns#a2840> . +<http://example.org/ns#a2841> <http://example.org/ns#a2841> <http://example.org/ns#a2841> . +<http://example.org/ns#a2842> <http://example.org/ns#a2842> <http://example.org/ns#a2842> . +<http://example.org/ns#a2843> <http://example.org/ns#a2843> <http://example.org/ns#a2843> . +<http://example.org/ns#a2844> <http://example.org/ns#a2844> <http://example.org/ns#a2844> . +<http://example.org/ns#a2845> <http://example.org/ns#a2845> <http://example.org/ns#a2845> . +<http://example.org/ns#a2846> <http://example.org/ns#a2846> <http://example.org/ns#a2846> . +<http://example.org/ns#a2847> <http://example.org/ns#a2847> <http://example.org/ns#a2847> . +<http://example.org/ns#a2848> <http://example.org/ns#a2848> <http://example.org/ns#a2848> . +<http://example.org/ns#a2849> <http://example.org/ns#a2849> <http://example.org/ns#a2849> . +<http://example.org/ns#a2850> <http://example.org/ns#a2850> <http://example.org/ns#a2850> . +<http://example.org/ns#a2851> <http://example.org/ns#a2851> <http://example.org/ns#a2851> . +<http://example.org/ns#a2852> <http://example.org/ns#a2852> <http://example.org/ns#a2852> . +<http://example.org/ns#a2853> <http://example.org/ns#a2853> <http://example.org/ns#a2853> . +<http://example.org/ns#a2854> <http://example.org/ns#a2854> <http://example.org/ns#a2854> . +<http://example.org/ns#a2855> <http://example.org/ns#a2855> <http://example.org/ns#a2855> . +<http://example.org/ns#a2856> <http://example.org/ns#a2856> <http://example.org/ns#a2856> . +<http://example.org/ns#a2857> <http://example.org/ns#a2857> <http://example.org/ns#a2857> . +<http://example.org/ns#a2858> <http://example.org/ns#a2858> <http://example.org/ns#a2858> . +<http://example.org/ns#a2859> <http://example.org/ns#a2859> <http://example.org/ns#a2859> . +<http://example.org/ns#a2860> <http://example.org/ns#a2860> <http://example.org/ns#a2860> . +<http://example.org/ns#a2861> <http://example.org/ns#a2861> <http://example.org/ns#a2861> . +<http://example.org/ns#a2862> <http://example.org/ns#a2862> <http://example.org/ns#a2862> . +<http://example.org/ns#a2863> <http://example.org/ns#a2863> <http://example.org/ns#a2863> . +<http://example.org/ns#a2864> <http://example.org/ns#a2864> <http://example.org/ns#a2864> . +<http://example.org/ns#a2865> <http://example.org/ns#a2865> <http://example.org/ns#a2865> . +<http://example.org/ns#a2866> <http://example.org/ns#a2866> <http://example.org/ns#a2866> . +<http://example.org/ns#a2867> <http://example.org/ns#a2867> <http://example.org/ns#a2867> . +<http://example.org/ns#a2868> <http://example.org/ns#a2868> <http://example.org/ns#a2868> . +<http://example.org/ns#a2869> <http://example.org/ns#a2869> <http://example.org/ns#a2869> . +<http://example.org/ns#a2870> <http://example.org/ns#a2870> <http://example.org/ns#a2870> . +<http://example.org/ns#a2871> <http://example.org/ns#a2871> <http://example.org/ns#a2871> . +<http://example.org/ns#a2872> <http://example.org/ns#a2872> <http://example.org/ns#a2872> . +<http://example.org/ns#a2873> <http://example.org/ns#a2873> <http://example.org/ns#a2873> . +<http://example.org/ns#a2874> <http://example.org/ns#a2874> <http://example.org/ns#a2874> . +<http://example.org/ns#a2875> <http://example.org/ns#a2875> <http://example.org/ns#a2875> . +<http://example.org/ns#a2876> <http://example.org/ns#a2876> <http://example.org/ns#a2876> . +<http://example.org/ns#a2877> <http://example.org/ns#a2877> <http://example.org/ns#a2877> . +<http://example.org/ns#a2878> <http://example.org/ns#a2878> <http://example.org/ns#a2878> . +<http://example.org/ns#a2879> <http://example.org/ns#a2879> <http://example.org/ns#a2879> . +<http://example.org/ns#a2880> <http://example.org/ns#a2880> <http://example.org/ns#a2880> . +<http://example.org/ns#a2881> <http://example.org/ns#a2881> <http://example.org/ns#a2881> . +<http://example.org/ns#a2882> <http://example.org/ns#a2882> <http://example.org/ns#a2882> . +<http://example.org/ns#a2883> <http://example.org/ns#a2883> <http://example.org/ns#a2883> . +<http://example.org/ns#a2884> <http://example.org/ns#a2884> <http://example.org/ns#a2884> . +<http://example.org/ns#a2885> <http://example.org/ns#a2885> <http://example.org/ns#a2885> . +<http://example.org/ns#a2886> <http://example.org/ns#a2886> <http://example.org/ns#a2886> . +<http://example.org/ns#a2887> <http://example.org/ns#a2887> <http://example.org/ns#a2887> . +<http://example.org/ns#a2888> <http://example.org/ns#a2888> <http://example.org/ns#a2888> . +<http://example.org/ns#a2889> <http://example.org/ns#a2889> <http://example.org/ns#a2889> . +<http://example.org/ns#a2890> <http://example.org/ns#a2890> <http://example.org/ns#a2890> . +<http://example.org/ns#a2891> <http://example.org/ns#a2891> <http://example.org/ns#a2891> . +<http://example.org/ns#a2892> <http://example.org/ns#a2892> <http://example.org/ns#a2892> . +<http://example.org/ns#a2893> <http://example.org/ns#a2893> <http://example.org/ns#a2893> . +<http://example.org/ns#a2894> <http://example.org/ns#a2894> <http://example.org/ns#a2894> . +<http://example.org/ns#a2895> <http://example.org/ns#a2895> <http://example.org/ns#a2895> . +<http://example.org/ns#a2896> <http://example.org/ns#a2896> <http://example.org/ns#a2896> . +<http://example.org/ns#a2897> <http://example.org/ns#a2897> <http://example.org/ns#a2897> . +<http://example.org/ns#a2898> <http://example.org/ns#a2898> <http://example.org/ns#a2898> . +<http://example.org/ns#a2899> <http://example.org/ns#a2899> <http://example.org/ns#a2899> . +<http://example.org/ns#a2900> <http://example.org/ns#a2900> <http://example.org/ns#a2900> . +<http://example.org/ns#a2901> <http://example.org/ns#a2901> <http://example.org/ns#a2901> . +<http://example.org/ns#a2902> <http://example.org/ns#a2902> <http://example.org/ns#a2902> . +<http://example.org/ns#a2903> <http://example.org/ns#a2903> <http://example.org/ns#a2903> . +<http://example.org/ns#a2904> <http://example.org/ns#a2904> <http://example.org/ns#a2904> . +<http://example.org/ns#a2905> <http://example.org/ns#a2905> <http://example.org/ns#a2905> . +<http://example.org/ns#a2906> <http://example.org/ns#a2906> <http://example.org/ns#a2906> . +<http://example.org/ns#a2907> <http://example.org/ns#a2907> <http://example.org/ns#a2907> . +<http://example.org/ns#a2908> <http://example.org/ns#a2908> <http://example.org/ns#a2908> . +<http://example.org/ns#a2909> <http://example.org/ns#a2909> <http://example.org/ns#a2909> . +<http://example.org/ns#a2910> <http://example.org/ns#a2910> <http://example.org/ns#a2910> . +<http://example.org/ns#a2911> <http://example.org/ns#a2911> <http://example.org/ns#a2911> . +<http://example.org/ns#a2912> <http://example.org/ns#a2912> <http://example.org/ns#a2912> . +<http://example.org/ns#a2913> <http://example.org/ns#a2913> <http://example.org/ns#a2913> . +<http://example.org/ns#a2914> <http://example.org/ns#a2914> <http://example.org/ns#a2914> . +<http://example.org/ns#a2915> <http://example.org/ns#a2915> <http://example.org/ns#a2915> . +<http://example.org/ns#a2916> <http://example.org/ns#a2916> <http://example.org/ns#a2916> . +<http://example.org/ns#a2917> <http://example.org/ns#a2917> <http://example.org/ns#a2917> . +<http://example.org/ns#a2918> <http://example.org/ns#a2918> <http://example.org/ns#a2918> . +<http://example.org/ns#a2919> <http://example.org/ns#a2919> <http://example.org/ns#a2919> . +<http://example.org/ns#a2920> <http://example.org/ns#a2920> <http://example.org/ns#a2920> . +<http://example.org/ns#a2921> <http://example.org/ns#a2921> <http://example.org/ns#a2921> . +<http://example.org/ns#a2922> <http://example.org/ns#a2922> <http://example.org/ns#a2922> . +<http://example.org/ns#a2923> <http://example.org/ns#a2923> <http://example.org/ns#a2923> . +<http://example.org/ns#a2924> <http://example.org/ns#a2924> <http://example.org/ns#a2924> . +<http://example.org/ns#a2925> <http://example.org/ns#a2925> <http://example.org/ns#a2925> . +<http://example.org/ns#a2926> <http://example.org/ns#a2926> <http://example.org/ns#a2926> . +<http://example.org/ns#a2927> <http://example.org/ns#a2927> <http://example.org/ns#a2927> . +<http://example.org/ns#a2928> <http://example.org/ns#a2928> <http://example.org/ns#a2928> . +<http://example.org/ns#a2929> <http://example.org/ns#a2929> <http://example.org/ns#a2929> . +<http://example.org/ns#a2930> <http://example.org/ns#a2930> <http://example.org/ns#a2930> . +<http://example.org/ns#a2931> <http://example.org/ns#a2931> <http://example.org/ns#a2931> . +<http://example.org/ns#a2932> <http://example.org/ns#a2932> <http://example.org/ns#a2932> . +<http://example.org/ns#a2933> <http://example.org/ns#a2933> <http://example.org/ns#a2933> . +<http://example.org/ns#a2934> <http://example.org/ns#a2934> <http://example.org/ns#a2934> . +<http://example.org/ns#a2935> <http://example.org/ns#a2935> <http://example.org/ns#a2935> . +<http://example.org/ns#a2936> <http://example.org/ns#a2936> <http://example.org/ns#a2936> . +<http://example.org/ns#a2937> <http://example.org/ns#a2937> <http://example.org/ns#a2937> . +<http://example.org/ns#a2938> <http://example.org/ns#a2938> <http://example.org/ns#a2938> . +<http://example.org/ns#a2939> <http://example.org/ns#a2939> <http://example.org/ns#a2939> . +<http://example.org/ns#a2940> <http://example.org/ns#a2940> <http://example.org/ns#a2940> . +<http://example.org/ns#a2941> <http://example.org/ns#a2941> <http://example.org/ns#a2941> . +<http://example.org/ns#a2942> <http://example.org/ns#a2942> <http://example.org/ns#a2942> . +<http://example.org/ns#a2943> <http://example.org/ns#a2943> <http://example.org/ns#a2943> . +<http://example.org/ns#a2944> <http://example.org/ns#a2944> <http://example.org/ns#a2944> . +<http://example.org/ns#a2945> <http://example.org/ns#a2945> <http://example.org/ns#a2945> . +<http://example.org/ns#a2946> <http://example.org/ns#a2946> <http://example.org/ns#a2946> . +<http://example.org/ns#a2947> <http://example.org/ns#a2947> <http://example.org/ns#a2947> . +<http://example.org/ns#a2948> <http://example.org/ns#a2948> <http://example.org/ns#a2948> . +<http://example.org/ns#a2949> <http://example.org/ns#a2949> <http://example.org/ns#a2949> . +<http://example.org/ns#a2950> <http://example.org/ns#a2950> <http://example.org/ns#a2950> . +<http://example.org/ns#a2951> <http://example.org/ns#a2951> <http://example.org/ns#a2951> . +<http://example.org/ns#a2952> <http://example.org/ns#a2952> <http://example.org/ns#a2952> . +<http://example.org/ns#a2953> <http://example.org/ns#a2953> <http://example.org/ns#a2953> . +<http://example.org/ns#a2954> <http://example.org/ns#a2954> <http://example.org/ns#a2954> . +<http://example.org/ns#a2955> <http://example.org/ns#a2955> <http://example.org/ns#a2955> . +<http://example.org/ns#a2956> <http://example.org/ns#a2956> <http://example.org/ns#a2956> . +<http://example.org/ns#a2957> <http://example.org/ns#a2957> <http://example.org/ns#a2957> . +<http://example.org/ns#a2958> <http://example.org/ns#a2958> <http://example.org/ns#a2958> . +<http://example.org/ns#a2959> <http://example.org/ns#a2959> <http://example.org/ns#a2959> . +<http://example.org/ns#a2960> <http://example.org/ns#a2960> <http://example.org/ns#a2960> . +<http://example.org/ns#a2961> <http://example.org/ns#a2961> <http://example.org/ns#a2961> . +<http://example.org/ns#a2962> <http://example.org/ns#a2962> <http://example.org/ns#a2962> . +<http://example.org/ns#a2963> <http://example.org/ns#a2963> <http://example.org/ns#a2963> . +<http://example.org/ns#a2964> <http://example.org/ns#a2964> <http://example.org/ns#a2964> . +<http://example.org/ns#a2965> <http://example.org/ns#a2965> <http://example.org/ns#a2965> . +<http://example.org/ns#a2966> <http://example.org/ns#a2966> <http://example.org/ns#a2966> . +<http://example.org/ns#a2967> <http://example.org/ns#a2967> <http://example.org/ns#a2967> . +<http://example.org/ns#a2968> <http://example.org/ns#a2968> <http://example.org/ns#a2968> . +<http://example.org/ns#a2969> <http://example.org/ns#a2969> <http://example.org/ns#a2969> . +<http://example.org/ns#a2970> <http://example.org/ns#a2970> <http://example.org/ns#a2970> . +<http://example.org/ns#a2971> <http://example.org/ns#a2971> <http://example.org/ns#a2971> . +<http://example.org/ns#a2972> <http://example.org/ns#a2972> <http://example.org/ns#a2972> . +<http://example.org/ns#a2973> <http://example.org/ns#a2973> <http://example.org/ns#a2973> . +<http://example.org/ns#a2974> <http://example.org/ns#a2974> <http://example.org/ns#a2974> . +<http://example.org/ns#a2975> <http://example.org/ns#a2975> <http://example.org/ns#a2975> . +<http://example.org/ns#a2976> <http://example.org/ns#a2976> <http://example.org/ns#a2976> . +<http://example.org/ns#a2977> <http://example.org/ns#a2977> <http://example.org/ns#a2977> . +<http://example.org/ns#a2978> <http://example.org/ns#a2978> <http://example.org/ns#a2978> . +<http://example.org/ns#a2979> <http://example.org/ns#a2979> <http://example.org/ns#a2979> . +<http://example.org/ns#a2980> <http://example.org/ns#a2980> <http://example.org/ns#a2980> . +<http://example.org/ns#a2981> <http://example.org/ns#a2981> <http://example.org/ns#a2981> . +<http://example.org/ns#a2982> <http://example.org/ns#a2982> <http://example.org/ns#a2982> . +<http://example.org/ns#a2983> <http://example.org/ns#a2983> <http://example.org/ns#a2983> . +<http://example.org/ns#a2984> <http://example.org/ns#a2984> <http://example.org/ns#a2984> . +<http://example.org/ns#a2985> <http://example.org/ns#a2985> <http://example.org/ns#a2985> . +<http://example.org/ns#a2986> <http://example.org/ns#a2986> <http://example.org/ns#a2986> . +<http://example.org/ns#a2987> <http://example.org/ns#a2987> <http://example.org/ns#a2987> . +<http://example.org/ns#a2988> <http://example.org/ns#a2988> <http://example.org/ns#a2988> . +<http://example.org/ns#a2989> <http://example.org/ns#a2989> <http://example.org/ns#a2989> . +<http://example.org/ns#a2990> <http://example.org/ns#a2990> <http://example.org/ns#a2990> . +<http://example.org/ns#a2991> <http://example.org/ns#a2991> <http://example.org/ns#a2991> . +<http://example.org/ns#a2992> <http://example.org/ns#a2992> <http://example.org/ns#a2992> . +<http://example.org/ns#a2993> <http://example.org/ns#a2993> <http://example.org/ns#a2993> . +<http://example.org/ns#a2994> <http://example.org/ns#a2994> <http://example.org/ns#a2994> . +<http://example.org/ns#a2995> <http://example.org/ns#a2995> <http://example.org/ns#a2995> . +<http://example.org/ns#a2996> <http://example.org/ns#a2996> <http://example.org/ns#a2996> . +<http://example.org/ns#a2997> <http://example.org/ns#a2997> <http://example.org/ns#a2997> . +<http://example.org/ns#a2998> <http://example.org/ns#a2998> <http://example.org/ns#a2998> . +<http://example.org/ns#a2999> <http://example.org/ns#a2999> <http://example.org/ns#a2999> . +<http://example.org/ns#a3000> <http://example.org/ns#a3000> <http://example.org/ns#a3000> . +<http://example.org/ns#a3001> <http://example.org/ns#a3001> <http://example.org/ns#a3001> . +<http://example.org/ns#a3002> <http://example.org/ns#a3002> <http://example.org/ns#a3002> . +<http://example.org/ns#a3003> <http://example.org/ns#a3003> <http://example.org/ns#a3003> . +<http://example.org/ns#a3004> <http://example.org/ns#a3004> <http://example.org/ns#a3004> . +<http://example.org/ns#a3005> <http://example.org/ns#a3005> <http://example.org/ns#a3005> . +<http://example.org/ns#a3006> <http://example.org/ns#a3006> <http://example.org/ns#a3006> . +<http://example.org/ns#a3007> <http://example.org/ns#a3007> <http://example.org/ns#a3007> . +<http://example.org/ns#a3008> <http://example.org/ns#a3008> <http://example.org/ns#a3008> . +<http://example.org/ns#a3009> <http://example.org/ns#a3009> <http://example.org/ns#a3009> . +<http://example.org/ns#a3010> <http://example.org/ns#a3010> <http://example.org/ns#a3010> . +<http://example.org/ns#a3011> <http://example.org/ns#a3011> <http://example.org/ns#a3011> . +<http://example.org/ns#a3012> <http://example.org/ns#a3012> <http://example.org/ns#a3012> . +<http://example.org/ns#a3013> <http://example.org/ns#a3013> <http://example.org/ns#a3013> . +<http://example.org/ns#a3014> <http://example.org/ns#a3014> <http://example.org/ns#a3014> . +<http://example.org/ns#a3015> <http://example.org/ns#a3015> <http://example.org/ns#a3015> . +<http://example.org/ns#a3016> <http://example.org/ns#a3016> <http://example.org/ns#a3016> . +<http://example.org/ns#a3017> <http://example.org/ns#a3017> <http://example.org/ns#a3017> . +<http://example.org/ns#a3018> <http://example.org/ns#a3018> <http://example.org/ns#a3018> . +<http://example.org/ns#a3019> <http://example.org/ns#a3019> <http://example.org/ns#a3019> . +<http://example.org/ns#a3020> <http://example.org/ns#a3020> <http://example.org/ns#a3020> . +<http://example.org/ns#a3021> <http://example.org/ns#a3021> <http://example.org/ns#a3021> . +<http://example.org/ns#a3022> <http://example.org/ns#a3022> <http://example.org/ns#a3022> . +<http://example.org/ns#a3023> <http://example.org/ns#a3023> <http://example.org/ns#a3023> . +<http://example.org/ns#a3024> <http://example.org/ns#a3024> <http://example.org/ns#a3024> . +<http://example.org/ns#a3025> <http://example.org/ns#a3025> <http://example.org/ns#a3025> . +<http://example.org/ns#a3026> <http://example.org/ns#a3026> <http://example.org/ns#a3026> . +<http://example.org/ns#a3027> <http://example.org/ns#a3027> <http://example.org/ns#a3027> . +<http://example.org/ns#a3028> <http://example.org/ns#a3028> <http://example.org/ns#a3028> . +<http://example.org/ns#a3029> <http://example.org/ns#a3029> <http://example.org/ns#a3029> . +<http://example.org/ns#a3030> <http://example.org/ns#a3030> <http://example.org/ns#a3030> . +<http://example.org/ns#a3031> <http://example.org/ns#a3031> <http://example.org/ns#a3031> . +<http://example.org/ns#a3032> <http://example.org/ns#a3032> <http://example.org/ns#a3032> . +<http://example.org/ns#a3033> <http://example.org/ns#a3033> <http://example.org/ns#a3033> . +<http://example.org/ns#a3034> <http://example.org/ns#a3034> <http://example.org/ns#a3034> . +<http://example.org/ns#a3035> <http://example.org/ns#a3035> <http://example.org/ns#a3035> . +<http://example.org/ns#a3036> <http://example.org/ns#a3036> <http://example.org/ns#a3036> . +<http://example.org/ns#a3037> <http://example.org/ns#a3037> <http://example.org/ns#a3037> . +<http://example.org/ns#a3038> <http://example.org/ns#a3038> <http://example.org/ns#a3038> . +<http://example.org/ns#a3039> <http://example.org/ns#a3039> <http://example.org/ns#a3039> . +<http://example.org/ns#a3040> <http://example.org/ns#a3040> <http://example.org/ns#a3040> . +<http://example.org/ns#a3041> <http://example.org/ns#a3041> <http://example.org/ns#a3041> . +<http://example.org/ns#a3042> <http://example.org/ns#a3042> <http://example.org/ns#a3042> . +<http://example.org/ns#a3043> <http://example.org/ns#a3043> <http://example.org/ns#a3043> . +<http://example.org/ns#a3044> <http://example.org/ns#a3044> <http://example.org/ns#a3044> . +<http://example.org/ns#a3045> <http://example.org/ns#a3045> <http://example.org/ns#a3045> . +<http://example.org/ns#a3046> <http://example.org/ns#a3046> <http://example.org/ns#a3046> . +<http://example.org/ns#a3047> <http://example.org/ns#a3047> <http://example.org/ns#a3047> . +<http://example.org/ns#a3048> <http://example.org/ns#a3048> <http://example.org/ns#a3048> . +<http://example.org/ns#a3049> <http://example.org/ns#a3049> <http://example.org/ns#a3049> . +<http://example.org/ns#a3050> <http://example.org/ns#a3050> <http://example.org/ns#a3050> . +<http://example.org/ns#a3051> <http://example.org/ns#a3051> <http://example.org/ns#a3051> . +<http://example.org/ns#a3052> <http://example.org/ns#a3052> <http://example.org/ns#a3052> . +<http://example.org/ns#a3053> <http://example.org/ns#a3053> <http://example.org/ns#a3053> . +<http://example.org/ns#a3054> <http://example.org/ns#a3054> <http://example.org/ns#a3054> . +<http://example.org/ns#a3055> <http://example.org/ns#a3055> <http://example.org/ns#a3055> . +<http://example.org/ns#a3056> <http://example.org/ns#a3056> <http://example.org/ns#a3056> . +<http://example.org/ns#a3057> <http://example.org/ns#a3057> <http://example.org/ns#a3057> . +<http://example.org/ns#a3058> <http://example.org/ns#a3058> <http://example.org/ns#a3058> . +<http://example.org/ns#a3059> <http://example.org/ns#a3059> <http://example.org/ns#a3059> . +<http://example.org/ns#a3060> <http://example.org/ns#a3060> <http://example.org/ns#a3060> . +<http://example.org/ns#a3061> <http://example.org/ns#a3061> <http://example.org/ns#a3061> . +<http://example.org/ns#a3062> <http://example.org/ns#a3062> <http://example.org/ns#a3062> . +<http://example.org/ns#a3063> <http://example.org/ns#a3063> <http://example.org/ns#a3063> . +<http://example.org/ns#a3064> <http://example.org/ns#a3064> <http://example.org/ns#a3064> . +<http://example.org/ns#a3065> <http://example.org/ns#a3065> <http://example.org/ns#a3065> . +<http://example.org/ns#a3066> <http://example.org/ns#a3066> <http://example.org/ns#a3066> . +<http://example.org/ns#a3067> <http://example.org/ns#a3067> <http://example.org/ns#a3067> . +<http://example.org/ns#a3068> <http://example.org/ns#a3068> <http://example.org/ns#a3068> . +<http://example.org/ns#a3069> <http://example.org/ns#a3069> <http://example.org/ns#a3069> . +<http://example.org/ns#a3070> <http://example.org/ns#a3070> <http://example.org/ns#a3070> . +<http://example.org/ns#a3071> <http://example.org/ns#a3071> <http://example.org/ns#a3071> . +<http://example.org/ns#a3072> <http://example.org/ns#a3072> <http://example.org/ns#a3072> . +<http://example.org/ns#a3073> <http://example.org/ns#a3073> <http://example.org/ns#a3073> . +<http://example.org/ns#a3074> <http://example.org/ns#a3074> <http://example.org/ns#a3074> . +<http://example.org/ns#a3075> <http://example.org/ns#a3075> <http://example.org/ns#a3075> . +<http://example.org/ns#a3076> <http://example.org/ns#a3076> <http://example.org/ns#a3076> . +<http://example.org/ns#a3077> <http://example.org/ns#a3077> <http://example.org/ns#a3077> . +<http://example.org/ns#a3078> <http://example.org/ns#a3078> <http://example.org/ns#a3078> . +<http://example.org/ns#a3079> <http://example.org/ns#a3079> <http://example.org/ns#a3079> . +<http://example.org/ns#a3080> <http://example.org/ns#a3080> <http://example.org/ns#a3080> . +<http://example.org/ns#a3081> <http://example.org/ns#a3081> <http://example.org/ns#a3081> . +<http://example.org/ns#a3082> <http://example.org/ns#a3082> <http://example.org/ns#a3082> . +<http://example.org/ns#a3083> <http://example.org/ns#a3083> <http://example.org/ns#a3083> . +<http://example.org/ns#a3084> <http://example.org/ns#a3084> <http://example.org/ns#a3084> . +<http://example.org/ns#a3085> <http://example.org/ns#a3085> <http://example.org/ns#a3085> . +<http://example.org/ns#a3086> <http://example.org/ns#a3086> <http://example.org/ns#a3086> . +<http://example.org/ns#a3087> <http://example.org/ns#a3087> <http://example.org/ns#a3087> . +<http://example.org/ns#a3088> <http://example.org/ns#a3088> <http://example.org/ns#a3088> . +<http://example.org/ns#a3089> <http://example.org/ns#a3089> <http://example.org/ns#a3089> . +<http://example.org/ns#a3090> <http://example.org/ns#a3090> <http://example.org/ns#a3090> . +<http://example.org/ns#a3091> <http://example.org/ns#a3091> <http://example.org/ns#a3091> . +<http://example.org/ns#a3092> <http://example.org/ns#a3092> <http://example.org/ns#a3092> . +<http://example.org/ns#a3093> <http://example.org/ns#a3093> <http://example.org/ns#a3093> . +<http://example.org/ns#a3094> <http://example.org/ns#a3094> <http://example.org/ns#a3094> . +<http://example.org/ns#a3095> <http://example.org/ns#a3095> <http://example.org/ns#a3095> . +<http://example.org/ns#a3096> <http://example.org/ns#a3096> <http://example.org/ns#a3096> . +<http://example.org/ns#a3097> <http://example.org/ns#a3097> <http://example.org/ns#a3097> . +<http://example.org/ns#a3098> <http://example.org/ns#a3098> <http://example.org/ns#a3098> . +<http://example.org/ns#a3099> <http://example.org/ns#a3099> <http://example.org/ns#a3099> . +<http://example.org/ns#a3100> <http://example.org/ns#a3100> <http://example.org/ns#a3100> . +<http://example.org/ns#a3101> <http://example.org/ns#a3101> <http://example.org/ns#a3101> . +<http://example.org/ns#a3102> <http://example.org/ns#a3102> <http://example.org/ns#a3102> . +<http://example.org/ns#a3103> <http://example.org/ns#a3103> <http://example.org/ns#a3103> . +<http://example.org/ns#a3104> <http://example.org/ns#a3104> <http://example.org/ns#a3104> . +<http://example.org/ns#a3105> <http://example.org/ns#a3105> <http://example.org/ns#a3105> . +<http://example.org/ns#a3106> <http://example.org/ns#a3106> <http://example.org/ns#a3106> . +<http://example.org/ns#a3107> <http://example.org/ns#a3107> <http://example.org/ns#a3107> . +<http://example.org/ns#a3108> <http://example.org/ns#a3108> <http://example.org/ns#a3108> . +<http://example.org/ns#a3109> <http://example.org/ns#a3109> <http://example.org/ns#a3109> . +<http://example.org/ns#a3110> <http://example.org/ns#a3110> <http://example.org/ns#a3110> . +<http://example.org/ns#a3111> <http://example.org/ns#a3111> <http://example.org/ns#a3111> . +<http://example.org/ns#a3112> <http://example.org/ns#a3112> <http://example.org/ns#a3112> . +<http://example.org/ns#a3113> <http://example.org/ns#a3113> <http://example.org/ns#a3113> . +<http://example.org/ns#a3114> <http://example.org/ns#a3114> <http://example.org/ns#a3114> . +<http://example.org/ns#a3115> <http://example.org/ns#a3115> <http://example.org/ns#a3115> . +<http://example.org/ns#a3116> <http://example.org/ns#a3116> <http://example.org/ns#a3116> . +<http://example.org/ns#a3117> <http://example.org/ns#a3117> <http://example.org/ns#a3117> . +<http://example.org/ns#a3118> <http://example.org/ns#a3118> <http://example.org/ns#a3118> . +<http://example.org/ns#a3119> <http://example.org/ns#a3119> <http://example.org/ns#a3119> . +<http://example.org/ns#a3120> <http://example.org/ns#a3120> <http://example.org/ns#a3120> . +<http://example.org/ns#a3121> <http://example.org/ns#a3121> <http://example.org/ns#a3121> . +<http://example.org/ns#a3122> <http://example.org/ns#a3122> <http://example.org/ns#a3122> . +<http://example.org/ns#a3123> <http://example.org/ns#a3123> <http://example.org/ns#a3123> . +<http://example.org/ns#a3124> <http://example.org/ns#a3124> <http://example.org/ns#a3124> . +<http://example.org/ns#a3125> <http://example.org/ns#a3125> <http://example.org/ns#a3125> . +<http://example.org/ns#a3126> <http://example.org/ns#a3126> <http://example.org/ns#a3126> . +<http://example.org/ns#a3127> <http://example.org/ns#a3127> <http://example.org/ns#a3127> . +<http://example.org/ns#a3128> <http://example.org/ns#a3128> <http://example.org/ns#a3128> . +<http://example.org/ns#a3129> <http://example.org/ns#a3129> <http://example.org/ns#a3129> . +<http://example.org/ns#a3130> <http://example.org/ns#a3130> <http://example.org/ns#a3130> . +<http://example.org/ns#a3131> <http://example.org/ns#a3131> <http://example.org/ns#a3131> . +<http://example.org/ns#a3132> <http://example.org/ns#a3132> <http://example.org/ns#a3132> . +<http://example.org/ns#a3133> <http://example.org/ns#a3133> <http://example.org/ns#a3133> . +<http://example.org/ns#a3134> <http://example.org/ns#a3134> <http://example.org/ns#a3134> . +<http://example.org/ns#a3135> <http://example.org/ns#a3135> <http://example.org/ns#a3135> . +<http://example.org/ns#a3136> <http://example.org/ns#a3136> <http://example.org/ns#a3136> . +<http://example.org/ns#a3137> <http://example.org/ns#a3137> <http://example.org/ns#a3137> . +<http://example.org/ns#a3138> <http://example.org/ns#a3138> <http://example.org/ns#a3138> . +<http://example.org/ns#a3139> <http://example.org/ns#a3139> <http://example.org/ns#a3139> . +<http://example.org/ns#a3140> <http://example.org/ns#a3140> <http://example.org/ns#a3140> . +<http://example.org/ns#a3141> <http://example.org/ns#a3141> <http://example.org/ns#a3141> . +<http://example.org/ns#a3142> <http://example.org/ns#a3142> <http://example.org/ns#a3142> . +<http://example.org/ns#a3143> <http://example.org/ns#a3143> <http://example.org/ns#a3143> . +<http://example.org/ns#a3144> <http://example.org/ns#a3144> <http://example.org/ns#a3144> . +<http://example.org/ns#a3145> <http://example.org/ns#a3145> <http://example.org/ns#a3145> . +<http://example.org/ns#a3146> <http://example.org/ns#a3146> <http://example.org/ns#a3146> . +<http://example.org/ns#a3147> <http://example.org/ns#a3147> <http://example.org/ns#a3147> . +<http://example.org/ns#a3148> <http://example.org/ns#a3148> <http://example.org/ns#a3148> . +<http://example.org/ns#a3149> <http://example.org/ns#a3149> <http://example.org/ns#a3149> . +<http://example.org/ns#a3150> <http://example.org/ns#a3150> <http://example.org/ns#a3150> . +<http://example.org/ns#a3151> <http://example.org/ns#a3151> <http://example.org/ns#a3151> . +<http://example.org/ns#a3152> <http://example.org/ns#a3152> <http://example.org/ns#a3152> . +<http://example.org/ns#a3153> <http://example.org/ns#a3153> <http://example.org/ns#a3153> . +<http://example.org/ns#a3154> <http://example.org/ns#a3154> <http://example.org/ns#a3154> . +<http://example.org/ns#a3155> <http://example.org/ns#a3155> <http://example.org/ns#a3155> . +<http://example.org/ns#a3156> <http://example.org/ns#a3156> <http://example.org/ns#a3156> . +<http://example.org/ns#a3157> <http://example.org/ns#a3157> <http://example.org/ns#a3157> . +<http://example.org/ns#a3158> <http://example.org/ns#a3158> <http://example.org/ns#a3158> . +<http://example.org/ns#a3159> <http://example.org/ns#a3159> <http://example.org/ns#a3159> . +<http://example.org/ns#a3160> <http://example.org/ns#a3160> <http://example.org/ns#a3160> . +<http://example.org/ns#a3161> <http://example.org/ns#a3161> <http://example.org/ns#a3161> . +<http://example.org/ns#a3162> <http://example.org/ns#a3162> <http://example.org/ns#a3162> . +<http://example.org/ns#a3163> <http://example.org/ns#a3163> <http://example.org/ns#a3163> . +<http://example.org/ns#a3164> <http://example.org/ns#a3164> <http://example.org/ns#a3164> . +<http://example.org/ns#a3165> <http://example.org/ns#a3165> <http://example.org/ns#a3165> . +<http://example.org/ns#a3166> <http://example.org/ns#a3166> <http://example.org/ns#a3166> . +<http://example.org/ns#a3167> <http://example.org/ns#a3167> <http://example.org/ns#a3167> . +<http://example.org/ns#a3168> <http://example.org/ns#a3168> <http://example.org/ns#a3168> . +<http://example.org/ns#a3169> <http://example.org/ns#a3169> <http://example.org/ns#a3169> . +<http://example.org/ns#a3170> <http://example.org/ns#a3170> <http://example.org/ns#a3170> . +<http://example.org/ns#a3171> <http://example.org/ns#a3171> <http://example.org/ns#a3171> . +<http://example.org/ns#a3172> <http://example.org/ns#a3172> <http://example.org/ns#a3172> . +<http://example.org/ns#a3173> <http://example.org/ns#a3173> <http://example.org/ns#a3173> . +<http://example.org/ns#a3174> <http://example.org/ns#a3174> <http://example.org/ns#a3174> . +<http://example.org/ns#a3175> <http://example.org/ns#a3175> <http://example.org/ns#a3175> . +<http://example.org/ns#a3176> <http://example.org/ns#a3176> <http://example.org/ns#a3176> . +<http://example.org/ns#a3177> <http://example.org/ns#a3177> <http://example.org/ns#a3177> . +<http://example.org/ns#a3178> <http://example.org/ns#a3178> <http://example.org/ns#a3178> . +<http://example.org/ns#a3179> <http://example.org/ns#a3179> <http://example.org/ns#a3179> . +<http://example.org/ns#a3180> <http://example.org/ns#a3180> <http://example.org/ns#a3180> . +<http://example.org/ns#a3181> <http://example.org/ns#a3181> <http://example.org/ns#a3181> . +<http://example.org/ns#a3182> <http://example.org/ns#a3182> <http://example.org/ns#a3182> . +<http://example.org/ns#a3183> <http://example.org/ns#a3183> <http://example.org/ns#a3183> . +<http://example.org/ns#a3184> <http://example.org/ns#a3184> <http://example.org/ns#a3184> . +<http://example.org/ns#a3185> <http://example.org/ns#a3185> <http://example.org/ns#a3185> . +<http://example.org/ns#a3186> <http://example.org/ns#a3186> <http://example.org/ns#a3186> . +<http://example.org/ns#a3187> <http://example.org/ns#a3187> <http://example.org/ns#a3187> . +<http://example.org/ns#a3188> <http://example.org/ns#a3188> <http://example.org/ns#a3188> . +<http://example.org/ns#a3189> <http://example.org/ns#a3189> <http://example.org/ns#a3189> . +<http://example.org/ns#a3190> <http://example.org/ns#a3190> <http://example.org/ns#a3190> . +<http://example.org/ns#a3191> <http://example.org/ns#a3191> <http://example.org/ns#a3191> . +<http://example.org/ns#a3192> <http://example.org/ns#a3192> <http://example.org/ns#a3192> . +<http://example.org/ns#a3193> <http://example.org/ns#a3193> <http://example.org/ns#a3193> . +<http://example.org/ns#a3194> <http://example.org/ns#a3194> <http://example.org/ns#a3194> . +<http://example.org/ns#a3195> <http://example.org/ns#a3195> <http://example.org/ns#a3195> . +<http://example.org/ns#a3196> <http://example.org/ns#a3196> <http://example.org/ns#a3196> . +<http://example.org/ns#a3197> <http://example.org/ns#a3197> <http://example.org/ns#a3197> . +<http://example.org/ns#a3198> <http://example.org/ns#a3198> <http://example.org/ns#a3198> . +<http://example.org/ns#a3199> <http://example.org/ns#a3199> <http://example.org/ns#a3199> . +<http://example.org/ns#a3200> <http://example.org/ns#a3200> <http://example.org/ns#a3200> . +<http://example.org/ns#a3201> <http://example.org/ns#a3201> <http://example.org/ns#a3201> . +<http://example.org/ns#a3202> <http://example.org/ns#a3202> <http://example.org/ns#a3202> . +<http://example.org/ns#a3203> <http://example.org/ns#a3203> <http://example.org/ns#a3203> . +<http://example.org/ns#a3204> <http://example.org/ns#a3204> <http://example.org/ns#a3204> . +<http://example.org/ns#a3205> <http://example.org/ns#a3205> <http://example.org/ns#a3205> . +<http://example.org/ns#a3206> <http://example.org/ns#a3206> <http://example.org/ns#a3206> . +<http://example.org/ns#a3207> <http://example.org/ns#a3207> <http://example.org/ns#a3207> . +<http://example.org/ns#a3208> <http://example.org/ns#a3208> <http://example.org/ns#a3208> . +<http://example.org/ns#a3209> <http://example.org/ns#a3209> <http://example.org/ns#a3209> . +<http://example.org/ns#a3210> <http://example.org/ns#a3210> <http://example.org/ns#a3210> . +<http://example.org/ns#a3211> <http://example.org/ns#a3211> <http://example.org/ns#a3211> . +<http://example.org/ns#a3212> <http://example.org/ns#a3212> <http://example.org/ns#a3212> . +<http://example.org/ns#a3213> <http://example.org/ns#a3213> <http://example.org/ns#a3213> . +<http://example.org/ns#a3214> <http://example.org/ns#a3214> <http://example.org/ns#a3214> . +<http://example.org/ns#a3215> <http://example.org/ns#a3215> <http://example.org/ns#a3215> . +<http://example.org/ns#a3216> <http://example.org/ns#a3216> <http://example.org/ns#a3216> . +<http://example.org/ns#a3217> <http://example.org/ns#a3217> <http://example.org/ns#a3217> . +<http://example.org/ns#a3218> <http://example.org/ns#a3218> <http://example.org/ns#a3218> . +<http://example.org/ns#a3219> <http://example.org/ns#a3219> <http://example.org/ns#a3219> . +<http://example.org/ns#a3220> <http://example.org/ns#a3220> <http://example.org/ns#a3220> . +<http://example.org/ns#a3221> <http://example.org/ns#a3221> <http://example.org/ns#a3221> . +<http://example.org/ns#a3222> <http://example.org/ns#a3222> <http://example.org/ns#a3222> . +<http://example.org/ns#a3223> <http://example.org/ns#a3223> <http://example.org/ns#a3223> . +<http://example.org/ns#a3224> <http://example.org/ns#a3224> <http://example.org/ns#a3224> . +<http://example.org/ns#a3225> <http://example.org/ns#a3225> <http://example.org/ns#a3225> . +<http://example.org/ns#a3226> <http://example.org/ns#a3226> <http://example.org/ns#a3226> . +<http://example.org/ns#a3227> <http://example.org/ns#a3227> <http://example.org/ns#a3227> . +<http://example.org/ns#a3228> <http://example.org/ns#a3228> <http://example.org/ns#a3228> . +<http://example.org/ns#a3229> <http://example.org/ns#a3229> <http://example.org/ns#a3229> . +<http://example.org/ns#a3230> <http://example.org/ns#a3230> <http://example.org/ns#a3230> . +<http://example.org/ns#a3231> <http://example.org/ns#a3231> <http://example.org/ns#a3231> . +<http://example.org/ns#a3232> <http://example.org/ns#a3232> <http://example.org/ns#a3232> . +<http://example.org/ns#a3233> <http://example.org/ns#a3233> <http://example.org/ns#a3233> . +<http://example.org/ns#a3234> <http://example.org/ns#a3234> <http://example.org/ns#a3234> . +<http://example.org/ns#a3235> <http://example.org/ns#a3235> <http://example.org/ns#a3235> . +<http://example.org/ns#a3236> <http://example.org/ns#a3236> <http://example.org/ns#a3236> . +<http://example.org/ns#a3237> <http://example.org/ns#a3237> <http://example.org/ns#a3237> . +<http://example.org/ns#a3238> <http://example.org/ns#a3238> <http://example.org/ns#a3238> . +<http://example.org/ns#a3239> <http://example.org/ns#a3239> <http://example.org/ns#a3239> . +<http://example.org/ns#a3240> <http://example.org/ns#a3240> <http://example.org/ns#a3240> . +<http://example.org/ns#a3241> <http://example.org/ns#a3241> <http://example.org/ns#a3241> . +<http://example.org/ns#a3242> <http://example.org/ns#a3242> <http://example.org/ns#a3242> . +<http://example.org/ns#a3243> <http://example.org/ns#a3243> <http://example.org/ns#a3243> . +<http://example.org/ns#a3244> <http://example.org/ns#a3244> <http://example.org/ns#a3244> . +<http://example.org/ns#a3245> <http://example.org/ns#a3245> <http://example.org/ns#a3245> . +<http://example.org/ns#a3246> <http://example.org/ns#a3246> <http://example.org/ns#a3246> . +<http://example.org/ns#a3247> <http://example.org/ns#a3247> <http://example.org/ns#a3247> . +<http://example.org/ns#a3248> <http://example.org/ns#a3248> <http://example.org/ns#a3248> . +<http://example.org/ns#a3249> <http://example.org/ns#a3249> <http://example.org/ns#a3249> . +<http://example.org/ns#a3250> <http://example.org/ns#a3250> <http://example.org/ns#a3250> . +<http://example.org/ns#a3251> <http://example.org/ns#a3251> <http://example.org/ns#a3251> . +<http://example.org/ns#a3252> <http://example.org/ns#a3252> <http://example.org/ns#a3252> . +<http://example.org/ns#a3253> <http://example.org/ns#a3253> <http://example.org/ns#a3253> . +<http://example.org/ns#a3254> <http://example.org/ns#a3254> <http://example.org/ns#a3254> . +<http://example.org/ns#a3255> <http://example.org/ns#a3255> <http://example.org/ns#a3255> . +<http://example.org/ns#a3256> <http://example.org/ns#a3256> <http://example.org/ns#a3256> . +<http://example.org/ns#a3257> <http://example.org/ns#a3257> <http://example.org/ns#a3257> . +<http://example.org/ns#a3258> <http://example.org/ns#a3258> <http://example.org/ns#a3258> . +<http://example.org/ns#a3259> <http://example.org/ns#a3259> <http://example.org/ns#a3259> . +<http://example.org/ns#a3260> <http://example.org/ns#a3260> <http://example.org/ns#a3260> . +<http://example.org/ns#a3261> <http://example.org/ns#a3261> <http://example.org/ns#a3261> . +<http://example.org/ns#a3262> <http://example.org/ns#a3262> <http://example.org/ns#a3262> . +<http://example.org/ns#a3263> <http://example.org/ns#a3263> <http://example.org/ns#a3263> . +<http://example.org/ns#a3264> <http://example.org/ns#a3264> <http://example.org/ns#a3264> . +<http://example.org/ns#a3265> <http://example.org/ns#a3265> <http://example.org/ns#a3265> . +<http://example.org/ns#a3266> <http://example.org/ns#a3266> <http://example.org/ns#a3266> . +<http://example.org/ns#a3267> <http://example.org/ns#a3267> <http://example.org/ns#a3267> . +<http://example.org/ns#a3268> <http://example.org/ns#a3268> <http://example.org/ns#a3268> . +<http://example.org/ns#a3269> <http://example.org/ns#a3269> <http://example.org/ns#a3269> . +<http://example.org/ns#a3270> <http://example.org/ns#a3270> <http://example.org/ns#a3270> . +<http://example.org/ns#a3271> <http://example.org/ns#a3271> <http://example.org/ns#a3271> . +<http://example.org/ns#a3272> <http://example.org/ns#a3272> <http://example.org/ns#a3272> . +<http://example.org/ns#a3273> <http://example.org/ns#a3273> <http://example.org/ns#a3273> . +<http://example.org/ns#a3274> <http://example.org/ns#a3274> <http://example.org/ns#a3274> . +<http://example.org/ns#a3275> <http://example.org/ns#a3275> <http://example.org/ns#a3275> . +<http://example.org/ns#a3276> <http://example.org/ns#a3276> <http://example.org/ns#a3276> . +<http://example.org/ns#a3277> <http://example.org/ns#a3277> <http://example.org/ns#a3277> . +<http://example.org/ns#a3278> <http://example.org/ns#a3278> <http://example.org/ns#a3278> . +<http://example.org/ns#a3279> <http://example.org/ns#a3279> <http://example.org/ns#a3279> . +<http://example.org/ns#a3280> <http://example.org/ns#a3280> <http://example.org/ns#a3280> . +<http://example.org/ns#a3281> <http://example.org/ns#a3281> <http://example.org/ns#a3281> . +<http://example.org/ns#a3282> <http://example.org/ns#a3282> <http://example.org/ns#a3282> . +<http://example.org/ns#a3283> <http://example.org/ns#a3283> <http://example.org/ns#a3283> . +<http://example.org/ns#a3284> <http://example.org/ns#a3284> <http://example.org/ns#a3284> . +<http://example.org/ns#a3285> <http://example.org/ns#a3285> <http://example.org/ns#a3285> . +<http://example.org/ns#a3286> <http://example.org/ns#a3286> <http://example.org/ns#a3286> . +<http://example.org/ns#a3287> <http://example.org/ns#a3287> <http://example.org/ns#a3287> . +<http://example.org/ns#a3288> <http://example.org/ns#a3288> <http://example.org/ns#a3288> . +<http://example.org/ns#a3289> <http://example.org/ns#a3289> <http://example.org/ns#a3289> . +<http://example.org/ns#a3290> <http://example.org/ns#a3290> <http://example.org/ns#a3290> . +<http://example.org/ns#a3291> <http://example.org/ns#a3291> <http://example.org/ns#a3291> . +<http://example.org/ns#a3292> <http://example.org/ns#a3292> <http://example.org/ns#a3292> . +<http://example.org/ns#a3293> <http://example.org/ns#a3293> <http://example.org/ns#a3293> . +<http://example.org/ns#a3294> <http://example.org/ns#a3294> <http://example.org/ns#a3294> . +<http://example.org/ns#a3295> <http://example.org/ns#a3295> <http://example.org/ns#a3295> . +<http://example.org/ns#a3296> <http://example.org/ns#a3296> <http://example.org/ns#a3296> . +<http://example.org/ns#a3297> <http://example.org/ns#a3297> <http://example.org/ns#a3297> . +<http://example.org/ns#a3298> <http://example.org/ns#a3298> <http://example.org/ns#a3298> . +<http://example.org/ns#a3299> <http://example.org/ns#a3299> <http://example.org/ns#a3299> . +<http://example.org/ns#a3300> <http://example.org/ns#a3300> <http://example.org/ns#a3300> . +<http://example.org/ns#a3301> <http://example.org/ns#a3301> <http://example.org/ns#a3301> . +<http://example.org/ns#a3302> <http://example.org/ns#a3302> <http://example.org/ns#a3302> . +<http://example.org/ns#a3303> <http://example.org/ns#a3303> <http://example.org/ns#a3303> . +<http://example.org/ns#a3304> <http://example.org/ns#a3304> <http://example.org/ns#a3304> . +<http://example.org/ns#a3305> <http://example.org/ns#a3305> <http://example.org/ns#a3305> . +<http://example.org/ns#a3306> <http://example.org/ns#a3306> <http://example.org/ns#a3306> . +<http://example.org/ns#a3307> <http://example.org/ns#a3307> <http://example.org/ns#a3307> . +<http://example.org/ns#a3308> <http://example.org/ns#a3308> <http://example.org/ns#a3308> . +<http://example.org/ns#a3309> <http://example.org/ns#a3309> <http://example.org/ns#a3309> . +<http://example.org/ns#a3310> <http://example.org/ns#a3310> <http://example.org/ns#a3310> . +<http://example.org/ns#a3311> <http://example.org/ns#a3311> <http://example.org/ns#a3311> . +<http://example.org/ns#a3312> <http://example.org/ns#a3312> <http://example.org/ns#a3312> . +<http://example.org/ns#a3313> <http://example.org/ns#a3313> <http://example.org/ns#a3313> . +<http://example.org/ns#a3314> <http://example.org/ns#a3314> <http://example.org/ns#a3314> . +<http://example.org/ns#a3315> <http://example.org/ns#a3315> <http://example.org/ns#a3315> . +<http://example.org/ns#a3316> <http://example.org/ns#a3316> <http://example.org/ns#a3316> . +<http://example.org/ns#a3317> <http://example.org/ns#a3317> <http://example.org/ns#a3317> . +<http://example.org/ns#a3318> <http://example.org/ns#a3318> <http://example.org/ns#a3318> . +<http://example.org/ns#a3319> <http://example.org/ns#a3319> <http://example.org/ns#a3319> . +<http://example.org/ns#a3320> <http://example.org/ns#a3320> <http://example.org/ns#a3320> . +<http://example.org/ns#a3321> <http://example.org/ns#a3321> <http://example.org/ns#a3321> . +<http://example.org/ns#a3322> <http://example.org/ns#a3322> <http://example.org/ns#a3322> . +<http://example.org/ns#a3323> <http://example.org/ns#a3323> <http://example.org/ns#a3323> . +<http://example.org/ns#a3324> <http://example.org/ns#a3324> <http://example.org/ns#a3324> . +<http://example.org/ns#a3325> <http://example.org/ns#a3325> <http://example.org/ns#a3325> . +<http://example.org/ns#a3326> <http://example.org/ns#a3326> <http://example.org/ns#a3326> . +<http://example.org/ns#a3327> <http://example.org/ns#a3327> <http://example.org/ns#a3327> . +<http://example.org/ns#a3328> <http://example.org/ns#a3328> <http://example.org/ns#a3328> . +<http://example.org/ns#a3329> <http://example.org/ns#a3329> <http://example.org/ns#a3329> . +<http://example.org/ns#a3330> <http://example.org/ns#a3330> <http://example.org/ns#a3330> . +<http://example.org/ns#a3331> <http://example.org/ns#a3331> <http://example.org/ns#a3331> . +<http://example.org/ns#a3332> <http://example.org/ns#a3332> <http://example.org/ns#a3332> . +<http://example.org/ns#a3333> <http://example.org/ns#a3333> <http://example.org/ns#a3333> . +<http://example.org/ns#a3334> <http://example.org/ns#a3334> <http://example.org/ns#a3334> . +<http://example.org/ns#a3335> <http://example.org/ns#a3335> <http://example.org/ns#a3335> . +<http://example.org/ns#a3336> <http://example.org/ns#a3336> <http://example.org/ns#a3336> . +<http://example.org/ns#a3337> <http://example.org/ns#a3337> <http://example.org/ns#a3337> . +<http://example.org/ns#a3338> <http://example.org/ns#a3338> <http://example.org/ns#a3338> . +<http://example.org/ns#a3339> <http://example.org/ns#a3339> <http://example.org/ns#a3339> . +<http://example.org/ns#a3340> <http://example.org/ns#a3340> <http://example.org/ns#a3340> . +<http://example.org/ns#a3341> <http://example.org/ns#a3341> <http://example.org/ns#a3341> . +<http://example.org/ns#a3342> <http://example.org/ns#a3342> <http://example.org/ns#a3342> . +<http://example.org/ns#a3343> <http://example.org/ns#a3343> <http://example.org/ns#a3343> . +<http://example.org/ns#a3344> <http://example.org/ns#a3344> <http://example.org/ns#a3344> . +<http://example.org/ns#a3345> <http://example.org/ns#a3345> <http://example.org/ns#a3345> . +<http://example.org/ns#a3346> <http://example.org/ns#a3346> <http://example.org/ns#a3346> . +<http://example.org/ns#a3347> <http://example.org/ns#a3347> <http://example.org/ns#a3347> . +<http://example.org/ns#a3348> <http://example.org/ns#a3348> <http://example.org/ns#a3348> . +<http://example.org/ns#a3349> <http://example.org/ns#a3349> <http://example.org/ns#a3349> . +<http://example.org/ns#a3350> <http://example.org/ns#a3350> <http://example.org/ns#a3350> . +<http://example.org/ns#a3351> <http://example.org/ns#a3351> <http://example.org/ns#a3351> . +<http://example.org/ns#a3352> <http://example.org/ns#a3352> <http://example.org/ns#a3352> . +<http://example.org/ns#a3353> <http://example.org/ns#a3353> <http://example.org/ns#a3353> . +<http://example.org/ns#a3354> <http://example.org/ns#a3354> <http://example.org/ns#a3354> . +<http://example.org/ns#a3355> <http://example.org/ns#a3355> <http://example.org/ns#a3355> . +<http://example.org/ns#a3356> <http://example.org/ns#a3356> <http://example.org/ns#a3356> . +<http://example.org/ns#a3357> <http://example.org/ns#a3357> <http://example.org/ns#a3357> . +<http://example.org/ns#a3358> <http://example.org/ns#a3358> <http://example.org/ns#a3358> . +<http://example.org/ns#a3359> <http://example.org/ns#a3359> <http://example.org/ns#a3359> . +<http://example.org/ns#a3360> <http://example.org/ns#a3360> <http://example.org/ns#a3360> . +<http://example.org/ns#a3361> <http://example.org/ns#a3361> <http://example.org/ns#a3361> . +<http://example.org/ns#a3362> <http://example.org/ns#a3362> <http://example.org/ns#a3362> . +<http://example.org/ns#a3363> <http://example.org/ns#a3363> <http://example.org/ns#a3363> . +<http://example.org/ns#a3364> <http://example.org/ns#a3364> <http://example.org/ns#a3364> . +<http://example.org/ns#a3365> <http://example.org/ns#a3365> <http://example.org/ns#a3365> . +<http://example.org/ns#a3366> <http://example.org/ns#a3366> <http://example.org/ns#a3366> . +<http://example.org/ns#a3367> <http://example.org/ns#a3367> <http://example.org/ns#a3367> . +<http://example.org/ns#a3368> <http://example.org/ns#a3368> <http://example.org/ns#a3368> . +<http://example.org/ns#a3369> <http://example.org/ns#a3369> <http://example.org/ns#a3369> . +<http://example.org/ns#a3370> <http://example.org/ns#a3370> <http://example.org/ns#a3370> . +<http://example.org/ns#a3371> <http://example.org/ns#a3371> <http://example.org/ns#a3371> . +<http://example.org/ns#a3372> <http://example.org/ns#a3372> <http://example.org/ns#a3372> . +<http://example.org/ns#a3373> <http://example.org/ns#a3373> <http://example.org/ns#a3373> . +<http://example.org/ns#a3374> <http://example.org/ns#a3374> <http://example.org/ns#a3374> . +<http://example.org/ns#a3375> <http://example.org/ns#a3375> <http://example.org/ns#a3375> . +<http://example.org/ns#a3376> <http://example.org/ns#a3376> <http://example.org/ns#a3376> . +<http://example.org/ns#a3377> <http://example.org/ns#a3377> <http://example.org/ns#a3377> . +<http://example.org/ns#a3378> <http://example.org/ns#a3378> <http://example.org/ns#a3378> . +<http://example.org/ns#a3379> <http://example.org/ns#a3379> <http://example.org/ns#a3379> . +<http://example.org/ns#a3380> <http://example.org/ns#a3380> <http://example.org/ns#a3380> . +<http://example.org/ns#a3381> <http://example.org/ns#a3381> <http://example.org/ns#a3381> . +<http://example.org/ns#a3382> <http://example.org/ns#a3382> <http://example.org/ns#a3382> . +<http://example.org/ns#a3383> <http://example.org/ns#a3383> <http://example.org/ns#a3383> . +<http://example.org/ns#a3384> <http://example.org/ns#a3384> <http://example.org/ns#a3384> . +<http://example.org/ns#a3385> <http://example.org/ns#a3385> <http://example.org/ns#a3385> . +<http://example.org/ns#a3386> <http://example.org/ns#a3386> <http://example.org/ns#a3386> . +<http://example.org/ns#a3387> <http://example.org/ns#a3387> <http://example.org/ns#a3387> . +<http://example.org/ns#a3388> <http://example.org/ns#a3388> <http://example.org/ns#a3388> . +<http://example.org/ns#a3389> <http://example.org/ns#a3389> <http://example.org/ns#a3389> . +<http://example.org/ns#a3390> <http://example.org/ns#a3390> <http://example.org/ns#a3390> . +<http://example.org/ns#a3391> <http://example.org/ns#a3391> <http://example.org/ns#a3391> . +<http://example.org/ns#a3392> <http://example.org/ns#a3392> <http://example.org/ns#a3392> . +<http://example.org/ns#a3393> <http://example.org/ns#a3393> <http://example.org/ns#a3393> . +<http://example.org/ns#a3394> <http://example.org/ns#a3394> <http://example.org/ns#a3394> . +<http://example.org/ns#a3395> <http://example.org/ns#a3395> <http://example.org/ns#a3395> . +<http://example.org/ns#a3396> <http://example.org/ns#a3396> <http://example.org/ns#a3396> . +<http://example.org/ns#a3397> <http://example.org/ns#a3397> <http://example.org/ns#a3397> . +<http://example.org/ns#a3398> <http://example.org/ns#a3398> <http://example.org/ns#a3398> . +<http://example.org/ns#a3399> <http://example.org/ns#a3399> <http://example.org/ns#a3399> . +<http://example.org/ns#a3400> <http://example.org/ns#a3400> <http://example.org/ns#a3400> . +<http://example.org/ns#a3401> <http://example.org/ns#a3401> <http://example.org/ns#a3401> . +<http://example.org/ns#a3402> <http://example.org/ns#a3402> <http://example.org/ns#a3402> . +<http://example.org/ns#a3403> <http://example.org/ns#a3403> <http://example.org/ns#a3403> . +<http://example.org/ns#a3404> <http://example.org/ns#a3404> <http://example.org/ns#a3404> . +<http://example.org/ns#a3405> <http://example.org/ns#a3405> <http://example.org/ns#a3405> . +<http://example.org/ns#a3406> <http://example.org/ns#a3406> <http://example.org/ns#a3406> . +<http://example.org/ns#a3407> <http://example.org/ns#a3407> <http://example.org/ns#a3407> . +<http://example.org/ns#a3408> <http://example.org/ns#a3408> <http://example.org/ns#a3408> . +<http://example.org/ns#a3409> <http://example.org/ns#a3409> <http://example.org/ns#a3409> . +<http://example.org/ns#a3410> <http://example.org/ns#a3410> <http://example.org/ns#a3410> . +<http://example.org/ns#a3411> <http://example.org/ns#a3411> <http://example.org/ns#a3411> . +<http://example.org/ns#a3412> <http://example.org/ns#a3412> <http://example.org/ns#a3412> . +<http://example.org/ns#a3413> <http://example.org/ns#a3413> <http://example.org/ns#a3413> . +<http://example.org/ns#a3414> <http://example.org/ns#a3414> <http://example.org/ns#a3414> . +<http://example.org/ns#a3415> <http://example.org/ns#a3415> <http://example.org/ns#a3415> . +<http://example.org/ns#a3416> <http://example.org/ns#a3416> <http://example.org/ns#a3416> . +<http://example.org/ns#a3417> <http://example.org/ns#a3417> <http://example.org/ns#a3417> . +<http://example.org/ns#a3418> <http://example.org/ns#a3418> <http://example.org/ns#a3418> . +<http://example.org/ns#a3419> <http://example.org/ns#a3419> <http://example.org/ns#a3419> . +<http://example.org/ns#a3420> <http://example.org/ns#a3420> <http://example.org/ns#a3420> . +<http://example.org/ns#a3421> <http://example.org/ns#a3421> <http://example.org/ns#a3421> . +<http://example.org/ns#a3422> <http://example.org/ns#a3422> <http://example.org/ns#a3422> . +<http://example.org/ns#a3423> <http://example.org/ns#a3423> <http://example.org/ns#a3423> . +<http://example.org/ns#a3424> <http://example.org/ns#a3424> <http://example.org/ns#a3424> . +<http://example.org/ns#a3425> <http://example.org/ns#a3425> <http://example.org/ns#a3425> . +<http://example.org/ns#a3426> <http://example.org/ns#a3426> <http://example.org/ns#a3426> . +<http://example.org/ns#a3427> <http://example.org/ns#a3427> <http://example.org/ns#a3427> . +<http://example.org/ns#a3428> <http://example.org/ns#a3428> <http://example.org/ns#a3428> . +<http://example.org/ns#a3429> <http://example.org/ns#a3429> <http://example.org/ns#a3429> . +<http://example.org/ns#a3430> <http://example.org/ns#a3430> <http://example.org/ns#a3430> . +<http://example.org/ns#a3431> <http://example.org/ns#a3431> <http://example.org/ns#a3431> . +<http://example.org/ns#a3432> <http://example.org/ns#a3432> <http://example.org/ns#a3432> . +<http://example.org/ns#a3433> <http://example.org/ns#a3433> <http://example.org/ns#a3433> . +<http://example.org/ns#a3434> <http://example.org/ns#a3434> <http://example.org/ns#a3434> . +<http://example.org/ns#a3435> <http://example.org/ns#a3435> <http://example.org/ns#a3435> . +<http://example.org/ns#a3436> <http://example.org/ns#a3436> <http://example.org/ns#a3436> . +<http://example.org/ns#a3437> <http://example.org/ns#a3437> <http://example.org/ns#a3437> . +<http://example.org/ns#a3438> <http://example.org/ns#a3438> <http://example.org/ns#a3438> . +<http://example.org/ns#a3439> <http://example.org/ns#a3439> <http://example.org/ns#a3439> . +<http://example.org/ns#a3440> <http://example.org/ns#a3440> <http://example.org/ns#a3440> . +<http://example.org/ns#a3441> <http://example.org/ns#a3441> <http://example.org/ns#a3441> . +<http://example.org/ns#a3442> <http://example.org/ns#a3442> <http://example.org/ns#a3442> . +<http://example.org/ns#a3443> <http://example.org/ns#a3443> <http://example.org/ns#a3443> . +<http://example.org/ns#a3444> <http://example.org/ns#a3444> <http://example.org/ns#a3444> . +<http://example.org/ns#a3445> <http://example.org/ns#a3445> <http://example.org/ns#a3445> . +<http://example.org/ns#a3446> <http://example.org/ns#a3446> <http://example.org/ns#a3446> . +<http://example.org/ns#a3447> <http://example.org/ns#a3447> <http://example.org/ns#a3447> . +<http://example.org/ns#a3448> <http://example.org/ns#a3448> <http://example.org/ns#a3448> . +<http://example.org/ns#a3449> <http://example.org/ns#a3449> <http://example.org/ns#a3449> . +<http://example.org/ns#a3450> <http://example.org/ns#a3450> <http://example.org/ns#a3450> . +<http://example.org/ns#a3451> <http://example.org/ns#a3451> <http://example.org/ns#a3451> . +<http://example.org/ns#a3452> <http://example.org/ns#a3452> <http://example.org/ns#a3452> . +<http://example.org/ns#a3453> <http://example.org/ns#a3453> <http://example.org/ns#a3453> . +<http://example.org/ns#a3454> <http://example.org/ns#a3454> <http://example.org/ns#a3454> . +<http://example.org/ns#a3455> <http://example.org/ns#a3455> <http://example.org/ns#a3455> . +<http://example.org/ns#a3456> <http://example.org/ns#a3456> <http://example.org/ns#a3456> . +<http://example.org/ns#a3457> <http://example.org/ns#a3457> <http://example.org/ns#a3457> . +<http://example.org/ns#a3458> <http://example.org/ns#a3458> <http://example.org/ns#a3458> . +<http://example.org/ns#a3459> <http://example.org/ns#a3459> <http://example.org/ns#a3459> . +<http://example.org/ns#a3460> <http://example.org/ns#a3460> <http://example.org/ns#a3460> . +<http://example.org/ns#a3461> <http://example.org/ns#a3461> <http://example.org/ns#a3461> . +<http://example.org/ns#a3462> <http://example.org/ns#a3462> <http://example.org/ns#a3462> . +<http://example.org/ns#a3463> <http://example.org/ns#a3463> <http://example.org/ns#a3463> . +<http://example.org/ns#a3464> <http://example.org/ns#a3464> <http://example.org/ns#a3464> . +<http://example.org/ns#a3465> <http://example.org/ns#a3465> <http://example.org/ns#a3465> . +<http://example.org/ns#a3466> <http://example.org/ns#a3466> <http://example.org/ns#a3466> . +<http://example.org/ns#a3467> <http://example.org/ns#a3467> <http://example.org/ns#a3467> . +<http://example.org/ns#a3468> <http://example.org/ns#a3468> <http://example.org/ns#a3468> . +<http://example.org/ns#a3469> <http://example.org/ns#a3469> <http://example.org/ns#a3469> . +<http://example.org/ns#a3470> <http://example.org/ns#a3470> <http://example.org/ns#a3470> . +<http://example.org/ns#a3471> <http://example.org/ns#a3471> <http://example.org/ns#a3471> . +<http://example.org/ns#a3472> <http://example.org/ns#a3472> <http://example.org/ns#a3472> . +<http://example.org/ns#a3473> <http://example.org/ns#a3473> <http://example.org/ns#a3473> . +<http://example.org/ns#a3474> <http://example.org/ns#a3474> <http://example.org/ns#a3474> . +<http://example.org/ns#a3475> <http://example.org/ns#a3475> <http://example.org/ns#a3475> . +<http://example.org/ns#a3476> <http://example.org/ns#a3476> <http://example.org/ns#a3476> . +<http://example.org/ns#a3477> <http://example.org/ns#a3477> <http://example.org/ns#a3477> . +<http://example.org/ns#a3478> <http://example.org/ns#a3478> <http://example.org/ns#a3478> . +<http://example.org/ns#a3479> <http://example.org/ns#a3479> <http://example.org/ns#a3479> . +<http://example.org/ns#a3480> <http://example.org/ns#a3480> <http://example.org/ns#a3480> . +<http://example.org/ns#a3481> <http://example.org/ns#a3481> <http://example.org/ns#a3481> . +<http://example.org/ns#a3482> <http://example.org/ns#a3482> <http://example.org/ns#a3482> . +<http://example.org/ns#a3483> <http://example.org/ns#a3483> <http://example.org/ns#a3483> . +<http://example.org/ns#a3484> <http://example.org/ns#a3484> <http://example.org/ns#a3484> . +<http://example.org/ns#a3485> <http://example.org/ns#a3485> <http://example.org/ns#a3485> . +<http://example.org/ns#a3486> <http://example.org/ns#a3486> <http://example.org/ns#a3486> . +<http://example.org/ns#a3487> <http://example.org/ns#a3487> <http://example.org/ns#a3487> . +<http://example.org/ns#a3488> <http://example.org/ns#a3488> <http://example.org/ns#a3488> . +<http://example.org/ns#a3489> <http://example.org/ns#a3489> <http://example.org/ns#a3489> . +<http://example.org/ns#a3490> <http://example.org/ns#a3490> <http://example.org/ns#a3490> . +<http://example.org/ns#a3491> <http://example.org/ns#a3491> <http://example.org/ns#a3491> . +<http://example.org/ns#a3492> <http://example.org/ns#a3492> <http://example.org/ns#a3492> . +<http://example.org/ns#a3493> <http://example.org/ns#a3493> <http://example.org/ns#a3493> . +<http://example.org/ns#a3494> <http://example.org/ns#a3494> <http://example.org/ns#a3494> . +<http://example.org/ns#a3495> <http://example.org/ns#a3495> <http://example.org/ns#a3495> . +<http://example.org/ns#a3496> <http://example.org/ns#a3496> <http://example.org/ns#a3496> . +<http://example.org/ns#a3497> <http://example.org/ns#a3497> <http://example.org/ns#a3497> . +<http://example.org/ns#a3498> <http://example.org/ns#a3498> <http://example.org/ns#a3498> . +<http://example.org/ns#a3499> <http://example.org/ns#a3499> <http://example.org/ns#a3499> . +<http://example.org/ns#a3500> <http://example.org/ns#a3500> <http://example.org/ns#a3500> . +<http://example.org/ns#a3501> <http://example.org/ns#a3501> <http://example.org/ns#a3501> . +<http://example.org/ns#a3502> <http://example.org/ns#a3502> <http://example.org/ns#a3502> . +<http://example.org/ns#a3503> <http://example.org/ns#a3503> <http://example.org/ns#a3503> . +<http://example.org/ns#a3504> <http://example.org/ns#a3504> <http://example.org/ns#a3504> . +<http://example.org/ns#a3505> <http://example.org/ns#a3505> <http://example.org/ns#a3505> . +<http://example.org/ns#a3506> <http://example.org/ns#a3506> <http://example.org/ns#a3506> . +<http://example.org/ns#a3507> <http://example.org/ns#a3507> <http://example.org/ns#a3507> . +<http://example.org/ns#a3508> <http://example.org/ns#a3508> <http://example.org/ns#a3508> . +<http://example.org/ns#a3509> <http://example.org/ns#a3509> <http://example.org/ns#a3509> . +<http://example.org/ns#a3510> <http://example.org/ns#a3510> <http://example.org/ns#a3510> . +<http://example.org/ns#a3511> <http://example.org/ns#a3511> <http://example.org/ns#a3511> . +<http://example.org/ns#a3512> <http://example.org/ns#a3512> <http://example.org/ns#a3512> . +<http://example.org/ns#a3513> <http://example.org/ns#a3513> <http://example.org/ns#a3513> . +<http://example.org/ns#a3514> <http://example.org/ns#a3514> <http://example.org/ns#a3514> . +<http://example.org/ns#a3515> <http://example.org/ns#a3515> <http://example.org/ns#a3515> . +<http://example.org/ns#a3516> <http://example.org/ns#a3516> <http://example.org/ns#a3516> . +<http://example.org/ns#a3517> <http://example.org/ns#a3517> <http://example.org/ns#a3517> . +<http://example.org/ns#a3518> <http://example.org/ns#a3518> <http://example.org/ns#a3518> . +<http://example.org/ns#a3519> <http://example.org/ns#a3519> <http://example.org/ns#a3519> . +<http://example.org/ns#a3520> <http://example.org/ns#a3520> <http://example.org/ns#a3520> . +<http://example.org/ns#a3521> <http://example.org/ns#a3521> <http://example.org/ns#a3521> . +<http://example.org/ns#a3522> <http://example.org/ns#a3522> <http://example.org/ns#a3522> . +<http://example.org/ns#a3523> <http://example.org/ns#a3523> <http://example.org/ns#a3523> . +<http://example.org/ns#a3524> <http://example.org/ns#a3524> <http://example.org/ns#a3524> . +<http://example.org/ns#a3525> <http://example.org/ns#a3525> <http://example.org/ns#a3525> . +<http://example.org/ns#a3526> <http://example.org/ns#a3526> <http://example.org/ns#a3526> . +<http://example.org/ns#a3527> <http://example.org/ns#a3527> <http://example.org/ns#a3527> . +<http://example.org/ns#a3528> <http://example.org/ns#a3528> <http://example.org/ns#a3528> . +<http://example.org/ns#a3529> <http://example.org/ns#a3529> <http://example.org/ns#a3529> . +<http://example.org/ns#a3530> <http://example.org/ns#a3530> <http://example.org/ns#a3530> . +<http://example.org/ns#a3531> <http://example.org/ns#a3531> <http://example.org/ns#a3531> . +<http://example.org/ns#a3532> <http://example.org/ns#a3532> <http://example.org/ns#a3532> . +<http://example.org/ns#a3533> <http://example.org/ns#a3533> <http://example.org/ns#a3533> . +<http://example.org/ns#a3534> <http://example.org/ns#a3534> <http://example.org/ns#a3534> . +<http://example.org/ns#a3535> <http://example.org/ns#a3535> <http://example.org/ns#a3535> . +<http://example.org/ns#a3536> <http://example.org/ns#a3536> <http://example.org/ns#a3536> . +<http://example.org/ns#a3537> <http://example.org/ns#a3537> <http://example.org/ns#a3537> . +<http://example.org/ns#a3538> <http://example.org/ns#a3538> <http://example.org/ns#a3538> . +<http://example.org/ns#a3539> <http://example.org/ns#a3539> <http://example.org/ns#a3539> . +<http://example.org/ns#a3540> <http://example.org/ns#a3540> <http://example.org/ns#a3540> . +<http://example.org/ns#a3541> <http://example.org/ns#a3541> <http://example.org/ns#a3541> . +<http://example.org/ns#a3542> <http://example.org/ns#a3542> <http://example.org/ns#a3542> . +<http://example.org/ns#a3543> <http://example.org/ns#a3543> <http://example.org/ns#a3543> . +<http://example.org/ns#a3544> <http://example.org/ns#a3544> <http://example.org/ns#a3544> . +<http://example.org/ns#a3545> <http://example.org/ns#a3545> <http://example.org/ns#a3545> . +<http://example.org/ns#a3546> <http://example.org/ns#a3546> <http://example.org/ns#a3546> . +<http://example.org/ns#a3547> <http://example.org/ns#a3547> <http://example.org/ns#a3547> . +<http://example.org/ns#a3548> <http://example.org/ns#a3548> <http://example.org/ns#a3548> . +<http://example.org/ns#a3549> <http://example.org/ns#a3549> <http://example.org/ns#a3549> . +<http://example.org/ns#a3550> <http://example.org/ns#a3550> <http://example.org/ns#a3550> . +<http://example.org/ns#a3551> <http://example.org/ns#a3551> <http://example.org/ns#a3551> . +<http://example.org/ns#a3552> <http://example.org/ns#a3552> <http://example.org/ns#a3552> . +<http://example.org/ns#a3553> <http://example.org/ns#a3553> <http://example.org/ns#a3553> . +<http://example.org/ns#a3554> <http://example.org/ns#a3554> <http://example.org/ns#a3554> . +<http://example.org/ns#a3555> <http://example.org/ns#a3555> <http://example.org/ns#a3555> . +<http://example.org/ns#a3556> <http://example.org/ns#a3556> <http://example.org/ns#a3556> . +<http://example.org/ns#a3557> <http://example.org/ns#a3557> <http://example.org/ns#a3557> . +<http://example.org/ns#a3558> <http://example.org/ns#a3558> <http://example.org/ns#a3558> . +<http://example.org/ns#a3559> <http://example.org/ns#a3559> <http://example.org/ns#a3559> . +<http://example.org/ns#a3560> <http://example.org/ns#a3560> <http://example.org/ns#a3560> . +<http://example.org/ns#a3561> <http://example.org/ns#a3561> <http://example.org/ns#a3561> . +<http://example.org/ns#a3562> <http://example.org/ns#a3562> <http://example.org/ns#a3562> . +<http://example.org/ns#a3563> <http://example.org/ns#a3563> <http://example.org/ns#a3563> . +<http://example.org/ns#a3564> <http://example.org/ns#a3564> <http://example.org/ns#a3564> . +<http://example.org/ns#a3565> <http://example.org/ns#a3565> <http://example.org/ns#a3565> . +<http://example.org/ns#a3566> <http://example.org/ns#a3566> <http://example.org/ns#a3566> . +<http://example.org/ns#a3567> <http://example.org/ns#a3567> <http://example.org/ns#a3567> . +<http://example.org/ns#a3568> <http://example.org/ns#a3568> <http://example.org/ns#a3568> . +<http://example.org/ns#a3569> <http://example.org/ns#a3569> <http://example.org/ns#a3569> . +<http://example.org/ns#a3570> <http://example.org/ns#a3570> <http://example.org/ns#a3570> . +<http://example.org/ns#a3571> <http://example.org/ns#a3571> <http://example.org/ns#a3571> . +<http://example.org/ns#a3572> <http://example.org/ns#a3572> <http://example.org/ns#a3572> . +<http://example.org/ns#a3573> <http://example.org/ns#a3573> <http://example.org/ns#a3573> . +<http://example.org/ns#a3574> <http://example.org/ns#a3574> <http://example.org/ns#a3574> . +<http://example.org/ns#a3575> <http://example.org/ns#a3575> <http://example.org/ns#a3575> . +<http://example.org/ns#a3576> <http://example.org/ns#a3576> <http://example.org/ns#a3576> . +<http://example.org/ns#a3577> <http://example.org/ns#a3577> <http://example.org/ns#a3577> . +<http://example.org/ns#a3578> <http://example.org/ns#a3578> <http://example.org/ns#a3578> . +<http://example.org/ns#a3579> <http://example.org/ns#a3579> <http://example.org/ns#a3579> . +<http://example.org/ns#a3580> <http://example.org/ns#a3580> <http://example.org/ns#a3580> . +<http://example.org/ns#a3581> <http://example.org/ns#a3581> <http://example.org/ns#a3581> . +<http://example.org/ns#a3582> <http://example.org/ns#a3582> <http://example.org/ns#a3582> . +<http://example.org/ns#a3583> <http://example.org/ns#a3583> <http://example.org/ns#a3583> . +<http://example.org/ns#a3584> <http://example.org/ns#a3584> <http://example.org/ns#a3584> . +<http://example.org/ns#a3585> <http://example.org/ns#a3585> <http://example.org/ns#a3585> . +<http://example.org/ns#a3586> <http://example.org/ns#a3586> <http://example.org/ns#a3586> . +<http://example.org/ns#a3587> <http://example.org/ns#a3587> <http://example.org/ns#a3587> . +<http://example.org/ns#a3588> <http://example.org/ns#a3588> <http://example.org/ns#a3588> . +<http://example.org/ns#a3589> <http://example.org/ns#a3589> <http://example.org/ns#a3589> . +<http://example.org/ns#a3590> <http://example.org/ns#a3590> <http://example.org/ns#a3590> . +<http://example.org/ns#a3591> <http://example.org/ns#a3591> <http://example.org/ns#a3591> . +<http://example.org/ns#a3592> <http://example.org/ns#a3592> <http://example.org/ns#a3592> . +<http://example.org/ns#a3593> <http://example.org/ns#a3593> <http://example.org/ns#a3593> . +<http://example.org/ns#a3594> <http://example.org/ns#a3594> <http://example.org/ns#a3594> . +<http://example.org/ns#a3595> <http://example.org/ns#a3595> <http://example.org/ns#a3595> . +<http://example.org/ns#a3596> <http://example.org/ns#a3596> <http://example.org/ns#a3596> . +<http://example.org/ns#a3597> <http://example.org/ns#a3597> <http://example.org/ns#a3597> . +<http://example.org/ns#a3598> <http://example.org/ns#a3598> <http://example.org/ns#a3598> . +<http://example.org/ns#a3599> <http://example.org/ns#a3599> <http://example.org/ns#a3599> . +<http://example.org/ns#a3600> <http://example.org/ns#a3600> <http://example.org/ns#a3600> . +<http://example.org/ns#a3601> <http://example.org/ns#a3601> <http://example.org/ns#a3601> . +<http://example.org/ns#a3602> <http://example.org/ns#a3602> <http://example.org/ns#a3602> . +<http://example.org/ns#a3603> <http://example.org/ns#a3603> <http://example.org/ns#a3603> . +<http://example.org/ns#a3604> <http://example.org/ns#a3604> <http://example.org/ns#a3604> . +<http://example.org/ns#a3605> <http://example.org/ns#a3605> <http://example.org/ns#a3605> . +<http://example.org/ns#a3606> <http://example.org/ns#a3606> <http://example.org/ns#a3606> . +<http://example.org/ns#a3607> <http://example.org/ns#a3607> <http://example.org/ns#a3607> . +<http://example.org/ns#a3608> <http://example.org/ns#a3608> <http://example.org/ns#a3608> . +<http://example.org/ns#a3609> <http://example.org/ns#a3609> <http://example.org/ns#a3609> . +<http://example.org/ns#a3610> <http://example.org/ns#a3610> <http://example.org/ns#a3610> . +<http://example.org/ns#a3611> <http://example.org/ns#a3611> <http://example.org/ns#a3611> . +<http://example.org/ns#a3612> <http://example.org/ns#a3612> <http://example.org/ns#a3612> . +<http://example.org/ns#a3613> <http://example.org/ns#a3613> <http://example.org/ns#a3613> . +<http://example.org/ns#a3614> <http://example.org/ns#a3614> <http://example.org/ns#a3614> . +<http://example.org/ns#a3615> <http://example.org/ns#a3615> <http://example.org/ns#a3615> . +<http://example.org/ns#a3616> <http://example.org/ns#a3616> <http://example.org/ns#a3616> . +<http://example.org/ns#a3617> <http://example.org/ns#a3617> <http://example.org/ns#a3617> . +<http://example.org/ns#a3618> <http://example.org/ns#a3618> <http://example.org/ns#a3618> . +<http://example.org/ns#a3619> <http://example.org/ns#a3619> <http://example.org/ns#a3619> . +<http://example.org/ns#a3620> <http://example.org/ns#a3620> <http://example.org/ns#a3620> . +<http://example.org/ns#a3621> <http://example.org/ns#a3621> <http://example.org/ns#a3621> . +<http://example.org/ns#a3622> <http://example.org/ns#a3622> <http://example.org/ns#a3622> . +<http://example.org/ns#a3623> <http://example.org/ns#a3623> <http://example.org/ns#a3623> . +<http://example.org/ns#a3624> <http://example.org/ns#a3624> <http://example.org/ns#a3624> . +<http://example.org/ns#a3625> <http://example.org/ns#a3625> <http://example.org/ns#a3625> . +<http://example.org/ns#a3626> <http://example.org/ns#a3626> <http://example.org/ns#a3626> . +<http://example.org/ns#a3627> <http://example.org/ns#a3627> <http://example.org/ns#a3627> . +<http://example.org/ns#a3628> <http://example.org/ns#a3628> <http://example.org/ns#a3628> . +<http://example.org/ns#a3629> <http://example.org/ns#a3629> <http://example.org/ns#a3629> . +<http://example.org/ns#a3630> <http://example.org/ns#a3630> <http://example.org/ns#a3630> . +<http://example.org/ns#a3631> <http://example.org/ns#a3631> <http://example.org/ns#a3631> . +<http://example.org/ns#a3632> <http://example.org/ns#a3632> <http://example.org/ns#a3632> . +<http://example.org/ns#a3633> <http://example.org/ns#a3633> <http://example.org/ns#a3633> . +<http://example.org/ns#a3634> <http://example.org/ns#a3634> <http://example.org/ns#a3634> . +<http://example.org/ns#a3635> <http://example.org/ns#a3635> <http://example.org/ns#a3635> . +<http://example.org/ns#a3636> <http://example.org/ns#a3636> <http://example.org/ns#a3636> . +<http://example.org/ns#a3637> <http://example.org/ns#a3637> <http://example.org/ns#a3637> . +<http://example.org/ns#a3638> <http://example.org/ns#a3638> <http://example.org/ns#a3638> . +<http://example.org/ns#a3639> <http://example.org/ns#a3639> <http://example.org/ns#a3639> . +<http://example.org/ns#a3640> <http://example.org/ns#a3640> <http://example.org/ns#a3640> . +<http://example.org/ns#a3641> <http://example.org/ns#a3641> <http://example.org/ns#a3641> . +<http://example.org/ns#a3642> <http://example.org/ns#a3642> <http://example.org/ns#a3642> . +<http://example.org/ns#a3643> <http://example.org/ns#a3643> <http://example.org/ns#a3643> . +<http://example.org/ns#a3644> <http://example.org/ns#a3644> <http://example.org/ns#a3644> . +<http://example.org/ns#a3645> <http://example.org/ns#a3645> <http://example.org/ns#a3645> . +<http://example.org/ns#a3646> <http://example.org/ns#a3646> <http://example.org/ns#a3646> . +<http://example.org/ns#a3647> <http://example.org/ns#a3647> <http://example.org/ns#a3647> . +<http://example.org/ns#a3648> <http://example.org/ns#a3648> <http://example.org/ns#a3648> . +<http://example.org/ns#a3649> <http://example.org/ns#a3649> <http://example.org/ns#a3649> . +<http://example.org/ns#a3650> <http://example.org/ns#a3650> <http://example.org/ns#a3650> . +<http://example.org/ns#a3651> <http://example.org/ns#a3651> <http://example.org/ns#a3651> . +<http://example.org/ns#a3652> <http://example.org/ns#a3652> <http://example.org/ns#a3652> . +<http://example.org/ns#a3653> <http://example.org/ns#a3653> <http://example.org/ns#a3653> . +<http://example.org/ns#a3654> <http://example.org/ns#a3654> <http://example.org/ns#a3654> . +<http://example.org/ns#a3655> <http://example.org/ns#a3655> <http://example.org/ns#a3655> . +<http://example.org/ns#a3656> <http://example.org/ns#a3656> <http://example.org/ns#a3656> . +<http://example.org/ns#a3657> <http://example.org/ns#a3657> <http://example.org/ns#a3657> . +<http://example.org/ns#a3658> <http://example.org/ns#a3658> <http://example.org/ns#a3658> . +<http://example.org/ns#a3659> <http://example.org/ns#a3659> <http://example.org/ns#a3659> . +<http://example.org/ns#a3660> <http://example.org/ns#a3660> <http://example.org/ns#a3660> . +<http://example.org/ns#a3661> <http://example.org/ns#a3661> <http://example.org/ns#a3661> . +<http://example.org/ns#a3662> <http://example.org/ns#a3662> <http://example.org/ns#a3662> . +<http://example.org/ns#a3663> <http://example.org/ns#a3663> <http://example.org/ns#a3663> . +<http://example.org/ns#a3664> <http://example.org/ns#a3664> <http://example.org/ns#a3664> . +<http://example.org/ns#a3665> <http://example.org/ns#a3665> <http://example.org/ns#a3665> . +<http://example.org/ns#a3666> <http://example.org/ns#a3666> <http://example.org/ns#a3666> . +<http://example.org/ns#a3667> <http://example.org/ns#a3667> <http://example.org/ns#a3667> . +<http://example.org/ns#a3668> <http://example.org/ns#a3668> <http://example.org/ns#a3668> . +<http://example.org/ns#a3669> <http://example.org/ns#a3669> <http://example.org/ns#a3669> . +<http://example.org/ns#a3670> <http://example.org/ns#a3670> <http://example.org/ns#a3670> . +<http://example.org/ns#a3671> <http://example.org/ns#a3671> <http://example.org/ns#a3671> . +<http://example.org/ns#a3672> <http://example.org/ns#a3672> <http://example.org/ns#a3672> . +<http://example.org/ns#a3673> <http://example.org/ns#a3673> <http://example.org/ns#a3673> . +<http://example.org/ns#a3674> <http://example.org/ns#a3674> <http://example.org/ns#a3674> . +<http://example.org/ns#a3675> <http://example.org/ns#a3675> <http://example.org/ns#a3675> . +<http://example.org/ns#a3676> <http://example.org/ns#a3676> <http://example.org/ns#a3676> . +<http://example.org/ns#a3677> <http://example.org/ns#a3677> <http://example.org/ns#a3677> . +<http://example.org/ns#a3678> <http://example.org/ns#a3678> <http://example.org/ns#a3678> . +<http://example.org/ns#a3679> <http://example.org/ns#a3679> <http://example.org/ns#a3679> . +<http://example.org/ns#a3680> <http://example.org/ns#a3680> <http://example.org/ns#a3680> . +<http://example.org/ns#a3681> <http://example.org/ns#a3681> <http://example.org/ns#a3681> . +<http://example.org/ns#a3682> <http://example.org/ns#a3682> <http://example.org/ns#a3682> . +<http://example.org/ns#a3683> <http://example.org/ns#a3683> <http://example.org/ns#a3683> . +<http://example.org/ns#a3684> <http://example.org/ns#a3684> <http://example.org/ns#a3684> . +<http://example.org/ns#a3685> <http://example.org/ns#a3685> <http://example.org/ns#a3685> . +<http://example.org/ns#a3686> <http://example.org/ns#a3686> <http://example.org/ns#a3686> . +<http://example.org/ns#a3687> <http://example.org/ns#a3687> <http://example.org/ns#a3687> . +<http://example.org/ns#a3688> <http://example.org/ns#a3688> <http://example.org/ns#a3688> . +<http://example.org/ns#a3689> <http://example.org/ns#a3689> <http://example.org/ns#a3689> . +<http://example.org/ns#a3690> <http://example.org/ns#a3690> <http://example.org/ns#a3690> . +<http://example.org/ns#a3691> <http://example.org/ns#a3691> <http://example.org/ns#a3691> . +<http://example.org/ns#a3692> <http://example.org/ns#a3692> <http://example.org/ns#a3692> . +<http://example.org/ns#a3693> <http://example.org/ns#a3693> <http://example.org/ns#a3693> . +<http://example.org/ns#a3694> <http://example.org/ns#a3694> <http://example.org/ns#a3694> . +<http://example.org/ns#a3695> <http://example.org/ns#a3695> <http://example.org/ns#a3695> . +<http://example.org/ns#a3696> <http://example.org/ns#a3696> <http://example.org/ns#a3696> . +<http://example.org/ns#a3697> <http://example.org/ns#a3697> <http://example.org/ns#a3697> . +<http://example.org/ns#a3698> <http://example.org/ns#a3698> <http://example.org/ns#a3698> . +<http://example.org/ns#a3699> <http://example.org/ns#a3699> <http://example.org/ns#a3699> . +<http://example.org/ns#a3700> <http://example.org/ns#a3700> <http://example.org/ns#a3700> . +<http://example.org/ns#a3701> <http://example.org/ns#a3701> <http://example.org/ns#a3701> . +<http://example.org/ns#a3702> <http://example.org/ns#a3702> <http://example.org/ns#a3702> . +<http://example.org/ns#a3703> <http://example.org/ns#a3703> <http://example.org/ns#a3703> . +<http://example.org/ns#a3704> <http://example.org/ns#a3704> <http://example.org/ns#a3704> . +<http://example.org/ns#a3705> <http://example.org/ns#a3705> <http://example.org/ns#a3705> . +<http://example.org/ns#a3706> <http://example.org/ns#a3706> <http://example.org/ns#a3706> . +<http://example.org/ns#a3707> <http://example.org/ns#a3707> <http://example.org/ns#a3707> . +<http://example.org/ns#a3708> <http://example.org/ns#a3708> <http://example.org/ns#a3708> . +<http://example.org/ns#a3709> <http://example.org/ns#a3709> <http://example.org/ns#a3709> . +<http://example.org/ns#a3710> <http://example.org/ns#a3710> <http://example.org/ns#a3710> . +<http://example.org/ns#a3711> <http://example.org/ns#a3711> <http://example.org/ns#a3711> . +<http://example.org/ns#a3712> <http://example.org/ns#a3712> <http://example.org/ns#a3712> . +<http://example.org/ns#a3713> <http://example.org/ns#a3713> <http://example.org/ns#a3713> . +<http://example.org/ns#a3714> <http://example.org/ns#a3714> <http://example.org/ns#a3714> . +<http://example.org/ns#a3715> <http://example.org/ns#a3715> <http://example.org/ns#a3715> . +<http://example.org/ns#a3716> <http://example.org/ns#a3716> <http://example.org/ns#a3716> . +<http://example.org/ns#a3717> <http://example.org/ns#a3717> <http://example.org/ns#a3717> . +<http://example.org/ns#a3718> <http://example.org/ns#a3718> <http://example.org/ns#a3718> . +<http://example.org/ns#a3719> <http://example.org/ns#a3719> <http://example.org/ns#a3719> . +<http://example.org/ns#a3720> <http://example.org/ns#a3720> <http://example.org/ns#a3720> . +<http://example.org/ns#a3721> <http://example.org/ns#a3721> <http://example.org/ns#a3721> . +<http://example.org/ns#a3722> <http://example.org/ns#a3722> <http://example.org/ns#a3722> . +<http://example.org/ns#a3723> <http://example.org/ns#a3723> <http://example.org/ns#a3723> . +<http://example.org/ns#a3724> <http://example.org/ns#a3724> <http://example.org/ns#a3724> . +<http://example.org/ns#a3725> <http://example.org/ns#a3725> <http://example.org/ns#a3725> . +<http://example.org/ns#a3726> <http://example.org/ns#a3726> <http://example.org/ns#a3726> . +<http://example.org/ns#a3727> <http://example.org/ns#a3727> <http://example.org/ns#a3727> . +<http://example.org/ns#a3728> <http://example.org/ns#a3728> <http://example.org/ns#a3728> . +<http://example.org/ns#a3729> <http://example.org/ns#a3729> <http://example.org/ns#a3729> . +<http://example.org/ns#a3730> <http://example.org/ns#a3730> <http://example.org/ns#a3730> . +<http://example.org/ns#a3731> <http://example.org/ns#a3731> <http://example.org/ns#a3731> . +<http://example.org/ns#a3732> <http://example.org/ns#a3732> <http://example.org/ns#a3732> . +<http://example.org/ns#a3733> <http://example.org/ns#a3733> <http://example.org/ns#a3733> . +<http://example.org/ns#a3734> <http://example.org/ns#a3734> <http://example.org/ns#a3734> . +<http://example.org/ns#a3735> <http://example.org/ns#a3735> <http://example.org/ns#a3735> . +<http://example.org/ns#a3736> <http://example.org/ns#a3736> <http://example.org/ns#a3736> . +<http://example.org/ns#a3737> <http://example.org/ns#a3737> <http://example.org/ns#a3737> . +<http://example.org/ns#a3738> <http://example.org/ns#a3738> <http://example.org/ns#a3738> . +<http://example.org/ns#a3739> <http://example.org/ns#a3739> <http://example.org/ns#a3739> . +<http://example.org/ns#a3740> <http://example.org/ns#a3740> <http://example.org/ns#a3740> . +<http://example.org/ns#a3741> <http://example.org/ns#a3741> <http://example.org/ns#a3741> . +<http://example.org/ns#a3742> <http://example.org/ns#a3742> <http://example.org/ns#a3742> . +<http://example.org/ns#a3743> <http://example.org/ns#a3743> <http://example.org/ns#a3743> . +<http://example.org/ns#a3744> <http://example.org/ns#a3744> <http://example.org/ns#a3744> . +<http://example.org/ns#a3745> <http://example.org/ns#a3745> <http://example.org/ns#a3745> . +<http://example.org/ns#a3746> <http://example.org/ns#a3746> <http://example.org/ns#a3746> . +<http://example.org/ns#a3747> <http://example.org/ns#a3747> <http://example.org/ns#a3747> . +<http://example.org/ns#a3748> <http://example.org/ns#a3748> <http://example.org/ns#a3748> . +<http://example.org/ns#a3749> <http://example.org/ns#a3749> <http://example.org/ns#a3749> . +<http://example.org/ns#a3750> <http://example.org/ns#a3750> <http://example.org/ns#a3750> . +<http://example.org/ns#a3751> <http://example.org/ns#a3751> <http://example.org/ns#a3751> . +<http://example.org/ns#a3752> <http://example.org/ns#a3752> <http://example.org/ns#a3752> . +<http://example.org/ns#a3753> <http://example.org/ns#a3753> <http://example.org/ns#a3753> . +<http://example.org/ns#a3754> <http://example.org/ns#a3754> <http://example.org/ns#a3754> . +<http://example.org/ns#a3755> <http://example.org/ns#a3755> <http://example.org/ns#a3755> . +<http://example.org/ns#a3756> <http://example.org/ns#a3756> <http://example.org/ns#a3756> . +<http://example.org/ns#a3757> <http://example.org/ns#a3757> <http://example.org/ns#a3757> . +<http://example.org/ns#a3758> <http://example.org/ns#a3758> <http://example.org/ns#a3758> . +<http://example.org/ns#a3759> <http://example.org/ns#a3759> <http://example.org/ns#a3759> . +<http://example.org/ns#a3760> <http://example.org/ns#a3760> <http://example.org/ns#a3760> . +<http://example.org/ns#a3761> <http://example.org/ns#a3761> <http://example.org/ns#a3761> . +<http://example.org/ns#a3762> <http://example.org/ns#a3762> <http://example.org/ns#a3762> . +<http://example.org/ns#a3763> <http://example.org/ns#a3763> <http://example.org/ns#a3763> . +<http://example.org/ns#a3764> <http://example.org/ns#a3764> <http://example.org/ns#a3764> . +<http://example.org/ns#a3765> <http://example.org/ns#a3765> <http://example.org/ns#a3765> . +<http://example.org/ns#a3766> <http://example.org/ns#a3766> <http://example.org/ns#a3766> . +<http://example.org/ns#a3767> <http://example.org/ns#a3767> <http://example.org/ns#a3767> . +<http://example.org/ns#a3768> <http://example.org/ns#a3768> <http://example.org/ns#a3768> . +<http://example.org/ns#a3769> <http://example.org/ns#a3769> <http://example.org/ns#a3769> . +<http://example.org/ns#a3770> <http://example.org/ns#a3770> <http://example.org/ns#a3770> . +<http://example.org/ns#a3771> <http://example.org/ns#a3771> <http://example.org/ns#a3771> . +<http://example.org/ns#a3772> <http://example.org/ns#a3772> <http://example.org/ns#a3772> . +<http://example.org/ns#a3773> <http://example.org/ns#a3773> <http://example.org/ns#a3773> . +<http://example.org/ns#a3774> <http://example.org/ns#a3774> <http://example.org/ns#a3774> . +<http://example.org/ns#a3775> <http://example.org/ns#a3775> <http://example.org/ns#a3775> . +<http://example.org/ns#a3776> <http://example.org/ns#a3776> <http://example.org/ns#a3776> . +<http://example.org/ns#a3777> <http://example.org/ns#a3777> <http://example.org/ns#a3777> . +<http://example.org/ns#a3778> <http://example.org/ns#a3778> <http://example.org/ns#a3778> . +<http://example.org/ns#a3779> <http://example.org/ns#a3779> <http://example.org/ns#a3779> . +<http://example.org/ns#a3780> <http://example.org/ns#a3780> <http://example.org/ns#a3780> . +<http://example.org/ns#a3781> <http://example.org/ns#a3781> <http://example.org/ns#a3781> . +<http://example.org/ns#a3782> <http://example.org/ns#a3782> <http://example.org/ns#a3782> . +<http://example.org/ns#a3783> <http://example.org/ns#a3783> <http://example.org/ns#a3783> . +<http://example.org/ns#a3784> <http://example.org/ns#a3784> <http://example.org/ns#a3784> . +<http://example.org/ns#a3785> <http://example.org/ns#a3785> <http://example.org/ns#a3785> . +<http://example.org/ns#a3786> <http://example.org/ns#a3786> <http://example.org/ns#a3786> . +<http://example.org/ns#a3787> <http://example.org/ns#a3787> <http://example.org/ns#a3787> . +<http://example.org/ns#a3788> <http://example.org/ns#a3788> <http://example.org/ns#a3788> . +<http://example.org/ns#a3789> <http://example.org/ns#a3789> <http://example.org/ns#a3789> . +<http://example.org/ns#a3790> <http://example.org/ns#a3790> <http://example.org/ns#a3790> . +<http://example.org/ns#a3791> <http://example.org/ns#a3791> <http://example.org/ns#a3791> . +<http://example.org/ns#a3792> <http://example.org/ns#a3792> <http://example.org/ns#a3792> . +<http://example.org/ns#a3793> <http://example.org/ns#a3793> <http://example.org/ns#a3793> . +<http://example.org/ns#a3794> <http://example.org/ns#a3794> <http://example.org/ns#a3794> . +<http://example.org/ns#a3795> <http://example.org/ns#a3795> <http://example.org/ns#a3795> . +<http://example.org/ns#a3796> <http://example.org/ns#a3796> <http://example.org/ns#a3796> . +<http://example.org/ns#a3797> <http://example.org/ns#a3797> <http://example.org/ns#a3797> . +<http://example.org/ns#a3798> <http://example.org/ns#a3798> <http://example.org/ns#a3798> . +<http://example.org/ns#a3799> <http://example.org/ns#a3799> <http://example.org/ns#a3799> . +<http://example.org/ns#a3800> <http://example.org/ns#a3800> <http://example.org/ns#a3800> . +<http://example.org/ns#a3801> <http://example.org/ns#a3801> <http://example.org/ns#a3801> . +<http://example.org/ns#a3802> <http://example.org/ns#a3802> <http://example.org/ns#a3802> . +<http://example.org/ns#a3803> <http://example.org/ns#a3803> <http://example.org/ns#a3803> . +<http://example.org/ns#a3804> <http://example.org/ns#a3804> <http://example.org/ns#a3804> . +<http://example.org/ns#a3805> <http://example.org/ns#a3805> <http://example.org/ns#a3805> . +<http://example.org/ns#a3806> <http://example.org/ns#a3806> <http://example.org/ns#a3806> . +<http://example.org/ns#a3807> <http://example.org/ns#a3807> <http://example.org/ns#a3807> . +<http://example.org/ns#a3808> <http://example.org/ns#a3808> <http://example.org/ns#a3808> . +<http://example.org/ns#a3809> <http://example.org/ns#a3809> <http://example.org/ns#a3809> . +<http://example.org/ns#a3810> <http://example.org/ns#a3810> <http://example.org/ns#a3810> . +<http://example.org/ns#a3811> <http://example.org/ns#a3811> <http://example.org/ns#a3811> . +<http://example.org/ns#a3812> <http://example.org/ns#a3812> <http://example.org/ns#a3812> . +<http://example.org/ns#a3813> <http://example.org/ns#a3813> <http://example.org/ns#a3813> . +<http://example.org/ns#a3814> <http://example.org/ns#a3814> <http://example.org/ns#a3814> . +<http://example.org/ns#a3815> <http://example.org/ns#a3815> <http://example.org/ns#a3815> . +<http://example.org/ns#a3816> <http://example.org/ns#a3816> <http://example.org/ns#a3816> . +<http://example.org/ns#a3817> <http://example.org/ns#a3817> <http://example.org/ns#a3817> . +<http://example.org/ns#a3818> <http://example.org/ns#a3818> <http://example.org/ns#a3818> . +<http://example.org/ns#a3819> <http://example.org/ns#a3819> <http://example.org/ns#a3819> . +<http://example.org/ns#a3820> <http://example.org/ns#a3820> <http://example.org/ns#a3820> . +<http://example.org/ns#a3821> <http://example.org/ns#a3821> <http://example.org/ns#a3821> . +<http://example.org/ns#a3822> <http://example.org/ns#a3822> <http://example.org/ns#a3822> . +<http://example.org/ns#a3823> <http://example.org/ns#a3823> <http://example.org/ns#a3823> . +<http://example.org/ns#a3824> <http://example.org/ns#a3824> <http://example.org/ns#a3824> . +<http://example.org/ns#a3825> <http://example.org/ns#a3825> <http://example.org/ns#a3825> . +<http://example.org/ns#a3826> <http://example.org/ns#a3826> <http://example.org/ns#a3826> . +<http://example.org/ns#a3827> <http://example.org/ns#a3827> <http://example.org/ns#a3827> . +<http://example.org/ns#a3828> <http://example.org/ns#a3828> <http://example.org/ns#a3828> . +<http://example.org/ns#a3829> <http://example.org/ns#a3829> <http://example.org/ns#a3829> . +<http://example.org/ns#a3830> <http://example.org/ns#a3830> <http://example.org/ns#a3830> . +<http://example.org/ns#a3831> <http://example.org/ns#a3831> <http://example.org/ns#a3831> . +<http://example.org/ns#a3832> <http://example.org/ns#a3832> <http://example.org/ns#a3832> . +<http://example.org/ns#a3833> <http://example.org/ns#a3833> <http://example.org/ns#a3833> . +<http://example.org/ns#a3834> <http://example.org/ns#a3834> <http://example.org/ns#a3834> . +<http://example.org/ns#a3835> <http://example.org/ns#a3835> <http://example.org/ns#a3835> . +<http://example.org/ns#a3836> <http://example.org/ns#a3836> <http://example.org/ns#a3836> . +<http://example.org/ns#a3837> <http://example.org/ns#a3837> <http://example.org/ns#a3837> . +<http://example.org/ns#a3838> <http://example.org/ns#a3838> <http://example.org/ns#a3838> . +<http://example.org/ns#a3839> <http://example.org/ns#a3839> <http://example.org/ns#a3839> . +<http://example.org/ns#a3840> <http://example.org/ns#a3840> <http://example.org/ns#a3840> . +<http://example.org/ns#a3841> <http://example.org/ns#a3841> <http://example.org/ns#a3841> . +<http://example.org/ns#a3842> <http://example.org/ns#a3842> <http://example.org/ns#a3842> . +<http://example.org/ns#a3843> <http://example.org/ns#a3843> <http://example.org/ns#a3843> . +<http://example.org/ns#a3844> <http://example.org/ns#a3844> <http://example.org/ns#a3844> . +<http://example.org/ns#a3845> <http://example.org/ns#a3845> <http://example.org/ns#a3845> . +<http://example.org/ns#a3846> <http://example.org/ns#a3846> <http://example.org/ns#a3846> . +<http://example.org/ns#a3847> <http://example.org/ns#a3847> <http://example.org/ns#a3847> . +<http://example.org/ns#a3848> <http://example.org/ns#a3848> <http://example.org/ns#a3848> . +<http://example.org/ns#a3849> <http://example.org/ns#a3849> <http://example.org/ns#a3849> . +<http://example.org/ns#a3850> <http://example.org/ns#a3850> <http://example.org/ns#a3850> . +<http://example.org/ns#a3851> <http://example.org/ns#a3851> <http://example.org/ns#a3851> . +<http://example.org/ns#a3852> <http://example.org/ns#a3852> <http://example.org/ns#a3852> . +<http://example.org/ns#a3853> <http://example.org/ns#a3853> <http://example.org/ns#a3853> . +<http://example.org/ns#a3854> <http://example.org/ns#a3854> <http://example.org/ns#a3854> . +<http://example.org/ns#a3855> <http://example.org/ns#a3855> <http://example.org/ns#a3855> . +<http://example.org/ns#a3856> <http://example.org/ns#a3856> <http://example.org/ns#a3856> . +<http://example.org/ns#a3857> <http://example.org/ns#a3857> <http://example.org/ns#a3857> . +<http://example.org/ns#a3858> <http://example.org/ns#a3858> <http://example.org/ns#a3858> . +<http://example.org/ns#a3859> <http://example.org/ns#a3859> <http://example.org/ns#a3859> . +<http://example.org/ns#a3860> <http://example.org/ns#a3860> <http://example.org/ns#a3860> . +<http://example.org/ns#a3861> <http://example.org/ns#a3861> <http://example.org/ns#a3861> . +<http://example.org/ns#a3862> <http://example.org/ns#a3862> <http://example.org/ns#a3862> . +<http://example.org/ns#a3863> <http://example.org/ns#a3863> <http://example.org/ns#a3863> . +<http://example.org/ns#a3864> <http://example.org/ns#a3864> <http://example.org/ns#a3864> . +<http://example.org/ns#a3865> <http://example.org/ns#a3865> <http://example.org/ns#a3865> . +<http://example.org/ns#a3866> <http://example.org/ns#a3866> <http://example.org/ns#a3866> . +<http://example.org/ns#a3867> <http://example.org/ns#a3867> <http://example.org/ns#a3867> . +<http://example.org/ns#a3868> <http://example.org/ns#a3868> <http://example.org/ns#a3868> . +<http://example.org/ns#a3869> <http://example.org/ns#a3869> <http://example.org/ns#a3869> . +<http://example.org/ns#a3870> <http://example.org/ns#a3870> <http://example.org/ns#a3870> . +<http://example.org/ns#a3871> <http://example.org/ns#a3871> <http://example.org/ns#a3871> . +<http://example.org/ns#a3872> <http://example.org/ns#a3872> <http://example.org/ns#a3872> . +<http://example.org/ns#a3873> <http://example.org/ns#a3873> <http://example.org/ns#a3873> . +<http://example.org/ns#a3874> <http://example.org/ns#a3874> <http://example.org/ns#a3874> . +<http://example.org/ns#a3875> <http://example.org/ns#a3875> <http://example.org/ns#a3875> . +<http://example.org/ns#a3876> <http://example.org/ns#a3876> <http://example.org/ns#a3876> . +<http://example.org/ns#a3877> <http://example.org/ns#a3877> <http://example.org/ns#a3877> . +<http://example.org/ns#a3878> <http://example.org/ns#a3878> <http://example.org/ns#a3878> . +<http://example.org/ns#a3879> <http://example.org/ns#a3879> <http://example.org/ns#a3879> . +<http://example.org/ns#a3880> <http://example.org/ns#a3880> <http://example.org/ns#a3880> . +<http://example.org/ns#a3881> <http://example.org/ns#a3881> <http://example.org/ns#a3881> . +<http://example.org/ns#a3882> <http://example.org/ns#a3882> <http://example.org/ns#a3882> . +<http://example.org/ns#a3883> <http://example.org/ns#a3883> <http://example.org/ns#a3883> . +<http://example.org/ns#a3884> <http://example.org/ns#a3884> <http://example.org/ns#a3884> . +<http://example.org/ns#a3885> <http://example.org/ns#a3885> <http://example.org/ns#a3885> . +<http://example.org/ns#a3886> <http://example.org/ns#a3886> <http://example.org/ns#a3886> . +<http://example.org/ns#a3887> <http://example.org/ns#a3887> <http://example.org/ns#a3887> . +<http://example.org/ns#a3888> <http://example.org/ns#a3888> <http://example.org/ns#a3888> . +<http://example.org/ns#a3889> <http://example.org/ns#a3889> <http://example.org/ns#a3889> . +<http://example.org/ns#a3890> <http://example.org/ns#a3890> <http://example.org/ns#a3890> . +<http://example.org/ns#a3891> <http://example.org/ns#a3891> <http://example.org/ns#a3891> . +<http://example.org/ns#a3892> <http://example.org/ns#a3892> <http://example.org/ns#a3892> . +<http://example.org/ns#a3893> <http://example.org/ns#a3893> <http://example.org/ns#a3893> . +<http://example.org/ns#a3894> <http://example.org/ns#a3894> <http://example.org/ns#a3894> . +<http://example.org/ns#a3895> <http://example.org/ns#a3895> <http://example.org/ns#a3895> . +<http://example.org/ns#a3896> <http://example.org/ns#a3896> <http://example.org/ns#a3896> . +<http://example.org/ns#a3897> <http://example.org/ns#a3897> <http://example.org/ns#a3897> . +<http://example.org/ns#a3898> <http://example.org/ns#a3898> <http://example.org/ns#a3898> . +<http://example.org/ns#a3899> <http://example.org/ns#a3899> <http://example.org/ns#a3899> . +<http://example.org/ns#a3900> <http://example.org/ns#a3900> <http://example.org/ns#a3900> . +<http://example.org/ns#a3901> <http://example.org/ns#a3901> <http://example.org/ns#a3901> . +<http://example.org/ns#a3902> <http://example.org/ns#a3902> <http://example.org/ns#a3902> . +<http://example.org/ns#a3903> <http://example.org/ns#a3903> <http://example.org/ns#a3903> . +<http://example.org/ns#a3904> <http://example.org/ns#a3904> <http://example.org/ns#a3904> . +<http://example.org/ns#a3905> <http://example.org/ns#a3905> <http://example.org/ns#a3905> . +<http://example.org/ns#a3906> <http://example.org/ns#a3906> <http://example.org/ns#a3906> . +<http://example.org/ns#a3907> <http://example.org/ns#a3907> <http://example.org/ns#a3907> . +<http://example.org/ns#a3908> <http://example.org/ns#a3908> <http://example.org/ns#a3908> . +<http://example.org/ns#a3909> <http://example.org/ns#a3909> <http://example.org/ns#a3909> . +<http://example.org/ns#a3910> <http://example.org/ns#a3910> <http://example.org/ns#a3910> . +<http://example.org/ns#a3911> <http://example.org/ns#a3911> <http://example.org/ns#a3911> . +<http://example.org/ns#a3912> <http://example.org/ns#a3912> <http://example.org/ns#a3912> . +<http://example.org/ns#a3913> <http://example.org/ns#a3913> <http://example.org/ns#a3913> . +<http://example.org/ns#a3914> <http://example.org/ns#a3914> <http://example.org/ns#a3914> . +<http://example.org/ns#a3915> <http://example.org/ns#a3915> <http://example.org/ns#a3915> . +<http://example.org/ns#a3916> <http://example.org/ns#a3916> <http://example.org/ns#a3916> . +<http://example.org/ns#a3917> <http://example.org/ns#a3917> <http://example.org/ns#a3917> . +<http://example.org/ns#a3918> <http://example.org/ns#a3918> <http://example.org/ns#a3918> . +<http://example.org/ns#a3919> <http://example.org/ns#a3919> <http://example.org/ns#a3919> . +<http://example.org/ns#a3920> <http://example.org/ns#a3920> <http://example.org/ns#a3920> . +<http://example.org/ns#a3921> <http://example.org/ns#a3921> <http://example.org/ns#a3921> . +<http://example.org/ns#a3922> <http://example.org/ns#a3922> <http://example.org/ns#a3922> . +<http://example.org/ns#a3923> <http://example.org/ns#a3923> <http://example.org/ns#a3923> . +<http://example.org/ns#a3924> <http://example.org/ns#a3924> <http://example.org/ns#a3924> . +<http://example.org/ns#a3925> <http://example.org/ns#a3925> <http://example.org/ns#a3925> . +<http://example.org/ns#a3926> <http://example.org/ns#a3926> <http://example.org/ns#a3926> . +<http://example.org/ns#a3927> <http://example.org/ns#a3927> <http://example.org/ns#a3927> . +<http://example.org/ns#a3928> <http://example.org/ns#a3928> <http://example.org/ns#a3928> . +<http://example.org/ns#a3929> <http://example.org/ns#a3929> <http://example.org/ns#a3929> . +<http://example.org/ns#a3930> <http://example.org/ns#a3930> <http://example.org/ns#a3930> . +<http://example.org/ns#a3931> <http://example.org/ns#a3931> <http://example.org/ns#a3931> . +<http://example.org/ns#a3932> <http://example.org/ns#a3932> <http://example.org/ns#a3932> . +<http://example.org/ns#a3933> <http://example.org/ns#a3933> <http://example.org/ns#a3933> . +<http://example.org/ns#a3934> <http://example.org/ns#a3934> <http://example.org/ns#a3934> . +<http://example.org/ns#a3935> <http://example.org/ns#a3935> <http://example.org/ns#a3935> . +<http://example.org/ns#a3936> <http://example.org/ns#a3936> <http://example.org/ns#a3936> . +<http://example.org/ns#a3937> <http://example.org/ns#a3937> <http://example.org/ns#a3937> . +<http://example.org/ns#a3938> <http://example.org/ns#a3938> <http://example.org/ns#a3938> . +<http://example.org/ns#a3939> <http://example.org/ns#a3939> <http://example.org/ns#a3939> . +<http://example.org/ns#a3940> <http://example.org/ns#a3940> <http://example.org/ns#a3940> . +<http://example.org/ns#a3941> <http://example.org/ns#a3941> <http://example.org/ns#a3941> . +<http://example.org/ns#a3942> <http://example.org/ns#a3942> <http://example.org/ns#a3942> . +<http://example.org/ns#a3943> <http://example.org/ns#a3943> <http://example.org/ns#a3943> . +<http://example.org/ns#a3944> <http://example.org/ns#a3944> <http://example.org/ns#a3944> . +<http://example.org/ns#a3945> <http://example.org/ns#a3945> <http://example.org/ns#a3945> . +<http://example.org/ns#a3946> <http://example.org/ns#a3946> <http://example.org/ns#a3946> . +<http://example.org/ns#a3947> <http://example.org/ns#a3947> <http://example.org/ns#a3947> . +<http://example.org/ns#a3948> <http://example.org/ns#a3948> <http://example.org/ns#a3948> . +<http://example.org/ns#a3949> <http://example.org/ns#a3949> <http://example.org/ns#a3949> . +<http://example.org/ns#a3950> <http://example.org/ns#a3950> <http://example.org/ns#a3950> . +<http://example.org/ns#a3951> <http://example.org/ns#a3951> <http://example.org/ns#a3951> . +<http://example.org/ns#a3952> <http://example.org/ns#a3952> <http://example.org/ns#a3952> . +<http://example.org/ns#a3953> <http://example.org/ns#a3953> <http://example.org/ns#a3953> . +<http://example.org/ns#a3954> <http://example.org/ns#a3954> <http://example.org/ns#a3954> . +<http://example.org/ns#a3955> <http://example.org/ns#a3955> <http://example.org/ns#a3955> . +<http://example.org/ns#a3956> <http://example.org/ns#a3956> <http://example.org/ns#a3956> . +<http://example.org/ns#a3957> <http://example.org/ns#a3957> <http://example.org/ns#a3957> . +<http://example.org/ns#a3958> <http://example.org/ns#a3958> <http://example.org/ns#a3958> . +<http://example.org/ns#a3959> <http://example.org/ns#a3959> <http://example.org/ns#a3959> . +<http://example.org/ns#a3960> <http://example.org/ns#a3960> <http://example.org/ns#a3960> . +<http://example.org/ns#a3961> <http://example.org/ns#a3961> <http://example.org/ns#a3961> . +<http://example.org/ns#a3962> <http://example.org/ns#a3962> <http://example.org/ns#a3962> . +<http://example.org/ns#a3963> <http://example.org/ns#a3963> <http://example.org/ns#a3963> . +<http://example.org/ns#a3964> <http://example.org/ns#a3964> <http://example.org/ns#a3964> . +<http://example.org/ns#a3965> <http://example.org/ns#a3965> <http://example.org/ns#a3965> . +<http://example.org/ns#a3966> <http://example.org/ns#a3966> <http://example.org/ns#a3966> . +<http://example.org/ns#a3967> <http://example.org/ns#a3967> <http://example.org/ns#a3967> . +<http://example.org/ns#a3968> <http://example.org/ns#a3968> <http://example.org/ns#a3968> . +<http://example.org/ns#a3969> <http://example.org/ns#a3969> <http://example.org/ns#a3969> . +<http://example.org/ns#a3970> <http://example.org/ns#a3970> <http://example.org/ns#a3970> . +<http://example.org/ns#a3971> <http://example.org/ns#a3971> <http://example.org/ns#a3971> . +<http://example.org/ns#a3972> <http://example.org/ns#a3972> <http://example.org/ns#a3972> . +<http://example.org/ns#a3973> <http://example.org/ns#a3973> <http://example.org/ns#a3973> . +<http://example.org/ns#a3974> <http://example.org/ns#a3974> <http://example.org/ns#a3974> . +<http://example.org/ns#a3975> <http://example.org/ns#a3975> <http://example.org/ns#a3975> . +<http://example.org/ns#a3976> <http://example.org/ns#a3976> <http://example.org/ns#a3976> . +<http://example.org/ns#a3977> <http://example.org/ns#a3977> <http://example.org/ns#a3977> . +<http://example.org/ns#a3978> <http://example.org/ns#a3978> <http://example.org/ns#a3978> . +<http://example.org/ns#a3979> <http://example.org/ns#a3979> <http://example.org/ns#a3979> . +<http://example.org/ns#a3980> <http://example.org/ns#a3980> <http://example.org/ns#a3980> . +<http://example.org/ns#a3981> <http://example.org/ns#a3981> <http://example.org/ns#a3981> . +<http://example.org/ns#a3982> <http://example.org/ns#a3982> <http://example.org/ns#a3982> . +<http://example.org/ns#a3983> <http://example.org/ns#a3983> <http://example.org/ns#a3983> . +<http://example.org/ns#a3984> <http://example.org/ns#a3984> <http://example.org/ns#a3984> . +<http://example.org/ns#a3985> <http://example.org/ns#a3985> <http://example.org/ns#a3985> . +<http://example.org/ns#a3986> <http://example.org/ns#a3986> <http://example.org/ns#a3986> . +<http://example.org/ns#a3987> <http://example.org/ns#a3987> <http://example.org/ns#a3987> . +<http://example.org/ns#a3988> <http://example.org/ns#a3988> <http://example.org/ns#a3988> . +<http://example.org/ns#a3989> <http://example.org/ns#a3989> <http://example.org/ns#a3989> . +<http://example.org/ns#a3990> <http://example.org/ns#a3990> <http://example.org/ns#a3990> . +<http://example.org/ns#a3991> <http://example.org/ns#a3991> <http://example.org/ns#a3991> . +<http://example.org/ns#a3992> <http://example.org/ns#a3992> <http://example.org/ns#a3992> . +<http://example.org/ns#a3993> <http://example.org/ns#a3993> <http://example.org/ns#a3993> . +<http://example.org/ns#a3994> <http://example.org/ns#a3994> <http://example.org/ns#a3994> . +<http://example.org/ns#a3995> <http://example.org/ns#a3995> <http://example.org/ns#a3995> . +<http://example.org/ns#a3996> <http://example.org/ns#a3996> <http://example.org/ns#a3996> . +<http://example.org/ns#a3997> <http://example.org/ns#a3997> <http://example.org/ns#a3997> . +<http://example.org/ns#a3998> <http://example.org/ns#a3998> <http://example.org/ns#a3998> . +<http://example.org/ns#a3999> <http://example.org/ns#a3999> <http://example.org/ns#a3999> . +<http://example.org/ns#a4000> <http://example.org/ns#a4000> <http://example.org/ns#a4000> . +<http://example.org/ns#a4001> <http://example.org/ns#a4001> <http://example.org/ns#a4001> . +<http://example.org/ns#a4002> <http://example.org/ns#a4002> <http://example.org/ns#a4002> . +<http://example.org/ns#a4003> <http://example.org/ns#a4003> <http://example.org/ns#a4003> . +<http://example.org/ns#a4004> <http://example.org/ns#a4004> <http://example.org/ns#a4004> . +<http://example.org/ns#a4005> <http://example.org/ns#a4005> <http://example.org/ns#a4005> . +<http://example.org/ns#a4006> <http://example.org/ns#a4006> <http://example.org/ns#a4006> . +<http://example.org/ns#a4007> <http://example.org/ns#a4007> <http://example.org/ns#a4007> . +<http://example.org/ns#a4008> <http://example.org/ns#a4008> <http://example.org/ns#a4008> . +<http://example.org/ns#a4009> <http://example.org/ns#a4009> <http://example.org/ns#a4009> . +<http://example.org/ns#a4010> <http://example.org/ns#a4010> <http://example.org/ns#a4010> . +<http://example.org/ns#a4011> <http://example.org/ns#a4011> <http://example.org/ns#a4011> . +<http://example.org/ns#a4012> <http://example.org/ns#a4012> <http://example.org/ns#a4012> . +<http://example.org/ns#a4013> <http://example.org/ns#a4013> <http://example.org/ns#a4013> . +<http://example.org/ns#a4014> <http://example.org/ns#a4014> <http://example.org/ns#a4014> . +<http://example.org/ns#a4015> <http://example.org/ns#a4015> <http://example.org/ns#a4015> . +<http://example.org/ns#a4016> <http://example.org/ns#a4016> <http://example.org/ns#a4016> . +<http://example.org/ns#a4017> <http://example.org/ns#a4017> <http://example.org/ns#a4017> . +<http://example.org/ns#a4018> <http://example.org/ns#a4018> <http://example.org/ns#a4018> . +<http://example.org/ns#a4019> <http://example.org/ns#a4019> <http://example.org/ns#a4019> . +<http://example.org/ns#a4020> <http://example.org/ns#a4020> <http://example.org/ns#a4020> . +<http://example.org/ns#a4021> <http://example.org/ns#a4021> <http://example.org/ns#a4021> . +<http://example.org/ns#a4022> <http://example.org/ns#a4022> <http://example.org/ns#a4022> . +<http://example.org/ns#a4023> <http://example.org/ns#a4023> <http://example.org/ns#a4023> . +<http://example.org/ns#a4024> <http://example.org/ns#a4024> <http://example.org/ns#a4024> . +<http://example.org/ns#a4025> <http://example.org/ns#a4025> <http://example.org/ns#a4025> . +<http://example.org/ns#a4026> <http://example.org/ns#a4026> <http://example.org/ns#a4026> . +<http://example.org/ns#a4027> <http://example.org/ns#a4027> <http://example.org/ns#a4027> . +<http://example.org/ns#a4028> <http://example.org/ns#a4028> <http://example.org/ns#a4028> . +<http://example.org/ns#a4029> <http://example.org/ns#a4029> <http://example.org/ns#a4029> . +<http://example.org/ns#a4030> <http://example.org/ns#a4030> <http://example.org/ns#a4030> . +<http://example.org/ns#a4031> <http://example.org/ns#a4031> <http://example.org/ns#a4031> . +<http://example.org/ns#a4032> <http://example.org/ns#a4032> <http://example.org/ns#a4032> . +<http://example.org/ns#a4033> <http://example.org/ns#a4033> <http://example.org/ns#a4033> . +<http://example.org/ns#a4034> <http://example.org/ns#a4034> <http://example.org/ns#a4034> . +<http://example.org/ns#a4035> <http://example.org/ns#a4035> <http://example.org/ns#a4035> . +<http://example.org/ns#a4036> <http://example.org/ns#a4036> <http://example.org/ns#a4036> . +<http://example.org/ns#a4037> <http://example.org/ns#a4037> <http://example.org/ns#a4037> . +<http://example.org/ns#a4038> <http://example.org/ns#a4038> <http://example.org/ns#a4038> . +<http://example.org/ns#a4039> <http://example.org/ns#a4039> <http://example.org/ns#a4039> . +<http://example.org/ns#a4040> <http://example.org/ns#a4040> <http://example.org/ns#a4040> . +<http://example.org/ns#a4041> <http://example.org/ns#a4041> <http://example.org/ns#a4041> . +<http://example.org/ns#a4042> <http://example.org/ns#a4042> <http://example.org/ns#a4042> . +<http://example.org/ns#a4043> <http://example.org/ns#a4043> <http://example.org/ns#a4043> . +<http://example.org/ns#a4044> <http://example.org/ns#a4044> <http://example.org/ns#a4044> . +<http://example.org/ns#a4045> <http://example.org/ns#a4045> <http://example.org/ns#a4045> . +<http://example.org/ns#a4046> <http://example.org/ns#a4046> <http://example.org/ns#a4046> . +<http://example.org/ns#a4047> <http://example.org/ns#a4047> <http://example.org/ns#a4047> . +<http://example.org/ns#a4048> <http://example.org/ns#a4048> <http://example.org/ns#a4048> . +<http://example.org/ns#a4049> <http://example.org/ns#a4049> <http://example.org/ns#a4049> . +<http://example.org/ns#a4050> <http://example.org/ns#a4050> <http://example.org/ns#a4050> . +<http://example.org/ns#a4051> <http://example.org/ns#a4051> <http://example.org/ns#a4051> . +<http://example.org/ns#a4052> <http://example.org/ns#a4052> <http://example.org/ns#a4052> . +<http://example.org/ns#a4053> <http://example.org/ns#a4053> <http://example.org/ns#a4053> . +<http://example.org/ns#a4054> <http://example.org/ns#a4054> <http://example.org/ns#a4054> . +<http://example.org/ns#a4055> <http://example.org/ns#a4055> <http://example.org/ns#a4055> . +<http://example.org/ns#a4056> <http://example.org/ns#a4056> <http://example.org/ns#a4056> . +<http://example.org/ns#a4057> <http://example.org/ns#a4057> <http://example.org/ns#a4057> . +<http://example.org/ns#a4058> <http://example.org/ns#a4058> <http://example.org/ns#a4058> . +<http://example.org/ns#a4059> <http://example.org/ns#a4059> <http://example.org/ns#a4059> . +<http://example.org/ns#a4060> <http://example.org/ns#a4060> <http://example.org/ns#a4060> . +<http://example.org/ns#a4061> <http://example.org/ns#a4061> <http://example.org/ns#a4061> . +<http://example.org/ns#a4062> <http://example.org/ns#a4062> <http://example.org/ns#a4062> . +<http://example.org/ns#a4063> <http://example.org/ns#a4063> <http://example.org/ns#a4063> . +<http://example.org/ns#a4064> <http://example.org/ns#a4064> <http://example.org/ns#a4064> . +<http://example.org/ns#a4065> <http://example.org/ns#a4065> <http://example.org/ns#a4065> . +<http://example.org/ns#a4066> <http://example.org/ns#a4066> <http://example.org/ns#a4066> . +<http://example.org/ns#a4067> <http://example.org/ns#a4067> <http://example.org/ns#a4067> . +<http://example.org/ns#a4068> <http://example.org/ns#a4068> <http://example.org/ns#a4068> . +<http://example.org/ns#a4069> <http://example.org/ns#a4069> <http://example.org/ns#a4069> . +<http://example.org/ns#a4070> <http://example.org/ns#a4070> <http://example.org/ns#a4070> . +<http://example.org/ns#a4071> <http://example.org/ns#a4071> <http://example.org/ns#a4071> . +<http://example.org/ns#a4072> <http://example.org/ns#a4072> <http://example.org/ns#a4072> . +<http://example.org/ns#a4073> <http://example.org/ns#a4073> <http://example.org/ns#a4073> . +<http://example.org/ns#a4074> <http://example.org/ns#a4074> <http://example.org/ns#a4074> . +<http://example.org/ns#a4075> <http://example.org/ns#a4075> <http://example.org/ns#a4075> . +<http://example.org/ns#a4076> <http://example.org/ns#a4076> <http://example.org/ns#a4076> . +<http://example.org/ns#a4077> <http://example.org/ns#a4077> <http://example.org/ns#a4077> . +<http://example.org/ns#a4078> <http://example.org/ns#a4078> <http://example.org/ns#a4078> . +<http://example.org/ns#a4079> <http://example.org/ns#a4079> <http://example.org/ns#a4079> . +<http://example.org/ns#a4080> <http://example.org/ns#a4080> <http://example.org/ns#a4080> . +<http://example.org/ns#a4081> <http://example.org/ns#a4081> <http://example.org/ns#a4081> . +<http://example.org/ns#a4082> <http://example.org/ns#a4082> <http://example.org/ns#a4082> . +<http://example.org/ns#a4083> <http://example.org/ns#a4083> <http://example.org/ns#a4083> . +<http://example.org/ns#a4084> <http://example.org/ns#a4084> <http://example.org/ns#a4084> . +<http://example.org/ns#a4085> <http://example.org/ns#a4085> <http://example.org/ns#a4085> . +<http://example.org/ns#a4086> <http://example.org/ns#a4086> <http://example.org/ns#a4086> . +<http://example.org/ns#a4087> <http://example.org/ns#a4087> <http://example.org/ns#a4087> . +<http://example.org/ns#a4088> <http://example.org/ns#a4088> <http://example.org/ns#a4088> . +<http://example.org/ns#a4089> <http://example.org/ns#a4089> <http://example.org/ns#a4089> . +<http://example.org/ns#a4090> <http://example.org/ns#a4090> <http://example.org/ns#a4090> . +<http://example.org/ns#a4091> <http://example.org/ns#a4091> <http://example.org/ns#a4091> . +<http://example.org/ns#a4092> <http://example.org/ns#a4092> <http://example.org/ns#a4092> . +<http://example.org/ns#a4093> <http://example.org/ns#a4093> <http://example.org/ns#a4093> . +<http://example.org/ns#a4094> <http://example.org/ns#a4094> <http://example.org/ns#a4094> . +<http://example.org/ns#a4095> <http://example.org/ns#a4095> <http://example.org/ns#a4095> . +<http://example.org/ns#a4096> <http://example.org/ns#a4096> <http://example.org/ns#a4096> . +<http://example.org/ns#a4097> <http://example.org/ns#a4097> <http://example.org/ns#a4097> . +<http://example.org/ns#a4098> <http://example.org/ns#a4098> <http://example.org/ns#a4098> . +<http://example.org/ns#a4099> <http://example.org/ns#a4099> <http://example.org/ns#a4099> . +<http://example.org/ns#a4100> <http://example.org/ns#a4100> <http://example.org/ns#a4100> . +<http://example.org/ns#a4101> <http://example.org/ns#a4101> <http://example.org/ns#a4101> . +<http://example.org/ns#a4102> <http://example.org/ns#a4102> <http://example.org/ns#a4102> . +<http://example.org/ns#a4103> <http://example.org/ns#a4103> <http://example.org/ns#a4103> . +<http://example.org/ns#a4104> <http://example.org/ns#a4104> <http://example.org/ns#a4104> . +<http://example.org/ns#a4105> <http://example.org/ns#a4105> <http://example.org/ns#a4105> . +<http://example.org/ns#a4106> <http://example.org/ns#a4106> <http://example.org/ns#a4106> . +<http://example.org/ns#a4107> <http://example.org/ns#a4107> <http://example.org/ns#a4107> . +<http://example.org/ns#a4108> <http://example.org/ns#a4108> <http://example.org/ns#a4108> . +<http://example.org/ns#a4109> <http://example.org/ns#a4109> <http://example.org/ns#a4109> . +<http://example.org/ns#a4110> <http://example.org/ns#a4110> <http://example.org/ns#a4110> . +<http://example.org/ns#a4111> <http://example.org/ns#a4111> <http://example.org/ns#a4111> . +<http://example.org/ns#a4112> <http://example.org/ns#a4112> <http://example.org/ns#a4112> . +<http://example.org/ns#a4113> <http://example.org/ns#a4113> <http://example.org/ns#a4113> . +<http://example.org/ns#a4114> <http://example.org/ns#a4114> <http://example.org/ns#a4114> . +<http://example.org/ns#a4115> <http://example.org/ns#a4115> <http://example.org/ns#a4115> . +<http://example.org/ns#a4116> <http://example.org/ns#a4116> <http://example.org/ns#a4116> . +<http://example.org/ns#a4117> <http://example.org/ns#a4117> <http://example.org/ns#a4117> . +<http://example.org/ns#a4118> <http://example.org/ns#a4118> <http://example.org/ns#a4118> . +<http://example.org/ns#a4119> <http://example.org/ns#a4119> <http://example.org/ns#a4119> . +<http://example.org/ns#a4120> <http://example.org/ns#a4120> <http://example.org/ns#a4120> . +<http://example.org/ns#a4121> <http://example.org/ns#a4121> <http://example.org/ns#a4121> . +<http://example.org/ns#a4122> <http://example.org/ns#a4122> <http://example.org/ns#a4122> . +<http://example.org/ns#a4123> <http://example.org/ns#a4123> <http://example.org/ns#a4123> . +<http://example.org/ns#a4124> <http://example.org/ns#a4124> <http://example.org/ns#a4124> . +<http://example.org/ns#a4125> <http://example.org/ns#a4125> <http://example.org/ns#a4125> . +<http://example.org/ns#a4126> <http://example.org/ns#a4126> <http://example.org/ns#a4126> . +<http://example.org/ns#a4127> <http://example.org/ns#a4127> <http://example.org/ns#a4127> . +<http://example.org/ns#a4128> <http://example.org/ns#a4128> <http://example.org/ns#a4128> . +<http://example.org/ns#a4129> <http://example.org/ns#a4129> <http://example.org/ns#a4129> . +<http://example.org/ns#a4130> <http://example.org/ns#a4130> <http://example.org/ns#a4130> . +<http://example.org/ns#a4131> <http://example.org/ns#a4131> <http://example.org/ns#a4131> . +<http://example.org/ns#a4132> <http://example.org/ns#a4132> <http://example.org/ns#a4132> . +<http://example.org/ns#a4133> <http://example.org/ns#a4133> <http://example.org/ns#a4133> . +<http://example.org/ns#a4134> <http://example.org/ns#a4134> <http://example.org/ns#a4134> . +<http://example.org/ns#a4135> <http://example.org/ns#a4135> <http://example.org/ns#a4135> . +<http://example.org/ns#a4136> <http://example.org/ns#a4136> <http://example.org/ns#a4136> . +<http://example.org/ns#a4137> <http://example.org/ns#a4137> <http://example.org/ns#a4137> . +<http://example.org/ns#a4138> <http://example.org/ns#a4138> <http://example.org/ns#a4138> . +<http://example.org/ns#a4139> <http://example.org/ns#a4139> <http://example.org/ns#a4139> . +<http://example.org/ns#a4140> <http://example.org/ns#a4140> <http://example.org/ns#a4140> . +<http://example.org/ns#a4141> <http://example.org/ns#a4141> <http://example.org/ns#a4141> . +<http://example.org/ns#a4142> <http://example.org/ns#a4142> <http://example.org/ns#a4142> . +<http://example.org/ns#a4143> <http://example.org/ns#a4143> <http://example.org/ns#a4143> . +<http://example.org/ns#a4144> <http://example.org/ns#a4144> <http://example.org/ns#a4144> . +<http://example.org/ns#a4145> <http://example.org/ns#a4145> <http://example.org/ns#a4145> . +<http://example.org/ns#a4146> <http://example.org/ns#a4146> <http://example.org/ns#a4146> . +<http://example.org/ns#a4147> <http://example.org/ns#a4147> <http://example.org/ns#a4147> . +<http://example.org/ns#a4148> <http://example.org/ns#a4148> <http://example.org/ns#a4148> . +<http://example.org/ns#a4149> <http://example.org/ns#a4149> <http://example.org/ns#a4149> . +<http://example.org/ns#a4150> <http://example.org/ns#a4150> <http://example.org/ns#a4150> . +<http://example.org/ns#a4151> <http://example.org/ns#a4151> <http://example.org/ns#a4151> . +<http://example.org/ns#a4152> <http://example.org/ns#a4152> <http://example.org/ns#a4152> . +<http://example.org/ns#a4153> <http://example.org/ns#a4153> <http://example.org/ns#a4153> . +<http://example.org/ns#a4154> <http://example.org/ns#a4154> <http://example.org/ns#a4154> . +<http://example.org/ns#a4155> <http://example.org/ns#a4155> <http://example.org/ns#a4155> . +<http://example.org/ns#a4156> <http://example.org/ns#a4156> <http://example.org/ns#a4156> . +<http://example.org/ns#a4157> <http://example.org/ns#a4157> <http://example.org/ns#a4157> . +<http://example.org/ns#a4158> <http://example.org/ns#a4158> <http://example.org/ns#a4158> . +<http://example.org/ns#a4159> <http://example.org/ns#a4159> <http://example.org/ns#a4159> . +<http://example.org/ns#a4160> <http://example.org/ns#a4160> <http://example.org/ns#a4160> . +<http://example.org/ns#a4161> <http://example.org/ns#a4161> <http://example.org/ns#a4161> . +<http://example.org/ns#a4162> <http://example.org/ns#a4162> <http://example.org/ns#a4162> . +<http://example.org/ns#a4163> <http://example.org/ns#a4163> <http://example.org/ns#a4163> . +<http://example.org/ns#a4164> <http://example.org/ns#a4164> <http://example.org/ns#a4164> . +<http://example.org/ns#a4165> <http://example.org/ns#a4165> <http://example.org/ns#a4165> . +<http://example.org/ns#a4166> <http://example.org/ns#a4166> <http://example.org/ns#a4166> . +<http://example.org/ns#a4167> <http://example.org/ns#a4167> <http://example.org/ns#a4167> . +<http://example.org/ns#a4168> <http://example.org/ns#a4168> <http://example.org/ns#a4168> . +<http://example.org/ns#a4169> <http://example.org/ns#a4169> <http://example.org/ns#a4169> . +<http://example.org/ns#a4170> <http://example.org/ns#a4170> <http://example.org/ns#a4170> . +<http://example.org/ns#a4171> <http://example.org/ns#a4171> <http://example.org/ns#a4171> . +<http://example.org/ns#a4172> <http://example.org/ns#a4172> <http://example.org/ns#a4172> . +<http://example.org/ns#a4173> <http://example.org/ns#a4173> <http://example.org/ns#a4173> . +<http://example.org/ns#a4174> <http://example.org/ns#a4174> <http://example.org/ns#a4174> . +<http://example.org/ns#a4175> <http://example.org/ns#a4175> <http://example.org/ns#a4175> . +<http://example.org/ns#a4176> <http://example.org/ns#a4176> <http://example.org/ns#a4176> . +<http://example.org/ns#a4177> <http://example.org/ns#a4177> <http://example.org/ns#a4177> . +<http://example.org/ns#a4178> <http://example.org/ns#a4178> <http://example.org/ns#a4178> . +<http://example.org/ns#a4179> <http://example.org/ns#a4179> <http://example.org/ns#a4179> . +<http://example.org/ns#a4180> <http://example.org/ns#a4180> <http://example.org/ns#a4180> . +<http://example.org/ns#a4181> <http://example.org/ns#a4181> <http://example.org/ns#a4181> . +<http://example.org/ns#a4182> <http://example.org/ns#a4182> <http://example.org/ns#a4182> . +<http://example.org/ns#a4183> <http://example.org/ns#a4183> <http://example.org/ns#a4183> . +<http://example.org/ns#a4184> <http://example.org/ns#a4184> <http://example.org/ns#a4184> . +<http://example.org/ns#a4185> <http://example.org/ns#a4185> <http://example.org/ns#a4185> . +<http://example.org/ns#a4186> <http://example.org/ns#a4186> <http://example.org/ns#a4186> . +<http://example.org/ns#a4187> <http://example.org/ns#a4187> <http://example.org/ns#a4187> . +<http://example.org/ns#a4188> <http://example.org/ns#a4188> <http://example.org/ns#a4188> . +<http://example.org/ns#a4189> <http://example.org/ns#a4189> <http://example.org/ns#a4189> . +<http://example.org/ns#a4190> <http://example.org/ns#a4190> <http://example.org/ns#a4190> . +<http://example.org/ns#a4191> <http://example.org/ns#a4191> <http://example.org/ns#a4191> . +<http://example.org/ns#a4192> <http://example.org/ns#a4192> <http://example.org/ns#a4192> . +<http://example.org/ns#a4193> <http://example.org/ns#a4193> <http://example.org/ns#a4193> . +<http://example.org/ns#a4194> <http://example.org/ns#a4194> <http://example.org/ns#a4194> . +<http://example.org/ns#a4195> <http://example.org/ns#a4195> <http://example.org/ns#a4195> . +<http://example.org/ns#a4196> <http://example.org/ns#a4196> <http://example.org/ns#a4196> . +<http://example.org/ns#a4197> <http://example.org/ns#a4197> <http://example.org/ns#a4197> . +<http://example.org/ns#a4198> <http://example.org/ns#a4198> <http://example.org/ns#a4198> . +<http://example.org/ns#a4199> <http://example.org/ns#a4199> <http://example.org/ns#a4199> . +<http://example.org/ns#a4200> <http://example.org/ns#a4200> <http://example.org/ns#a4200> . +<http://example.org/ns#a4201> <http://example.org/ns#a4201> <http://example.org/ns#a4201> . +<http://example.org/ns#a4202> <http://example.org/ns#a4202> <http://example.org/ns#a4202> . +<http://example.org/ns#a4203> <http://example.org/ns#a4203> <http://example.org/ns#a4203> . +<http://example.org/ns#a4204> <http://example.org/ns#a4204> <http://example.org/ns#a4204> . +<http://example.org/ns#a4205> <http://example.org/ns#a4205> <http://example.org/ns#a4205> . +<http://example.org/ns#a4206> <http://example.org/ns#a4206> <http://example.org/ns#a4206> . +<http://example.org/ns#a4207> <http://example.org/ns#a4207> <http://example.org/ns#a4207> . +<http://example.org/ns#a4208> <http://example.org/ns#a4208> <http://example.org/ns#a4208> . +<http://example.org/ns#a4209> <http://example.org/ns#a4209> <http://example.org/ns#a4209> . +<http://example.org/ns#a4210> <http://example.org/ns#a4210> <http://example.org/ns#a4210> . +<http://example.org/ns#a4211> <http://example.org/ns#a4211> <http://example.org/ns#a4211> . +<http://example.org/ns#a4212> <http://example.org/ns#a4212> <http://example.org/ns#a4212> . +<http://example.org/ns#a4213> <http://example.org/ns#a4213> <http://example.org/ns#a4213> . +<http://example.org/ns#a4214> <http://example.org/ns#a4214> <http://example.org/ns#a4214> . +<http://example.org/ns#a4215> <http://example.org/ns#a4215> <http://example.org/ns#a4215> . +<http://example.org/ns#a4216> <http://example.org/ns#a4216> <http://example.org/ns#a4216> . +<http://example.org/ns#a4217> <http://example.org/ns#a4217> <http://example.org/ns#a4217> . +<http://example.org/ns#a4218> <http://example.org/ns#a4218> <http://example.org/ns#a4218> . +<http://example.org/ns#a4219> <http://example.org/ns#a4219> <http://example.org/ns#a4219> . +<http://example.org/ns#a4220> <http://example.org/ns#a4220> <http://example.org/ns#a4220> . +<http://example.org/ns#a4221> <http://example.org/ns#a4221> <http://example.org/ns#a4221> . +<http://example.org/ns#a4222> <http://example.org/ns#a4222> <http://example.org/ns#a4222> . +<http://example.org/ns#a4223> <http://example.org/ns#a4223> <http://example.org/ns#a4223> . +<http://example.org/ns#a4224> <http://example.org/ns#a4224> <http://example.org/ns#a4224> . +<http://example.org/ns#a4225> <http://example.org/ns#a4225> <http://example.org/ns#a4225> . +<http://example.org/ns#a4226> <http://example.org/ns#a4226> <http://example.org/ns#a4226> . +<http://example.org/ns#a4227> <http://example.org/ns#a4227> <http://example.org/ns#a4227> . +<http://example.org/ns#a4228> <http://example.org/ns#a4228> <http://example.org/ns#a4228> . +<http://example.org/ns#a4229> <http://example.org/ns#a4229> <http://example.org/ns#a4229> . +<http://example.org/ns#a4230> <http://example.org/ns#a4230> <http://example.org/ns#a4230> . +<http://example.org/ns#a4231> <http://example.org/ns#a4231> <http://example.org/ns#a4231> . +<http://example.org/ns#a4232> <http://example.org/ns#a4232> <http://example.org/ns#a4232> . +<http://example.org/ns#a4233> <http://example.org/ns#a4233> <http://example.org/ns#a4233> . +<http://example.org/ns#a4234> <http://example.org/ns#a4234> <http://example.org/ns#a4234> . +<http://example.org/ns#a4235> <http://example.org/ns#a4235> <http://example.org/ns#a4235> . +<http://example.org/ns#a4236> <http://example.org/ns#a4236> <http://example.org/ns#a4236> . +<http://example.org/ns#a4237> <http://example.org/ns#a4237> <http://example.org/ns#a4237> . +<http://example.org/ns#a4238> <http://example.org/ns#a4238> <http://example.org/ns#a4238> . +<http://example.org/ns#a4239> <http://example.org/ns#a4239> <http://example.org/ns#a4239> . +<http://example.org/ns#a4240> <http://example.org/ns#a4240> <http://example.org/ns#a4240> . +<http://example.org/ns#a4241> <http://example.org/ns#a4241> <http://example.org/ns#a4241> . +<http://example.org/ns#a4242> <http://example.org/ns#a4242> <http://example.org/ns#a4242> . +<http://example.org/ns#a4243> <http://example.org/ns#a4243> <http://example.org/ns#a4243> . +<http://example.org/ns#a4244> <http://example.org/ns#a4244> <http://example.org/ns#a4244> . +<http://example.org/ns#a4245> <http://example.org/ns#a4245> <http://example.org/ns#a4245> . +<http://example.org/ns#a4246> <http://example.org/ns#a4246> <http://example.org/ns#a4246> . +<http://example.org/ns#a4247> <http://example.org/ns#a4247> <http://example.org/ns#a4247> . +<http://example.org/ns#a4248> <http://example.org/ns#a4248> <http://example.org/ns#a4248> . +<http://example.org/ns#a4249> <http://example.org/ns#a4249> <http://example.org/ns#a4249> . +<http://example.org/ns#a4250> <http://example.org/ns#a4250> <http://example.org/ns#a4250> . +<http://example.org/ns#a4251> <http://example.org/ns#a4251> <http://example.org/ns#a4251> . +<http://example.org/ns#a4252> <http://example.org/ns#a4252> <http://example.org/ns#a4252> . +<http://example.org/ns#a4253> <http://example.org/ns#a4253> <http://example.org/ns#a4253> . +<http://example.org/ns#a4254> <http://example.org/ns#a4254> <http://example.org/ns#a4254> . +<http://example.org/ns#a4255> <http://example.org/ns#a4255> <http://example.org/ns#a4255> . +<http://example.org/ns#a4256> <http://example.org/ns#a4256> <http://example.org/ns#a4256> . +<http://example.org/ns#a4257> <http://example.org/ns#a4257> <http://example.org/ns#a4257> . +<http://example.org/ns#a4258> <http://example.org/ns#a4258> <http://example.org/ns#a4258> . +<http://example.org/ns#a4259> <http://example.org/ns#a4259> <http://example.org/ns#a4259> . +<http://example.org/ns#a4260> <http://example.org/ns#a4260> <http://example.org/ns#a4260> . +<http://example.org/ns#a4261> <http://example.org/ns#a4261> <http://example.org/ns#a4261> . +<http://example.org/ns#a4262> <http://example.org/ns#a4262> <http://example.org/ns#a4262> . +<http://example.org/ns#a4263> <http://example.org/ns#a4263> <http://example.org/ns#a4263> . +<http://example.org/ns#a4264> <http://example.org/ns#a4264> <http://example.org/ns#a4264> . +<http://example.org/ns#a4265> <http://example.org/ns#a4265> <http://example.org/ns#a4265> . +<http://example.org/ns#a4266> <http://example.org/ns#a4266> <http://example.org/ns#a4266> . +<http://example.org/ns#a4267> <http://example.org/ns#a4267> <http://example.org/ns#a4267> . +<http://example.org/ns#a4268> <http://example.org/ns#a4268> <http://example.org/ns#a4268> . +<http://example.org/ns#a4269> <http://example.org/ns#a4269> <http://example.org/ns#a4269> . +<http://example.org/ns#a4270> <http://example.org/ns#a4270> <http://example.org/ns#a4270> . +<http://example.org/ns#a4271> <http://example.org/ns#a4271> <http://example.org/ns#a4271> . +<http://example.org/ns#a4272> <http://example.org/ns#a4272> <http://example.org/ns#a4272> . +<http://example.org/ns#a4273> <http://example.org/ns#a4273> <http://example.org/ns#a4273> . +<http://example.org/ns#a4274> <http://example.org/ns#a4274> <http://example.org/ns#a4274> . +<http://example.org/ns#a4275> <http://example.org/ns#a4275> <http://example.org/ns#a4275> . +<http://example.org/ns#a4276> <http://example.org/ns#a4276> <http://example.org/ns#a4276> . +<http://example.org/ns#a4277> <http://example.org/ns#a4277> <http://example.org/ns#a4277> . +<http://example.org/ns#a4278> <http://example.org/ns#a4278> <http://example.org/ns#a4278> . +<http://example.org/ns#a4279> <http://example.org/ns#a4279> <http://example.org/ns#a4279> . +<http://example.org/ns#a4280> <http://example.org/ns#a4280> <http://example.org/ns#a4280> . +<http://example.org/ns#a4281> <http://example.org/ns#a4281> <http://example.org/ns#a4281> . +<http://example.org/ns#a4282> <http://example.org/ns#a4282> <http://example.org/ns#a4282> . +<http://example.org/ns#a4283> <http://example.org/ns#a4283> <http://example.org/ns#a4283> . +<http://example.org/ns#a4284> <http://example.org/ns#a4284> <http://example.org/ns#a4284> . +<http://example.org/ns#a4285> <http://example.org/ns#a4285> <http://example.org/ns#a4285> . +<http://example.org/ns#a4286> <http://example.org/ns#a4286> <http://example.org/ns#a4286> . +<http://example.org/ns#a4287> <http://example.org/ns#a4287> <http://example.org/ns#a4287> . +<http://example.org/ns#a4288> <http://example.org/ns#a4288> <http://example.org/ns#a4288> . +<http://example.org/ns#a4289> <http://example.org/ns#a4289> <http://example.org/ns#a4289> . +<http://example.org/ns#a4290> <http://example.org/ns#a4290> <http://example.org/ns#a4290> . +<http://example.org/ns#a4291> <http://example.org/ns#a4291> <http://example.org/ns#a4291> . +<http://example.org/ns#a4292> <http://example.org/ns#a4292> <http://example.org/ns#a4292> . +<http://example.org/ns#a4293> <http://example.org/ns#a4293> <http://example.org/ns#a4293> . +<http://example.org/ns#a4294> <http://example.org/ns#a4294> <http://example.org/ns#a4294> . +<http://example.org/ns#a4295> <http://example.org/ns#a4295> <http://example.org/ns#a4295> . +<http://example.org/ns#a4296> <http://example.org/ns#a4296> <http://example.org/ns#a4296> . +<http://example.org/ns#a4297> <http://example.org/ns#a4297> <http://example.org/ns#a4297> . +<http://example.org/ns#a4298> <http://example.org/ns#a4298> <http://example.org/ns#a4298> . +<http://example.org/ns#a4299> <http://example.org/ns#a4299> <http://example.org/ns#a4299> . +<http://example.org/ns#a4300> <http://example.org/ns#a4300> <http://example.org/ns#a4300> . +<http://example.org/ns#a4301> <http://example.org/ns#a4301> <http://example.org/ns#a4301> . +<http://example.org/ns#a4302> <http://example.org/ns#a4302> <http://example.org/ns#a4302> . +<http://example.org/ns#a4303> <http://example.org/ns#a4303> <http://example.org/ns#a4303> . +<http://example.org/ns#a4304> <http://example.org/ns#a4304> <http://example.org/ns#a4304> . +<http://example.org/ns#a4305> <http://example.org/ns#a4305> <http://example.org/ns#a4305> . +<http://example.org/ns#a4306> <http://example.org/ns#a4306> <http://example.org/ns#a4306> . +<http://example.org/ns#a4307> <http://example.org/ns#a4307> <http://example.org/ns#a4307> . +<http://example.org/ns#a4308> <http://example.org/ns#a4308> <http://example.org/ns#a4308> . +<http://example.org/ns#a4309> <http://example.org/ns#a4309> <http://example.org/ns#a4309> . +<http://example.org/ns#a4310> <http://example.org/ns#a4310> <http://example.org/ns#a4310> . +<http://example.org/ns#a4311> <http://example.org/ns#a4311> <http://example.org/ns#a4311> . +<http://example.org/ns#a4312> <http://example.org/ns#a4312> <http://example.org/ns#a4312> . +<http://example.org/ns#a4313> <http://example.org/ns#a4313> <http://example.org/ns#a4313> . +<http://example.org/ns#a4314> <http://example.org/ns#a4314> <http://example.org/ns#a4314> . +<http://example.org/ns#a4315> <http://example.org/ns#a4315> <http://example.org/ns#a4315> . +<http://example.org/ns#a4316> <http://example.org/ns#a4316> <http://example.org/ns#a4316> . +<http://example.org/ns#a4317> <http://example.org/ns#a4317> <http://example.org/ns#a4317> . +<http://example.org/ns#a4318> <http://example.org/ns#a4318> <http://example.org/ns#a4318> . +<http://example.org/ns#a4319> <http://example.org/ns#a4319> <http://example.org/ns#a4319> . +<http://example.org/ns#a4320> <http://example.org/ns#a4320> <http://example.org/ns#a4320> . +<http://example.org/ns#a4321> <http://example.org/ns#a4321> <http://example.org/ns#a4321> . +<http://example.org/ns#a4322> <http://example.org/ns#a4322> <http://example.org/ns#a4322> . +<http://example.org/ns#a4323> <http://example.org/ns#a4323> <http://example.org/ns#a4323> . +<http://example.org/ns#a4324> <http://example.org/ns#a4324> <http://example.org/ns#a4324> . +<http://example.org/ns#a4325> <http://example.org/ns#a4325> <http://example.org/ns#a4325> . +<http://example.org/ns#a4326> <http://example.org/ns#a4326> <http://example.org/ns#a4326> . +<http://example.org/ns#a4327> <http://example.org/ns#a4327> <http://example.org/ns#a4327> . +<http://example.org/ns#a4328> <http://example.org/ns#a4328> <http://example.org/ns#a4328> . +<http://example.org/ns#a4329> <http://example.org/ns#a4329> <http://example.org/ns#a4329> . +<http://example.org/ns#a4330> <http://example.org/ns#a4330> <http://example.org/ns#a4330> . +<http://example.org/ns#a4331> <http://example.org/ns#a4331> <http://example.org/ns#a4331> . +<http://example.org/ns#a4332> <http://example.org/ns#a4332> <http://example.org/ns#a4332> . +<http://example.org/ns#a4333> <http://example.org/ns#a4333> <http://example.org/ns#a4333> . +<http://example.org/ns#a4334> <http://example.org/ns#a4334> <http://example.org/ns#a4334> . +<http://example.org/ns#a4335> <http://example.org/ns#a4335> <http://example.org/ns#a4335> . +<http://example.org/ns#a4336> <http://example.org/ns#a4336> <http://example.org/ns#a4336> . +<http://example.org/ns#a4337> <http://example.org/ns#a4337> <http://example.org/ns#a4337> . +<http://example.org/ns#a4338> <http://example.org/ns#a4338> <http://example.org/ns#a4338> . +<http://example.org/ns#a4339> <http://example.org/ns#a4339> <http://example.org/ns#a4339> . +<http://example.org/ns#a4340> <http://example.org/ns#a4340> <http://example.org/ns#a4340> . +<http://example.org/ns#a4341> <http://example.org/ns#a4341> <http://example.org/ns#a4341> . +<http://example.org/ns#a4342> <http://example.org/ns#a4342> <http://example.org/ns#a4342> . +<http://example.org/ns#a4343> <http://example.org/ns#a4343> <http://example.org/ns#a4343> . +<http://example.org/ns#a4344> <http://example.org/ns#a4344> <http://example.org/ns#a4344> . +<http://example.org/ns#a4345> <http://example.org/ns#a4345> <http://example.org/ns#a4345> . +<http://example.org/ns#a4346> <http://example.org/ns#a4346> <http://example.org/ns#a4346> . +<http://example.org/ns#a4347> <http://example.org/ns#a4347> <http://example.org/ns#a4347> . +<http://example.org/ns#a4348> <http://example.org/ns#a4348> <http://example.org/ns#a4348> . +<http://example.org/ns#a4349> <http://example.org/ns#a4349> <http://example.org/ns#a4349> . +<http://example.org/ns#a4350> <http://example.org/ns#a4350> <http://example.org/ns#a4350> . +<http://example.org/ns#a4351> <http://example.org/ns#a4351> <http://example.org/ns#a4351> . +<http://example.org/ns#a4352> <http://example.org/ns#a4352> <http://example.org/ns#a4352> . +<http://example.org/ns#a4353> <http://example.org/ns#a4353> <http://example.org/ns#a4353> . +<http://example.org/ns#a4354> <http://example.org/ns#a4354> <http://example.org/ns#a4354> . +<http://example.org/ns#a4355> <http://example.org/ns#a4355> <http://example.org/ns#a4355> . +<http://example.org/ns#a4356> <http://example.org/ns#a4356> <http://example.org/ns#a4356> . +<http://example.org/ns#a4357> <http://example.org/ns#a4357> <http://example.org/ns#a4357> . +<http://example.org/ns#a4358> <http://example.org/ns#a4358> <http://example.org/ns#a4358> . +<http://example.org/ns#a4359> <http://example.org/ns#a4359> <http://example.org/ns#a4359> . +<http://example.org/ns#a4360> <http://example.org/ns#a4360> <http://example.org/ns#a4360> . +<http://example.org/ns#a4361> <http://example.org/ns#a4361> <http://example.org/ns#a4361> . +<http://example.org/ns#a4362> <http://example.org/ns#a4362> <http://example.org/ns#a4362> . +<http://example.org/ns#a4363> <http://example.org/ns#a4363> <http://example.org/ns#a4363> . +<http://example.org/ns#a4364> <http://example.org/ns#a4364> <http://example.org/ns#a4364> . +<http://example.org/ns#a4365> <http://example.org/ns#a4365> <http://example.org/ns#a4365> . +<http://example.org/ns#a4366> <http://example.org/ns#a4366> <http://example.org/ns#a4366> . +<http://example.org/ns#a4367> <http://example.org/ns#a4367> <http://example.org/ns#a4367> . +<http://example.org/ns#a4368> <http://example.org/ns#a4368> <http://example.org/ns#a4368> . +<http://example.org/ns#a4369> <http://example.org/ns#a4369> <http://example.org/ns#a4369> . +<http://example.org/ns#a4370> <http://example.org/ns#a4370> <http://example.org/ns#a4370> . +<http://example.org/ns#a4371> <http://example.org/ns#a4371> <http://example.org/ns#a4371> . +<http://example.org/ns#a4372> <http://example.org/ns#a4372> <http://example.org/ns#a4372> . +<http://example.org/ns#a4373> <http://example.org/ns#a4373> <http://example.org/ns#a4373> . +<http://example.org/ns#a4374> <http://example.org/ns#a4374> <http://example.org/ns#a4374> . +<http://example.org/ns#a4375> <http://example.org/ns#a4375> <http://example.org/ns#a4375> . +<http://example.org/ns#a4376> <http://example.org/ns#a4376> <http://example.org/ns#a4376> . +<http://example.org/ns#a4377> <http://example.org/ns#a4377> <http://example.org/ns#a4377> . +<http://example.org/ns#a4378> <http://example.org/ns#a4378> <http://example.org/ns#a4378> . +<http://example.org/ns#a4379> <http://example.org/ns#a4379> <http://example.org/ns#a4379> . +<http://example.org/ns#a4380> <http://example.org/ns#a4380> <http://example.org/ns#a4380> . +<http://example.org/ns#a4381> <http://example.org/ns#a4381> <http://example.org/ns#a4381> . +<http://example.org/ns#a4382> <http://example.org/ns#a4382> <http://example.org/ns#a4382> . +<http://example.org/ns#a4383> <http://example.org/ns#a4383> <http://example.org/ns#a4383> . +<http://example.org/ns#a4384> <http://example.org/ns#a4384> <http://example.org/ns#a4384> . +<http://example.org/ns#a4385> <http://example.org/ns#a4385> <http://example.org/ns#a4385> . +<http://example.org/ns#a4386> <http://example.org/ns#a4386> <http://example.org/ns#a4386> . +<http://example.org/ns#a4387> <http://example.org/ns#a4387> <http://example.org/ns#a4387> . +<http://example.org/ns#a4388> <http://example.org/ns#a4388> <http://example.org/ns#a4388> . +<http://example.org/ns#a4389> <http://example.org/ns#a4389> <http://example.org/ns#a4389> . +<http://example.org/ns#a4390> <http://example.org/ns#a4390> <http://example.org/ns#a4390> . +<http://example.org/ns#a4391> <http://example.org/ns#a4391> <http://example.org/ns#a4391> . +<http://example.org/ns#a4392> <http://example.org/ns#a4392> <http://example.org/ns#a4392> . +<http://example.org/ns#a4393> <http://example.org/ns#a4393> <http://example.org/ns#a4393> . +<http://example.org/ns#a4394> <http://example.org/ns#a4394> <http://example.org/ns#a4394> . +<http://example.org/ns#a4395> <http://example.org/ns#a4395> <http://example.org/ns#a4395> . +<http://example.org/ns#a4396> <http://example.org/ns#a4396> <http://example.org/ns#a4396> . +<http://example.org/ns#a4397> <http://example.org/ns#a4397> <http://example.org/ns#a4397> . +<http://example.org/ns#a4398> <http://example.org/ns#a4398> <http://example.org/ns#a4398> . +<http://example.org/ns#a4399> <http://example.org/ns#a4399> <http://example.org/ns#a4399> . +<http://example.org/ns#a4400> <http://example.org/ns#a4400> <http://example.org/ns#a4400> . +<http://example.org/ns#a4401> <http://example.org/ns#a4401> <http://example.org/ns#a4401> . +<http://example.org/ns#a4402> <http://example.org/ns#a4402> <http://example.org/ns#a4402> . +<http://example.org/ns#a4403> <http://example.org/ns#a4403> <http://example.org/ns#a4403> . +<http://example.org/ns#a4404> <http://example.org/ns#a4404> <http://example.org/ns#a4404> . +<http://example.org/ns#a4405> <http://example.org/ns#a4405> <http://example.org/ns#a4405> . +<http://example.org/ns#a4406> <http://example.org/ns#a4406> <http://example.org/ns#a4406> . +<http://example.org/ns#a4407> <http://example.org/ns#a4407> <http://example.org/ns#a4407> . +<http://example.org/ns#a4408> <http://example.org/ns#a4408> <http://example.org/ns#a4408> . +<http://example.org/ns#a4409> <http://example.org/ns#a4409> <http://example.org/ns#a4409> . +<http://example.org/ns#a4410> <http://example.org/ns#a4410> <http://example.org/ns#a4410> . +<http://example.org/ns#a4411> <http://example.org/ns#a4411> <http://example.org/ns#a4411> . +<http://example.org/ns#a4412> <http://example.org/ns#a4412> <http://example.org/ns#a4412> . +<http://example.org/ns#a4413> <http://example.org/ns#a4413> <http://example.org/ns#a4413> . +<http://example.org/ns#a4414> <http://example.org/ns#a4414> <http://example.org/ns#a4414> . +<http://example.org/ns#a4415> <http://example.org/ns#a4415> <http://example.org/ns#a4415> . +<http://example.org/ns#a4416> <http://example.org/ns#a4416> <http://example.org/ns#a4416> . +<http://example.org/ns#a4417> <http://example.org/ns#a4417> <http://example.org/ns#a4417> . +<http://example.org/ns#a4418> <http://example.org/ns#a4418> <http://example.org/ns#a4418> . +<http://example.org/ns#a4419> <http://example.org/ns#a4419> <http://example.org/ns#a4419> . +<http://example.org/ns#a4420> <http://example.org/ns#a4420> <http://example.org/ns#a4420> . +<http://example.org/ns#a4421> <http://example.org/ns#a4421> <http://example.org/ns#a4421> . +<http://example.org/ns#a4422> <http://example.org/ns#a4422> <http://example.org/ns#a4422> . +<http://example.org/ns#a4423> <http://example.org/ns#a4423> <http://example.org/ns#a4423> . +<http://example.org/ns#a4424> <http://example.org/ns#a4424> <http://example.org/ns#a4424> . +<http://example.org/ns#a4425> <http://example.org/ns#a4425> <http://example.org/ns#a4425> . +<http://example.org/ns#a4426> <http://example.org/ns#a4426> <http://example.org/ns#a4426> . +<http://example.org/ns#a4427> <http://example.org/ns#a4427> <http://example.org/ns#a4427> . +<http://example.org/ns#a4428> <http://example.org/ns#a4428> <http://example.org/ns#a4428> . +<http://example.org/ns#a4429> <http://example.org/ns#a4429> <http://example.org/ns#a4429> . +<http://example.org/ns#a4430> <http://example.org/ns#a4430> <http://example.org/ns#a4430> . +<http://example.org/ns#a4431> <http://example.org/ns#a4431> <http://example.org/ns#a4431> . +<http://example.org/ns#a4432> <http://example.org/ns#a4432> <http://example.org/ns#a4432> . +<http://example.org/ns#a4433> <http://example.org/ns#a4433> <http://example.org/ns#a4433> . +<http://example.org/ns#a4434> <http://example.org/ns#a4434> <http://example.org/ns#a4434> . +<http://example.org/ns#a4435> <http://example.org/ns#a4435> <http://example.org/ns#a4435> . +<http://example.org/ns#a4436> <http://example.org/ns#a4436> <http://example.org/ns#a4436> . +<http://example.org/ns#a4437> <http://example.org/ns#a4437> <http://example.org/ns#a4437> . +<http://example.org/ns#a4438> <http://example.org/ns#a4438> <http://example.org/ns#a4438> . +<http://example.org/ns#a4439> <http://example.org/ns#a4439> <http://example.org/ns#a4439> . +<http://example.org/ns#a4440> <http://example.org/ns#a4440> <http://example.org/ns#a4440> . +<http://example.org/ns#a4441> <http://example.org/ns#a4441> <http://example.org/ns#a4441> . +<http://example.org/ns#a4442> <http://example.org/ns#a4442> <http://example.org/ns#a4442> . +<http://example.org/ns#a4443> <http://example.org/ns#a4443> <http://example.org/ns#a4443> . +<http://example.org/ns#a4444> <http://example.org/ns#a4444> <http://example.org/ns#a4444> . +<http://example.org/ns#a4445> <http://example.org/ns#a4445> <http://example.org/ns#a4445> . +<http://example.org/ns#a4446> <http://example.org/ns#a4446> <http://example.org/ns#a4446> . +<http://example.org/ns#a4447> <http://example.org/ns#a4447> <http://example.org/ns#a4447> . +<http://example.org/ns#a4448> <http://example.org/ns#a4448> <http://example.org/ns#a4448> . +<http://example.org/ns#a4449> <http://example.org/ns#a4449> <http://example.org/ns#a4449> . +<http://example.org/ns#a4450> <http://example.org/ns#a4450> <http://example.org/ns#a4450> . +<http://example.org/ns#a4451> <http://example.org/ns#a4451> <http://example.org/ns#a4451> . +<http://example.org/ns#a4452> <http://example.org/ns#a4452> <http://example.org/ns#a4452> . +<http://example.org/ns#a4453> <http://example.org/ns#a4453> <http://example.org/ns#a4453> . +<http://example.org/ns#a4454> <http://example.org/ns#a4454> <http://example.org/ns#a4454> . +<http://example.org/ns#a4455> <http://example.org/ns#a4455> <http://example.org/ns#a4455> . +<http://example.org/ns#a4456> <http://example.org/ns#a4456> <http://example.org/ns#a4456> . +<http://example.org/ns#a4457> <http://example.org/ns#a4457> <http://example.org/ns#a4457> . +<http://example.org/ns#a4458> <http://example.org/ns#a4458> <http://example.org/ns#a4458> . +<http://example.org/ns#a4459> <http://example.org/ns#a4459> <http://example.org/ns#a4459> . +<http://example.org/ns#a4460> <http://example.org/ns#a4460> <http://example.org/ns#a4460> . +<http://example.org/ns#a4461> <http://example.org/ns#a4461> <http://example.org/ns#a4461> . +<http://example.org/ns#a4462> <http://example.org/ns#a4462> <http://example.org/ns#a4462> . +<http://example.org/ns#a4463> <http://example.org/ns#a4463> <http://example.org/ns#a4463> . +<http://example.org/ns#a4464> <http://example.org/ns#a4464> <http://example.org/ns#a4464> . +<http://example.org/ns#a4465> <http://example.org/ns#a4465> <http://example.org/ns#a4465> . +<http://example.org/ns#a4466> <http://example.org/ns#a4466> <http://example.org/ns#a4466> . +<http://example.org/ns#a4467> <http://example.org/ns#a4467> <http://example.org/ns#a4467> . +<http://example.org/ns#a4468> <http://example.org/ns#a4468> <http://example.org/ns#a4468> . +<http://example.org/ns#a4469> <http://example.org/ns#a4469> <http://example.org/ns#a4469> . +<http://example.org/ns#a4470> <http://example.org/ns#a4470> <http://example.org/ns#a4470> . +<http://example.org/ns#a4471> <http://example.org/ns#a4471> <http://example.org/ns#a4471> . +<http://example.org/ns#a4472> <http://example.org/ns#a4472> <http://example.org/ns#a4472> . +<http://example.org/ns#a4473> <http://example.org/ns#a4473> <http://example.org/ns#a4473> . +<http://example.org/ns#a4474> <http://example.org/ns#a4474> <http://example.org/ns#a4474> . +<http://example.org/ns#a4475> <http://example.org/ns#a4475> <http://example.org/ns#a4475> . +<http://example.org/ns#a4476> <http://example.org/ns#a4476> <http://example.org/ns#a4476> . +<http://example.org/ns#a4477> <http://example.org/ns#a4477> <http://example.org/ns#a4477> . +<http://example.org/ns#a4478> <http://example.org/ns#a4478> <http://example.org/ns#a4478> . +<http://example.org/ns#a4479> <http://example.org/ns#a4479> <http://example.org/ns#a4479> . +<http://example.org/ns#a4480> <http://example.org/ns#a4480> <http://example.org/ns#a4480> . +<http://example.org/ns#a4481> <http://example.org/ns#a4481> <http://example.org/ns#a4481> . +<http://example.org/ns#a4482> <http://example.org/ns#a4482> <http://example.org/ns#a4482> . +<http://example.org/ns#a4483> <http://example.org/ns#a4483> <http://example.org/ns#a4483> . +<http://example.org/ns#a4484> <http://example.org/ns#a4484> <http://example.org/ns#a4484> . +<http://example.org/ns#a4485> <http://example.org/ns#a4485> <http://example.org/ns#a4485> . +<http://example.org/ns#a4486> <http://example.org/ns#a4486> <http://example.org/ns#a4486> . +<http://example.org/ns#a4487> <http://example.org/ns#a4487> <http://example.org/ns#a4487> . +<http://example.org/ns#a4488> <http://example.org/ns#a4488> <http://example.org/ns#a4488> . +<http://example.org/ns#a4489> <http://example.org/ns#a4489> <http://example.org/ns#a4489> . +<http://example.org/ns#a4490> <http://example.org/ns#a4490> <http://example.org/ns#a4490> . +<http://example.org/ns#a4491> <http://example.org/ns#a4491> <http://example.org/ns#a4491> . +<http://example.org/ns#a4492> <http://example.org/ns#a4492> <http://example.org/ns#a4492> . +<http://example.org/ns#a4493> <http://example.org/ns#a4493> <http://example.org/ns#a4493> . +<http://example.org/ns#a4494> <http://example.org/ns#a4494> <http://example.org/ns#a4494> . +<http://example.org/ns#a4495> <http://example.org/ns#a4495> <http://example.org/ns#a4495> . +<http://example.org/ns#a4496> <http://example.org/ns#a4496> <http://example.org/ns#a4496> . +<http://example.org/ns#a4497> <http://example.org/ns#a4497> <http://example.org/ns#a4497> . +<http://example.org/ns#a4498> <http://example.org/ns#a4498> <http://example.org/ns#a4498> . +<http://example.org/ns#a4499> <http://example.org/ns#a4499> <http://example.org/ns#a4499> . +<http://example.org/ns#a4500> <http://example.org/ns#a4500> <http://example.org/ns#a4500> . +<http://example.org/ns#a4501> <http://example.org/ns#a4501> <http://example.org/ns#a4501> . +<http://example.org/ns#a4502> <http://example.org/ns#a4502> <http://example.org/ns#a4502> . +<http://example.org/ns#a4503> <http://example.org/ns#a4503> <http://example.org/ns#a4503> . +<http://example.org/ns#a4504> <http://example.org/ns#a4504> <http://example.org/ns#a4504> . +<http://example.org/ns#a4505> <http://example.org/ns#a4505> <http://example.org/ns#a4505> . +<http://example.org/ns#a4506> <http://example.org/ns#a4506> <http://example.org/ns#a4506> . +<http://example.org/ns#a4507> <http://example.org/ns#a4507> <http://example.org/ns#a4507> . +<http://example.org/ns#a4508> <http://example.org/ns#a4508> <http://example.org/ns#a4508> . +<http://example.org/ns#a4509> <http://example.org/ns#a4509> <http://example.org/ns#a4509> . +<http://example.org/ns#a4510> <http://example.org/ns#a4510> <http://example.org/ns#a4510> . +<http://example.org/ns#a4511> <http://example.org/ns#a4511> <http://example.org/ns#a4511> . +<http://example.org/ns#a4512> <http://example.org/ns#a4512> <http://example.org/ns#a4512> . +<http://example.org/ns#a4513> <http://example.org/ns#a4513> <http://example.org/ns#a4513> . +<http://example.org/ns#a4514> <http://example.org/ns#a4514> <http://example.org/ns#a4514> . +<http://example.org/ns#a4515> <http://example.org/ns#a4515> <http://example.org/ns#a4515> . +<http://example.org/ns#a4516> <http://example.org/ns#a4516> <http://example.org/ns#a4516> . +<http://example.org/ns#a4517> <http://example.org/ns#a4517> <http://example.org/ns#a4517> . +<http://example.org/ns#a4518> <http://example.org/ns#a4518> <http://example.org/ns#a4518> . +<http://example.org/ns#a4519> <http://example.org/ns#a4519> <http://example.org/ns#a4519> . +<http://example.org/ns#a4520> <http://example.org/ns#a4520> <http://example.org/ns#a4520> . +<http://example.org/ns#a4521> <http://example.org/ns#a4521> <http://example.org/ns#a4521> . +<http://example.org/ns#a4522> <http://example.org/ns#a4522> <http://example.org/ns#a4522> . +<http://example.org/ns#a4523> <http://example.org/ns#a4523> <http://example.org/ns#a4523> . +<http://example.org/ns#a4524> <http://example.org/ns#a4524> <http://example.org/ns#a4524> . +<http://example.org/ns#a4525> <http://example.org/ns#a4525> <http://example.org/ns#a4525> . +<http://example.org/ns#a4526> <http://example.org/ns#a4526> <http://example.org/ns#a4526> . +<http://example.org/ns#a4527> <http://example.org/ns#a4527> <http://example.org/ns#a4527> . +<http://example.org/ns#a4528> <http://example.org/ns#a4528> <http://example.org/ns#a4528> . +<http://example.org/ns#a4529> <http://example.org/ns#a4529> <http://example.org/ns#a4529> . +<http://example.org/ns#a4530> <http://example.org/ns#a4530> <http://example.org/ns#a4530> . +<http://example.org/ns#a4531> <http://example.org/ns#a4531> <http://example.org/ns#a4531> . +<http://example.org/ns#a4532> <http://example.org/ns#a4532> <http://example.org/ns#a4532> . +<http://example.org/ns#a4533> <http://example.org/ns#a4533> <http://example.org/ns#a4533> . +<http://example.org/ns#a4534> <http://example.org/ns#a4534> <http://example.org/ns#a4534> . +<http://example.org/ns#a4535> <http://example.org/ns#a4535> <http://example.org/ns#a4535> . +<http://example.org/ns#a4536> <http://example.org/ns#a4536> <http://example.org/ns#a4536> . +<http://example.org/ns#a4537> <http://example.org/ns#a4537> <http://example.org/ns#a4537> . +<http://example.org/ns#a4538> <http://example.org/ns#a4538> <http://example.org/ns#a4538> . +<http://example.org/ns#a4539> <http://example.org/ns#a4539> <http://example.org/ns#a4539> . +<http://example.org/ns#a4540> <http://example.org/ns#a4540> <http://example.org/ns#a4540> . +<http://example.org/ns#a4541> <http://example.org/ns#a4541> <http://example.org/ns#a4541> . +<http://example.org/ns#a4542> <http://example.org/ns#a4542> <http://example.org/ns#a4542> . +<http://example.org/ns#a4543> <http://example.org/ns#a4543> <http://example.org/ns#a4543> . +<http://example.org/ns#a4544> <http://example.org/ns#a4544> <http://example.org/ns#a4544> . +<http://example.org/ns#a4545> <http://example.org/ns#a4545> <http://example.org/ns#a4545> . +<http://example.org/ns#a4546> <http://example.org/ns#a4546> <http://example.org/ns#a4546> . +<http://example.org/ns#a4547> <http://example.org/ns#a4547> <http://example.org/ns#a4547> . +<http://example.org/ns#a4548> <http://example.org/ns#a4548> <http://example.org/ns#a4548> . +<http://example.org/ns#a4549> <http://example.org/ns#a4549> <http://example.org/ns#a4549> . +<http://example.org/ns#a4550> <http://example.org/ns#a4550> <http://example.org/ns#a4550> . +<http://example.org/ns#a4551> <http://example.org/ns#a4551> <http://example.org/ns#a4551> . +<http://example.org/ns#a4552> <http://example.org/ns#a4552> <http://example.org/ns#a4552> . +<http://example.org/ns#a4553> <http://example.org/ns#a4553> <http://example.org/ns#a4553> . +<http://example.org/ns#a4554> <http://example.org/ns#a4554> <http://example.org/ns#a4554> . +<http://example.org/ns#a4555> <http://example.org/ns#a4555> <http://example.org/ns#a4555> . +<http://example.org/ns#a4556> <http://example.org/ns#a4556> <http://example.org/ns#a4556> . +<http://example.org/ns#a4557> <http://example.org/ns#a4557> <http://example.org/ns#a4557> . +<http://example.org/ns#a4558> <http://example.org/ns#a4558> <http://example.org/ns#a4558> . +<http://example.org/ns#a4559> <http://example.org/ns#a4559> <http://example.org/ns#a4559> . +<http://example.org/ns#a4560> <http://example.org/ns#a4560> <http://example.org/ns#a4560> . +<http://example.org/ns#a4561> <http://example.org/ns#a4561> <http://example.org/ns#a4561> . +<http://example.org/ns#a4562> <http://example.org/ns#a4562> <http://example.org/ns#a4562> . +<http://example.org/ns#a4563> <http://example.org/ns#a4563> <http://example.org/ns#a4563> . +<http://example.org/ns#a4564> <http://example.org/ns#a4564> <http://example.org/ns#a4564> . +<http://example.org/ns#a4565> <http://example.org/ns#a4565> <http://example.org/ns#a4565> . +<http://example.org/ns#a4566> <http://example.org/ns#a4566> <http://example.org/ns#a4566> . +<http://example.org/ns#a4567> <http://example.org/ns#a4567> <http://example.org/ns#a4567> . +<http://example.org/ns#a4568> <http://example.org/ns#a4568> <http://example.org/ns#a4568> . +<http://example.org/ns#a4569> <http://example.org/ns#a4569> <http://example.org/ns#a4569> . +<http://example.org/ns#a4570> <http://example.org/ns#a4570> <http://example.org/ns#a4570> . +<http://example.org/ns#a4571> <http://example.org/ns#a4571> <http://example.org/ns#a4571> . +<http://example.org/ns#a4572> <http://example.org/ns#a4572> <http://example.org/ns#a4572> . +<http://example.org/ns#a4573> <http://example.org/ns#a4573> <http://example.org/ns#a4573> . +<http://example.org/ns#a4574> <http://example.org/ns#a4574> <http://example.org/ns#a4574> . +<http://example.org/ns#a4575> <http://example.org/ns#a4575> <http://example.org/ns#a4575> . +<http://example.org/ns#a4576> <http://example.org/ns#a4576> <http://example.org/ns#a4576> . +<http://example.org/ns#a4577> <http://example.org/ns#a4577> <http://example.org/ns#a4577> . +<http://example.org/ns#a4578> <http://example.org/ns#a4578> <http://example.org/ns#a4578> . +<http://example.org/ns#a4579> <http://example.org/ns#a4579> <http://example.org/ns#a4579> . +<http://example.org/ns#a4580> <http://example.org/ns#a4580> <http://example.org/ns#a4580> . +<http://example.org/ns#a4581> <http://example.org/ns#a4581> <http://example.org/ns#a4581> . +<http://example.org/ns#a4582> <http://example.org/ns#a4582> <http://example.org/ns#a4582> . +<http://example.org/ns#a4583> <http://example.org/ns#a4583> <http://example.org/ns#a4583> . +<http://example.org/ns#a4584> <http://example.org/ns#a4584> <http://example.org/ns#a4584> . +<http://example.org/ns#a4585> <http://example.org/ns#a4585> <http://example.org/ns#a4585> . +<http://example.org/ns#a4586> <http://example.org/ns#a4586> <http://example.org/ns#a4586> . +<http://example.org/ns#a4587> <http://example.org/ns#a4587> <http://example.org/ns#a4587> . +<http://example.org/ns#a4588> <http://example.org/ns#a4588> <http://example.org/ns#a4588> . +<http://example.org/ns#a4589> <http://example.org/ns#a4589> <http://example.org/ns#a4589> . +<http://example.org/ns#a4590> <http://example.org/ns#a4590> <http://example.org/ns#a4590> . +<http://example.org/ns#a4591> <http://example.org/ns#a4591> <http://example.org/ns#a4591> . +<http://example.org/ns#a4592> <http://example.org/ns#a4592> <http://example.org/ns#a4592> . +<http://example.org/ns#a4593> <http://example.org/ns#a4593> <http://example.org/ns#a4593> . +<http://example.org/ns#a4594> <http://example.org/ns#a4594> <http://example.org/ns#a4594> . +<http://example.org/ns#a4595> <http://example.org/ns#a4595> <http://example.org/ns#a4595> . +<http://example.org/ns#a4596> <http://example.org/ns#a4596> <http://example.org/ns#a4596> . +<http://example.org/ns#a4597> <http://example.org/ns#a4597> <http://example.org/ns#a4597> . +<http://example.org/ns#a4598> <http://example.org/ns#a4598> <http://example.org/ns#a4598> . +<http://example.org/ns#a4599> <http://example.org/ns#a4599> <http://example.org/ns#a4599> . +<http://example.org/ns#a4600> <http://example.org/ns#a4600> <http://example.org/ns#a4600> . +<http://example.org/ns#a4601> <http://example.org/ns#a4601> <http://example.org/ns#a4601> . +<http://example.org/ns#a4602> <http://example.org/ns#a4602> <http://example.org/ns#a4602> . +<http://example.org/ns#a4603> <http://example.org/ns#a4603> <http://example.org/ns#a4603> . +<http://example.org/ns#a4604> <http://example.org/ns#a4604> <http://example.org/ns#a4604> . +<http://example.org/ns#a4605> <http://example.org/ns#a4605> <http://example.org/ns#a4605> . +<http://example.org/ns#a4606> <http://example.org/ns#a4606> <http://example.org/ns#a4606> . +<http://example.org/ns#a4607> <http://example.org/ns#a4607> <http://example.org/ns#a4607> . +<http://example.org/ns#a4608> <http://example.org/ns#a4608> <http://example.org/ns#a4608> . +<http://example.org/ns#a4609> <http://example.org/ns#a4609> <http://example.org/ns#a4609> . +<http://example.org/ns#a4610> <http://example.org/ns#a4610> <http://example.org/ns#a4610> . +<http://example.org/ns#a4611> <http://example.org/ns#a4611> <http://example.org/ns#a4611> . +<http://example.org/ns#a4612> <http://example.org/ns#a4612> <http://example.org/ns#a4612> . +<http://example.org/ns#a4613> <http://example.org/ns#a4613> <http://example.org/ns#a4613> . +<http://example.org/ns#a4614> <http://example.org/ns#a4614> <http://example.org/ns#a4614> . +<http://example.org/ns#a4615> <http://example.org/ns#a4615> <http://example.org/ns#a4615> . +<http://example.org/ns#a4616> <http://example.org/ns#a4616> <http://example.org/ns#a4616> . +<http://example.org/ns#a4617> <http://example.org/ns#a4617> <http://example.org/ns#a4617> . +<http://example.org/ns#a4618> <http://example.org/ns#a4618> <http://example.org/ns#a4618> . +<http://example.org/ns#a4619> <http://example.org/ns#a4619> <http://example.org/ns#a4619> . +<http://example.org/ns#a4620> <http://example.org/ns#a4620> <http://example.org/ns#a4620> . +<http://example.org/ns#a4621> <http://example.org/ns#a4621> <http://example.org/ns#a4621> . +<http://example.org/ns#a4622> <http://example.org/ns#a4622> <http://example.org/ns#a4622> . +<http://example.org/ns#a4623> <http://example.org/ns#a4623> <http://example.org/ns#a4623> . +<http://example.org/ns#a4624> <http://example.org/ns#a4624> <http://example.org/ns#a4624> . +<http://example.org/ns#a4625> <http://example.org/ns#a4625> <http://example.org/ns#a4625> . +<http://example.org/ns#a4626> <http://example.org/ns#a4626> <http://example.org/ns#a4626> . +<http://example.org/ns#a4627> <http://example.org/ns#a4627> <http://example.org/ns#a4627> . +<http://example.org/ns#a4628> <http://example.org/ns#a4628> <http://example.org/ns#a4628> . +<http://example.org/ns#a4629> <http://example.org/ns#a4629> <http://example.org/ns#a4629> . +<http://example.org/ns#a4630> <http://example.org/ns#a4630> <http://example.org/ns#a4630> . +<http://example.org/ns#a4631> <http://example.org/ns#a4631> <http://example.org/ns#a4631> . +<http://example.org/ns#a4632> <http://example.org/ns#a4632> <http://example.org/ns#a4632> . +<http://example.org/ns#a4633> <http://example.org/ns#a4633> <http://example.org/ns#a4633> . +<http://example.org/ns#a4634> <http://example.org/ns#a4634> <http://example.org/ns#a4634> . +<http://example.org/ns#a4635> <http://example.org/ns#a4635> <http://example.org/ns#a4635> . +<http://example.org/ns#a4636> <http://example.org/ns#a4636> <http://example.org/ns#a4636> . +<http://example.org/ns#a4637> <http://example.org/ns#a4637> <http://example.org/ns#a4637> . +<http://example.org/ns#a4638> <http://example.org/ns#a4638> <http://example.org/ns#a4638> . +<http://example.org/ns#a4639> <http://example.org/ns#a4639> <http://example.org/ns#a4639> . +<http://example.org/ns#a4640> <http://example.org/ns#a4640> <http://example.org/ns#a4640> . +<http://example.org/ns#a4641> <http://example.org/ns#a4641> <http://example.org/ns#a4641> . +<http://example.org/ns#a4642> <http://example.org/ns#a4642> <http://example.org/ns#a4642> . +<http://example.org/ns#a4643> <http://example.org/ns#a4643> <http://example.org/ns#a4643> . +<http://example.org/ns#a4644> <http://example.org/ns#a4644> <http://example.org/ns#a4644> . +<http://example.org/ns#a4645> <http://example.org/ns#a4645> <http://example.org/ns#a4645> . +<http://example.org/ns#a4646> <http://example.org/ns#a4646> <http://example.org/ns#a4646> . +<http://example.org/ns#a4647> <http://example.org/ns#a4647> <http://example.org/ns#a4647> . +<http://example.org/ns#a4648> <http://example.org/ns#a4648> <http://example.org/ns#a4648> . +<http://example.org/ns#a4649> <http://example.org/ns#a4649> <http://example.org/ns#a4649> . +<http://example.org/ns#a4650> <http://example.org/ns#a4650> <http://example.org/ns#a4650> . +<http://example.org/ns#a4651> <http://example.org/ns#a4651> <http://example.org/ns#a4651> . +<http://example.org/ns#a4652> <http://example.org/ns#a4652> <http://example.org/ns#a4652> . +<http://example.org/ns#a4653> <http://example.org/ns#a4653> <http://example.org/ns#a4653> . +<http://example.org/ns#a4654> <http://example.org/ns#a4654> <http://example.org/ns#a4654> . +<http://example.org/ns#a4655> <http://example.org/ns#a4655> <http://example.org/ns#a4655> . +<http://example.org/ns#a4656> <http://example.org/ns#a4656> <http://example.org/ns#a4656> . +<http://example.org/ns#a4657> <http://example.org/ns#a4657> <http://example.org/ns#a4657> . +<http://example.org/ns#a4658> <http://example.org/ns#a4658> <http://example.org/ns#a4658> . +<http://example.org/ns#a4659> <http://example.org/ns#a4659> <http://example.org/ns#a4659> . +<http://example.org/ns#a4660> <http://example.org/ns#a4660> <http://example.org/ns#a4660> . +<http://example.org/ns#a4661> <http://example.org/ns#a4661> <http://example.org/ns#a4661> . +<http://example.org/ns#a4662> <http://example.org/ns#a4662> <http://example.org/ns#a4662> . +<http://example.org/ns#a4663> <http://example.org/ns#a4663> <http://example.org/ns#a4663> . +<http://example.org/ns#a4664> <http://example.org/ns#a4664> <http://example.org/ns#a4664> . +<http://example.org/ns#a4665> <http://example.org/ns#a4665> <http://example.org/ns#a4665> . +<http://example.org/ns#a4666> <http://example.org/ns#a4666> <http://example.org/ns#a4666> . +<http://example.org/ns#a4667> <http://example.org/ns#a4667> <http://example.org/ns#a4667> . +<http://example.org/ns#a4668> <http://example.org/ns#a4668> <http://example.org/ns#a4668> . +<http://example.org/ns#a4669> <http://example.org/ns#a4669> <http://example.org/ns#a4669> . +<http://example.org/ns#a4670> <http://example.org/ns#a4670> <http://example.org/ns#a4670> . +<http://example.org/ns#a4671> <http://example.org/ns#a4671> <http://example.org/ns#a4671> . +<http://example.org/ns#a4672> <http://example.org/ns#a4672> <http://example.org/ns#a4672> . +<http://example.org/ns#a4673> <http://example.org/ns#a4673> <http://example.org/ns#a4673> . +<http://example.org/ns#a4674> <http://example.org/ns#a4674> <http://example.org/ns#a4674> . +<http://example.org/ns#a4675> <http://example.org/ns#a4675> <http://example.org/ns#a4675> . +<http://example.org/ns#a4676> <http://example.org/ns#a4676> <http://example.org/ns#a4676> . +<http://example.org/ns#a4677> <http://example.org/ns#a4677> <http://example.org/ns#a4677> . +<http://example.org/ns#a4678> <http://example.org/ns#a4678> <http://example.org/ns#a4678> . +<http://example.org/ns#a4679> <http://example.org/ns#a4679> <http://example.org/ns#a4679> . +<http://example.org/ns#a4680> <http://example.org/ns#a4680> <http://example.org/ns#a4680> . +<http://example.org/ns#a4681> <http://example.org/ns#a4681> <http://example.org/ns#a4681> . +<http://example.org/ns#a4682> <http://example.org/ns#a4682> <http://example.org/ns#a4682> . +<http://example.org/ns#a4683> <http://example.org/ns#a4683> <http://example.org/ns#a4683> . +<http://example.org/ns#a4684> <http://example.org/ns#a4684> <http://example.org/ns#a4684> . +<http://example.org/ns#a4685> <http://example.org/ns#a4685> <http://example.org/ns#a4685> . +<http://example.org/ns#a4686> <http://example.org/ns#a4686> <http://example.org/ns#a4686> . +<http://example.org/ns#a4687> <http://example.org/ns#a4687> <http://example.org/ns#a4687> . +<http://example.org/ns#a4688> <http://example.org/ns#a4688> <http://example.org/ns#a4688> . +<http://example.org/ns#a4689> <http://example.org/ns#a4689> <http://example.org/ns#a4689> . +<http://example.org/ns#a4690> <http://example.org/ns#a4690> <http://example.org/ns#a4690> . +<http://example.org/ns#a4691> <http://example.org/ns#a4691> <http://example.org/ns#a4691> . +<http://example.org/ns#a4692> <http://example.org/ns#a4692> <http://example.org/ns#a4692> . +<http://example.org/ns#a4693> <http://example.org/ns#a4693> <http://example.org/ns#a4693> . +<http://example.org/ns#a4694> <http://example.org/ns#a4694> <http://example.org/ns#a4694> . +<http://example.org/ns#a4695> <http://example.org/ns#a4695> <http://example.org/ns#a4695> . +<http://example.org/ns#a4696> <http://example.org/ns#a4696> <http://example.org/ns#a4696> . +<http://example.org/ns#a4697> <http://example.org/ns#a4697> <http://example.org/ns#a4697> . +<http://example.org/ns#a4698> <http://example.org/ns#a4698> <http://example.org/ns#a4698> . +<http://example.org/ns#a4699> <http://example.org/ns#a4699> <http://example.org/ns#a4699> . +<http://example.org/ns#a4700> <http://example.org/ns#a4700> <http://example.org/ns#a4700> . +<http://example.org/ns#a4701> <http://example.org/ns#a4701> <http://example.org/ns#a4701> . +<http://example.org/ns#a4702> <http://example.org/ns#a4702> <http://example.org/ns#a4702> . +<http://example.org/ns#a4703> <http://example.org/ns#a4703> <http://example.org/ns#a4703> . +<http://example.org/ns#a4704> <http://example.org/ns#a4704> <http://example.org/ns#a4704> . +<http://example.org/ns#a4705> <http://example.org/ns#a4705> <http://example.org/ns#a4705> . +<http://example.org/ns#a4706> <http://example.org/ns#a4706> <http://example.org/ns#a4706> . +<http://example.org/ns#a4707> <http://example.org/ns#a4707> <http://example.org/ns#a4707> . +<http://example.org/ns#a4708> <http://example.org/ns#a4708> <http://example.org/ns#a4708> . +<http://example.org/ns#a4709> <http://example.org/ns#a4709> <http://example.org/ns#a4709> . +<http://example.org/ns#a4710> <http://example.org/ns#a4710> <http://example.org/ns#a4710> . +<http://example.org/ns#a4711> <http://example.org/ns#a4711> <http://example.org/ns#a4711> . +<http://example.org/ns#a4712> <http://example.org/ns#a4712> <http://example.org/ns#a4712> . +<http://example.org/ns#a4713> <http://example.org/ns#a4713> <http://example.org/ns#a4713> . +<http://example.org/ns#a4714> <http://example.org/ns#a4714> <http://example.org/ns#a4714> . +<http://example.org/ns#a4715> <http://example.org/ns#a4715> <http://example.org/ns#a4715> . +<http://example.org/ns#a4716> <http://example.org/ns#a4716> <http://example.org/ns#a4716> . +<http://example.org/ns#a4717> <http://example.org/ns#a4717> <http://example.org/ns#a4717> . +<http://example.org/ns#a4718> <http://example.org/ns#a4718> <http://example.org/ns#a4718> . +<http://example.org/ns#a4719> <http://example.org/ns#a4719> <http://example.org/ns#a4719> . +<http://example.org/ns#a4720> <http://example.org/ns#a4720> <http://example.org/ns#a4720> . +<http://example.org/ns#a4721> <http://example.org/ns#a4721> <http://example.org/ns#a4721> . +<http://example.org/ns#a4722> <http://example.org/ns#a4722> <http://example.org/ns#a4722> . +<http://example.org/ns#a4723> <http://example.org/ns#a4723> <http://example.org/ns#a4723> . +<http://example.org/ns#a4724> <http://example.org/ns#a4724> <http://example.org/ns#a4724> . +<http://example.org/ns#a4725> <http://example.org/ns#a4725> <http://example.org/ns#a4725> . +<http://example.org/ns#a4726> <http://example.org/ns#a4726> <http://example.org/ns#a4726> . +<http://example.org/ns#a4727> <http://example.org/ns#a4727> <http://example.org/ns#a4727> . +<http://example.org/ns#a4728> <http://example.org/ns#a4728> <http://example.org/ns#a4728> . +<http://example.org/ns#a4729> <http://example.org/ns#a4729> <http://example.org/ns#a4729> . +<http://example.org/ns#a4730> <http://example.org/ns#a4730> <http://example.org/ns#a4730> . +<http://example.org/ns#a4731> <http://example.org/ns#a4731> <http://example.org/ns#a4731> . +<http://example.org/ns#a4732> <http://example.org/ns#a4732> <http://example.org/ns#a4732> . +<http://example.org/ns#a4733> <http://example.org/ns#a4733> <http://example.org/ns#a4733> . +<http://example.org/ns#a4734> <http://example.org/ns#a4734> <http://example.org/ns#a4734> . +<http://example.org/ns#a4735> <http://example.org/ns#a4735> <http://example.org/ns#a4735> . +<http://example.org/ns#a4736> <http://example.org/ns#a4736> <http://example.org/ns#a4736> . +<http://example.org/ns#a4737> <http://example.org/ns#a4737> <http://example.org/ns#a4737> . +<http://example.org/ns#a4738> <http://example.org/ns#a4738> <http://example.org/ns#a4738> . +<http://example.org/ns#a4739> <http://example.org/ns#a4739> <http://example.org/ns#a4739> . +<http://example.org/ns#a4740> <http://example.org/ns#a4740> <http://example.org/ns#a4740> . +<http://example.org/ns#a4741> <http://example.org/ns#a4741> <http://example.org/ns#a4741> . +<http://example.org/ns#a4742> <http://example.org/ns#a4742> <http://example.org/ns#a4742> . +<http://example.org/ns#a4743> <http://example.org/ns#a4743> <http://example.org/ns#a4743> . +<http://example.org/ns#a4744> <http://example.org/ns#a4744> <http://example.org/ns#a4744> . +<http://example.org/ns#a4745> <http://example.org/ns#a4745> <http://example.org/ns#a4745> . +<http://example.org/ns#a4746> <http://example.org/ns#a4746> <http://example.org/ns#a4746> . +<http://example.org/ns#a4747> <http://example.org/ns#a4747> <http://example.org/ns#a4747> . +<http://example.org/ns#a4748> <http://example.org/ns#a4748> <http://example.org/ns#a4748> . +<http://example.org/ns#a4749> <http://example.org/ns#a4749> <http://example.org/ns#a4749> . +<http://example.org/ns#a4750> <http://example.org/ns#a4750> <http://example.org/ns#a4750> . +<http://example.org/ns#a4751> <http://example.org/ns#a4751> <http://example.org/ns#a4751> . +<http://example.org/ns#a4752> <http://example.org/ns#a4752> <http://example.org/ns#a4752> . +<http://example.org/ns#a4753> <http://example.org/ns#a4753> <http://example.org/ns#a4753> . +<http://example.org/ns#a4754> <http://example.org/ns#a4754> <http://example.org/ns#a4754> . +<http://example.org/ns#a4755> <http://example.org/ns#a4755> <http://example.org/ns#a4755> . +<http://example.org/ns#a4756> <http://example.org/ns#a4756> <http://example.org/ns#a4756> . +<http://example.org/ns#a4757> <http://example.org/ns#a4757> <http://example.org/ns#a4757> . +<http://example.org/ns#a4758> <http://example.org/ns#a4758> <http://example.org/ns#a4758> . +<http://example.org/ns#a4759> <http://example.org/ns#a4759> <http://example.org/ns#a4759> . +<http://example.org/ns#a4760> <http://example.org/ns#a4760> <http://example.org/ns#a4760> . +<http://example.org/ns#a4761> <http://example.org/ns#a4761> <http://example.org/ns#a4761> . +<http://example.org/ns#a4762> <http://example.org/ns#a4762> <http://example.org/ns#a4762> . +<http://example.org/ns#a4763> <http://example.org/ns#a4763> <http://example.org/ns#a4763> . +<http://example.org/ns#a4764> <http://example.org/ns#a4764> <http://example.org/ns#a4764> . +<http://example.org/ns#a4765> <http://example.org/ns#a4765> <http://example.org/ns#a4765> . +<http://example.org/ns#a4766> <http://example.org/ns#a4766> <http://example.org/ns#a4766> . +<http://example.org/ns#a4767> <http://example.org/ns#a4767> <http://example.org/ns#a4767> . +<http://example.org/ns#a4768> <http://example.org/ns#a4768> <http://example.org/ns#a4768> . +<http://example.org/ns#a4769> <http://example.org/ns#a4769> <http://example.org/ns#a4769> . +<http://example.org/ns#a4770> <http://example.org/ns#a4770> <http://example.org/ns#a4770> . +<http://example.org/ns#a4771> <http://example.org/ns#a4771> <http://example.org/ns#a4771> . +<http://example.org/ns#a4772> <http://example.org/ns#a4772> <http://example.org/ns#a4772> . +<http://example.org/ns#a4773> <http://example.org/ns#a4773> <http://example.org/ns#a4773> . +<http://example.org/ns#a4774> <http://example.org/ns#a4774> <http://example.org/ns#a4774> . +<http://example.org/ns#a4775> <http://example.org/ns#a4775> <http://example.org/ns#a4775> . +<http://example.org/ns#a4776> <http://example.org/ns#a4776> <http://example.org/ns#a4776> . +<http://example.org/ns#a4777> <http://example.org/ns#a4777> <http://example.org/ns#a4777> . +<http://example.org/ns#a4778> <http://example.org/ns#a4778> <http://example.org/ns#a4778> . +<http://example.org/ns#a4779> <http://example.org/ns#a4779> <http://example.org/ns#a4779> . +<http://example.org/ns#a4780> <http://example.org/ns#a4780> <http://example.org/ns#a4780> . +<http://example.org/ns#a4781> <http://example.org/ns#a4781> <http://example.org/ns#a4781> . +<http://example.org/ns#a4782> <http://example.org/ns#a4782> <http://example.org/ns#a4782> . +<http://example.org/ns#a4783> <http://example.org/ns#a4783> <http://example.org/ns#a4783> . +<http://example.org/ns#a4784> <http://example.org/ns#a4784> <http://example.org/ns#a4784> . +<http://example.org/ns#a4785> <http://example.org/ns#a4785> <http://example.org/ns#a4785> . +<http://example.org/ns#a4786> <http://example.org/ns#a4786> <http://example.org/ns#a4786> . +<http://example.org/ns#a4787> <http://example.org/ns#a4787> <http://example.org/ns#a4787> . +<http://example.org/ns#a4788> <http://example.org/ns#a4788> <http://example.org/ns#a4788> . +<http://example.org/ns#a4789> <http://example.org/ns#a4789> <http://example.org/ns#a4789> . +<http://example.org/ns#a4790> <http://example.org/ns#a4790> <http://example.org/ns#a4790> . +<http://example.org/ns#a4791> <http://example.org/ns#a4791> <http://example.org/ns#a4791> . +<http://example.org/ns#a4792> <http://example.org/ns#a4792> <http://example.org/ns#a4792> . +<http://example.org/ns#a4793> <http://example.org/ns#a4793> <http://example.org/ns#a4793> . +<http://example.org/ns#a4794> <http://example.org/ns#a4794> <http://example.org/ns#a4794> . +<http://example.org/ns#a4795> <http://example.org/ns#a4795> <http://example.org/ns#a4795> . +<http://example.org/ns#a4796> <http://example.org/ns#a4796> <http://example.org/ns#a4796> . +<http://example.org/ns#a4797> <http://example.org/ns#a4797> <http://example.org/ns#a4797> . +<http://example.org/ns#a4798> <http://example.org/ns#a4798> <http://example.org/ns#a4798> . +<http://example.org/ns#a4799> <http://example.org/ns#a4799> <http://example.org/ns#a4799> . +<http://example.org/ns#a4800> <http://example.org/ns#a4800> <http://example.org/ns#a4800> . +<http://example.org/ns#a4801> <http://example.org/ns#a4801> <http://example.org/ns#a4801> . +<http://example.org/ns#a4802> <http://example.org/ns#a4802> <http://example.org/ns#a4802> . +<http://example.org/ns#a4803> <http://example.org/ns#a4803> <http://example.org/ns#a4803> . +<http://example.org/ns#a4804> <http://example.org/ns#a4804> <http://example.org/ns#a4804> . +<http://example.org/ns#a4805> <http://example.org/ns#a4805> <http://example.org/ns#a4805> . +<http://example.org/ns#a4806> <http://example.org/ns#a4806> <http://example.org/ns#a4806> . +<http://example.org/ns#a4807> <http://example.org/ns#a4807> <http://example.org/ns#a4807> . +<http://example.org/ns#a4808> <http://example.org/ns#a4808> <http://example.org/ns#a4808> . +<http://example.org/ns#a4809> <http://example.org/ns#a4809> <http://example.org/ns#a4809> . +<http://example.org/ns#a4810> <http://example.org/ns#a4810> <http://example.org/ns#a4810> . +<http://example.org/ns#a4811> <http://example.org/ns#a4811> <http://example.org/ns#a4811> . +<http://example.org/ns#a4812> <http://example.org/ns#a4812> <http://example.org/ns#a4812> . +<http://example.org/ns#a4813> <http://example.org/ns#a4813> <http://example.org/ns#a4813> . +<http://example.org/ns#a4814> <http://example.org/ns#a4814> <http://example.org/ns#a4814> . +<http://example.org/ns#a4815> <http://example.org/ns#a4815> <http://example.org/ns#a4815> . +<http://example.org/ns#a4816> <http://example.org/ns#a4816> <http://example.org/ns#a4816> . +<http://example.org/ns#a4817> <http://example.org/ns#a4817> <http://example.org/ns#a4817> . +<http://example.org/ns#a4818> <http://example.org/ns#a4818> <http://example.org/ns#a4818> . +<http://example.org/ns#a4819> <http://example.org/ns#a4819> <http://example.org/ns#a4819> . +<http://example.org/ns#a4820> <http://example.org/ns#a4820> <http://example.org/ns#a4820> . +<http://example.org/ns#a4821> <http://example.org/ns#a4821> <http://example.org/ns#a4821> . +<http://example.org/ns#a4822> <http://example.org/ns#a4822> <http://example.org/ns#a4822> . +<http://example.org/ns#a4823> <http://example.org/ns#a4823> <http://example.org/ns#a4823> . +<http://example.org/ns#a4824> <http://example.org/ns#a4824> <http://example.org/ns#a4824> . +<http://example.org/ns#a4825> <http://example.org/ns#a4825> <http://example.org/ns#a4825> . +<http://example.org/ns#a4826> <http://example.org/ns#a4826> <http://example.org/ns#a4826> . +<http://example.org/ns#a4827> <http://example.org/ns#a4827> <http://example.org/ns#a4827> . +<http://example.org/ns#a4828> <http://example.org/ns#a4828> <http://example.org/ns#a4828> . +<http://example.org/ns#a4829> <http://example.org/ns#a4829> <http://example.org/ns#a4829> . +<http://example.org/ns#a4830> <http://example.org/ns#a4830> <http://example.org/ns#a4830> . +<http://example.org/ns#a4831> <http://example.org/ns#a4831> <http://example.org/ns#a4831> . +<http://example.org/ns#a4832> <http://example.org/ns#a4832> <http://example.org/ns#a4832> . +<http://example.org/ns#a4833> <http://example.org/ns#a4833> <http://example.org/ns#a4833> . +<http://example.org/ns#a4834> <http://example.org/ns#a4834> <http://example.org/ns#a4834> . +<http://example.org/ns#a4835> <http://example.org/ns#a4835> <http://example.org/ns#a4835> . +<http://example.org/ns#a4836> <http://example.org/ns#a4836> <http://example.org/ns#a4836> . +<http://example.org/ns#a4837> <http://example.org/ns#a4837> <http://example.org/ns#a4837> . +<http://example.org/ns#a4838> <http://example.org/ns#a4838> <http://example.org/ns#a4838> . +<http://example.org/ns#a4839> <http://example.org/ns#a4839> <http://example.org/ns#a4839> . +<http://example.org/ns#a4840> <http://example.org/ns#a4840> <http://example.org/ns#a4840> . +<http://example.org/ns#a4841> <http://example.org/ns#a4841> <http://example.org/ns#a4841> . +<http://example.org/ns#a4842> <http://example.org/ns#a4842> <http://example.org/ns#a4842> . +<http://example.org/ns#a4843> <http://example.org/ns#a4843> <http://example.org/ns#a4843> . +<http://example.org/ns#a4844> <http://example.org/ns#a4844> <http://example.org/ns#a4844> . +<http://example.org/ns#a4845> <http://example.org/ns#a4845> <http://example.org/ns#a4845> . +<http://example.org/ns#a4846> <http://example.org/ns#a4846> <http://example.org/ns#a4846> . +<http://example.org/ns#a4847> <http://example.org/ns#a4847> <http://example.org/ns#a4847> . +<http://example.org/ns#a4848> <http://example.org/ns#a4848> <http://example.org/ns#a4848> . +<http://example.org/ns#a4849> <http://example.org/ns#a4849> <http://example.org/ns#a4849> . +<http://example.org/ns#a4850> <http://example.org/ns#a4850> <http://example.org/ns#a4850> . +<http://example.org/ns#a4851> <http://example.org/ns#a4851> <http://example.org/ns#a4851> . +<http://example.org/ns#a4852> <http://example.org/ns#a4852> <http://example.org/ns#a4852> . +<http://example.org/ns#a4853> <http://example.org/ns#a4853> <http://example.org/ns#a4853> . +<http://example.org/ns#a4854> <http://example.org/ns#a4854> <http://example.org/ns#a4854> . +<http://example.org/ns#a4855> <http://example.org/ns#a4855> <http://example.org/ns#a4855> . +<http://example.org/ns#a4856> <http://example.org/ns#a4856> <http://example.org/ns#a4856> . +<http://example.org/ns#a4857> <http://example.org/ns#a4857> <http://example.org/ns#a4857> . +<http://example.org/ns#a4858> <http://example.org/ns#a4858> <http://example.org/ns#a4858> . +<http://example.org/ns#a4859> <http://example.org/ns#a4859> <http://example.org/ns#a4859> . +<http://example.org/ns#a4860> <http://example.org/ns#a4860> <http://example.org/ns#a4860> . +<http://example.org/ns#a4861> <http://example.org/ns#a4861> <http://example.org/ns#a4861> . +<http://example.org/ns#a4862> <http://example.org/ns#a4862> <http://example.org/ns#a4862> . +<http://example.org/ns#a4863> <http://example.org/ns#a4863> <http://example.org/ns#a4863> . +<http://example.org/ns#a4864> <http://example.org/ns#a4864> <http://example.org/ns#a4864> . +<http://example.org/ns#a4865> <http://example.org/ns#a4865> <http://example.org/ns#a4865> . +<http://example.org/ns#a4866> <http://example.org/ns#a4866> <http://example.org/ns#a4866> . +<http://example.org/ns#a4867> <http://example.org/ns#a4867> <http://example.org/ns#a4867> . +<http://example.org/ns#a4868> <http://example.org/ns#a4868> <http://example.org/ns#a4868> . +<http://example.org/ns#a4869> <http://example.org/ns#a4869> <http://example.org/ns#a4869> . +<http://example.org/ns#a4870> <http://example.org/ns#a4870> <http://example.org/ns#a4870> . +<http://example.org/ns#a4871> <http://example.org/ns#a4871> <http://example.org/ns#a4871> . +<http://example.org/ns#a4872> <http://example.org/ns#a4872> <http://example.org/ns#a4872> . +<http://example.org/ns#a4873> <http://example.org/ns#a4873> <http://example.org/ns#a4873> . +<http://example.org/ns#a4874> <http://example.org/ns#a4874> <http://example.org/ns#a4874> . +<http://example.org/ns#a4875> <http://example.org/ns#a4875> <http://example.org/ns#a4875> . +<http://example.org/ns#a4876> <http://example.org/ns#a4876> <http://example.org/ns#a4876> . +<http://example.org/ns#a4877> <http://example.org/ns#a4877> <http://example.org/ns#a4877> . +<http://example.org/ns#a4878> <http://example.org/ns#a4878> <http://example.org/ns#a4878> . +<http://example.org/ns#a4879> <http://example.org/ns#a4879> <http://example.org/ns#a4879> . +<http://example.org/ns#a4880> <http://example.org/ns#a4880> <http://example.org/ns#a4880> . +<http://example.org/ns#a4881> <http://example.org/ns#a4881> <http://example.org/ns#a4881> . +<http://example.org/ns#a4882> <http://example.org/ns#a4882> <http://example.org/ns#a4882> . +<http://example.org/ns#a4883> <http://example.org/ns#a4883> <http://example.org/ns#a4883> . +<http://example.org/ns#a4884> <http://example.org/ns#a4884> <http://example.org/ns#a4884> . +<http://example.org/ns#a4885> <http://example.org/ns#a4885> <http://example.org/ns#a4885> . +<http://example.org/ns#a4886> <http://example.org/ns#a4886> <http://example.org/ns#a4886> . +<http://example.org/ns#a4887> <http://example.org/ns#a4887> <http://example.org/ns#a4887> . +<http://example.org/ns#a4888> <http://example.org/ns#a4888> <http://example.org/ns#a4888> . +<http://example.org/ns#a4889> <http://example.org/ns#a4889> <http://example.org/ns#a4889> . +<http://example.org/ns#a4890> <http://example.org/ns#a4890> <http://example.org/ns#a4890> . +<http://example.org/ns#a4891> <http://example.org/ns#a4891> <http://example.org/ns#a4891> . +<http://example.org/ns#a4892> <http://example.org/ns#a4892> <http://example.org/ns#a4892> . +<http://example.org/ns#a4893> <http://example.org/ns#a4893> <http://example.org/ns#a4893> . +<http://example.org/ns#a4894> <http://example.org/ns#a4894> <http://example.org/ns#a4894> . +<http://example.org/ns#a4895> <http://example.org/ns#a4895> <http://example.org/ns#a4895> . +<http://example.org/ns#a4896> <http://example.org/ns#a4896> <http://example.org/ns#a4896> . +<http://example.org/ns#a4897> <http://example.org/ns#a4897> <http://example.org/ns#a4897> . +<http://example.org/ns#a4898> <http://example.org/ns#a4898> <http://example.org/ns#a4898> . +<http://example.org/ns#a4899> <http://example.org/ns#a4899> <http://example.org/ns#a4899> . +<http://example.org/ns#a4900> <http://example.org/ns#a4900> <http://example.org/ns#a4900> . +<http://example.org/ns#a4901> <http://example.org/ns#a4901> <http://example.org/ns#a4901> . +<http://example.org/ns#a4902> <http://example.org/ns#a4902> <http://example.org/ns#a4902> . +<http://example.org/ns#a4903> <http://example.org/ns#a4903> <http://example.org/ns#a4903> . +<http://example.org/ns#a4904> <http://example.org/ns#a4904> <http://example.org/ns#a4904> . +<http://example.org/ns#a4905> <http://example.org/ns#a4905> <http://example.org/ns#a4905> . +<http://example.org/ns#a4906> <http://example.org/ns#a4906> <http://example.org/ns#a4906> . +<http://example.org/ns#a4907> <http://example.org/ns#a4907> <http://example.org/ns#a4907> . +<http://example.org/ns#a4908> <http://example.org/ns#a4908> <http://example.org/ns#a4908> . +<http://example.org/ns#a4909> <http://example.org/ns#a4909> <http://example.org/ns#a4909> . +<http://example.org/ns#a4910> <http://example.org/ns#a4910> <http://example.org/ns#a4910> . +<http://example.org/ns#a4911> <http://example.org/ns#a4911> <http://example.org/ns#a4911> . +<http://example.org/ns#a4912> <http://example.org/ns#a4912> <http://example.org/ns#a4912> . +<http://example.org/ns#a4913> <http://example.org/ns#a4913> <http://example.org/ns#a4913> . +<http://example.org/ns#a4914> <http://example.org/ns#a4914> <http://example.org/ns#a4914> . +<http://example.org/ns#a4915> <http://example.org/ns#a4915> <http://example.org/ns#a4915> . +<http://example.org/ns#a4916> <http://example.org/ns#a4916> <http://example.org/ns#a4916> . +<http://example.org/ns#a4917> <http://example.org/ns#a4917> <http://example.org/ns#a4917> . +<http://example.org/ns#a4918> <http://example.org/ns#a4918> <http://example.org/ns#a4918> . +<http://example.org/ns#a4919> <http://example.org/ns#a4919> <http://example.org/ns#a4919> . +<http://example.org/ns#a4920> <http://example.org/ns#a4920> <http://example.org/ns#a4920> . +<http://example.org/ns#a4921> <http://example.org/ns#a4921> <http://example.org/ns#a4921> . +<http://example.org/ns#a4922> <http://example.org/ns#a4922> <http://example.org/ns#a4922> . +<http://example.org/ns#a4923> <http://example.org/ns#a4923> <http://example.org/ns#a4923> . +<http://example.org/ns#a4924> <http://example.org/ns#a4924> <http://example.org/ns#a4924> . +<http://example.org/ns#a4925> <http://example.org/ns#a4925> <http://example.org/ns#a4925> . +<http://example.org/ns#a4926> <http://example.org/ns#a4926> <http://example.org/ns#a4926> . +<http://example.org/ns#a4927> <http://example.org/ns#a4927> <http://example.org/ns#a4927> . +<http://example.org/ns#a4928> <http://example.org/ns#a4928> <http://example.org/ns#a4928> . +<http://example.org/ns#a4929> <http://example.org/ns#a4929> <http://example.org/ns#a4929> . +<http://example.org/ns#a4930> <http://example.org/ns#a4930> <http://example.org/ns#a4930> . +<http://example.org/ns#a4931> <http://example.org/ns#a4931> <http://example.org/ns#a4931> . +<http://example.org/ns#a4932> <http://example.org/ns#a4932> <http://example.org/ns#a4932> . +<http://example.org/ns#a4933> <http://example.org/ns#a4933> <http://example.org/ns#a4933> . +<http://example.org/ns#a4934> <http://example.org/ns#a4934> <http://example.org/ns#a4934> . +<http://example.org/ns#a4935> <http://example.org/ns#a4935> <http://example.org/ns#a4935> . +<http://example.org/ns#a4936> <http://example.org/ns#a4936> <http://example.org/ns#a4936> . +<http://example.org/ns#a4937> <http://example.org/ns#a4937> <http://example.org/ns#a4937> . +<http://example.org/ns#a4938> <http://example.org/ns#a4938> <http://example.org/ns#a4938> . +<http://example.org/ns#a4939> <http://example.org/ns#a4939> <http://example.org/ns#a4939> . +<http://example.org/ns#a4940> <http://example.org/ns#a4940> <http://example.org/ns#a4940> . +<http://example.org/ns#a4941> <http://example.org/ns#a4941> <http://example.org/ns#a4941> . +<http://example.org/ns#a4942> <http://example.org/ns#a4942> <http://example.org/ns#a4942> . +<http://example.org/ns#a4943> <http://example.org/ns#a4943> <http://example.org/ns#a4943> . +<http://example.org/ns#a4944> <http://example.org/ns#a4944> <http://example.org/ns#a4944> . +<http://example.org/ns#a4945> <http://example.org/ns#a4945> <http://example.org/ns#a4945> . +<http://example.org/ns#a4946> <http://example.org/ns#a4946> <http://example.org/ns#a4946> . +<http://example.org/ns#a4947> <http://example.org/ns#a4947> <http://example.org/ns#a4947> . +<http://example.org/ns#a4948> <http://example.org/ns#a4948> <http://example.org/ns#a4948> . +<http://example.org/ns#a4949> <http://example.org/ns#a4949> <http://example.org/ns#a4949> . +<http://example.org/ns#a4950> <http://example.org/ns#a4950> <http://example.org/ns#a4950> . +<http://example.org/ns#a4951> <http://example.org/ns#a4951> <http://example.org/ns#a4951> . +<http://example.org/ns#a4952> <http://example.org/ns#a4952> <http://example.org/ns#a4952> . +<http://example.org/ns#a4953> <http://example.org/ns#a4953> <http://example.org/ns#a4953> . +<http://example.org/ns#a4954> <http://example.org/ns#a4954> <http://example.org/ns#a4954> . +<http://example.org/ns#a4955> <http://example.org/ns#a4955> <http://example.org/ns#a4955> . +<http://example.org/ns#a4956> <http://example.org/ns#a4956> <http://example.org/ns#a4956> . +<http://example.org/ns#a4957> <http://example.org/ns#a4957> <http://example.org/ns#a4957> . +<http://example.org/ns#a4958> <http://example.org/ns#a4958> <http://example.org/ns#a4958> . +<http://example.org/ns#a4959> <http://example.org/ns#a4959> <http://example.org/ns#a4959> . +<http://example.org/ns#a4960> <http://example.org/ns#a4960> <http://example.org/ns#a4960> . +<http://example.org/ns#a4961> <http://example.org/ns#a4961> <http://example.org/ns#a4961> . +<http://example.org/ns#a4962> <http://example.org/ns#a4962> <http://example.org/ns#a4962> . +<http://example.org/ns#a4963> <http://example.org/ns#a4963> <http://example.org/ns#a4963> . +<http://example.org/ns#a4964> <http://example.org/ns#a4964> <http://example.org/ns#a4964> . +<http://example.org/ns#a4965> <http://example.org/ns#a4965> <http://example.org/ns#a4965> . +<http://example.org/ns#a4966> <http://example.org/ns#a4966> <http://example.org/ns#a4966> . +<http://example.org/ns#a4967> <http://example.org/ns#a4967> <http://example.org/ns#a4967> . +<http://example.org/ns#a4968> <http://example.org/ns#a4968> <http://example.org/ns#a4968> . +<http://example.org/ns#a4969> <http://example.org/ns#a4969> <http://example.org/ns#a4969> . +<http://example.org/ns#a4970> <http://example.org/ns#a4970> <http://example.org/ns#a4970> . +<http://example.org/ns#a4971> <http://example.org/ns#a4971> <http://example.org/ns#a4971> . +<http://example.org/ns#a4972> <http://example.org/ns#a4972> <http://example.org/ns#a4972> . +<http://example.org/ns#a4973> <http://example.org/ns#a4973> <http://example.org/ns#a4973> . +<http://example.org/ns#a4974> <http://example.org/ns#a4974> <http://example.org/ns#a4974> . +<http://example.org/ns#a4975> <http://example.org/ns#a4975> <http://example.org/ns#a4975> . +<http://example.org/ns#a4976> <http://example.org/ns#a4976> <http://example.org/ns#a4976> . +<http://example.org/ns#a4977> <http://example.org/ns#a4977> <http://example.org/ns#a4977> . +<http://example.org/ns#a4978> <http://example.org/ns#a4978> <http://example.org/ns#a4978> . +<http://example.org/ns#a4979> <http://example.org/ns#a4979> <http://example.org/ns#a4979> . +<http://example.org/ns#a4980> <http://example.org/ns#a4980> <http://example.org/ns#a4980> . +<http://example.org/ns#a4981> <http://example.org/ns#a4981> <http://example.org/ns#a4981> . +<http://example.org/ns#a4982> <http://example.org/ns#a4982> <http://example.org/ns#a4982> . +<http://example.org/ns#a4983> <http://example.org/ns#a4983> <http://example.org/ns#a4983> . +<http://example.org/ns#a4984> <http://example.org/ns#a4984> <http://example.org/ns#a4984> . +<http://example.org/ns#a4985> <http://example.org/ns#a4985> <http://example.org/ns#a4985> . +<http://example.org/ns#a4986> <http://example.org/ns#a4986> <http://example.org/ns#a4986> . +<http://example.org/ns#a4987> <http://example.org/ns#a4987> <http://example.org/ns#a4987> . +<http://example.org/ns#a4988> <http://example.org/ns#a4988> <http://example.org/ns#a4988> . +<http://example.org/ns#a4989> <http://example.org/ns#a4989> <http://example.org/ns#a4989> . +<http://example.org/ns#a4990> <http://example.org/ns#a4990> <http://example.org/ns#a4990> . +<http://example.org/ns#a4991> <http://example.org/ns#a4991> <http://example.org/ns#a4991> . +<http://example.org/ns#a4992> <http://example.org/ns#a4992> <http://example.org/ns#a4992> . +<http://example.org/ns#a4993> <http://example.org/ns#a4993> <http://example.org/ns#a4993> . +<http://example.org/ns#a4994> <http://example.org/ns#a4994> <http://example.org/ns#a4994> . +<http://example.org/ns#a4995> <http://example.org/ns#a4995> <http://example.org/ns#a4995> . +<http://example.org/ns#a4996> <http://example.org/ns#a4996> <http://example.org/ns#a4996> . +<http://example.org/ns#a4997> <http://example.org/ns#a4997> <http://example.org/ns#a4997> . +<http://example.org/ns#a4998> <http://example.org/ns#a4998> <http://example.org/ns#a4998> . +<http://example.org/ns#a4999> <http://example.org/ns#a4999> <http://example.org/ns#a4999> . +<http://example.org/ns#a5000> <http://example.org/ns#a5000> <http://example.org/ns#a5000> . +<http://example.org/ns#a5001> <http://example.org/ns#a5001> <http://example.org/ns#a5001> . +<http://example.org/ns#a5002> <http://example.org/ns#a5002> <http://example.org/ns#a5002> . +<http://example.org/ns#a5003> <http://example.org/ns#a5003> <http://example.org/ns#a5003> . +<http://example.org/ns#a5004> <http://example.org/ns#a5004> <http://example.org/ns#a5004> . +<http://example.org/ns#a5005> <http://example.org/ns#a5005> <http://example.org/ns#a5005> . +<http://example.org/ns#a5006> <http://example.org/ns#a5006> <http://example.org/ns#a5006> . +<http://example.org/ns#a5007> <http://example.org/ns#a5007> <http://example.org/ns#a5007> . +<http://example.org/ns#a5008> <http://example.org/ns#a5008> <http://example.org/ns#a5008> . +<http://example.org/ns#a5009> <http://example.org/ns#a5009> <http://example.org/ns#a5009> . +<http://example.org/ns#a5010> <http://example.org/ns#a5010> <http://example.org/ns#a5010> . +<http://example.org/ns#a5011> <http://example.org/ns#a5011> <http://example.org/ns#a5011> . +<http://example.org/ns#a5012> <http://example.org/ns#a5012> <http://example.org/ns#a5012> . +<http://example.org/ns#a5013> <http://example.org/ns#a5013> <http://example.org/ns#a5013> . +<http://example.org/ns#a5014> <http://example.org/ns#a5014> <http://example.org/ns#a5014> . +<http://example.org/ns#a5015> <http://example.org/ns#a5015> <http://example.org/ns#a5015> . +<http://example.org/ns#a5016> <http://example.org/ns#a5016> <http://example.org/ns#a5016> . +<http://example.org/ns#a5017> <http://example.org/ns#a5017> <http://example.org/ns#a5017> . +<http://example.org/ns#a5018> <http://example.org/ns#a5018> <http://example.org/ns#a5018> . +<http://example.org/ns#a5019> <http://example.org/ns#a5019> <http://example.org/ns#a5019> . +<http://example.org/ns#a5020> <http://example.org/ns#a5020> <http://example.org/ns#a5020> . +<http://example.org/ns#a5021> <http://example.org/ns#a5021> <http://example.org/ns#a5021> . +<http://example.org/ns#a5022> <http://example.org/ns#a5022> <http://example.org/ns#a5022> . +<http://example.org/ns#a5023> <http://example.org/ns#a5023> <http://example.org/ns#a5023> . +<http://example.org/ns#a5024> <http://example.org/ns#a5024> <http://example.org/ns#a5024> . +<http://example.org/ns#a5025> <http://example.org/ns#a5025> <http://example.org/ns#a5025> . +<http://example.org/ns#a5026> <http://example.org/ns#a5026> <http://example.org/ns#a5026> . +<http://example.org/ns#a5027> <http://example.org/ns#a5027> <http://example.org/ns#a5027> . +<http://example.org/ns#a5028> <http://example.org/ns#a5028> <http://example.org/ns#a5028> . +<http://example.org/ns#a5029> <http://example.org/ns#a5029> <http://example.org/ns#a5029> . +<http://example.org/ns#a5030> <http://example.org/ns#a5030> <http://example.org/ns#a5030> . +<http://example.org/ns#a5031> <http://example.org/ns#a5031> <http://example.org/ns#a5031> . +<http://example.org/ns#a5032> <http://example.org/ns#a5032> <http://example.org/ns#a5032> . +<http://example.org/ns#a5033> <http://example.org/ns#a5033> <http://example.org/ns#a5033> . +<http://example.org/ns#a5034> <http://example.org/ns#a5034> <http://example.org/ns#a5034> . +<http://example.org/ns#a5035> <http://example.org/ns#a5035> <http://example.org/ns#a5035> . +<http://example.org/ns#a5036> <http://example.org/ns#a5036> <http://example.org/ns#a5036> . +<http://example.org/ns#a5037> <http://example.org/ns#a5037> <http://example.org/ns#a5037> . +<http://example.org/ns#a5038> <http://example.org/ns#a5038> <http://example.org/ns#a5038> . +<http://example.org/ns#a5039> <http://example.org/ns#a5039> <http://example.org/ns#a5039> . +<http://example.org/ns#a5040> <http://example.org/ns#a5040> <http://example.org/ns#a5040> . +<http://example.org/ns#a5041> <http://example.org/ns#a5041> <http://example.org/ns#a5041> . +<http://example.org/ns#a5042> <http://example.org/ns#a5042> <http://example.org/ns#a5042> . +<http://example.org/ns#a5043> <http://example.org/ns#a5043> <http://example.org/ns#a5043> . +<http://example.org/ns#a5044> <http://example.org/ns#a5044> <http://example.org/ns#a5044> . +<http://example.org/ns#a5045> <http://example.org/ns#a5045> <http://example.org/ns#a5045> . +<http://example.org/ns#a5046> <http://example.org/ns#a5046> <http://example.org/ns#a5046> . +<http://example.org/ns#a5047> <http://example.org/ns#a5047> <http://example.org/ns#a5047> . +<http://example.org/ns#a5048> <http://example.org/ns#a5048> <http://example.org/ns#a5048> . +<http://example.org/ns#a5049> <http://example.org/ns#a5049> <http://example.org/ns#a5049> . +<http://example.org/ns#a5050> <http://example.org/ns#a5050> <http://example.org/ns#a5050> . +<http://example.org/ns#a5051> <http://example.org/ns#a5051> <http://example.org/ns#a5051> . +<http://example.org/ns#a5052> <http://example.org/ns#a5052> <http://example.org/ns#a5052> . +<http://example.org/ns#a5053> <http://example.org/ns#a5053> <http://example.org/ns#a5053> . +<http://example.org/ns#a5054> <http://example.org/ns#a5054> <http://example.org/ns#a5054> . +<http://example.org/ns#a5055> <http://example.org/ns#a5055> <http://example.org/ns#a5055> . +<http://example.org/ns#a5056> <http://example.org/ns#a5056> <http://example.org/ns#a5056> . +<http://example.org/ns#a5057> <http://example.org/ns#a5057> <http://example.org/ns#a5057> . +<http://example.org/ns#a5058> <http://example.org/ns#a5058> <http://example.org/ns#a5058> . +<http://example.org/ns#a5059> <http://example.org/ns#a5059> <http://example.org/ns#a5059> . +<http://example.org/ns#a5060> <http://example.org/ns#a5060> <http://example.org/ns#a5060> . +<http://example.org/ns#a5061> <http://example.org/ns#a5061> <http://example.org/ns#a5061> . +<http://example.org/ns#a5062> <http://example.org/ns#a5062> <http://example.org/ns#a5062> . +<http://example.org/ns#a5063> <http://example.org/ns#a5063> <http://example.org/ns#a5063> . +<http://example.org/ns#a5064> <http://example.org/ns#a5064> <http://example.org/ns#a5064> . +<http://example.org/ns#a5065> <http://example.org/ns#a5065> <http://example.org/ns#a5065> . +<http://example.org/ns#a5066> <http://example.org/ns#a5066> <http://example.org/ns#a5066> . +<http://example.org/ns#a5067> <http://example.org/ns#a5067> <http://example.org/ns#a5067> . +<http://example.org/ns#a5068> <http://example.org/ns#a5068> <http://example.org/ns#a5068> . +<http://example.org/ns#a5069> <http://example.org/ns#a5069> <http://example.org/ns#a5069> . +<http://example.org/ns#a5070> <http://example.org/ns#a5070> <http://example.org/ns#a5070> . +<http://example.org/ns#a5071> <http://example.org/ns#a5071> <http://example.org/ns#a5071> . +<http://example.org/ns#a5072> <http://example.org/ns#a5072> <http://example.org/ns#a5072> . +<http://example.org/ns#a5073> <http://example.org/ns#a5073> <http://example.org/ns#a5073> . +<http://example.org/ns#a5074> <http://example.org/ns#a5074> <http://example.org/ns#a5074> . +<http://example.org/ns#a5075> <http://example.org/ns#a5075> <http://example.org/ns#a5075> . +<http://example.org/ns#a5076> <http://example.org/ns#a5076> <http://example.org/ns#a5076> . +<http://example.org/ns#a5077> <http://example.org/ns#a5077> <http://example.org/ns#a5077> . +<http://example.org/ns#a5078> <http://example.org/ns#a5078> <http://example.org/ns#a5078> . +<http://example.org/ns#a5079> <http://example.org/ns#a5079> <http://example.org/ns#a5079> . +<http://example.org/ns#a5080> <http://example.org/ns#a5080> <http://example.org/ns#a5080> . +<http://example.org/ns#a5081> <http://example.org/ns#a5081> <http://example.org/ns#a5081> . +<http://example.org/ns#a5082> <http://example.org/ns#a5082> <http://example.org/ns#a5082> . +<http://example.org/ns#a5083> <http://example.org/ns#a5083> <http://example.org/ns#a5083> . +<http://example.org/ns#a5084> <http://example.org/ns#a5084> <http://example.org/ns#a5084> . +<http://example.org/ns#a5085> <http://example.org/ns#a5085> <http://example.org/ns#a5085> . +<http://example.org/ns#a5086> <http://example.org/ns#a5086> <http://example.org/ns#a5086> . +<http://example.org/ns#a5087> <http://example.org/ns#a5087> <http://example.org/ns#a5087> . +<http://example.org/ns#a5088> <http://example.org/ns#a5088> <http://example.org/ns#a5088> . +<http://example.org/ns#a5089> <http://example.org/ns#a5089> <http://example.org/ns#a5089> . +<http://example.org/ns#a5090> <http://example.org/ns#a5090> <http://example.org/ns#a5090> . +<http://example.org/ns#a5091> <http://example.org/ns#a5091> <http://example.org/ns#a5091> . +<http://example.org/ns#a5092> <http://example.org/ns#a5092> <http://example.org/ns#a5092> . +<http://example.org/ns#a5093> <http://example.org/ns#a5093> <http://example.org/ns#a5093> . +<http://example.org/ns#a5094> <http://example.org/ns#a5094> <http://example.org/ns#a5094> . +<http://example.org/ns#a5095> <http://example.org/ns#a5095> <http://example.org/ns#a5095> . +<http://example.org/ns#a5096> <http://example.org/ns#a5096> <http://example.org/ns#a5096> . +<http://example.org/ns#a5097> <http://example.org/ns#a5097> <http://example.org/ns#a5097> . +<http://example.org/ns#a5098> <http://example.org/ns#a5098> <http://example.org/ns#a5098> . +<http://example.org/ns#a5099> <http://example.org/ns#a5099> <http://example.org/ns#a5099> . +<http://example.org/ns#a5100> <http://example.org/ns#a5100> <http://example.org/ns#a5100> . +<http://example.org/ns#a5101> <http://example.org/ns#a5101> <http://example.org/ns#a5101> . +<http://example.org/ns#a5102> <http://example.org/ns#a5102> <http://example.org/ns#a5102> . +<http://example.org/ns#a5103> <http://example.org/ns#a5103> <http://example.org/ns#a5103> . +<http://example.org/ns#a5104> <http://example.org/ns#a5104> <http://example.org/ns#a5104> . +<http://example.org/ns#a5105> <http://example.org/ns#a5105> <http://example.org/ns#a5105> . +<http://example.org/ns#a5106> <http://example.org/ns#a5106> <http://example.org/ns#a5106> . +<http://example.org/ns#a5107> <http://example.org/ns#a5107> <http://example.org/ns#a5107> . +<http://example.org/ns#a5108> <http://example.org/ns#a5108> <http://example.org/ns#a5108> . +<http://example.org/ns#a5109> <http://example.org/ns#a5109> <http://example.org/ns#a5109> . +<http://example.org/ns#a5110> <http://example.org/ns#a5110> <http://example.org/ns#a5110> . +<http://example.org/ns#a5111> <http://example.org/ns#a5111> <http://example.org/ns#a5111> . +<http://example.org/ns#a5112> <http://example.org/ns#a5112> <http://example.org/ns#a5112> . +<http://example.org/ns#a5113> <http://example.org/ns#a5113> <http://example.org/ns#a5113> . +<http://example.org/ns#a5114> <http://example.org/ns#a5114> <http://example.org/ns#a5114> . +<http://example.org/ns#a5115> <http://example.org/ns#a5115> <http://example.org/ns#a5115> . +<http://example.org/ns#a5116> <http://example.org/ns#a5116> <http://example.org/ns#a5116> . +<http://example.org/ns#a5117> <http://example.org/ns#a5117> <http://example.org/ns#a5117> . +<http://example.org/ns#a5118> <http://example.org/ns#a5118> <http://example.org/ns#a5118> . +<http://example.org/ns#a5119> <http://example.org/ns#a5119> <http://example.org/ns#a5119> . +<http://example.org/ns#a5120> <http://example.org/ns#a5120> <http://example.org/ns#a5120> . +<http://example.org/ns#a5121> <http://example.org/ns#a5121> <http://example.org/ns#a5121> . +<http://example.org/ns#a5122> <http://example.org/ns#a5122> <http://example.org/ns#a5122> . +<http://example.org/ns#a5123> <http://example.org/ns#a5123> <http://example.org/ns#a5123> . +<http://example.org/ns#a5124> <http://example.org/ns#a5124> <http://example.org/ns#a5124> . +<http://example.org/ns#a5125> <http://example.org/ns#a5125> <http://example.org/ns#a5125> . +<http://example.org/ns#a5126> <http://example.org/ns#a5126> <http://example.org/ns#a5126> . +<http://example.org/ns#a5127> <http://example.org/ns#a5127> <http://example.org/ns#a5127> . +<http://example.org/ns#a5128> <http://example.org/ns#a5128> <http://example.org/ns#a5128> . +<http://example.org/ns#a5129> <http://example.org/ns#a5129> <http://example.org/ns#a5129> . +<http://example.org/ns#a5130> <http://example.org/ns#a5130> <http://example.org/ns#a5130> . +<http://example.org/ns#a5131> <http://example.org/ns#a5131> <http://example.org/ns#a5131> . +<http://example.org/ns#a5132> <http://example.org/ns#a5132> <http://example.org/ns#a5132> . +<http://example.org/ns#a5133> <http://example.org/ns#a5133> <http://example.org/ns#a5133> . +<http://example.org/ns#a5134> <http://example.org/ns#a5134> <http://example.org/ns#a5134> . +<http://example.org/ns#a5135> <http://example.org/ns#a5135> <http://example.org/ns#a5135> . +<http://example.org/ns#a5136> <http://example.org/ns#a5136> <http://example.org/ns#a5136> . +<http://example.org/ns#a5137> <http://example.org/ns#a5137> <http://example.org/ns#a5137> . +<http://example.org/ns#a5138> <http://example.org/ns#a5138> <http://example.org/ns#a5138> . +<http://example.org/ns#a5139> <http://example.org/ns#a5139> <http://example.org/ns#a5139> . +<http://example.org/ns#a5140> <http://example.org/ns#a5140> <http://example.org/ns#a5140> . +<http://example.org/ns#a5141> <http://example.org/ns#a5141> <http://example.org/ns#a5141> . +<http://example.org/ns#a5142> <http://example.org/ns#a5142> <http://example.org/ns#a5142> . +<http://example.org/ns#a5143> <http://example.org/ns#a5143> <http://example.org/ns#a5143> . +<http://example.org/ns#a5144> <http://example.org/ns#a5144> <http://example.org/ns#a5144> . +<http://example.org/ns#a5145> <http://example.org/ns#a5145> <http://example.org/ns#a5145> . +<http://example.org/ns#a5146> <http://example.org/ns#a5146> <http://example.org/ns#a5146> . +<http://example.org/ns#a5147> <http://example.org/ns#a5147> <http://example.org/ns#a5147> . +<http://example.org/ns#a5148> <http://example.org/ns#a5148> <http://example.org/ns#a5148> . +<http://example.org/ns#a5149> <http://example.org/ns#a5149> <http://example.org/ns#a5149> . +<http://example.org/ns#a5150> <http://example.org/ns#a5150> <http://example.org/ns#a5150> . +<http://example.org/ns#a5151> <http://example.org/ns#a5151> <http://example.org/ns#a5151> . +<http://example.org/ns#a5152> <http://example.org/ns#a5152> <http://example.org/ns#a5152> . +<http://example.org/ns#a5153> <http://example.org/ns#a5153> <http://example.org/ns#a5153> . +<http://example.org/ns#a5154> <http://example.org/ns#a5154> <http://example.org/ns#a5154> . +<http://example.org/ns#a5155> <http://example.org/ns#a5155> <http://example.org/ns#a5155> . +<http://example.org/ns#a5156> <http://example.org/ns#a5156> <http://example.org/ns#a5156> . +<http://example.org/ns#a5157> <http://example.org/ns#a5157> <http://example.org/ns#a5157> . +<http://example.org/ns#a5158> <http://example.org/ns#a5158> <http://example.org/ns#a5158> . +<http://example.org/ns#a5159> <http://example.org/ns#a5159> <http://example.org/ns#a5159> . +<http://example.org/ns#a5160> <http://example.org/ns#a5160> <http://example.org/ns#a5160> . +<http://example.org/ns#a5161> <http://example.org/ns#a5161> <http://example.org/ns#a5161> . +<http://example.org/ns#a5162> <http://example.org/ns#a5162> <http://example.org/ns#a5162> . +<http://example.org/ns#a5163> <http://example.org/ns#a5163> <http://example.org/ns#a5163> . +<http://example.org/ns#a5164> <http://example.org/ns#a5164> <http://example.org/ns#a5164> . +<http://example.org/ns#a5165> <http://example.org/ns#a5165> <http://example.org/ns#a5165> . +<http://example.org/ns#a5166> <http://example.org/ns#a5166> <http://example.org/ns#a5166> . +<http://example.org/ns#a5167> <http://example.org/ns#a5167> <http://example.org/ns#a5167> . +<http://example.org/ns#a5168> <http://example.org/ns#a5168> <http://example.org/ns#a5168> . +<http://example.org/ns#a5169> <http://example.org/ns#a5169> <http://example.org/ns#a5169> . +<http://example.org/ns#a5170> <http://example.org/ns#a5170> <http://example.org/ns#a5170> . +<http://example.org/ns#a5171> <http://example.org/ns#a5171> <http://example.org/ns#a5171> . +<http://example.org/ns#a5172> <http://example.org/ns#a5172> <http://example.org/ns#a5172> . +<http://example.org/ns#a5173> <http://example.org/ns#a5173> <http://example.org/ns#a5173> . +<http://example.org/ns#a5174> <http://example.org/ns#a5174> <http://example.org/ns#a5174> . +<http://example.org/ns#a5175> <http://example.org/ns#a5175> <http://example.org/ns#a5175> . +<http://example.org/ns#a5176> <http://example.org/ns#a5176> <http://example.org/ns#a5176> . +<http://example.org/ns#a5177> <http://example.org/ns#a5177> <http://example.org/ns#a5177> . +<http://example.org/ns#a5178> <http://example.org/ns#a5178> <http://example.org/ns#a5178> . +<http://example.org/ns#a5179> <http://example.org/ns#a5179> <http://example.org/ns#a5179> . +<http://example.org/ns#a5180> <http://example.org/ns#a5180> <http://example.org/ns#a5180> . +<http://example.org/ns#a5181> <http://example.org/ns#a5181> <http://example.org/ns#a5181> . +<http://example.org/ns#a5182> <http://example.org/ns#a5182> <http://example.org/ns#a5182> . +<http://example.org/ns#a5183> <http://example.org/ns#a5183> <http://example.org/ns#a5183> . +<http://example.org/ns#a5184> <http://example.org/ns#a5184> <http://example.org/ns#a5184> . +<http://example.org/ns#a5185> <http://example.org/ns#a5185> <http://example.org/ns#a5185> . +<http://example.org/ns#a5186> <http://example.org/ns#a5186> <http://example.org/ns#a5186> . +<http://example.org/ns#a5187> <http://example.org/ns#a5187> <http://example.org/ns#a5187> . +<http://example.org/ns#a5188> <http://example.org/ns#a5188> <http://example.org/ns#a5188> . +<http://example.org/ns#a5189> <http://example.org/ns#a5189> <http://example.org/ns#a5189> . +<http://example.org/ns#a5190> <http://example.org/ns#a5190> <http://example.org/ns#a5190> . +<http://example.org/ns#a5191> <http://example.org/ns#a5191> <http://example.org/ns#a5191> . +<http://example.org/ns#a5192> <http://example.org/ns#a5192> <http://example.org/ns#a5192> . +<http://example.org/ns#a5193> <http://example.org/ns#a5193> <http://example.org/ns#a5193> . +<http://example.org/ns#a5194> <http://example.org/ns#a5194> <http://example.org/ns#a5194> . +<http://example.org/ns#a5195> <http://example.org/ns#a5195> <http://example.org/ns#a5195> . +<http://example.org/ns#a5196> <http://example.org/ns#a5196> <http://example.org/ns#a5196> . +<http://example.org/ns#a5197> <http://example.org/ns#a5197> <http://example.org/ns#a5197> . +<http://example.org/ns#a5198> <http://example.org/ns#a5198> <http://example.org/ns#a5198> . +<http://example.org/ns#a5199> <http://example.org/ns#a5199> <http://example.org/ns#a5199> . +<http://example.org/ns#a5200> <http://example.org/ns#a5200> <http://example.org/ns#a5200> . +<http://example.org/ns#a5201> <http://example.org/ns#a5201> <http://example.org/ns#a5201> . +<http://example.org/ns#a5202> <http://example.org/ns#a5202> <http://example.org/ns#a5202> . +<http://example.org/ns#a5203> <http://example.org/ns#a5203> <http://example.org/ns#a5203> . +<http://example.org/ns#a5204> <http://example.org/ns#a5204> <http://example.org/ns#a5204> . +<http://example.org/ns#a5205> <http://example.org/ns#a5205> <http://example.org/ns#a5205> . +<http://example.org/ns#a5206> <http://example.org/ns#a5206> <http://example.org/ns#a5206> . +<http://example.org/ns#a5207> <http://example.org/ns#a5207> <http://example.org/ns#a5207> . +<http://example.org/ns#a5208> <http://example.org/ns#a5208> <http://example.org/ns#a5208> . +<http://example.org/ns#a5209> <http://example.org/ns#a5209> <http://example.org/ns#a5209> . +<http://example.org/ns#a5210> <http://example.org/ns#a5210> <http://example.org/ns#a5210> . +<http://example.org/ns#a5211> <http://example.org/ns#a5211> <http://example.org/ns#a5211> . +<http://example.org/ns#a5212> <http://example.org/ns#a5212> <http://example.org/ns#a5212> . +<http://example.org/ns#a5213> <http://example.org/ns#a5213> <http://example.org/ns#a5213> . +<http://example.org/ns#a5214> <http://example.org/ns#a5214> <http://example.org/ns#a5214> . +<http://example.org/ns#a5215> <http://example.org/ns#a5215> <http://example.org/ns#a5215> . +<http://example.org/ns#a5216> <http://example.org/ns#a5216> <http://example.org/ns#a5216> . +<http://example.org/ns#a5217> <http://example.org/ns#a5217> <http://example.org/ns#a5217> . +<http://example.org/ns#a5218> <http://example.org/ns#a5218> <http://example.org/ns#a5218> . +<http://example.org/ns#a5219> <http://example.org/ns#a5219> <http://example.org/ns#a5219> . +<http://example.org/ns#a5220> <http://example.org/ns#a5220> <http://example.org/ns#a5220> . +<http://example.org/ns#a5221> <http://example.org/ns#a5221> <http://example.org/ns#a5221> . +<http://example.org/ns#a5222> <http://example.org/ns#a5222> <http://example.org/ns#a5222> . +<http://example.org/ns#a5223> <http://example.org/ns#a5223> <http://example.org/ns#a5223> . +<http://example.org/ns#a5224> <http://example.org/ns#a5224> <http://example.org/ns#a5224> . +<http://example.org/ns#a5225> <http://example.org/ns#a5225> <http://example.org/ns#a5225> . +<http://example.org/ns#a5226> <http://example.org/ns#a5226> <http://example.org/ns#a5226> . +<http://example.org/ns#a5227> <http://example.org/ns#a5227> <http://example.org/ns#a5227> . +<http://example.org/ns#a5228> <http://example.org/ns#a5228> <http://example.org/ns#a5228> . +<http://example.org/ns#a5229> <http://example.org/ns#a5229> <http://example.org/ns#a5229> . +<http://example.org/ns#a5230> <http://example.org/ns#a5230> <http://example.org/ns#a5230> . +<http://example.org/ns#a5231> <http://example.org/ns#a5231> <http://example.org/ns#a5231> . +<http://example.org/ns#a5232> <http://example.org/ns#a5232> <http://example.org/ns#a5232> . +<http://example.org/ns#a5233> <http://example.org/ns#a5233> <http://example.org/ns#a5233> . +<http://example.org/ns#a5234> <http://example.org/ns#a5234> <http://example.org/ns#a5234> . +<http://example.org/ns#a5235> <http://example.org/ns#a5235> <http://example.org/ns#a5235> . +<http://example.org/ns#a5236> <http://example.org/ns#a5236> <http://example.org/ns#a5236> . +<http://example.org/ns#a5237> <http://example.org/ns#a5237> <http://example.org/ns#a5237> . +<http://example.org/ns#a5238> <http://example.org/ns#a5238> <http://example.org/ns#a5238> . +<http://example.org/ns#a5239> <http://example.org/ns#a5239> <http://example.org/ns#a5239> . +<http://example.org/ns#a5240> <http://example.org/ns#a5240> <http://example.org/ns#a5240> . +<http://example.org/ns#a5241> <http://example.org/ns#a5241> <http://example.org/ns#a5241> . +<http://example.org/ns#a5242> <http://example.org/ns#a5242> <http://example.org/ns#a5242> . +<http://example.org/ns#a5243> <http://example.org/ns#a5243> <http://example.org/ns#a5243> . +<http://example.org/ns#a5244> <http://example.org/ns#a5244> <http://example.org/ns#a5244> . +<http://example.org/ns#a5245> <http://example.org/ns#a5245> <http://example.org/ns#a5245> . +<http://example.org/ns#a5246> <http://example.org/ns#a5246> <http://example.org/ns#a5246> . +<http://example.org/ns#a5247> <http://example.org/ns#a5247> <http://example.org/ns#a5247> . +<http://example.org/ns#a5248> <http://example.org/ns#a5248> <http://example.org/ns#a5248> . +<http://example.org/ns#a5249> <http://example.org/ns#a5249> <http://example.org/ns#a5249> . +<http://example.org/ns#a5250> <http://example.org/ns#a5250> <http://example.org/ns#a5250> . +<http://example.org/ns#a5251> <http://example.org/ns#a5251> <http://example.org/ns#a5251> . +<http://example.org/ns#a5252> <http://example.org/ns#a5252> <http://example.org/ns#a5252> . +<http://example.org/ns#a5253> <http://example.org/ns#a5253> <http://example.org/ns#a5253> . +<http://example.org/ns#a5254> <http://example.org/ns#a5254> <http://example.org/ns#a5254> . +<http://example.org/ns#a5255> <http://example.org/ns#a5255> <http://example.org/ns#a5255> . +<http://example.org/ns#a5256> <http://example.org/ns#a5256> <http://example.org/ns#a5256> . +<http://example.org/ns#a5257> <http://example.org/ns#a5257> <http://example.org/ns#a5257> . +<http://example.org/ns#a5258> <http://example.org/ns#a5258> <http://example.org/ns#a5258> . +<http://example.org/ns#a5259> <http://example.org/ns#a5259> <http://example.org/ns#a5259> . +<http://example.org/ns#a5260> <http://example.org/ns#a5260> <http://example.org/ns#a5260> . +<http://example.org/ns#a5261> <http://example.org/ns#a5261> <http://example.org/ns#a5261> . +<http://example.org/ns#a5262> <http://example.org/ns#a5262> <http://example.org/ns#a5262> . +<http://example.org/ns#a5263> <http://example.org/ns#a5263> <http://example.org/ns#a5263> . +<http://example.org/ns#a5264> <http://example.org/ns#a5264> <http://example.org/ns#a5264> . +<http://example.org/ns#a5265> <http://example.org/ns#a5265> <http://example.org/ns#a5265> . +<http://example.org/ns#a5266> <http://example.org/ns#a5266> <http://example.org/ns#a5266> . +<http://example.org/ns#a5267> <http://example.org/ns#a5267> <http://example.org/ns#a5267> . +<http://example.org/ns#a5268> <http://example.org/ns#a5268> <http://example.org/ns#a5268> . +<http://example.org/ns#a5269> <http://example.org/ns#a5269> <http://example.org/ns#a5269> . +<http://example.org/ns#a5270> <http://example.org/ns#a5270> <http://example.org/ns#a5270> . +<http://example.org/ns#a5271> <http://example.org/ns#a5271> <http://example.org/ns#a5271> . +<http://example.org/ns#a5272> <http://example.org/ns#a5272> <http://example.org/ns#a5272> . +<http://example.org/ns#a5273> <http://example.org/ns#a5273> <http://example.org/ns#a5273> . +<http://example.org/ns#a5274> <http://example.org/ns#a5274> <http://example.org/ns#a5274> . +<http://example.org/ns#a5275> <http://example.org/ns#a5275> <http://example.org/ns#a5275> . +<http://example.org/ns#a5276> <http://example.org/ns#a5276> <http://example.org/ns#a5276> . +<http://example.org/ns#a5277> <http://example.org/ns#a5277> <http://example.org/ns#a5277> . +<http://example.org/ns#a5278> <http://example.org/ns#a5278> <http://example.org/ns#a5278> . +<http://example.org/ns#a5279> <http://example.org/ns#a5279> <http://example.org/ns#a5279> . +<http://example.org/ns#a5280> <http://example.org/ns#a5280> <http://example.org/ns#a5280> . +<http://example.org/ns#a5281> <http://example.org/ns#a5281> <http://example.org/ns#a5281> . +<http://example.org/ns#a5282> <http://example.org/ns#a5282> <http://example.org/ns#a5282> . +<http://example.org/ns#a5283> <http://example.org/ns#a5283> <http://example.org/ns#a5283> . +<http://example.org/ns#a5284> <http://example.org/ns#a5284> <http://example.org/ns#a5284> . +<http://example.org/ns#a5285> <http://example.org/ns#a5285> <http://example.org/ns#a5285> . +<http://example.org/ns#a5286> <http://example.org/ns#a5286> <http://example.org/ns#a5286> . +<http://example.org/ns#a5287> <http://example.org/ns#a5287> <http://example.org/ns#a5287> . +<http://example.org/ns#a5288> <http://example.org/ns#a5288> <http://example.org/ns#a5288> . +<http://example.org/ns#a5289> <http://example.org/ns#a5289> <http://example.org/ns#a5289> . +<http://example.org/ns#a5290> <http://example.org/ns#a5290> <http://example.org/ns#a5290> . +<http://example.org/ns#a5291> <http://example.org/ns#a5291> <http://example.org/ns#a5291> . +<http://example.org/ns#a5292> <http://example.org/ns#a5292> <http://example.org/ns#a5292> . +<http://example.org/ns#a5293> <http://example.org/ns#a5293> <http://example.org/ns#a5293> . +<http://example.org/ns#a5294> <http://example.org/ns#a5294> <http://example.org/ns#a5294> . +<http://example.org/ns#a5295> <http://example.org/ns#a5295> <http://example.org/ns#a5295> . +<http://example.org/ns#a5296> <http://example.org/ns#a5296> <http://example.org/ns#a5296> . +<http://example.org/ns#a5297> <http://example.org/ns#a5297> <http://example.org/ns#a5297> . +<http://example.org/ns#a5298> <http://example.org/ns#a5298> <http://example.org/ns#a5298> . +<http://example.org/ns#a5299> <http://example.org/ns#a5299> <http://example.org/ns#a5299> . +<http://example.org/ns#a5300> <http://example.org/ns#a5300> <http://example.org/ns#a5300> . +<http://example.org/ns#a5301> <http://example.org/ns#a5301> <http://example.org/ns#a5301> . +<http://example.org/ns#a5302> <http://example.org/ns#a5302> <http://example.org/ns#a5302> . +<http://example.org/ns#a5303> <http://example.org/ns#a5303> <http://example.org/ns#a5303> . +<http://example.org/ns#a5304> <http://example.org/ns#a5304> <http://example.org/ns#a5304> . +<http://example.org/ns#a5305> <http://example.org/ns#a5305> <http://example.org/ns#a5305> . +<http://example.org/ns#a5306> <http://example.org/ns#a5306> <http://example.org/ns#a5306> . +<http://example.org/ns#a5307> <http://example.org/ns#a5307> <http://example.org/ns#a5307> . +<http://example.org/ns#a5308> <http://example.org/ns#a5308> <http://example.org/ns#a5308> . +<http://example.org/ns#a5309> <http://example.org/ns#a5309> <http://example.org/ns#a5309> . +<http://example.org/ns#a5310> <http://example.org/ns#a5310> <http://example.org/ns#a5310> . +<http://example.org/ns#a5311> <http://example.org/ns#a5311> <http://example.org/ns#a5311> . +<http://example.org/ns#a5312> <http://example.org/ns#a5312> <http://example.org/ns#a5312> . +<http://example.org/ns#a5313> <http://example.org/ns#a5313> <http://example.org/ns#a5313> . +<http://example.org/ns#a5314> <http://example.org/ns#a5314> <http://example.org/ns#a5314> . +<http://example.org/ns#a5315> <http://example.org/ns#a5315> <http://example.org/ns#a5315> . +<http://example.org/ns#a5316> <http://example.org/ns#a5316> <http://example.org/ns#a5316> . +<http://example.org/ns#a5317> <http://example.org/ns#a5317> <http://example.org/ns#a5317> . +<http://example.org/ns#a5318> <http://example.org/ns#a5318> <http://example.org/ns#a5318> . +<http://example.org/ns#a5319> <http://example.org/ns#a5319> <http://example.org/ns#a5319> . +<http://example.org/ns#a5320> <http://example.org/ns#a5320> <http://example.org/ns#a5320> . +<http://example.org/ns#a5321> <http://example.org/ns#a5321> <http://example.org/ns#a5321> . +<http://example.org/ns#a5322> <http://example.org/ns#a5322> <http://example.org/ns#a5322> . +<http://example.org/ns#a5323> <http://example.org/ns#a5323> <http://example.org/ns#a5323> . +<http://example.org/ns#a5324> <http://example.org/ns#a5324> <http://example.org/ns#a5324> . +<http://example.org/ns#a5325> <http://example.org/ns#a5325> <http://example.org/ns#a5325> . +<http://example.org/ns#a5326> <http://example.org/ns#a5326> <http://example.org/ns#a5326> . +<http://example.org/ns#a5327> <http://example.org/ns#a5327> <http://example.org/ns#a5327> . +<http://example.org/ns#a5328> <http://example.org/ns#a5328> <http://example.org/ns#a5328> . +<http://example.org/ns#a5329> <http://example.org/ns#a5329> <http://example.org/ns#a5329> . +<http://example.org/ns#a5330> <http://example.org/ns#a5330> <http://example.org/ns#a5330> . +<http://example.org/ns#a5331> <http://example.org/ns#a5331> <http://example.org/ns#a5331> . +<http://example.org/ns#a5332> <http://example.org/ns#a5332> <http://example.org/ns#a5332> . +<http://example.org/ns#a5333> <http://example.org/ns#a5333> <http://example.org/ns#a5333> . +<http://example.org/ns#a5334> <http://example.org/ns#a5334> <http://example.org/ns#a5334> . +<http://example.org/ns#a5335> <http://example.org/ns#a5335> <http://example.org/ns#a5335> . +<http://example.org/ns#a5336> <http://example.org/ns#a5336> <http://example.org/ns#a5336> . +<http://example.org/ns#a5337> <http://example.org/ns#a5337> <http://example.org/ns#a5337> . +<http://example.org/ns#a5338> <http://example.org/ns#a5338> <http://example.org/ns#a5338> . +<http://example.org/ns#a5339> <http://example.org/ns#a5339> <http://example.org/ns#a5339> . +<http://example.org/ns#a5340> <http://example.org/ns#a5340> <http://example.org/ns#a5340> . +<http://example.org/ns#a5341> <http://example.org/ns#a5341> <http://example.org/ns#a5341> . +<http://example.org/ns#a5342> <http://example.org/ns#a5342> <http://example.org/ns#a5342> . +<http://example.org/ns#a5343> <http://example.org/ns#a5343> <http://example.org/ns#a5343> . +<http://example.org/ns#a5344> <http://example.org/ns#a5344> <http://example.org/ns#a5344> . +<http://example.org/ns#a5345> <http://example.org/ns#a5345> <http://example.org/ns#a5345> . +<http://example.org/ns#a5346> <http://example.org/ns#a5346> <http://example.org/ns#a5346> . +<http://example.org/ns#a5347> <http://example.org/ns#a5347> <http://example.org/ns#a5347> . +<http://example.org/ns#a5348> <http://example.org/ns#a5348> <http://example.org/ns#a5348> . +<http://example.org/ns#a5349> <http://example.org/ns#a5349> <http://example.org/ns#a5349> . +<http://example.org/ns#a5350> <http://example.org/ns#a5350> <http://example.org/ns#a5350> . +<http://example.org/ns#a5351> <http://example.org/ns#a5351> <http://example.org/ns#a5351> . +<http://example.org/ns#a5352> <http://example.org/ns#a5352> <http://example.org/ns#a5352> . +<http://example.org/ns#a5353> <http://example.org/ns#a5353> <http://example.org/ns#a5353> . +<http://example.org/ns#a5354> <http://example.org/ns#a5354> <http://example.org/ns#a5354> . +<http://example.org/ns#a5355> <http://example.org/ns#a5355> <http://example.org/ns#a5355> . +<http://example.org/ns#a5356> <http://example.org/ns#a5356> <http://example.org/ns#a5356> . +<http://example.org/ns#a5357> <http://example.org/ns#a5357> <http://example.org/ns#a5357> . +<http://example.org/ns#a5358> <http://example.org/ns#a5358> <http://example.org/ns#a5358> . +<http://example.org/ns#a5359> <http://example.org/ns#a5359> <http://example.org/ns#a5359> . +<http://example.org/ns#a5360> <http://example.org/ns#a5360> <http://example.org/ns#a5360> . +<http://example.org/ns#a5361> <http://example.org/ns#a5361> <http://example.org/ns#a5361> . +<http://example.org/ns#a5362> <http://example.org/ns#a5362> <http://example.org/ns#a5362> . +<http://example.org/ns#a5363> <http://example.org/ns#a5363> <http://example.org/ns#a5363> . +<http://example.org/ns#a5364> <http://example.org/ns#a5364> <http://example.org/ns#a5364> . +<http://example.org/ns#a5365> <http://example.org/ns#a5365> <http://example.org/ns#a5365> . +<http://example.org/ns#a5366> <http://example.org/ns#a5366> <http://example.org/ns#a5366> . +<http://example.org/ns#a5367> <http://example.org/ns#a5367> <http://example.org/ns#a5367> . +<http://example.org/ns#a5368> <http://example.org/ns#a5368> <http://example.org/ns#a5368> . +<http://example.org/ns#a5369> <http://example.org/ns#a5369> <http://example.org/ns#a5369> . +<http://example.org/ns#a5370> <http://example.org/ns#a5370> <http://example.org/ns#a5370> . +<http://example.org/ns#a5371> <http://example.org/ns#a5371> <http://example.org/ns#a5371> . +<http://example.org/ns#a5372> <http://example.org/ns#a5372> <http://example.org/ns#a5372> . +<http://example.org/ns#a5373> <http://example.org/ns#a5373> <http://example.org/ns#a5373> . +<http://example.org/ns#a5374> <http://example.org/ns#a5374> <http://example.org/ns#a5374> . +<http://example.org/ns#a5375> <http://example.org/ns#a5375> <http://example.org/ns#a5375> . +<http://example.org/ns#a5376> <http://example.org/ns#a5376> <http://example.org/ns#a5376> . +<http://example.org/ns#a5377> <http://example.org/ns#a5377> <http://example.org/ns#a5377> . +<http://example.org/ns#a5378> <http://example.org/ns#a5378> <http://example.org/ns#a5378> . +<http://example.org/ns#a5379> <http://example.org/ns#a5379> <http://example.org/ns#a5379> . +<http://example.org/ns#a5380> <http://example.org/ns#a5380> <http://example.org/ns#a5380> . +<http://example.org/ns#a5381> <http://example.org/ns#a5381> <http://example.org/ns#a5381> . +<http://example.org/ns#a5382> <http://example.org/ns#a5382> <http://example.org/ns#a5382> . +<http://example.org/ns#a5383> <http://example.org/ns#a5383> <http://example.org/ns#a5383> . +<http://example.org/ns#a5384> <http://example.org/ns#a5384> <http://example.org/ns#a5384> . +<http://example.org/ns#a5385> <http://example.org/ns#a5385> <http://example.org/ns#a5385> . +<http://example.org/ns#a5386> <http://example.org/ns#a5386> <http://example.org/ns#a5386> . +<http://example.org/ns#a5387> <http://example.org/ns#a5387> <http://example.org/ns#a5387> . +<http://example.org/ns#a5388> <http://example.org/ns#a5388> <http://example.org/ns#a5388> . +<http://example.org/ns#a5389> <http://example.org/ns#a5389> <http://example.org/ns#a5389> . +<http://example.org/ns#a5390> <http://example.org/ns#a5390> <http://example.org/ns#a5390> . +<http://example.org/ns#a5391> <http://example.org/ns#a5391> <http://example.org/ns#a5391> . +<http://example.org/ns#a5392> <http://example.org/ns#a5392> <http://example.org/ns#a5392> . +<http://example.org/ns#a5393> <http://example.org/ns#a5393> <http://example.org/ns#a5393> . +<http://example.org/ns#a5394> <http://example.org/ns#a5394> <http://example.org/ns#a5394> . +<http://example.org/ns#a5395> <http://example.org/ns#a5395> <http://example.org/ns#a5395> . +<http://example.org/ns#a5396> <http://example.org/ns#a5396> <http://example.org/ns#a5396> . +<http://example.org/ns#a5397> <http://example.org/ns#a5397> <http://example.org/ns#a5397> . +<http://example.org/ns#a5398> <http://example.org/ns#a5398> <http://example.org/ns#a5398> . +<http://example.org/ns#a5399> <http://example.org/ns#a5399> <http://example.org/ns#a5399> . +<http://example.org/ns#a5400> <http://example.org/ns#a5400> <http://example.org/ns#a5400> . +<http://example.org/ns#a5401> <http://example.org/ns#a5401> <http://example.org/ns#a5401> . +<http://example.org/ns#a5402> <http://example.org/ns#a5402> <http://example.org/ns#a5402> . +<http://example.org/ns#a5403> <http://example.org/ns#a5403> <http://example.org/ns#a5403> . +<http://example.org/ns#a5404> <http://example.org/ns#a5404> <http://example.org/ns#a5404> . +<http://example.org/ns#a5405> <http://example.org/ns#a5405> <http://example.org/ns#a5405> . +<http://example.org/ns#a5406> <http://example.org/ns#a5406> <http://example.org/ns#a5406> . +<http://example.org/ns#a5407> <http://example.org/ns#a5407> <http://example.org/ns#a5407> . +<http://example.org/ns#a5408> <http://example.org/ns#a5408> <http://example.org/ns#a5408> . +<http://example.org/ns#a5409> <http://example.org/ns#a5409> <http://example.org/ns#a5409> . +<http://example.org/ns#a5410> <http://example.org/ns#a5410> <http://example.org/ns#a5410> . +<http://example.org/ns#a5411> <http://example.org/ns#a5411> <http://example.org/ns#a5411> . +<http://example.org/ns#a5412> <http://example.org/ns#a5412> <http://example.org/ns#a5412> . +<http://example.org/ns#a5413> <http://example.org/ns#a5413> <http://example.org/ns#a5413> . +<http://example.org/ns#a5414> <http://example.org/ns#a5414> <http://example.org/ns#a5414> . +<http://example.org/ns#a5415> <http://example.org/ns#a5415> <http://example.org/ns#a5415> . +<http://example.org/ns#a5416> <http://example.org/ns#a5416> <http://example.org/ns#a5416> . +<http://example.org/ns#a5417> <http://example.org/ns#a5417> <http://example.org/ns#a5417> . +<http://example.org/ns#a5418> <http://example.org/ns#a5418> <http://example.org/ns#a5418> . +<http://example.org/ns#a5419> <http://example.org/ns#a5419> <http://example.org/ns#a5419> . +<http://example.org/ns#a5420> <http://example.org/ns#a5420> <http://example.org/ns#a5420> . +<http://example.org/ns#a5421> <http://example.org/ns#a5421> <http://example.org/ns#a5421> . +<http://example.org/ns#a5422> <http://example.org/ns#a5422> <http://example.org/ns#a5422> . +<http://example.org/ns#a5423> <http://example.org/ns#a5423> <http://example.org/ns#a5423> . +<http://example.org/ns#a5424> <http://example.org/ns#a5424> <http://example.org/ns#a5424> . +<http://example.org/ns#a5425> <http://example.org/ns#a5425> <http://example.org/ns#a5425> . +<http://example.org/ns#a5426> <http://example.org/ns#a5426> <http://example.org/ns#a5426> . +<http://example.org/ns#a5427> <http://example.org/ns#a5427> <http://example.org/ns#a5427> . +<http://example.org/ns#a5428> <http://example.org/ns#a5428> <http://example.org/ns#a5428> . +<http://example.org/ns#a5429> <http://example.org/ns#a5429> <http://example.org/ns#a5429> . +<http://example.org/ns#a5430> <http://example.org/ns#a5430> <http://example.org/ns#a5430> . +<http://example.org/ns#a5431> <http://example.org/ns#a5431> <http://example.org/ns#a5431> . +<http://example.org/ns#a5432> <http://example.org/ns#a5432> <http://example.org/ns#a5432> . +<http://example.org/ns#a5433> <http://example.org/ns#a5433> <http://example.org/ns#a5433> . +<http://example.org/ns#a5434> <http://example.org/ns#a5434> <http://example.org/ns#a5434> . +<http://example.org/ns#a5435> <http://example.org/ns#a5435> <http://example.org/ns#a5435> . +<http://example.org/ns#a5436> <http://example.org/ns#a5436> <http://example.org/ns#a5436> . +<http://example.org/ns#a5437> <http://example.org/ns#a5437> <http://example.org/ns#a5437> . +<http://example.org/ns#a5438> <http://example.org/ns#a5438> <http://example.org/ns#a5438> . +<http://example.org/ns#a5439> <http://example.org/ns#a5439> <http://example.org/ns#a5439> . +<http://example.org/ns#a5440> <http://example.org/ns#a5440> <http://example.org/ns#a5440> . +<http://example.org/ns#a5441> <http://example.org/ns#a5441> <http://example.org/ns#a5441> . +<http://example.org/ns#a5442> <http://example.org/ns#a5442> <http://example.org/ns#a5442> . +<http://example.org/ns#a5443> <http://example.org/ns#a5443> <http://example.org/ns#a5443> . +<http://example.org/ns#a5444> <http://example.org/ns#a5444> <http://example.org/ns#a5444> . +<http://example.org/ns#a5445> <http://example.org/ns#a5445> <http://example.org/ns#a5445> . +<http://example.org/ns#a5446> <http://example.org/ns#a5446> <http://example.org/ns#a5446> . +<http://example.org/ns#a5447> <http://example.org/ns#a5447> <http://example.org/ns#a5447> . +<http://example.org/ns#a5448> <http://example.org/ns#a5448> <http://example.org/ns#a5448> . +<http://example.org/ns#a5449> <http://example.org/ns#a5449> <http://example.org/ns#a5449> . +<http://example.org/ns#a5450> <http://example.org/ns#a5450> <http://example.org/ns#a5450> . +<http://example.org/ns#a5451> <http://example.org/ns#a5451> <http://example.org/ns#a5451> . +<http://example.org/ns#a5452> <http://example.org/ns#a5452> <http://example.org/ns#a5452> . +<http://example.org/ns#a5453> <http://example.org/ns#a5453> <http://example.org/ns#a5453> . +<http://example.org/ns#a5454> <http://example.org/ns#a5454> <http://example.org/ns#a5454> . +<http://example.org/ns#a5455> <http://example.org/ns#a5455> <http://example.org/ns#a5455> . +<http://example.org/ns#a5456> <http://example.org/ns#a5456> <http://example.org/ns#a5456> . +<http://example.org/ns#a5457> <http://example.org/ns#a5457> <http://example.org/ns#a5457> . +<http://example.org/ns#a5458> <http://example.org/ns#a5458> <http://example.org/ns#a5458> . +<http://example.org/ns#a5459> <http://example.org/ns#a5459> <http://example.org/ns#a5459> . +<http://example.org/ns#a5460> <http://example.org/ns#a5460> <http://example.org/ns#a5460> . +<http://example.org/ns#a5461> <http://example.org/ns#a5461> <http://example.org/ns#a5461> . +<http://example.org/ns#a5462> <http://example.org/ns#a5462> <http://example.org/ns#a5462> . +<http://example.org/ns#a5463> <http://example.org/ns#a5463> <http://example.org/ns#a5463> . +<http://example.org/ns#a5464> <http://example.org/ns#a5464> <http://example.org/ns#a5464> . +<http://example.org/ns#a5465> <http://example.org/ns#a5465> <http://example.org/ns#a5465> . +<http://example.org/ns#a5466> <http://example.org/ns#a5466> <http://example.org/ns#a5466> . +<http://example.org/ns#a5467> <http://example.org/ns#a5467> <http://example.org/ns#a5467> . +<http://example.org/ns#a5468> <http://example.org/ns#a5468> <http://example.org/ns#a5468> . +<http://example.org/ns#a5469> <http://example.org/ns#a5469> <http://example.org/ns#a5469> . +<http://example.org/ns#a5470> <http://example.org/ns#a5470> <http://example.org/ns#a5470> . +<http://example.org/ns#a5471> <http://example.org/ns#a5471> <http://example.org/ns#a5471> . +<http://example.org/ns#a5472> <http://example.org/ns#a5472> <http://example.org/ns#a5472> . +<http://example.org/ns#a5473> <http://example.org/ns#a5473> <http://example.org/ns#a5473> . +<http://example.org/ns#a5474> <http://example.org/ns#a5474> <http://example.org/ns#a5474> . +<http://example.org/ns#a5475> <http://example.org/ns#a5475> <http://example.org/ns#a5475> . +<http://example.org/ns#a5476> <http://example.org/ns#a5476> <http://example.org/ns#a5476> . +<http://example.org/ns#a5477> <http://example.org/ns#a5477> <http://example.org/ns#a5477> . +<http://example.org/ns#a5478> <http://example.org/ns#a5478> <http://example.org/ns#a5478> . +<http://example.org/ns#a5479> <http://example.org/ns#a5479> <http://example.org/ns#a5479> . +<http://example.org/ns#a5480> <http://example.org/ns#a5480> <http://example.org/ns#a5480> . +<http://example.org/ns#a5481> <http://example.org/ns#a5481> <http://example.org/ns#a5481> . +<http://example.org/ns#a5482> <http://example.org/ns#a5482> <http://example.org/ns#a5482> . +<http://example.org/ns#a5483> <http://example.org/ns#a5483> <http://example.org/ns#a5483> . +<http://example.org/ns#a5484> <http://example.org/ns#a5484> <http://example.org/ns#a5484> . +<http://example.org/ns#a5485> <http://example.org/ns#a5485> <http://example.org/ns#a5485> . +<http://example.org/ns#a5486> <http://example.org/ns#a5486> <http://example.org/ns#a5486> . +<http://example.org/ns#a5487> <http://example.org/ns#a5487> <http://example.org/ns#a5487> . +<http://example.org/ns#a5488> <http://example.org/ns#a5488> <http://example.org/ns#a5488> . +<http://example.org/ns#a5489> <http://example.org/ns#a5489> <http://example.org/ns#a5489> . +<http://example.org/ns#a5490> <http://example.org/ns#a5490> <http://example.org/ns#a5490> . +<http://example.org/ns#a5491> <http://example.org/ns#a5491> <http://example.org/ns#a5491> . +<http://example.org/ns#a5492> <http://example.org/ns#a5492> <http://example.org/ns#a5492> . +<http://example.org/ns#a5493> <http://example.org/ns#a5493> <http://example.org/ns#a5493> . +<http://example.org/ns#a5494> <http://example.org/ns#a5494> <http://example.org/ns#a5494> . +<http://example.org/ns#a5495> <http://example.org/ns#a5495> <http://example.org/ns#a5495> . +<http://example.org/ns#a5496> <http://example.org/ns#a5496> <http://example.org/ns#a5496> . +<http://example.org/ns#a5497> <http://example.org/ns#a5497> <http://example.org/ns#a5497> . +<http://example.org/ns#a5498> <http://example.org/ns#a5498> <http://example.org/ns#a5498> . +<http://example.org/ns#a5499> <http://example.org/ns#a5499> <http://example.org/ns#a5499> . +<http://example.org/ns#a5500> <http://example.org/ns#a5500> <http://example.org/ns#a5500> . +<http://example.org/ns#a5501> <http://example.org/ns#a5501> <http://example.org/ns#a5501> . +<http://example.org/ns#a5502> <http://example.org/ns#a5502> <http://example.org/ns#a5502> . +<http://example.org/ns#a5503> <http://example.org/ns#a5503> <http://example.org/ns#a5503> . +<http://example.org/ns#a5504> <http://example.org/ns#a5504> <http://example.org/ns#a5504> . +<http://example.org/ns#a5505> <http://example.org/ns#a5505> <http://example.org/ns#a5505> . +<http://example.org/ns#a5506> <http://example.org/ns#a5506> <http://example.org/ns#a5506> . +<http://example.org/ns#a5507> <http://example.org/ns#a5507> <http://example.org/ns#a5507> . +<http://example.org/ns#a5508> <http://example.org/ns#a5508> <http://example.org/ns#a5508> . +<http://example.org/ns#a5509> <http://example.org/ns#a5509> <http://example.org/ns#a5509> . +<http://example.org/ns#a5510> <http://example.org/ns#a5510> <http://example.org/ns#a5510> . +<http://example.org/ns#a5511> <http://example.org/ns#a5511> <http://example.org/ns#a5511> . +<http://example.org/ns#a5512> <http://example.org/ns#a5512> <http://example.org/ns#a5512> . +<http://example.org/ns#a5513> <http://example.org/ns#a5513> <http://example.org/ns#a5513> . +<http://example.org/ns#a5514> <http://example.org/ns#a5514> <http://example.org/ns#a5514> . +<http://example.org/ns#a5515> <http://example.org/ns#a5515> <http://example.org/ns#a5515> . +<http://example.org/ns#a5516> <http://example.org/ns#a5516> <http://example.org/ns#a5516> . +<http://example.org/ns#a5517> <http://example.org/ns#a5517> <http://example.org/ns#a5517> . +<http://example.org/ns#a5518> <http://example.org/ns#a5518> <http://example.org/ns#a5518> . +<http://example.org/ns#a5519> <http://example.org/ns#a5519> <http://example.org/ns#a5519> . +<http://example.org/ns#a5520> <http://example.org/ns#a5520> <http://example.org/ns#a5520> . +<http://example.org/ns#a5521> <http://example.org/ns#a5521> <http://example.org/ns#a5521> . +<http://example.org/ns#a5522> <http://example.org/ns#a5522> <http://example.org/ns#a5522> . +<http://example.org/ns#a5523> <http://example.org/ns#a5523> <http://example.org/ns#a5523> . +<http://example.org/ns#a5524> <http://example.org/ns#a5524> <http://example.org/ns#a5524> . +<http://example.org/ns#a5525> <http://example.org/ns#a5525> <http://example.org/ns#a5525> . +<http://example.org/ns#a5526> <http://example.org/ns#a5526> <http://example.org/ns#a5526> . +<http://example.org/ns#a5527> <http://example.org/ns#a5527> <http://example.org/ns#a5527> . +<http://example.org/ns#a5528> <http://example.org/ns#a5528> <http://example.org/ns#a5528> . +<http://example.org/ns#a5529> <http://example.org/ns#a5529> <http://example.org/ns#a5529> . +<http://example.org/ns#a5530> <http://example.org/ns#a5530> <http://example.org/ns#a5530> . +<http://example.org/ns#a5531> <http://example.org/ns#a5531> <http://example.org/ns#a5531> . +<http://example.org/ns#a5532> <http://example.org/ns#a5532> <http://example.org/ns#a5532> . +<http://example.org/ns#a5533> <http://example.org/ns#a5533> <http://example.org/ns#a5533> . +<http://example.org/ns#a5534> <http://example.org/ns#a5534> <http://example.org/ns#a5534> . +<http://example.org/ns#a5535> <http://example.org/ns#a5535> <http://example.org/ns#a5535> . +<http://example.org/ns#a5536> <http://example.org/ns#a5536> <http://example.org/ns#a5536> . +<http://example.org/ns#a5537> <http://example.org/ns#a5537> <http://example.org/ns#a5537> . +<http://example.org/ns#a5538> <http://example.org/ns#a5538> <http://example.org/ns#a5538> . +<http://example.org/ns#a5539> <http://example.org/ns#a5539> <http://example.org/ns#a5539> . +<http://example.org/ns#a5540> <http://example.org/ns#a5540> <http://example.org/ns#a5540> . +<http://example.org/ns#a5541> <http://example.org/ns#a5541> <http://example.org/ns#a5541> . +<http://example.org/ns#a5542> <http://example.org/ns#a5542> <http://example.org/ns#a5542> . +<http://example.org/ns#a5543> <http://example.org/ns#a5543> <http://example.org/ns#a5543> . +<http://example.org/ns#a5544> <http://example.org/ns#a5544> <http://example.org/ns#a5544> . +<http://example.org/ns#a5545> <http://example.org/ns#a5545> <http://example.org/ns#a5545> . +<http://example.org/ns#a5546> <http://example.org/ns#a5546> <http://example.org/ns#a5546> . +<http://example.org/ns#a5547> <http://example.org/ns#a5547> <http://example.org/ns#a5547> . +<http://example.org/ns#a5548> <http://example.org/ns#a5548> <http://example.org/ns#a5548> . +<http://example.org/ns#a5549> <http://example.org/ns#a5549> <http://example.org/ns#a5549> . +<http://example.org/ns#a5550> <http://example.org/ns#a5550> <http://example.org/ns#a5550> . +<http://example.org/ns#a5551> <http://example.org/ns#a5551> <http://example.org/ns#a5551> . +<http://example.org/ns#a5552> <http://example.org/ns#a5552> <http://example.org/ns#a5552> . +<http://example.org/ns#a5553> <http://example.org/ns#a5553> <http://example.org/ns#a5553> . +<http://example.org/ns#a5554> <http://example.org/ns#a5554> <http://example.org/ns#a5554> . +<http://example.org/ns#a5555> <http://example.org/ns#a5555> <http://example.org/ns#a5555> . +<http://example.org/ns#a5556> <http://example.org/ns#a5556> <http://example.org/ns#a5556> . +<http://example.org/ns#a5557> <http://example.org/ns#a5557> <http://example.org/ns#a5557> . +<http://example.org/ns#a5558> <http://example.org/ns#a5558> <http://example.org/ns#a5558> . +<http://example.org/ns#a5559> <http://example.org/ns#a5559> <http://example.org/ns#a5559> . +<http://example.org/ns#a5560> <http://example.org/ns#a5560> <http://example.org/ns#a5560> . +<http://example.org/ns#a5561> <http://example.org/ns#a5561> <http://example.org/ns#a5561> . +<http://example.org/ns#a5562> <http://example.org/ns#a5562> <http://example.org/ns#a5562> . +<http://example.org/ns#a5563> <http://example.org/ns#a5563> <http://example.org/ns#a5563> . +<http://example.org/ns#a5564> <http://example.org/ns#a5564> <http://example.org/ns#a5564> . +<http://example.org/ns#a5565> <http://example.org/ns#a5565> <http://example.org/ns#a5565> . +<http://example.org/ns#a5566> <http://example.org/ns#a5566> <http://example.org/ns#a5566> . +<http://example.org/ns#a5567> <http://example.org/ns#a5567> <http://example.org/ns#a5567> . +<http://example.org/ns#a5568> <http://example.org/ns#a5568> <http://example.org/ns#a5568> . +<http://example.org/ns#a5569> <http://example.org/ns#a5569> <http://example.org/ns#a5569> . +<http://example.org/ns#a5570> <http://example.org/ns#a5570> <http://example.org/ns#a5570> . +<http://example.org/ns#a5571> <http://example.org/ns#a5571> <http://example.org/ns#a5571> . +<http://example.org/ns#a5572> <http://example.org/ns#a5572> <http://example.org/ns#a5572> . +<http://example.org/ns#a5573> <http://example.org/ns#a5573> <http://example.org/ns#a5573> . +<http://example.org/ns#a5574> <http://example.org/ns#a5574> <http://example.org/ns#a5574> . +<http://example.org/ns#a5575> <http://example.org/ns#a5575> <http://example.org/ns#a5575> . +<http://example.org/ns#a5576> <http://example.org/ns#a5576> <http://example.org/ns#a5576> . +<http://example.org/ns#a5577> <http://example.org/ns#a5577> <http://example.org/ns#a5577> . +<http://example.org/ns#a5578> <http://example.org/ns#a5578> <http://example.org/ns#a5578> . +<http://example.org/ns#a5579> <http://example.org/ns#a5579> <http://example.org/ns#a5579> . +<http://example.org/ns#a5580> <http://example.org/ns#a5580> <http://example.org/ns#a5580> . +<http://example.org/ns#a5581> <http://example.org/ns#a5581> <http://example.org/ns#a5581> . +<http://example.org/ns#a5582> <http://example.org/ns#a5582> <http://example.org/ns#a5582> . +<http://example.org/ns#a5583> <http://example.org/ns#a5583> <http://example.org/ns#a5583> . +<http://example.org/ns#a5584> <http://example.org/ns#a5584> <http://example.org/ns#a5584> . +<http://example.org/ns#a5585> <http://example.org/ns#a5585> <http://example.org/ns#a5585> . +<http://example.org/ns#a5586> <http://example.org/ns#a5586> <http://example.org/ns#a5586> . +<http://example.org/ns#a5587> <http://example.org/ns#a5587> <http://example.org/ns#a5587> . +<http://example.org/ns#a5588> <http://example.org/ns#a5588> <http://example.org/ns#a5588> . +<http://example.org/ns#a5589> <http://example.org/ns#a5589> <http://example.org/ns#a5589> . +<http://example.org/ns#a5590> <http://example.org/ns#a5590> <http://example.org/ns#a5590> . +<http://example.org/ns#a5591> <http://example.org/ns#a5591> <http://example.org/ns#a5591> . +<http://example.org/ns#a5592> <http://example.org/ns#a5592> <http://example.org/ns#a5592> . +<http://example.org/ns#a5593> <http://example.org/ns#a5593> <http://example.org/ns#a5593> . +<http://example.org/ns#a5594> <http://example.org/ns#a5594> <http://example.org/ns#a5594> . +<http://example.org/ns#a5595> <http://example.org/ns#a5595> <http://example.org/ns#a5595> . +<http://example.org/ns#a5596> <http://example.org/ns#a5596> <http://example.org/ns#a5596> . +<http://example.org/ns#a5597> <http://example.org/ns#a5597> <http://example.org/ns#a5597> . +<http://example.org/ns#a5598> <http://example.org/ns#a5598> <http://example.org/ns#a5598> . +<http://example.org/ns#a5599> <http://example.org/ns#a5599> <http://example.org/ns#a5599> . +<http://example.org/ns#a5600> <http://example.org/ns#a5600> <http://example.org/ns#a5600> . +<http://example.org/ns#a5601> <http://example.org/ns#a5601> <http://example.org/ns#a5601> . +<http://example.org/ns#a5602> <http://example.org/ns#a5602> <http://example.org/ns#a5602> . +<http://example.org/ns#a5603> <http://example.org/ns#a5603> <http://example.org/ns#a5603> . +<http://example.org/ns#a5604> <http://example.org/ns#a5604> <http://example.org/ns#a5604> . +<http://example.org/ns#a5605> <http://example.org/ns#a5605> <http://example.org/ns#a5605> . +<http://example.org/ns#a5606> <http://example.org/ns#a5606> <http://example.org/ns#a5606> . +<http://example.org/ns#a5607> <http://example.org/ns#a5607> <http://example.org/ns#a5607> . +<http://example.org/ns#a5608> <http://example.org/ns#a5608> <http://example.org/ns#a5608> . +<http://example.org/ns#a5609> <http://example.org/ns#a5609> <http://example.org/ns#a5609> . +<http://example.org/ns#a5610> <http://example.org/ns#a5610> <http://example.org/ns#a5610> . +<http://example.org/ns#a5611> <http://example.org/ns#a5611> <http://example.org/ns#a5611> . +<http://example.org/ns#a5612> <http://example.org/ns#a5612> <http://example.org/ns#a5612> . +<http://example.org/ns#a5613> <http://example.org/ns#a5613> <http://example.org/ns#a5613> . +<http://example.org/ns#a5614> <http://example.org/ns#a5614> <http://example.org/ns#a5614> . +<http://example.org/ns#a5615> <http://example.org/ns#a5615> <http://example.org/ns#a5615> . +<http://example.org/ns#a5616> <http://example.org/ns#a5616> <http://example.org/ns#a5616> . +<http://example.org/ns#a5617> <http://example.org/ns#a5617> <http://example.org/ns#a5617> . +<http://example.org/ns#a5618> <http://example.org/ns#a5618> <http://example.org/ns#a5618> . +<http://example.org/ns#a5619> <http://example.org/ns#a5619> <http://example.org/ns#a5619> . +<http://example.org/ns#a5620> <http://example.org/ns#a5620> <http://example.org/ns#a5620> . +<http://example.org/ns#a5621> <http://example.org/ns#a5621> <http://example.org/ns#a5621> . +<http://example.org/ns#a5622> <http://example.org/ns#a5622> <http://example.org/ns#a5622> . +<http://example.org/ns#a5623> <http://example.org/ns#a5623> <http://example.org/ns#a5623> . +<http://example.org/ns#a5624> <http://example.org/ns#a5624> <http://example.org/ns#a5624> . +<http://example.org/ns#a5625> <http://example.org/ns#a5625> <http://example.org/ns#a5625> . +<http://example.org/ns#a5626> <http://example.org/ns#a5626> <http://example.org/ns#a5626> . +<http://example.org/ns#a5627> <http://example.org/ns#a5627> <http://example.org/ns#a5627> . +<http://example.org/ns#a5628> <http://example.org/ns#a5628> <http://example.org/ns#a5628> . +<http://example.org/ns#a5629> <http://example.org/ns#a5629> <http://example.org/ns#a5629> . +<http://example.org/ns#a5630> <http://example.org/ns#a5630> <http://example.org/ns#a5630> . +<http://example.org/ns#a5631> <http://example.org/ns#a5631> <http://example.org/ns#a5631> . +<http://example.org/ns#a5632> <http://example.org/ns#a5632> <http://example.org/ns#a5632> . +<http://example.org/ns#a5633> <http://example.org/ns#a5633> <http://example.org/ns#a5633> . +<http://example.org/ns#a5634> <http://example.org/ns#a5634> <http://example.org/ns#a5634> . +<http://example.org/ns#a5635> <http://example.org/ns#a5635> <http://example.org/ns#a5635> . +<http://example.org/ns#a5636> <http://example.org/ns#a5636> <http://example.org/ns#a5636> . +<http://example.org/ns#a5637> <http://example.org/ns#a5637> <http://example.org/ns#a5637> . +<http://example.org/ns#a5638> <http://example.org/ns#a5638> <http://example.org/ns#a5638> . +<http://example.org/ns#a5639> <http://example.org/ns#a5639> <http://example.org/ns#a5639> . +<http://example.org/ns#a5640> <http://example.org/ns#a5640> <http://example.org/ns#a5640> . +<http://example.org/ns#a5641> <http://example.org/ns#a5641> <http://example.org/ns#a5641> . +<http://example.org/ns#a5642> <http://example.org/ns#a5642> <http://example.org/ns#a5642> . +<http://example.org/ns#a5643> <http://example.org/ns#a5643> <http://example.org/ns#a5643> . +<http://example.org/ns#a5644> <http://example.org/ns#a5644> <http://example.org/ns#a5644> . +<http://example.org/ns#a5645> <http://example.org/ns#a5645> <http://example.org/ns#a5645> . +<http://example.org/ns#a5646> <http://example.org/ns#a5646> <http://example.org/ns#a5646> . +<http://example.org/ns#a5647> <http://example.org/ns#a5647> <http://example.org/ns#a5647> . +<http://example.org/ns#a5648> <http://example.org/ns#a5648> <http://example.org/ns#a5648> . +<http://example.org/ns#a5649> <http://example.org/ns#a5649> <http://example.org/ns#a5649> . +<http://example.org/ns#a5650> <http://example.org/ns#a5650> <http://example.org/ns#a5650> . +<http://example.org/ns#a5651> <http://example.org/ns#a5651> <http://example.org/ns#a5651> . +<http://example.org/ns#a5652> <http://example.org/ns#a5652> <http://example.org/ns#a5652> . +<http://example.org/ns#a5653> <http://example.org/ns#a5653> <http://example.org/ns#a5653> . +<http://example.org/ns#a5654> <http://example.org/ns#a5654> <http://example.org/ns#a5654> . +<http://example.org/ns#a5655> <http://example.org/ns#a5655> <http://example.org/ns#a5655> . +<http://example.org/ns#a5656> <http://example.org/ns#a5656> <http://example.org/ns#a5656> . +<http://example.org/ns#a5657> <http://example.org/ns#a5657> <http://example.org/ns#a5657> . +<http://example.org/ns#a5658> <http://example.org/ns#a5658> <http://example.org/ns#a5658> . +<http://example.org/ns#a5659> <http://example.org/ns#a5659> <http://example.org/ns#a5659> . +<http://example.org/ns#a5660> <http://example.org/ns#a5660> <http://example.org/ns#a5660> . +<http://example.org/ns#a5661> <http://example.org/ns#a5661> <http://example.org/ns#a5661> . +<http://example.org/ns#a5662> <http://example.org/ns#a5662> <http://example.org/ns#a5662> . +<http://example.org/ns#a5663> <http://example.org/ns#a5663> <http://example.org/ns#a5663> . +<http://example.org/ns#a5664> <http://example.org/ns#a5664> <http://example.org/ns#a5664> . +<http://example.org/ns#a5665> <http://example.org/ns#a5665> <http://example.org/ns#a5665> . +<http://example.org/ns#a5666> <http://example.org/ns#a5666> <http://example.org/ns#a5666> . +<http://example.org/ns#a5667> <http://example.org/ns#a5667> <http://example.org/ns#a5667> . +<http://example.org/ns#a5668> <http://example.org/ns#a5668> <http://example.org/ns#a5668> . +<http://example.org/ns#a5669> <http://example.org/ns#a5669> <http://example.org/ns#a5669> . +<http://example.org/ns#a5670> <http://example.org/ns#a5670> <http://example.org/ns#a5670> . +<http://example.org/ns#a5671> <http://example.org/ns#a5671> <http://example.org/ns#a5671> . +<http://example.org/ns#a5672> <http://example.org/ns#a5672> <http://example.org/ns#a5672> . +<http://example.org/ns#a5673> <http://example.org/ns#a5673> <http://example.org/ns#a5673> . +<http://example.org/ns#a5674> <http://example.org/ns#a5674> <http://example.org/ns#a5674> . +<http://example.org/ns#a5675> <http://example.org/ns#a5675> <http://example.org/ns#a5675> . +<http://example.org/ns#a5676> <http://example.org/ns#a5676> <http://example.org/ns#a5676> . +<http://example.org/ns#a5677> <http://example.org/ns#a5677> <http://example.org/ns#a5677> . +<http://example.org/ns#a5678> <http://example.org/ns#a5678> <http://example.org/ns#a5678> . +<http://example.org/ns#a5679> <http://example.org/ns#a5679> <http://example.org/ns#a5679> . +<http://example.org/ns#a5680> <http://example.org/ns#a5680> <http://example.org/ns#a5680> . +<http://example.org/ns#a5681> <http://example.org/ns#a5681> <http://example.org/ns#a5681> . +<http://example.org/ns#a5682> <http://example.org/ns#a5682> <http://example.org/ns#a5682> . +<http://example.org/ns#a5683> <http://example.org/ns#a5683> <http://example.org/ns#a5683> . +<http://example.org/ns#a5684> <http://example.org/ns#a5684> <http://example.org/ns#a5684> . +<http://example.org/ns#a5685> <http://example.org/ns#a5685> <http://example.org/ns#a5685> . +<http://example.org/ns#a5686> <http://example.org/ns#a5686> <http://example.org/ns#a5686> . +<http://example.org/ns#a5687> <http://example.org/ns#a5687> <http://example.org/ns#a5687> . +<http://example.org/ns#a5688> <http://example.org/ns#a5688> <http://example.org/ns#a5688> . +<http://example.org/ns#a5689> <http://example.org/ns#a5689> <http://example.org/ns#a5689> . +<http://example.org/ns#a5690> <http://example.org/ns#a5690> <http://example.org/ns#a5690> . +<http://example.org/ns#a5691> <http://example.org/ns#a5691> <http://example.org/ns#a5691> . +<http://example.org/ns#a5692> <http://example.org/ns#a5692> <http://example.org/ns#a5692> . +<http://example.org/ns#a5693> <http://example.org/ns#a5693> <http://example.org/ns#a5693> . +<http://example.org/ns#a5694> <http://example.org/ns#a5694> <http://example.org/ns#a5694> . +<http://example.org/ns#a5695> <http://example.org/ns#a5695> <http://example.org/ns#a5695> . +<http://example.org/ns#a5696> <http://example.org/ns#a5696> <http://example.org/ns#a5696> . +<http://example.org/ns#a5697> <http://example.org/ns#a5697> <http://example.org/ns#a5697> . +<http://example.org/ns#a5698> <http://example.org/ns#a5698> <http://example.org/ns#a5698> . +<http://example.org/ns#a5699> <http://example.org/ns#a5699> <http://example.org/ns#a5699> . +<http://example.org/ns#a5700> <http://example.org/ns#a5700> <http://example.org/ns#a5700> . +<http://example.org/ns#a5701> <http://example.org/ns#a5701> <http://example.org/ns#a5701> . +<http://example.org/ns#a5702> <http://example.org/ns#a5702> <http://example.org/ns#a5702> . +<http://example.org/ns#a5703> <http://example.org/ns#a5703> <http://example.org/ns#a5703> . +<http://example.org/ns#a5704> <http://example.org/ns#a5704> <http://example.org/ns#a5704> . +<http://example.org/ns#a5705> <http://example.org/ns#a5705> <http://example.org/ns#a5705> . +<http://example.org/ns#a5706> <http://example.org/ns#a5706> <http://example.org/ns#a5706> . +<http://example.org/ns#a5707> <http://example.org/ns#a5707> <http://example.org/ns#a5707> . +<http://example.org/ns#a5708> <http://example.org/ns#a5708> <http://example.org/ns#a5708> . +<http://example.org/ns#a5709> <http://example.org/ns#a5709> <http://example.org/ns#a5709> . +<http://example.org/ns#a5710> <http://example.org/ns#a5710> <http://example.org/ns#a5710> . +<http://example.org/ns#a5711> <http://example.org/ns#a5711> <http://example.org/ns#a5711> . +<http://example.org/ns#a5712> <http://example.org/ns#a5712> <http://example.org/ns#a5712> . +<http://example.org/ns#a5713> <http://example.org/ns#a5713> <http://example.org/ns#a5713> . +<http://example.org/ns#a5714> <http://example.org/ns#a5714> <http://example.org/ns#a5714> . +<http://example.org/ns#a5715> <http://example.org/ns#a5715> <http://example.org/ns#a5715> . +<http://example.org/ns#a5716> <http://example.org/ns#a5716> <http://example.org/ns#a5716> . +<http://example.org/ns#a5717> <http://example.org/ns#a5717> <http://example.org/ns#a5717> . +<http://example.org/ns#a5718> <http://example.org/ns#a5718> <http://example.org/ns#a5718> . +<http://example.org/ns#a5719> <http://example.org/ns#a5719> <http://example.org/ns#a5719> . +<http://example.org/ns#a5720> <http://example.org/ns#a5720> <http://example.org/ns#a5720> . +<http://example.org/ns#a5721> <http://example.org/ns#a5721> <http://example.org/ns#a5721> . +<http://example.org/ns#a5722> <http://example.org/ns#a5722> <http://example.org/ns#a5722> . +<http://example.org/ns#a5723> <http://example.org/ns#a5723> <http://example.org/ns#a5723> . +<http://example.org/ns#a5724> <http://example.org/ns#a5724> <http://example.org/ns#a5724> . +<http://example.org/ns#a5725> <http://example.org/ns#a5725> <http://example.org/ns#a5725> . +<http://example.org/ns#a5726> <http://example.org/ns#a5726> <http://example.org/ns#a5726> . +<http://example.org/ns#a5727> <http://example.org/ns#a5727> <http://example.org/ns#a5727> . +<http://example.org/ns#a5728> <http://example.org/ns#a5728> <http://example.org/ns#a5728> . +<http://example.org/ns#a5729> <http://example.org/ns#a5729> <http://example.org/ns#a5729> . +<http://example.org/ns#a5730> <http://example.org/ns#a5730> <http://example.org/ns#a5730> . +<http://example.org/ns#a5731> <http://example.org/ns#a5731> <http://example.org/ns#a5731> . +<http://example.org/ns#a5732> <http://example.org/ns#a5732> <http://example.org/ns#a5732> . +<http://example.org/ns#a5733> <http://example.org/ns#a5733> <http://example.org/ns#a5733> . +<http://example.org/ns#a5734> <http://example.org/ns#a5734> <http://example.org/ns#a5734> . +<http://example.org/ns#a5735> <http://example.org/ns#a5735> <http://example.org/ns#a5735> . +<http://example.org/ns#a5736> <http://example.org/ns#a5736> <http://example.org/ns#a5736> . +<http://example.org/ns#a5737> <http://example.org/ns#a5737> <http://example.org/ns#a5737> . +<http://example.org/ns#a5738> <http://example.org/ns#a5738> <http://example.org/ns#a5738> . +<http://example.org/ns#a5739> <http://example.org/ns#a5739> <http://example.org/ns#a5739> . +<http://example.org/ns#a5740> <http://example.org/ns#a5740> <http://example.org/ns#a5740> . +<http://example.org/ns#a5741> <http://example.org/ns#a5741> <http://example.org/ns#a5741> . +<http://example.org/ns#a5742> <http://example.org/ns#a5742> <http://example.org/ns#a5742> . +<http://example.org/ns#a5743> <http://example.org/ns#a5743> <http://example.org/ns#a5743> . +<http://example.org/ns#a5744> <http://example.org/ns#a5744> <http://example.org/ns#a5744> . +<http://example.org/ns#a5745> <http://example.org/ns#a5745> <http://example.org/ns#a5745> . +<http://example.org/ns#a5746> <http://example.org/ns#a5746> <http://example.org/ns#a5746> . +<http://example.org/ns#a5747> <http://example.org/ns#a5747> <http://example.org/ns#a5747> . +<http://example.org/ns#a5748> <http://example.org/ns#a5748> <http://example.org/ns#a5748> . +<http://example.org/ns#a5749> <http://example.org/ns#a5749> <http://example.org/ns#a5749> . +<http://example.org/ns#a5750> <http://example.org/ns#a5750> <http://example.org/ns#a5750> . +<http://example.org/ns#a5751> <http://example.org/ns#a5751> <http://example.org/ns#a5751> . +<http://example.org/ns#a5752> <http://example.org/ns#a5752> <http://example.org/ns#a5752> . +<http://example.org/ns#a5753> <http://example.org/ns#a5753> <http://example.org/ns#a5753> . +<http://example.org/ns#a5754> <http://example.org/ns#a5754> <http://example.org/ns#a5754> . +<http://example.org/ns#a5755> <http://example.org/ns#a5755> <http://example.org/ns#a5755> . +<http://example.org/ns#a5756> <http://example.org/ns#a5756> <http://example.org/ns#a5756> . +<http://example.org/ns#a5757> <http://example.org/ns#a5757> <http://example.org/ns#a5757> . +<http://example.org/ns#a5758> <http://example.org/ns#a5758> <http://example.org/ns#a5758> . +<http://example.org/ns#a5759> <http://example.org/ns#a5759> <http://example.org/ns#a5759> . +<http://example.org/ns#a5760> <http://example.org/ns#a5760> <http://example.org/ns#a5760> . +<http://example.org/ns#a5761> <http://example.org/ns#a5761> <http://example.org/ns#a5761> . +<http://example.org/ns#a5762> <http://example.org/ns#a5762> <http://example.org/ns#a5762> . +<http://example.org/ns#a5763> <http://example.org/ns#a5763> <http://example.org/ns#a5763> . +<http://example.org/ns#a5764> <http://example.org/ns#a5764> <http://example.org/ns#a5764> . +<http://example.org/ns#a5765> <http://example.org/ns#a5765> <http://example.org/ns#a5765> . +<http://example.org/ns#a5766> <http://example.org/ns#a5766> <http://example.org/ns#a5766> . +<http://example.org/ns#a5767> <http://example.org/ns#a5767> <http://example.org/ns#a5767> . +<http://example.org/ns#a5768> <http://example.org/ns#a5768> <http://example.org/ns#a5768> . +<http://example.org/ns#a5769> <http://example.org/ns#a5769> <http://example.org/ns#a5769> . +<http://example.org/ns#a5770> <http://example.org/ns#a5770> <http://example.org/ns#a5770> . +<http://example.org/ns#a5771> <http://example.org/ns#a5771> <http://example.org/ns#a5771> . +<http://example.org/ns#a5772> <http://example.org/ns#a5772> <http://example.org/ns#a5772> . +<http://example.org/ns#a5773> <http://example.org/ns#a5773> <http://example.org/ns#a5773> . +<http://example.org/ns#a5774> <http://example.org/ns#a5774> <http://example.org/ns#a5774> . +<http://example.org/ns#a5775> <http://example.org/ns#a5775> <http://example.org/ns#a5775> . +<http://example.org/ns#a5776> <http://example.org/ns#a5776> <http://example.org/ns#a5776> . +<http://example.org/ns#a5777> <http://example.org/ns#a5777> <http://example.org/ns#a5777> . +<http://example.org/ns#a5778> <http://example.org/ns#a5778> <http://example.org/ns#a5778> . +<http://example.org/ns#a5779> <http://example.org/ns#a5779> <http://example.org/ns#a5779> . +<http://example.org/ns#a5780> <http://example.org/ns#a5780> <http://example.org/ns#a5780> . +<http://example.org/ns#a5781> <http://example.org/ns#a5781> <http://example.org/ns#a5781> . +<http://example.org/ns#a5782> <http://example.org/ns#a5782> <http://example.org/ns#a5782> . +<http://example.org/ns#a5783> <http://example.org/ns#a5783> <http://example.org/ns#a5783> . +<http://example.org/ns#a5784> <http://example.org/ns#a5784> <http://example.org/ns#a5784> . +<http://example.org/ns#a5785> <http://example.org/ns#a5785> <http://example.org/ns#a5785> . +<http://example.org/ns#a5786> <http://example.org/ns#a5786> <http://example.org/ns#a5786> . +<http://example.org/ns#a5787> <http://example.org/ns#a5787> <http://example.org/ns#a5787> . +<http://example.org/ns#a5788> <http://example.org/ns#a5788> <http://example.org/ns#a5788> . +<http://example.org/ns#a5789> <http://example.org/ns#a5789> <http://example.org/ns#a5789> . +<http://example.org/ns#a5790> <http://example.org/ns#a5790> <http://example.org/ns#a5790> . +<http://example.org/ns#a5791> <http://example.org/ns#a5791> <http://example.org/ns#a5791> . +<http://example.org/ns#a5792> <http://example.org/ns#a5792> <http://example.org/ns#a5792> . +<http://example.org/ns#a5793> <http://example.org/ns#a5793> <http://example.org/ns#a5793> . +<http://example.org/ns#a5794> <http://example.org/ns#a5794> <http://example.org/ns#a5794> . +<http://example.org/ns#a5795> <http://example.org/ns#a5795> <http://example.org/ns#a5795> . +<http://example.org/ns#a5796> <http://example.org/ns#a5796> <http://example.org/ns#a5796> . +<http://example.org/ns#a5797> <http://example.org/ns#a5797> <http://example.org/ns#a5797> . +<http://example.org/ns#a5798> <http://example.org/ns#a5798> <http://example.org/ns#a5798> . +<http://example.org/ns#a5799> <http://example.org/ns#a5799> <http://example.org/ns#a5799> . +<http://example.org/ns#a5800> <http://example.org/ns#a5800> <http://example.org/ns#a5800> . +<http://example.org/ns#a5801> <http://example.org/ns#a5801> <http://example.org/ns#a5801> . +<http://example.org/ns#a5802> <http://example.org/ns#a5802> <http://example.org/ns#a5802> . +<http://example.org/ns#a5803> <http://example.org/ns#a5803> <http://example.org/ns#a5803> . +<http://example.org/ns#a5804> <http://example.org/ns#a5804> <http://example.org/ns#a5804> . +<http://example.org/ns#a5805> <http://example.org/ns#a5805> <http://example.org/ns#a5805> . +<http://example.org/ns#a5806> <http://example.org/ns#a5806> <http://example.org/ns#a5806> . +<http://example.org/ns#a5807> <http://example.org/ns#a5807> <http://example.org/ns#a5807> . +<http://example.org/ns#a5808> <http://example.org/ns#a5808> <http://example.org/ns#a5808> . +<http://example.org/ns#a5809> <http://example.org/ns#a5809> <http://example.org/ns#a5809> . +<http://example.org/ns#a5810> <http://example.org/ns#a5810> <http://example.org/ns#a5810> . +<http://example.org/ns#a5811> <http://example.org/ns#a5811> <http://example.org/ns#a5811> . +<http://example.org/ns#a5812> <http://example.org/ns#a5812> <http://example.org/ns#a5812> . +<http://example.org/ns#a5813> <http://example.org/ns#a5813> <http://example.org/ns#a5813> . +<http://example.org/ns#a5814> <http://example.org/ns#a5814> <http://example.org/ns#a5814> . +<http://example.org/ns#a5815> <http://example.org/ns#a5815> <http://example.org/ns#a5815> . +<http://example.org/ns#a5816> <http://example.org/ns#a5816> <http://example.org/ns#a5816> . +<http://example.org/ns#a5817> <http://example.org/ns#a5817> <http://example.org/ns#a5817> . +<http://example.org/ns#a5818> <http://example.org/ns#a5818> <http://example.org/ns#a5818> . +<http://example.org/ns#a5819> <http://example.org/ns#a5819> <http://example.org/ns#a5819> . +<http://example.org/ns#a5820> <http://example.org/ns#a5820> <http://example.org/ns#a5820> . +<http://example.org/ns#a5821> <http://example.org/ns#a5821> <http://example.org/ns#a5821> . +<http://example.org/ns#a5822> <http://example.org/ns#a5822> <http://example.org/ns#a5822> . +<http://example.org/ns#a5823> <http://example.org/ns#a5823> <http://example.org/ns#a5823> . +<http://example.org/ns#a5824> <http://example.org/ns#a5824> <http://example.org/ns#a5824> . +<http://example.org/ns#a5825> <http://example.org/ns#a5825> <http://example.org/ns#a5825> . +<http://example.org/ns#a5826> <http://example.org/ns#a5826> <http://example.org/ns#a5826> . +<http://example.org/ns#a5827> <http://example.org/ns#a5827> <http://example.org/ns#a5827> . +<http://example.org/ns#a5828> <http://example.org/ns#a5828> <http://example.org/ns#a5828> . +<http://example.org/ns#a5829> <http://example.org/ns#a5829> <http://example.org/ns#a5829> . +<http://example.org/ns#a5830> <http://example.org/ns#a5830> <http://example.org/ns#a5830> . +<http://example.org/ns#a5831> <http://example.org/ns#a5831> <http://example.org/ns#a5831> . +<http://example.org/ns#a5832> <http://example.org/ns#a5832> <http://example.org/ns#a5832> . +<http://example.org/ns#a5833> <http://example.org/ns#a5833> <http://example.org/ns#a5833> . +<http://example.org/ns#a5834> <http://example.org/ns#a5834> <http://example.org/ns#a5834> . +<http://example.org/ns#a5835> <http://example.org/ns#a5835> <http://example.org/ns#a5835> . +<http://example.org/ns#a5836> <http://example.org/ns#a5836> <http://example.org/ns#a5836> . +<http://example.org/ns#a5837> <http://example.org/ns#a5837> <http://example.org/ns#a5837> . +<http://example.org/ns#a5838> <http://example.org/ns#a5838> <http://example.org/ns#a5838> . +<http://example.org/ns#a5839> <http://example.org/ns#a5839> <http://example.org/ns#a5839> . +<http://example.org/ns#a5840> <http://example.org/ns#a5840> <http://example.org/ns#a5840> . +<http://example.org/ns#a5841> <http://example.org/ns#a5841> <http://example.org/ns#a5841> . +<http://example.org/ns#a5842> <http://example.org/ns#a5842> <http://example.org/ns#a5842> . +<http://example.org/ns#a5843> <http://example.org/ns#a5843> <http://example.org/ns#a5843> . +<http://example.org/ns#a5844> <http://example.org/ns#a5844> <http://example.org/ns#a5844> . +<http://example.org/ns#a5845> <http://example.org/ns#a5845> <http://example.org/ns#a5845> . +<http://example.org/ns#a5846> <http://example.org/ns#a5846> <http://example.org/ns#a5846> . +<http://example.org/ns#a5847> <http://example.org/ns#a5847> <http://example.org/ns#a5847> . +<http://example.org/ns#a5848> <http://example.org/ns#a5848> <http://example.org/ns#a5848> . +<http://example.org/ns#a5849> <http://example.org/ns#a5849> <http://example.org/ns#a5849> . +<http://example.org/ns#a5850> <http://example.org/ns#a5850> <http://example.org/ns#a5850> . +<http://example.org/ns#a5851> <http://example.org/ns#a5851> <http://example.org/ns#a5851> . +<http://example.org/ns#a5852> <http://example.org/ns#a5852> <http://example.org/ns#a5852> . +<http://example.org/ns#a5853> <http://example.org/ns#a5853> <http://example.org/ns#a5853> . +<http://example.org/ns#a5854> <http://example.org/ns#a5854> <http://example.org/ns#a5854> . +<http://example.org/ns#a5855> <http://example.org/ns#a5855> <http://example.org/ns#a5855> . +<http://example.org/ns#a5856> <http://example.org/ns#a5856> <http://example.org/ns#a5856> . +<http://example.org/ns#a5857> <http://example.org/ns#a5857> <http://example.org/ns#a5857> . +<http://example.org/ns#a5858> <http://example.org/ns#a5858> <http://example.org/ns#a5858> . +<http://example.org/ns#a5859> <http://example.org/ns#a5859> <http://example.org/ns#a5859> . +<http://example.org/ns#a5860> <http://example.org/ns#a5860> <http://example.org/ns#a5860> . +<http://example.org/ns#a5861> <http://example.org/ns#a5861> <http://example.org/ns#a5861> . +<http://example.org/ns#a5862> <http://example.org/ns#a5862> <http://example.org/ns#a5862> . +<http://example.org/ns#a5863> <http://example.org/ns#a5863> <http://example.org/ns#a5863> . +<http://example.org/ns#a5864> <http://example.org/ns#a5864> <http://example.org/ns#a5864> . +<http://example.org/ns#a5865> <http://example.org/ns#a5865> <http://example.org/ns#a5865> . +<http://example.org/ns#a5866> <http://example.org/ns#a5866> <http://example.org/ns#a5866> . +<http://example.org/ns#a5867> <http://example.org/ns#a5867> <http://example.org/ns#a5867> . +<http://example.org/ns#a5868> <http://example.org/ns#a5868> <http://example.org/ns#a5868> . +<http://example.org/ns#a5869> <http://example.org/ns#a5869> <http://example.org/ns#a5869> . +<http://example.org/ns#a5870> <http://example.org/ns#a5870> <http://example.org/ns#a5870> . +<http://example.org/ns#a5871> <http://example.org/ns#a5871> <http://example.org/ns#a5871> . +<http://example.org/ns#a5872> <http://example.org/ns#a5872> <http://example.org/ns#a5872> . +<http://example.org/ns#a5873> <http://example.org/ns#a5873> <http://example.org/ns#a5873> . +<http://example.org/ns#a5874> <http://example.org/ns#a5874> <http://example.org/ns#a5874> . +<http://example.org/ns#a5875> <http://example.org/ns#a5875> <http://example.org/ns#a5875> . +<http://example.org/ns#a5876> <http://example.org/ns#a5876> <http://example.org/ns#a5876> . +<http://example.org/ns#a5877> <http://example.org/ns#a5877> <http://example.org/ns#a5877> . +<http://example.org/ns#a5878> <http://example.org/ns#a5878> <http://example.org/ns#a5878> . +<http://example.org/ns#a5879> <http://example.org/ns#a5879> <http://example.org/ns#a5879> . +<http://example.org/ns#a5880> <http://example.org/ns#a5880> <http://example.org/ns#a5880> . +<http://example.org/ns#a5881> <http://example.org/ns#a5881> <http://example.org/ns#a5881> . +<http://example.org/ns#a5882> <http://example.org/ns#a5882> <http://example.org/ns#a5882> . +<http://example.org/ns#a5883> <http://example.org/ns#a5883> <http://example.org/ns#a5883> . +<http://example.org/ns#a5884> <http://example.org/ns#a5884> <http://example.org/ns#a5884> . +<http://example.org/ns#a5885> <http://example.org/ns#a5885> <http://example.org/ns#a5885> . +<http://example.org/ns#a5886> <http://example.org/ns#a5886> <http://example.org/ns#a5886> . +<http://example.org/ns#a5887> <http://example.org/ns#a5887> <http://example.org/ns#a5887> . +<http://example.org/ns#a5888> <http://example.org/ns#a5888> <http://example.org/ns#a5888> . +<http://example.org/ns#a5889> <http://example.org/ns#a5889> <http://example.org/ns#a5889> . +<http://example.org/ns#a5890> <http://example.org/ns#a5890> <http://example.org/ns#a5890> . +<http://example.org/ns#a5891> <http://example.org/ns#a5891> <http://example.org/ns#a5891> . +<http://example.org/ns#a5892> <http://example.org/ns#a5892> <http://example.org/ns#a5892> . +<http://example.org/ns#a5893> <http://example.org/ns#a5893> <http://example.org/ns#a5893> . +<http://example.org/ns#a5894> <http://example.org/ns#a5894> <http://example.org/ns#a5894> . +<http://example.org/ns#a5895> <http://example.org/ns#a5895> <http://example.org/ns#a5895> . +<http://example.org/ns#a5896> <http://example.org/ns#a5896> <http://example.org/ns#a5896> . +<http://example.org/ns#a5897> <http://example.org/ns#a5897> <http://example.org/ns#a5897> . +<http://example.org/ns#a5898> <http://example.org/ns#a5898> <http://example.org/ns#a5898> . +<http://example.org/ns#a5899> <http://example.org/ns#a5899> <http://example.org/ns#a5899> . +<http://example.org/ns#a5900> <http://example.org/ns#a5900> <http://example.org/ns#a5900> . +<http://example.org/ns#a5901> <http://example.org/ns#a5901> <http://example.org/ns#a5901> . +<http://example.org/ns#a5902> <http://example.org/ns#a5902> <http://example.org/ns#a5902> . +<http://example.org/ns#a5903> <http://example.org/ns#a5903> <http://example.org/ns#a5903> . +<http://example.org/ns#a5904> <http://example.org/ns#a5904> <http://example.org/ns#a5904> . +<http://example.org/ns#a5905> <http://example.org/ns#a5905> <http://example.org/ns#a5905> . +<http://example.org/ns#a5906> <http://example.org/ns#a5906> <http://example.org/ns#a5906> . +<http://example.org/ns#a5907> <http://example.org/ns#a5907> <http://example.org/ns#a5907> . +<http://example.org/ns#a5908> <http://example.org/ns#a5908> <http://example.org/ns#a5908> . +<http://example.org/ns#a5909> <http://example.org/ns#a5909> <http://example.org/ns#a5909> . +<http://example.org/ns#a5910> <http://example.org/ns#a5910> <http://example.org/ns#a5910> . +<http://example.org/ns#a5911> <http://example.org/ns#a5911> <http://example.org/ns#a5911> . +<http://example.org/ns#a5912> <http://example.org/ns#a5912> <http://example.org/ns#a5912> . +<http://example.org/ns#a5913> <http://example.org/ns#a5913> <http://example.org/ns#a5913> . +<http://example.org/ns#a5914> <http://example.org/ns#a5914> <http://example.org/ns#a5914> . +<http://example.org/ns#a5915> <http://example.org/ns#a5915> <http://example.org/ns#a5915> . +<http://example.org/ns#a5916> <http://example.org/ns#a5916> <http://example.org/ns#a5916> . +<http://example.org/ns#a5917> <http://example.org/ns#a5917> <http://example.org/ns#a5917> . +<http://example.org/ns#a5918> <http://example.org/ns#a5918> <http://example.org/ns#a5918> . +<http://example.org/ns#a5919> <http://example.org/ns#a5919> <http://example.org/ns#a5919> . +<http://example.org/ns#a5920> <http://example.org/ns#a5920> <http://example.org/ns#a5920> . +<http://example.org/ns#a5921> <http://example.org/ns#a5921> <http://example.org/ns#a5921> . +<http://example.org/ns#a5922> <http://example.org/ns#a5922> <http://example.org/ns#a5922> . +<http://example.org/ns#a5923> <http://example.org/ns#a5923> <http://example.org/ns#a5923> . +<http://example.org/ns#a5924> <http://example.org/ns#a5924> <http://example.org/ns#a5924> . +<http://example.org/ns#a5925> <http://example.org/ns#a5925> <http://example.org/ns#a5925> . +<http://example.org/ns#a5926> <http://example.org/ns#a5926> <http://example.org/ns#a5926> . +<http://example.org/ns#a5927> <http://example.org/ns#a5927> <http://example.org/ns#a5927> . +<http://example.org/ns#a5928> <http://example.org/ns#a5928> <http://example.org/ns#a5928> . +<http://example.org/ns#a5929> <http://example.org/ns#a5929> <http://example.org/ns#a5929> . +<http://example.org/ns#a5930> <http://example.org/ns#a5930> <http://example.org/ns#a5930> . +<http://example.org/ns#a5931> <http://example.org/ns#a5931> <http://example.org/ns#a5931> . +<http://example.org/ns#a5932> <http://example.org/ns#a5932> <http://example.org/ns#a5932> . +<http://example.org/ns#a5933> <http://example.org/ns#a5933> <http://example.org/ns#a5933> . +<http://example.org/ns#a5934> <http://example.org/ns#a5934> <http://example.org/ns#a5934> . +<http://example.org/ns#a5935> <http://example.org/ns#a5935> <http://example.org/ns#a5935> . +<http://example.org/ns#a5936> <http://example.org/ns#a5936> <http://example.org/ns#a5936> . +<http://example.org/ns#a5937> <http://example.org/ns#a5937> <http://example.org/ns#a5937> . +<http://example.org/ns#a5938> <http://example.org/ns#a5938> <http://example.org/ns#a5938> . +<http://example.org/ns#a5939> <http://example.org/ns#a5939> <http://example.org/ns#a5939> . +<http://example.org/ns#a5940> <http://example.org/ns#a5940> <http://example.org/ns#a5940> . +<http://example.org/ns#a5941> <http://example.org/ns#a5941> <http://example.org/ns#a5941> . +<http://example.org/ns#a5942> <http://example.org/ns#a5942> <http://example.org/ns#a5942> . +<http://example.org/ns#a5943> <http://example.org/ns#a5943> <http://example.org/ns#a5943> . +<http://example.org/ns#a5944> <http://example.org/ns#a5944> <http://example.org/ns#a5944> . +<http://example.org/ns#a5945> <http://example.org/ns#a5945> <http://example.org/ns#a5945> . +<http://example.org/ns#a5946> <http://example.org/ns#a5946> <http://example.org/ns#a5946> . +<http://example.org/ns#a5947> <http://example.org/ns#a5947> <http://example.org/ns#a5947> . +<http://example.org/ns#a5948> <http://example.org/ns#a5948> <http://example.org/ns#a5948> . +<http://example.org/ns#a5949> <http://example.org/ns#a5949> <http://example.org/ns#a5949> . +<http://example.org/ns#a5950> <http://example.org/ns#a5950> <http://example.org/ns#a5950> . +<http://example.org/ns#a5951> <http://example.org/ns#a5951> <http://example.org/ns#a5951> . +<http://example.org/ns#a5952> <http://example.org/ns#a5952> <http://example.org/ns#a5952> . +<http://example.org/ns#a5953> <http://example.org/ns#a5953> <http://example.org/ns#a5953> . +<http://example.org/ns#a5954> <http://example.org/ns#a5954> <http://example.org/ns#a5954> . +<http://example.org/ns#a5955> <http://example.org/ns#a5955> <http://example.org/ns#a5955> . +<http://example.org/ns#a5956> <http://example.org/ns#a5956> <http://example.org/ns#a5956> . +<http://example.org/ns#a5957> <http://example.org/ns#a5957> <http://example.org/ns#a5957> . +<http://example.org/ns#a5958> <http://example.org/ns#a5958> <http://example.org/ns#a5958> . +<http://example.org/ns#a5959> <http://example.org/ns#a5959> <http://example.org/ns#a5959> . +<http://example.org/ns#a5960> <http://example.org/ns#a5960> <http://example.org/ns#a5960> . +<http://example.org/ns#a5961> <http://example.org/ns#a5961> <http://example.org/ns#a5961> . +<http://example.org/ns#a5962> <http://example.org/ns#a5962> <http://example.org/ns#a5962> . +<http://example.org/ns#a5963> <http://example.org/ns#a5963> <http://example.org/ns#a5963> . +<http://example.org/ns#a5964> <http://example.org/ns#a5964> <http://example.org/ns#a5964> . +<http://example.org/ns#a5965> <http://example.org/ns#a5965> <http://example.org/ns#a5965> . +<http://example.org/ns#a5966> <http://example.org/ns#a5966> <http://example.org/ns#a5966> . +<http://example.org/ns#a5967> <http://example.org/ns#a5967> <http://example.org/ns#a5967> . +<http://example.org/ns#a5968> <http://example.org/ns#a5968> <http://example.org/ns#a5968> . +<http://example.org/ns#a5969> <http://example.org/ns#a5969> <http://example.org/ns#a5969> . +<http://example.org/ns#a5970> <http://example.org/ns#a5970> <http://example.org/ns#a5970> . +<http://example.org/ns#a5971> <http://example.org/ns#a5971> <http://example.org/ns#a5971> . +<http://example.org/ns#a5972> <http://example.org/ns#a5972> <http://example.org/ns#a5972> . +<http://example.org/ns#a5973> <http://example.org/ns#a5973> <http://example.org/ns#a5973> . +<http://example.org/ns#a5974> <http://example.org/ns#a5974> <http://example.org/ns#a5974> . +<http://example.org/ns#a5975> <http://example.org/ns#a5975> <http://example.org/ns#a5975> . +<http://example.org/ns#a5976> <http://example.org/ns#a5976> <http://example.org/ns#a5976> . +<http://example.org/ns#a5977> <http://example.org/ns#a5977> <http://example.org/ns#a5977> . +<http://example.org/ns#a5978> <http://example.org/ns#a5978> <http://example.org/ns#a5978> . +<http://example.org/ns#a5979> <http://example.org/ns#a5979> <http://example.org/ns#a5979> . +<http://example.org/ns#a5980> <http://example.org/ns#a5980> <http://example.org/ns#a5980> . +<http://example.org/ns#a5981> <http://example.org/ns#a5981> <http://example.org/ns#a5981> . +<http://example.org/ns#a5982> <http://example.org/ns#a5982> <http://example.org/ns#a5982> . +<http://example.org/ns#a5983> <http://example.org/ns#a5983> <http://example.org/ns#a5983> . +<http://example.org/ns#a5984> <http://example.org/ns#a5984> <http://example.org/ns#a5984> . +<http://example.org/ns#a5985> <http://example.org/ns#a5985> <http://example.org/ns#a5985> . +<http://example.org/ns#a5986> <http://example.org/ns#a5986> <http://example.org/ns#a5986> . +<http://example.org/ns#a5987> <http://example.org/ns#a5987> <http://example.org/ns#a5987> . +<http://example.org/ns#a5988> <http://example.org/ns#a5988> <http://example.org/ns#a5988> . +<http://example.org/ns#a5989> <http://example.org/ns#a5989> <http://example.org/ns#a5989> . +<http://example.org/ns#a5990> <http://example.org/ns#a5990> <http://example.org/ns#a5990> . +<http://example.org/ns#a5991> <http://example.org/ns#a5991> <http://example.org/ns#a5991> . +<http://example.org/ns#a5992> <http://example.org/ns#a5992> <http://example.org/ns#a5992> . +<http://example.org/ns#a5993> <http://example.org/ns#a5993> <http://example.org/ns#a5993> . +<http://example.org/ns#a5994> <http://example.org/ns#a5994> <http://example.org/ns#a5994> . +<http://example.org/ns#a5995> <http://example.org/ns#a5995> <http://example.org/ns#a5995> . +<http://example.org/ns#a5996> <http://example.org/ns#a5996> <http://example.org/ns#a5996> . +<http://example.org/ns#a5997> <http://example.org/ns#a5997> <http://example.org/ns#a5997> . +<http://example.org/ns#a5998> <http://example.org/ns#a5998> <http://example.org/ns#a5998> . +<http://example.org/ns#a5999> <http://example.org/ns#a5999> <http://example.org/ns#a5999> . +<http://example.org/ns#a6000> <http://example.org/ns#a6000> <http://example.org/ns#a6000> . +<http://example.org/ns#a6001> <http://example.org/ns#a6001> <http://example.org/ns#a6001> . +<http://example.org/ns#a6002> <http://example.org/ns#a6002> <http://example.org/ns#a6002> . +<http://example.org/ns#a6003> <http://example.org/ns#a6003> <http://example.org/ns#a6003> . +<http://example.org/ns#a6004> <http://example.org/ns#a6004> <http://example.org/ns#a6004> . +<http://example.org/ns#a6005> <http://example.org/ns#a6005> <http://example.org/ns#a6005> . +<http://example.org/ns#a6006> <http://example.org/ns#a6006> <http://example.org/ns#a6006> . +<http://example.org/ns#a6007> <http://example.org/ns#a6007> <http://example.org/ns#a6007> . +<http://example.org/ns#a6008> <http://example.org/ns#a6008> <http://example.org/ns#a6008> . +<http://example.org/ns#a6009> <http://example.org/ns#a6009> <http://example.org/ns#a6009> . +<http://example.org/ns#a6010> <http://example.org/ns#a6010> <http://example.org/ns#a6010> . +<http://example.org/ns#a6011> <http://example.org/ns#a6011> <http://example.org/ns#a6011> . +<http://example.org/ns#a6012> <http://example.org/ns#a6012> <http://example.org/ns#a6012> . +<http://example.org/ns#a6013> <http://example.org/ns#a6013> <http://example.org/ns#a6013> . +<http://example.org/ns#a6014> <http://example.org/ns#a6014> <http://example.org/ns#a6014> . +<http://example.org/ns#a6015> <http://example.org/ns#a6015> <http://example.org/ns#a6015> . +<http://example.org/ns#a6016> <http://example.org/ns#a6016> <http://example.org/ns#a6016> . +<http://example.org/ns#a6017> <http://example.org/ns#a6017> <http://example.org/ns#a6017> . +<http://example.org/ns#a6018> <http://example.org/ns#a6018> <http://example.org/ns#a6018> . +<http://example.org/ns#a6019> <http://example.org/ns#a6019> <http://example.org/ns#a6019> . +<http://example.org/ns#a6020> <http://example.org/ns#a6020> <http://example.org/ns#a6020> . +<http://example.org/ns#a6021> <http://example.org/ns#a6021> <http://example.org/ns#a6021> . +<http://example.org/ns#a6022> <http://example.org/ns#a6022> <http://example.org/ns#a6022> . +<http://example.org/ns#a6023> <http://example.org/ns#a6023> <http://example.org/ns#a6023> . +<http://example.org/ns#a6024> <http://example.org/ns#a6024> <http://example.org/ns#a6024> . +<http://example.org/ns#a6025> <http://example.org/ns#a6025> <http://example.org/ns#a6025> . +<http://example.org/ns#a6026> <http://example.org/ns#a6026> <http://example.org/ns#a6026> . +<http://example.org/ns#a6027> <http://example.org/ns#a6027> <http://example.org/ns#a6027> . +<http://example.org/ns#a6028> <http://example.org/ns#a6028> <http://example.org/ns#a6028> . +<http://example.org/ns#a6029> <http://example.org/ns#a6029> <http://example.org/ns#a6029> . +<http://example.org/ns#a6030> <http://example.org/ns#a6030> <http://example.org/ns#a6030> . +<http://example.org/ns#a6031> <http://example.org/ns#a6031> <http://example.org/ns#a6031> . +<http://example.org/ns#a6032> <http://example.org/ns#a6032> <http://example.org/ns#a6032> . +<http://example.org/ns#a6033> <http://example.org/ns#a6033> <http://example.org/ns#a6033> . +<http://example.org/ns#a6034> <http://example.org/ns#a6034> <http://example.org/ns#a6034> . +<http://example.org/ns#a6035> <http://example.org/ns#a6035> <http://example.org/ns#a6035> . +<http://example.org/ns#a6036> <http://example.org/ns#a6036> <http://example.org/ns#a6036> . +<http://example.org/ns#a6037> <http://example.org/ns#a6037> <http://example.org/ns#a6037> . +<http://example.org/ns#a6038> <http://example.org/ns#a6038> <http://example.org/ns#a6038> . +<http://example.org/ns#a6039> <http://example.org/ns#a6039> <http://example.org/ns#a6039> . +<http://example.org/ns#a6040> <http://example.org/ns#a6040> <http://example.org/ns#a6040> . +<http://example.org/ns#a6041> <http://example.org/ns#a6041> <http://example.org/ns#a6041> . +<http://example.org/ns#a6042> <http://example.org/ns#a6042> <http://example.org/ns#a6042> . +<http://example.org/ns#a6043> <http://example.org/ns#a6043> <http://example.org/ns#a6043> . +<http://example.org/ns#a6044> <http://example.org/ns#a6044> <http://example.org/ns#a6044> . +<http://example.org/ns#a6045> <http://example.org/ns#a6045> <http://example.org/ns#a6045> . +<http://example.org/ns#a6046> <http://example.org/ns#a6046> <http://example.org/ns#a6046> . +<http://example.org/ns#a6047> <http://example.org/ns#a6047> <http://example.org/ns#a6047> . +<http://example.org/ns#a6048> <http://example.org/ns#a6048> <http://example.org/ns#a6048> . +<http://example.org/ns#a6049> <http://example.org/ns#a6049> <http://example.org/ns#a6049> . +<http://example.org/ns#a6050> <http://example.org/ns#a6050> <http://example.org/ns#a6050> . +<http://example.org/ns#a6051> <http://example.org/ns#a6051> <http://example.org/ns#a6051> . +<http://example.org/ns#a6052> <http://example.org/ns#a6052> <http://example.org/ns#a6052> . +<http://example.org/ns#a6053> <http://example.org/ns#a6053> <http://example.org/ns#a6053> . +<http://example.org/ns#a6054> <http://example.org/ns#a6054> <http://example.org/ns#a6054> . +<http://example.org/ns#a6055> <http://example.org/ns#a6055> <http://example.org/ns#a6055> . +<http://example.org/ns#a6056> <http://example.org/ns#a6056> <http://example.org/ns#a6056> . +<http://example.org/ns#a6057> <http://example.org/ns#a6057> <http://example.org/ns#a6057> . +<http://example.org/ns#a6058> <http://example.org/ns#a6058> <http://example.org/ns#a6058> . +<http://example.org/ns#a6059> <http://example.org/ns#a6059> <http://example.org/ns#a6059> . +<http://example.org/ns#a6060> <http://example.org/ns#a6060> <http://example.org/ns#a6060> . +<http://example.org/ns#a6061> <http://example.org/ns#a6061> <http://example.org/ns#a6061> . +<http://example.org/ns#a6062> <http://example.org/ns#a6062> <http://example.org/ns#a6062> . +<http://example.org/ns#a6063> <http://example.org/ns#a6063> <http://example.org/ns#a6063> . +<http://example.org/ns#a6064> <http://example.org/ns#a6064> <http://example.org/ns#a6064> . +<http://example.org/ns#a6065> <http://example.org/ns#a6065> <http://example.org/ns#a6065> . +<http://example.org/ns#a6066> <http://example.org/ns#a6066> <http://example.org/ns#a6066> . +<http://example.org/ns#a6067> <http://example.org/ns#a6067> <http://example.org/ns#a6067> . +<http://example.org/ns#a6068> <http://example.org/ns#a6068> <http://example.org/ns#a6068> . +<http://example.org/ns#a6069> <http://example.org/ns#a6069> <http://example.org/ns#a6069> . +<http://example.org/ns#a6070> <http://example.org/ns#a6070> <http://example.org/ns#a6070> . +<http://example.org/ns#a6071> <http://example.org/ns#a6071> <http://example.org/ns#a6071> . +<http://example.org/ns#a6072> <http://example.org/ns#a6072> <http://example.org/ns#a6072> . +<http://example.org/ns#a6073> <http://example.org/ns#a6073> <http://example.org/ns#a6073> . +<http://example.org/ns#a6074> <http://example.org/ns#a6074> <http://example.org/ns#a6074> . +<http://example.org/ns#a6075> <http://example.org/ns#a6075> <http://example.org/ns#a6075> . +<http://example.org/ns#a6076> <http://example.org/ns#a6076> <http://example.org/ns#a6076> . +<http://example.org/ns#a6077> <http://example.org/ns#a6077> <http://example.org/ns#a6077> . +<http://example.org/ns#a6078> <http://example.org/ns#a6078> <http://example.org/ns#a6078> . +<http://example.org/ns#a6079> <http://example.org/ns#a6079> <http://example.org/ns#a6079> . +<http://example.org/ns#a6080> <http://example.org/ns#a6080> <http://example.org/ns#a6080> . +<http://example.org/ns#a6081> <http://example.org/ns#a6081> <http://example.org/ns#a6081> . +<http://example.org/ns#a6082> <http://example.org/ns#a6082> <http://example.org/ns#a6082> . +<http://example.org/ns#a6083> <http://example.org/ns#a6083> <http://example.org/ns#a6083> . +<http://example.org/ns#a6084> <http://example.org/ns#a6084> <http://example.org/ns#a6084> . +<http://example.org/ns#a6085> <http://example.org/ns#a6085> <http://example.org/ns#a6085> . +<http://example.org/ns#a6086> <http://example.org/ns#a6086> <http://example.org/ns#a6086> . +<http://example.org/ns#a6087> <http://example.org/ns#a6087> <http://example.org/ns#a6087> . +<http://example.org/ns#a6088> <http://example.org/ns#a6088> <http://example.org/ns#a6088> . +<http://example.org/ns#a6089> <http://example.org/ns#a6089> <http://example.org/ns#a6089> . +<http://example.org/ns#a6090> <http://example.org/ns#a6090> <http://example.org/ns#a6090> . +<http://example.org/ns#a6091> <http://example.org/ns#a6091> <http://example.org/ns#a6091> . +<http://example.org/ns#a6092> <http://example.org/ns#a6092> <http://example.org/ns#a6092> . +<http://example.org/ns#a6093> <http://example.org/ns#a6093> <http://example.org/ns#a6093> . +<http://example.org/ns#a6094> <http://example.org/ns#a6094> <http://example.org/ns#a6094> . +<http://example.org/ns#a6095> <http://example.org/ns#a6095> <http://example.org/ns#a6095> . +<http://example.org/ns#a6096> <http://example.org/ns#a6096> <http://example.org/ns#a6096> . +<http://example.org/ns#a6097> <http://example.org/ns#a6097> <http://example.org/ns#a6097> . +<http://example.org/ns#a6098> <http://example.org/ns#a6098> <http://example.org/ns#a6098> . +<http://example.org/ns#a6099> <http://example.org/ns#a6099> <http://example.org/ns#a6099> . +<http://example.org/ns#a6100> <http://example.org/ns#a6100> <http://example.org/ns#a6100> . +<http://example.org/ns#a6101> <http://example.org/ns#a6101> <http://example.org/ns#a6101> . +<http://example.org/ns#a6102> <http://example.org/ns#a6102> <http://example.org/ns#a6102> . +<http://example.org/ns#a6103> <http://example.org/ns#a6103> <http://example.org/ns#a6103> . +<http://example.org/ns#a6104> <http://example.org/ns#a6104> <http://example.org/ns#a6104> . +<http://example.org/ns#a6105> <http://example.org/ns#a6105> <http://example.org/ns#a6105> . +<http://example.org/ns#a6106> <http://example.org/ns#a6106> <http://example.org/ns#a6106> . +<http://example.org/ns#a6107> <http://example.org/ns#a6107> <http://example.org/ns#a6107> . +<http://example.org/ns#a6108> <http://example.org/ns#a6108> <http://example.org/ns#a6108> . +<http://example.org/ns#a6109> <http://example.org/ns#a6109> <http://example.org/ns#a6109> . +<http://example.org/ns#a6110> <http://example.org/ns#a6110> <http://example.org/ns#a6110> . +<http://example.org/ns#a6111> <http://example.org/ns#a6111> <http://example.org/ns#a6111> . +<http://example.org/ns#a6112> <http://example.org/ns#a6112> <http://example.org/ns#a6112> . +<http://example.org/ns#a6113> <http://example.org/ns#a6113> <http://example.org/ns#a6113> . +<http://example.org/ns#a6114> <http://example.org/ns#a6114> <http://example.org/ns#a6114> . +<http://example.org/ns#a6115> <http://example.org/ns#a6115> <http://example.org/ns#a6115> . +<http://example.org/ns#a6116> <http://example.org/ns#a6116> <http://example.org/ns#a6116> . +<http://example.org/ns#a6117> <http://example.org/ns#a6117> <http://example.org/ns#a6117> . +<http://example.org/ns#a6118> <http://example.org/ns#a6118> <http://example.org/ns#a6118> . +<http://example.org/ns#a6119> <http://example.org/ns#a6119> <http://example.org/ns#a6119> . +<http://example.org/ns#a6120> <http://example.org/ns#a6120> <http://example.org/ns#a6120> . +<http://example.org/ns#a6121> <http://example.org/ns#a6121> <http://example.org/ns#a6121> . +<http://example.org/ns#a6122> <http://example.org/ns#a6122> <http://example.org/ns#a6122> . +<http://example.org/ns#a6123> <http://example.org/ns#a6123> <http://example.org/ns#a6123> . +<http://example.org/ns#a6124> <http://example.org/ns#a6124> <http://example.org/ns#a6124> . +<http://example.org/ns#a6125> <http://example.org/ns#a6125> <http://example.org/ns#a6125> . +<http://example.org/ns#a6126> <http://example.org/ns#a6126> <http://example.org/ns#a6126> . +<http://example.org/ns#a6127> <http://example.org/ns#a6127> <http://example.org/ns#a6127> . +<http://example.org/ns#a6128> <http://example.org/ns#a6128> <http://example.org/ns#a6128> . +<http://example.org/ns#a6129> <http://example.org/ns#a6129> <http://example.org/ns#a6129> . +<http://example.org/ns#a6130> <http://example.org/ns#a6130> <http://example.org/ns#a6130> . +<http://example.org/ns#a6131> <http://example.org/ns#a6131> <http://example.org/ns#a6131> . +<http://example.org/ns#a6132> <http://example.org/ns#a6132> <http://example.org/ns#a6132> . +<http://example.org/ns#a6133> <http://example.org/ns#a6133> <http://example.org/ns#a6133> . +<http://example.org/ns#a6134> <http://example.org/ns#a6134> <http://example.org/ns#a6134> . +<http://example.org/ns#a6135> <http://example.org/ns#a6135> <http://example.org/ns#a6135> . +<http://example.org/ns#a6136> <http://example.org/ns#a6136> <http://example.org/ns#a6136> . +<http://example.org/ns#a6137> <http://example.org/ns#a6137> <http://example.org/ns#a6137> . +<http://example.org/ns#a6138> <http://example.org/ns#a6138> <http://example.org/ns#a6138> . +<http://example.org/ns#a6139> <http://example.org/ns#a6139> <http://example.org/ns#a6139> . +<http://example.org/ns#a6140> <http://example.org/ns#a6140> <http://example.org/ns#a6140> . +<http://example.org/ns#a6141> <http://example.org/ns#a6141> <http://example.org/ns#a6141> . +<http://example.org/ns#a6142> <http://example.org/ns#a6142> <http://example.org/ns#a6142> . +<http://example.org/ns#a6143> <http://example.org/ns#a6143> <http://example.org/ns#a6143> . +<http://example.org/ns#a6144> <http://example.org/ns#a6144> <http://example.org/ns#a6144> . +<http://example.org/ns#a6145> <http://example.org/ns#a6145> <http://example.org/ns#a6145> . +<http://example.org/ns#a6146> <http://example.org/ns#a6146> <http://example.org/ns#a6146> . +<http://example.org/ns#a6147> <http://example.org/ns#a6147> <http://example.org/ns#a6147> . +<http://example.org/ns#a6148> <http://example.org/ns#a6148> <http://example.org/ns#a6148> . +<http://example.org/ns#a6149> <http://example.org/ns#a6149> <http://example.org/ns#a6149> . +<http://example.org/ns#a6150> <http://example.org/ns#a6150> <http://example.org/ns#a6150> . +<http://example.org/ns#a6151> <http://example.org/ns#a6151> <http://example.org/ns#a6151> . +<http://example.org/ns#a6152> <http://example.org/ns#a6152> <http://example.org/ns#a6152> . +<http://example.org/ns#a6153> <http://example.org/ns#a6153> <http://example.org/ns#a6153> . +<http://example.org/ns#a6154> <http://example.org/ns#a6154> <http://example.org/ns#a6154> . +<http://example.org/ns#a6155> <http://example.org/ns#a6155> <http://example.org/ns#a6155> . +<http://example.org/ns#a6156> <http://example.org/ns#a6156> <http://example.org/ns#a6156> . +<http://example.org/ns#a6157> <http://example.org/ns#a6157> <http://example.org/ns#a6157> . +<http://example.org/ns#a6158> <http://example.org/ns#a6158> <http://example.org/ns#a6158> . +<http://example.org/ns#a6159> <http://example.org/ns#a6159> <http://example.org/ns#a6159> . +<http://example.org/ns#a6160> <http://example.org/ns#a6160> <http://example.org/ns#a6160> . +<http://example.org/ns#a6161> <http://example.org/ns#a6161> <http://example.org/ns#a6161> . +<http://example.org/ns#a6162> <http://example.org/ns#a6162> <http://example.org/ns#a6162> . +<http://example.org/ns#a6163> <http://example.org/ns#a6163> <http://example.org/ns#a6163> . +<http://example.org/ns#a6164> <http://example.org/ns#a6164> <http://example.org/ns#a6164> . +<http://example.org/ns#a6165> <http://example.org/ns#a6165> <http://example.org/ns#a6165> . +<http://example.org/ns#a6166> <http://example.org/ns#a6166> <http://example.org/ns#a6166> . +<http://example.org/ns#a6167> <http://example.org/ns#a6167> <http://example.org/ns#a6167> . +<http://example.org/ns#a6168> <http://example.org/ns#a6168> <http://example.org/ns#a6168> . +<http://example.org/ns#a6169> <http://example.org/ns#a6169> <http://example.org/ns#a6169> . +<http://example.org/ns#a6170> <http://example.org/ns#a6170> <http://example.org/ns#a6170> . +<http://example.org/ns#a6171> <http://example.org/ns#a6171> <http://example.org/ns#a6171> . +<http://example.org/ns#a6172> <http://example.org/ns#a6172> <http://example.org/ns#a6172> . +<http://example.org/ns#a6173> <http://example.org/ns#a6173> <http://example.org/ns#a6173> . +<http://example.org/ns#a6174> <http://example.org/ns#a6174> <http://example.org/ns#a6174> . +<http://example.org/ns#a6175> <http://example.org/ns#a6175> <http://example.org/ns#a6175> . +<http://example.org/ns#a6176> <http://example.org/ns#a6176> <http://example.org/ns#a6176> . +<http://example.org/ns#a6177> <http://example.org/ns#a6177> <http://example.org/ns#a6177> . +<http://example.org/ns#a6178> <http://example.org/ns#a6178> <http://example.org/ns#a6178> . +<http://example.org/ns#a6179> <http://example.org/ns#a6179> <http://example.org/ns#a6179> . +<http://example.org/ns#a6180> <http://example.org/ns#a6180> <http://example.org/ns#a6180> . +<http://example.org/ns#a6181> <http://example.org/ns#a6181> <http://example.org/ns#a6181> . +<http://example.org/ns#a6182> <http://example.org/ns#a6182> <http://example.org/ns#a6182> . +<http://example.org/ns#a6183> <http://example.org/ns#a6183> <http://example.org/ns#a6183> . +<http://example.org/ns#a6184> <http://example.org/ns#a6184> <http://example.org/ns#a6184> . +<http://example.org/ns#a6185> <http://example.org/ns#a6185> <http://example.org/ns#a6185> . +<http://example.org/ns#a6186> <http://example.org/ns#a6186> <http://example.org/ns#a6186> . +<http://example.org/ns#a6187> <http://example.org/ns#a6187> <http://example.org/ns#a6187> . +<http://example.org/ns#a6188> <http://example.org/ns#a6188> <http://example.org/ns#a6188> . +<http://example.org/ns#a6189> <http://example.org/ns#a6189> <http://example.org/ns#a6189> . +<http://example.org/ns#a6190> <http://example.org/ns#a6190> <http://example.org/ns#a6190> . +<http://example.org/ns#a6191> <http://example.org/ns#a6191> <http://example.org/ns#a6191> . +<http://example.org/ns#a6192> <http://example.org/ns#a6192> <http://example.org/ns#a6192> . +<http://example.org/ns#a6193> <http://example.org/ns#a6193> <http://example.org/ns#a6193> . +<http://example.org/ns#a6194> <http://example.org/ns#a6194> <http://example.org/ns#a6194> . +<http://example.org/ns#a6195> <http://example.org/ns#a6195> <http://example.org/ns#a6195> . +<http://example.org/ns#a6196> <http://example.org/ns#a6196> <http://example.org/ns#a6196> . +<http://example.org/ns#a6197> <http://example.org/ns#a6197> <http://example.org/ns#a6197> . +<http://example.org/ns#a6198> <http://example.org/ns#a6198> <http://example.org/ns#a6198> . +<http://example.org/ns#a6199> <http://example.org/ns#a6199> <http://example.org/ns#a6199> . +<http://example.org/ns#a6200> <http://example.org/ns#a6200> <http://example.org/ns#a6200> . +<http://example.org/ns#a6201> <http://example.org/ns#a6201> <http://example.org/ns#a6201> . +<http://example.org/ns#a6202> <http://example.org/ns#a6202> <http://example.org/ns#a6202> . +<http://example.org/ns#a6203> <http://example.org/ns#a6203> <http://example.org/ns#a6203> . +<http://example.org/ns#a6204> <http://example.org/ns#a6204> <http://example.org/ns#a6204> . +<http://example.org/ns#a6205> <http://example.org/ns#a6205> <http://example.org/ns#a6205> . +<http://example.org/ns#a6206> <http://example.org/ns#a6206> <http://example.org/ns#a6206> . +<http://example.org/ns#a6207> <http://example.org/ns#a6207> <http://example.org/ns#a6207> . +<http://example.org/ns#a6208> <http://example.org/ns#a6208> <http://example.org/ns#a6208> . +<http://example.org/ns#a6209> <http://example.org/ns#a6209> <http://example.org/ns#a6209> . +<http://example.org/ns#a6210> <http://example.org/ns#a6210> <http://example.org/ns#a6210> . +<http://example.org/ns#a6211> <http://example.org/ns#a6211> <http://example.org/ns#a6211> . +<http://example.org/ns#a6212> <http://example.org/ns#a6212> <http://example.org/ns#a6212> . +<http://example.org/ns#a6213> <http://example.org/ns#a6213> <http://example.org/ns#a6213> . +<http://example.org/ns#a6214> <http://example.org/ns#a6214> <http://example.org/ns#a6214> . +<http://example.org/ns#a6215> <http://example.org/ns#a6215> <http://example.org/ns#a6215> . +<http://example.org/ns#a6216> <http://example.org/ns#a6216> <http://example.org/ns#a6216> . +<http://example.org/ns#a6217> <http://example.org/ns#a6217> <http://example.org/ns#a6217> . +<http://example.org/ns#a6218> <http://example.org/ns#a6218> <http://example.org/ns#a6218> . +<http://example.org/ns#a6219> <http://example.org/ns#a6219> <http://example.org/ns#a6219> . +<http://example.org/ns#a6220> <http://example.org/ns#a6220> <http://example.org/ns#a6220> . +<http://example.org/ns#a6221> <http://example.org/ns#a6221> <http://example.org/ns#a6221> . +<http://example.org/ns#a6222> <http://example.org/ns#a6222> <http://example.org/ns#a6222> . +<http://example.org/ns#a6223> <http://example.org/ns#a6223> <http://example.org/ns#a6223> . +<http://example.org/ns#a6224> <http://example.org/ns#a6224> <http://example.org/ns#a6224> . +<http://example.org/ns#a6225> <http://example.org/ns#a6225> <http://example.org/ns#a6225> . +<http://example.org/ns#a6226> <http://example.org/ns#a6226> <http://example.org/ns#a6226> . +<http://example.org/ns#a6227> <http://example.org/ns#a6227> <http://example.org/ns#a6227> . +<http://example.org/ns#a6228> <http://example.org/ns#a6228> <http://example.org/ns#a6228> . +<http://example.org/ns#a6229> <http://example.org/ns#a6229> <http://example.org/ns#a6229> . +<http://example.org/ns#a6230> <http://example.org/ns#a6230> <http://example.org/ns#a6230> . +<http://example.org/ns#a6231> <http://example.org/ns#a6231> <http://example.org/ns#a6231> . +<http://example.org/ns#a6232> <http://example.org/ns#a6232> <http://example.org/ns#a6232> . +<http://example.org/ns#a6233> <http://example.org/ns#a6233> <http://example.org/ns#a6233> . +<http://example.org/ns#a6234> <http://example.org/ns#a6234> <http://example.org/ns#a6234> . +<http://example.org/ns#a6235> <http://example.org/ns#a6235> <http://example.org/ns#a6235> . +<http://example.org/ns#a6236> <http://example.org/ns#a6236> <http://example.org/ns#a6236> . +<http://example.org/ns#a6237> <http://example.org/ns#a6237> <http://example.org/ns#a6237> . +<http://example.org/ns#a6238> <http://example.org/ns#a6238> <http://example.org/ns#a6238> . +<http://example.org/ns#a6239> <http://example.org/ns#a6239> <http://example.org/ns#a6239> . +<http://example.org/ns#a6240> <http://example.org/ns#a6240> <http://example.org/ns#a6240> . +<http://example.org/ns#a6241> <http://example.org/ns#a6241> <http://example.org/ns#a6241> . +<http://example.org/ns#a6242> <http://example.org/ns#a6242> <http://example.org/ns#a6242> . +<http://example.org/ns#a6243> <http://example.org/ns#a6243> <http://example.org/ns#a6243> . +<http://example.org/ns#a6244> <http://example.org/ns#a6244> <http://example.org/ns#a6244> . +<http://example.org/ns#a6245> <http://example.org/ns#a6245> <http://example.org/ns#a6245> . +<http://example.org/ns#a6246> <http://example.org/ns#a6246> <http://example.org/ns#a6246> . +<http://example.org/ns#a6247> <http://example.org/ns#a6247> <http://example.org/ns#a6247> . +<http://example.org/ns#a6248> <http://example.org/ns#a6248> <http://example.org/ns#a6248> . +<http://example.org/ns#a6249> <http://example.org/ns#a6249> <http://example.org/ns#a6249> . +<http://example.org/ns#a6250> <http://example.org/ns#a6250> <http://example.org/ns#a6250> . +<http://example.org/ns#a6251> <http://example.org/ns#a6251> <http://example.org/ns#a6251> . +<http://example.org/ns#a6252> <http://example.org/ns#a6252> <http://example.org/ns#a6252> . +<http://example.org/ns#a6253> <http://example.org/ns#a6253> <http://example.org/ns#a6253> . +<http://example.org/ns#a6254> <http://example.org/ns#a6254> <http://example.org/ns#a6254> . +<http://example.org/ns#a6255> <http://example.org/ns#a6255> <http://example.org/ns#a6255> . +<http://example.org/ns#a6256> <http://example.org/ns#a6256> <http://example.org/ns#a6256> . +<http://example.org/ns#a6257> <http://example.org/ns#a6257> <http://example.org/ns#a6257> . +<http://example.org/ns#a6258> <http://example.org/ns#a6258> <http://example.org/ns#a6258> . +<http://example.org/ns#a6259> <http://example.org/ns#a6259> <http://example.org/ns#a6259> . +<http://example.org/ns#a6260> <http://example.org/ns#a6260> <http://example.org/ns#a6260> . +<http://example.org/ns#a6261> <http://example.org/ns#a6261> <http://example.org/ns#a6261> . +<http://example.org/ns#a6262> <http://example.org/ns#a6262> <http://example.org/ns#a6262> . +<http://example.org/ns#a6263> <http://example.org/ns#a6263> <http://example.org/ns#a6263> . +<http://example.org/ns#a6264> <http://example.org/ns#a6264> <http://example.org/ns#a6264> . +<http://example.org/ns#a6265> <http://example.org/ns#a6265> <http://example.org/ns#a6265> . +<http://example.org/ns#a6266> <http://example.org/ns#a6266> <http://example.org/ns#a6266> . +<http://example.org/ns#a6267> <http://example.org/ns#a6267> <http://example.org/ns#a6267> . +<http://example.org/ns#a6268> <http://example.org/ns#a6268> <http://example.org/ns#a6268> . +<http://example.org/ns#a6269> <http://example.org/ns#a6269> <http://example.org/ns#a6269> . +<http://example.org/ns#a6270> <http://example.org/ns#a6270> <http://example.org/ns#a6270> . +<http://example.org/ns#a6271> <http://example.org/ns#a6271> <http://example.org/ns#a6271> . +<http://example.org/ns#a6272> <http://example.org/ns#a6272> <http://example.org/ns#a6272> . +<http://example.org/ns#a6273> <http://example.org/ns#a6273> <http://example.org/ns#a6273> . +<http://example.org/ns#a6274> <http://example.org/ns#a6274> <http://example.org/ns#a6274> . +<http://example.org/ns#a6275> <http://example.org/ns#a6275> <http://example.org/ns#a6275> . +<http://example.org/ns#a6276> <http://example.org/ns#a6276> <http://example.org/ns#a6276> . +<http://example.org/ns#a6277> <http://example.org/ns#a6277> <http://example.org/ns#a6277> . +<http://example.org/ns#a6278> <http://example.org/ns#a6278> <http://example.org/ns#a6278> . +<http://example.org/ns#a6279> <http://example.org/ns#a6279> <http://example.org/ns#a6279> . +<http://example.org/ns#a6280> <http://example.org/ns#a6280> <http://example.org/ns#a6280> . +<http://example.org/ns#a6281> <http://example.org/ns#a6281> <http://example.org/ns#a6281> . +<http://example.org/ns#a6282> <http://example.org/ns#a6282> <http://example.org/ns#a6282> . +<http://example.org/ns#a6283> <http://example.org/ns#a6283> <http://example.org/ns#a6283> . +<http://example.org/ns#a6284> <http://example.org/ns#a6284> <http://example.org/ns#a6284> . +<http://example.org/ns#a6285> <http://example.org/ns#a6285> <http://example.org/ns#a6285> . +<http://example.org/ns#a6286> <http://example.org/ns#a6286> <http://example.org/ns#a6286> . +<http://example.org/ns#a6287> <http://example.org/ns#a6287> <http://example.org/ns#a6287> . +<http://example.org/ns#a6288> <http://example.org/ns#a6288> <http://example.org/ns#a6288> . +<http://example.org/ns#a6289> <http://example.org/ns#a6289> <http://example.org/ns#a6289> . +<http://example.org/ns#a6290> <http://example.org/ns#a6290> <http://example.org/ns#a6290> . +<http://example.org/ns#a6291> <http://example.org/ns#a6291> <http://example.org/ns#a6291> . +<http://example.org/ns#a6292> <http://example.org/ns#a6292> <http://example.org/ns#a6292> . +<http://example.org/ns#a6293> <http://example.org/ns#a6293> <http://example.org/ns#a6293> . +<http://example.org/ns#a6294> <http://example.org/ns#a6294> <http://example.org/ns#a6294> . +<http://example.org/ns#a6295> <http://example.org/ns#a6295> <http://example.org/ns#a6295> . +<http://example.org/ns#a6296> <http://example.org/ns#a6296> <http://example.org/ns#a6296> . +<http://example.org/ns#a6297> <http://example.org/ns#a6297> <http://example.org/ns#a6297> . +<http://example.org/ns#a6298> <http://example.org/ns#a6298> <http://example.org/ns#a6298> . +<http://example.org/ns#a6299> <http://example.org/ns#a6299> <http://example.org/ns#a6299> . +<http://example.org/ns#a6300> <http://example.org/ns#a6300> <http://example.org/ns#a6300> . +<http://example.org/ns#a6301> <http://example.org/ns#a6301> <http://example.org/ns#a6301> . +<http://example.org/ns#a6302> <http://example.org/ns#a6302> <http://example.org/ns#a6302> . +<http://example.org/ns#a6303> <http://example.org/ns#a6303> <http://example.org/ns#a6303> . +<http://example.org/ns#a6304> <http://example.org/ns#a6304> <http://example.org/ns#a6304> . +<http://example.org/ns#a6305> <http://example.org/ns#a6305> <http://example.org/ns#a6305> . +<http://example.org/ns#a6306> <http://example.org/ns#a6306> <http://example.org/ns#a6306> . +<http://example.org/ns#a6307> <http://example.org/ns#a6307> <http://example.org/ns#a6307> . +<http://example.org/ns#a6308> <http://example.org/ns#a6308> <http://example.org/ns#a6308> . +<http://example.org/ns#a6309> <http://example.org/ns#a6309> <http://example.org/ns#a6309> . +<http://example.org/ns#a6310> <http://example.org/ns#a6310> <http://example.org/ns#a6310> . +<http://example.org/ns#a6311> <http://example.org/ns#a6311> <http://example.org/ns#a6311> . +<http://example.org/ns#a6312> <http://example.org/ns#a6312> <http://example.org/ns#a6312> . +<http://example.org/ns#a6313> <http://example.org/ns#a6313> <http://example.org/ns#a6313> . +<http://example.org/ns#a6314> <http://example.org/ns#a6314> <http://example.org/ns#a6314> . +<http://example.org/ns#a6315> <http://example.org/ns#a6315> <http://example.org/ns#a6315> . +<http://example.org/ns#a6316> <http://example.org/ns#a6316> <http://example.org/ns#a6316> . +<http://example.org/ns#a6317> <http://example.org/ns#a6317> <http://example.org/ns#a6317> . +<http://example.org/ns#a6318> <http://example.org/ns#a6318> <http://example.org/ns#a6318> . +<http://example.org/ns#a6319> <http://example.org/ns#a6319> <http://example.org/ns#a6319> . +<http://example.org/ns#a6320> <http://example.org/ns#a6320> <http://example.org/ns#a6320> . +<http://example.org/ns#a6321> <http://example.org/ns#a6321> <http://example.org/ns#a6321> . +<http://example.org/ns#a6322> <http://example.org/ns#a6322> <http://example.org/ns#a6322> . +<http://example.org/ns#a6323> <http://example.org/ns#a6323> <http://example.org/ns#a6323> . +<http://example.org/ns#a6324> <http://example.org/ns#a6324> <http://example.org/ns#a6324> . +<http://example.org/ns#a6325> <http://example.org/ns#a6325> <http://example.org/ns#a6325> . +<http://example.org/ns#a6326> <http://example.org/ns#a6326> <http://example.org/ns#a6326> . +<http://example.org/ns#a6327> <http://example.org/ns#a6327> <http://example.org/ns#a6327> . +<http://example.org/ns#a6328> <http://example.org/ns#a6328> <http://example.org/ns#a6328> . +<http://example.org/ns#a6329> <http://example.org/ns#a6329> <http://example.org/ns#a6329> . +<http://example.org/ns#a6330> <http://example.org/ns#a6330> <http://example.org/ns#a6330> . +<http://example.org/ns#a6331> <http://example.org/ns#a6331> <http://example.org/ns#a6331> . +<http://example.org/ns#a6332> <http://example.org/ns#a6332> <http://example.org/ns#a6332> . +<http://example.org/ns#a6333> <http://example.org/ns#a6333> <http://example.org/ns#a6333> . +<http://example.org/ns#a6334> <http://example.org/ns#a6334> <http://example.org/ns#a6334> . +<http://example.org/ns#a6335> <http://example.org/ns#a6335> <http://example.org/ns#a6335> . +<http://example.org/ns#a6336> <http://example.org/ns#a6336> <http://example.org/ns#a6336> . +<http://example.org/ns#a6337> <http://example.org/ns#a6337> <http://example.org/ns#a6337> . +<http://example.org/ns#a6338> <http://example.org/ns#a6338> <http://example.org/ns#a6338> . +<http://example.org/ns#a6339> <http://example.org/ns#a6339> <http://example.org/ns#a6339> . +<http://example.org/ns#a6340> <http://example.org/ns#a6340> <http://example.org/ns#a6340> . +<http://example.org/ns#a6341> <http://example.org/ns#a6341> <http://example.org/ns#a6341> . +<http://example.org/ns#a6342> <http://example.org/ns#a6342> <http://example.org/ns#a6342> . +<http://example.org/ns#a6343> <http://example.org/ns#a6343> <http://example.org/ns#a6343> . +<http://example.org/ns#a6344> <http://example.org/ns#a6344> <http://example.org/ns#a6344> . +<http://example.org/ns#a6345> <http://example.org/ns#a6345> <http://example.org/ns#a6345> . +<http://example.org/ns#a6346> <http://example.org/ns#a6346> <http://example.org/ns#a6346> . +<http://example.org/ns#a6347> <http://example.org/ns#a6347> <http://example.org/ns#a6347> . +<http://example.org/ns#a6348> <http://example.org/ns#a6348> <http://example.org/ns#a6348> . +<http://example.org/ns#a6349> <http://example.org/ns#a6349> <http://example.org/ns#a6349> . +<http://example.org/ns#a6350> <http://example.org/ns#a6350> <http://example.org/ns#a6350> . +<http://example.org/ns#a6351> <http://example.org/ns#a6351> <http://example.org/ns#a6351> . +<http://example.org/ns#a6352> <http://example.org/ns#a6352> <http://example.org/ns#a6352> . +<http://example.org/ns#a6353> <http://example.org/ns#a6353> <http://example.org/ns#a6353> . +<http://example.org/ns#a6354> <http://example.org/ns#a6354> <http://example.org/ns#a6354> . +<http://example.org/ns#a6355> <http://example.org/ns#a6355> <http://example.org/ns#a6355> . +<http://example.org/ns#a6356> <http://example.org/ns#a6356> <http://example.org/ns#a6356> . +<http://example.org/ns#a6357> <http://example.org/ns#a6357> <http://example.org/ns#a6357> . +<http://example.org/ns#a6358> <http://example.org/ns#a6358> <http://example.org/ns#a6358> . +<http://example.org/ns#a6359> <http://example.org/ns#a6359> <http://example.org/ns#a6359> . +<http://example.org/ns#a6360> <http://example.org/ns#a6360> <http://example.org/ns#a6360> . +<http://example.org/ns#a6361> <http://example.org/ns#a6361> <http://example.org/ns#a6361> . +<http://example.org/ns#a6362> <http://example.org/ns#a6362> <http://example.org/ns#a6362> . +<http://example.org/ns#a6363> <http://example.org/ns#a6363> <http://example.org/ns#a6363> . +<http://example.org/ns#a6364> <http://example.org/ns#a6364> <http://example.org/ns#a6364> . +<http://example.org/ns#a6365> <http://example.org/ns#a6365> <http://example.org/ns#a6365> . +<http://example.org/ns#a6366> <http://example.org/ns#a6366> <http://example.org/ns#a6366> . +<http://example.org/ns#a6367> <http://example.org/ns#a6367> <http://example.org/ns#a6367> . +<http://example.org/ns#a6368> <http://example.org/ns#a6368> <http://example.org/ns#a6368> . +<http://example.org/ns#a6369> <http://example.org/ns#a6369> <http://example.org/ns#a6369> . +<http://example.org/ns#a6370> <http://example.org/ns#a6370> <http://example.org/ns#a6370> . +<http://example.org/ns#a6371> <http://example.org/ns#a6371> <http://example.org/ns#a6371> . +<http://example.org/ns#a6372> <http://example.org/ns#a6372> <http://example.org/ns#a6372> . +<http://example.org/ns#a6373> <http://example.org/ns#a6373> <http://example.org/ns#a6373> . +<http://example.org/ns#a6374> <http://example.org/ns#a6374> <http://example.org/ns#a6374> . +<http://example.org/ns#a6375> <http://example.org/ns#a6375> <http://example.org/ns#a6375> . +<http://example.org/ns#a6376> <http://example.org/ns#a6376> <http://example.org/ns#a6376> . +<http://example.org/ns#a6377> <http://example.org/ns#a6377> <http://example.org/ns#a6377> . +<http://example.org/ns#a6378> <http://example.org/ns#a6378> <http://example.org/ns#a6378> . +<http://example.org/ns#a6379> <http://example.org/ns#a6379> <http://example.org/ns#a6379> . +<http://example.org/ns#a6380> <http://example.org/ns#a6380> <http://example.org/ns#a6380> . +<http://example.org/ns#a6381> <http://example.org/ns#a6381> <http://example.org/ns#a6381> . +<http://example.org/ns#a6382> <http://example.org/ns#a6382> <http://example.org/ns#a6382> . +<http://example.org/ns#a6383> <http://example.org/ns#a6383> <http://example.org/ns#a6383> . +<http://example.org/ns#a6384> <http://example.org/ns#a6384> <http://example.org/ns#a6384> . +<http://example.org/ns#a6385> <http://example.org/ns#a6385> <http://example.org/ns#a6385> . +<http://example.org/ns#a6386> <http://example.org/ns#a6386> <http://example.org/ns#a6386> . +<http://example.org/ns#a6387> <http://example.org/ns#a6387> <http://example.org/ns#a6387> . +<http://example.org/ns#a6388> <http://example.org/ns#a6388> <http://example.org/ns#a6388> . +<http://example.org/ns#a6389> <http://example.org/ns#a6389> <http://example.org/ns#a6389> . +<http://example.org/ns#a6390> <http://example.org/ns#a6390> <http://example.org/ns#a6390> . +<http://example.org/ns#a6391> <http://example.org/ns#a6391> <http://example.org/ns#a6391> . +<http://example.org/ns#a6392> <http://example.org/ns#a6392> <http://example.org/ns#a6392> . +<http://example.org/ns#a6393> <http://example.org/ns#a6393> <http://example.org/ns#a6393> . +<http://example.org/ns#a6394> <http://example.org/ns#a6394> <http://example.org/ns#a6394> . +<http://example.org/ns#a6395> <http://example.org/ns#a6395> <http://example.org/ns#a6395> . +<http://example.org/ns#a6396> <http://example.org/ns#a6396> <http://example.org/ns#a6396> . +<http://example.org/ns#a6397> <http://example.org/ns#a6397> <http://example.org/ns#a6397> . +<http://example.org/ns#a6398> <http://example.org/ns#a6398> <http://example.org/ns#a6398> . +<http://example.org/ns#a6399> <http://example.org/ns#a6399> <http://example.org/ns#a6399> . +<http://example.org/ns#a6400> <http://example.org/ns#a6400> <http://example.org/ns#a6400> . +<http://example.org/ns#a6401> <http://example.org/ns#a6401> <http://example.org/ns#a6401> . +<http://example.org/ns#a6402> <http://example.org/ns#a6402> <http://example.org/ns#a6402> . +<http://example.org/ns#a6403> <http://example.org/ns#a6403> <http://example.org/ns#a6403> . +<http://example.org/ns#a6404> <http://example.org/ns#a6404> <http://example.org/ns#a6404> . +<http://example.org/ns#a6405> <http://example.org/ns#a6405> <http://example.org/ns#a6405> . +<http://example.org/ns#a6406> <http://example.org/ns#a6406> <http://example.org/ns#a6406> . +<http://example.org/ns#a6407> <http://example.org/ns#a6407> <http://example.org/ns#a6407> . +<http://example.org/ns#a6408> <http://example.org/ns#a6408> <http://example.org/ns#a6408> . +<http://example.org/ns#a6409> <http://example.org/ns#a6409> <http://example.org/ns#a6409> . +<http://example.org/ns#a6410> <http://example.org/ns#a6410> <http://example.org/ns#a6410> . +<http://example.org/ns#a6411> <http://example.org/ns#a6411> <http://example.org/ns#a6411> . +<http://example.org/ns#a6412> <http://example.org/ns#a6412> <http://example.org/ns#a6412> . +<http://example.org/ns#a6413> <http://example.org/ns#a6413> <http://example.org/ns#a6413> . +<http://example.org/ns#a6414> <http://example.org/ns#a6414> <http://example.org/ns#a6414> . +<http://example.org/ns#a6415> <http://example.org/ns#a6415> <http://example.org/ns#a6415> . +<http://example.org/ns#a6416> <http://example.org/ns#a6416> <http://example.org/ns#a6416> . +<http://example.org/ns#a6417> <http://example.org/ns#a6417> <http://example.org/ns#a6417> . +<http://example.org/ns#a6418> <http://example.org/ns#a6418> <http://example.org/ns#a6418> . +<http://example.org/ns#a6419> <http://example.org/ns#a6419> <http://example.org/ns#a6419> . +<http://example.org/ns#a6420> <http://example.org/ns#a6420> <http://example.org/ns#a6420> . +<http://example.org/ns#a6421> <http://example.org/ns#a6421> <http://example.org/ns#a6421> . +<http://example.org/ns#a6422> <http://example.org/ns#a6422> <http://example.org/ns#a6422> . +<http://example.org/ns#a6423> <http://example.org/ns#a6423> <http://example.org/ns#a6423> . +<http://example.org/ns#a6424> <http://example.org/ns#a6424> <http://example.org/ns#a6424> . +<http://example.org/ns#a6425> <http://example.org/ns#a6425> <http://example.org/ns#a6425> . +<http://example.org/ns#a6426> <http://example.org/ns#a6426> <http://example.org/ns#a6426> . +<http://example.org/ns#a6427> <http://example.org/ns#a6427> <http://example.org/ns#a6427> . +<http://example.org/ns#a6428> <http://example.org/ns#a6428> <http://example.org/ns#a6428> . +<http://example.org/ns#a6429> <http://example.org/ns#a6429> <http://example.org/ns#a6429> . +<http://example.org/ns#a6430> <http://example.org/ns#a6430> <http://example.org/ns#a6430> . +<http://example.org/ns#a6431> <http://example.org/ns#a6431> <http://example.org/ns#a6431> . +<http://example.org/ns#a6432> <http://example.org/ns#a6432> <http://example.org/ns#a6432> . +<http://example.org/ns#a6433> <http://example.org/ns#a6433> <http://example.org/ns#a6433> . +<http://example.org/ns#a6434> <http://example.org/ns#a6434> <http://example.org/ns#a6434> . +<http://example.org/ns#a6435> <http://example.org/ns#a6435> <http://example.org/ns#a6435> . +<http://example.org/ns#a6436> <http://example.org/ns#a6436> <http://example.org/ns#a6436> . +<http://example.org/ns#a6437> <http://example.org/ns#a6437> <http://example.org/ns#a6437> . +<http://example.org/ns#a6438> <http://example.org/ns#a6438> <http://example.org/ns#a6438> . +<http://example.org/ns#a6439> <http://example.org/ns#a6439> <http://example.org/ns#a6439> . +<http://example.org/ns#a6440> <http://example.org/ns#a6440> <http://example.org/ns#a6440> . +<http://example.org/ns#a6441> <http://example.org/ns#a6441> <http://example.org/ns#a6441> . +<http://example.org/ns#a6442> <http://example.org/ns#a6442> <http://example.org/ns#a6442> . +<http://example.org/ns#a6443> <http://example.org/ns#a6443> <http://example.org/ns#a6443> . +<http://example.org/ns#a6444> <http://example.org/ns#a6444> <http://example.org/ns#a6444> . +<http://example.org/ns#a6445> <http://example.org/ns#a6445> <http://example.org/ns#a6445> . +<http://example.org/ns#a6446> <http://example.org/ns#a6446> <http://example.org/ns#a6446> . +<http://example.org/ns#a6447> <http://example.org/ns#a6447> <http://example.org/ns#a6447> . +<http://example.org/ns#a6448> <http://example.org/ns#a6448> <http://example.org/ns#a6448> . +<http://example.org/ns#a6449> <http://example.org/ns#a6449> <http://example.org/ns#a6449> . +<http://example.org/ns#a6450> <http://example.org/ns#a6450> <http://example.org/ns#a6450> . +<http://example.org/ns#a6451> <http://example.org/ns#a6451> <http://example.org/ns#a6451> . +<http://example.org/ns#a6452> <http://example.org/ns#a6452> <http://example.org/ns#a6452> . +<http://example.org/ns#a6453> <http://example.org/ns#a6453> <http://example.org/ns#a6453> . +<http://example.org/ns#a6454> <http://example.org/ns#a6454> <http://example.org/ns#a6454> . +<http://example.org/ns#a6455> <http://example.org/ns#a6455> <http://example.org/ns#a6455> . +<http://example.org/ns#a6456> <http://example.org/ns#a6456> <http://example.org/ns#a6456> . +<http://example.org/ns#a6457> <http://example.org/ns#a6457> <http://example.org/ns#a6457> . +<http://example.org/ns#a6458> <http://example.org/ns#a6458> <http://example.org/ns#a6458> . +<http://example.org/ns#a6459> <http://example.org/ns#a6459> <http://example.org/ns#a6459> . +<http://example.org/ns#a6460> <http://example.org/ns#a6460> <http://example.org/ns#a6460> . +<http://example.org/ns#a6461> <http://example.org/ns#a6461> <http://example.org/ns#a6461> . +<http://example.org/ns#a6462> <http://example.org/ns#a6462> <http://example.org/ns#a6462> . +<http://example.org/ns#a6463> <http://example.org/ns#a6463> <http://example.org/ns#a6463> . +<http://example.org/ns#a6464> <http://example.org/ns#a6464> <http://example.org/ns#a6464> . +<http://example.org/ns#a6465> <http://example.org/ns#a6465> <http://example.org/ns#a6465> . +<http://example.org/ns#a6466> <http://example.org/ns#a6466> <http://example.org/ns#a6466> . +<http://example.org/ns#a6467> <http://example.org/ns#a6467> <http://example.org/ns#a6467> . +<http://example.org/ns#a6468> <http://example.org/ns#a6468> <http://example.org/ns#a6468> . +<http://example.org/ns#a6469> <http://example.org/ns#a6469> <http://example.org/ns#a6469> . +<http://example.org/ns#a6470> <http://example.org/ns#a6470> <http://example.org/ns#a6470> . +<http://example.org/ns#a6471> <http://example.org/ns#a6471> <http://example.org/ns#a6471> . +<http://example.org/ns#a6472> <http://example.org/ns#a6472> <http://example.org/ns#a6472> . +<http://example.org/ns#a6473> <http://example.org/ns#a6473> <http://example.org/ns#a6473> . +<http://example.org/ns#a6474> <http://example.org/ns#a6474> <http://example.org/ns#a6474> . +<http://example.org/ns#a6475> <http://example.org/ns#a6475> <http://example.org/ns#a6475> . +<http://example.org/ns#a6476> <http://example.org/ns#a6476> <http://example.org/ns#a6476> . +<http://example.org/ns#a6477> <http://example.org/ns#a6477> <http://example.org/ns#a6477> . +<http://example.org/ns#a6478> <http://example.org/ns#a6478> <http://example.org/ns#a6478> . +<http://example.org/ns#a6479> <http://example.org/ns#a6479> <http://example.org/ns#a6479> . +<http://example.org/ns#a6480> <http://example.org/ns#a6480> <http://example.org/ns#a6480> . +<http://example.org/ns#a6481> <http://example.org/ns#a6481> <http://example.org/ns#a6481> . +<http://example.org/ns#a6482> <http://example.org/ns#a6482> <http://example.org/ns#a6482> . +<http://example.org/ns#a6483> <http://example.org/ns#a6483> <http://example.org/ns#a6483> . +<http://example.org/ns#a6484> <http://example.org/ns#a6484> <http://example.org/ns#a6484> . +<http://example.org/ns#a6485> <http://example.org/ns#a6485> <http://example.org/ns#a6485> . +<http://example.org/ns#a6486> <http://example.org/ns#a6486> <http://example.org/ns#a6486> . +<http://example.org/ns#a6487> <http://example.org/ns#a6487> <http://example.org/ns#a6487> . +<http://example.org/ns#a6488> <http://example.org/ns#a6488> <http://example.org/ns#a6488> . +<http://example.org/ns#a6489> <http://example.org/ns#a6489> <http://example.org/ns#a6489> . +<http://example.org/ns#a6490> <http://example.org/ns#a6490> <http://example.org/ns#a6490> . +<http://example.org/ns#a6491> <http://example.org/ns#a6491> <http://example.org/ns#a6491> . +<http://example.org/ns#a6492> <http://example.org/ns#a6492> <http://example.org/ns#a6492> . +<http://example.org/ns#a6493> <http://example.org/ns#a6493> <http://example.org/ns#a6493> . +<http://example.org/ns#a6494> <http://example.org/ns#a6494> <http://example.org/ns#a6494> . +<http://example.org/ns#a6495> <http://example.org/ns#a6495> <http://example.org/ns#a6495> . +<http://example.org/ns#a6496> <http://example.org/ns#a6496> <http://example.org/ns#a6496> . +<http://example.org/ns#a6497> <http://example.org/ns#a6497> <http://example.org/ns#a6497> . +<http://example.org/ns#a6498> <http://example.org/ns#a6498> <http://example.org/ns#a6498> . +<http://example.org/ns#a6499> <http://example.org/ns#a6499> <http://example.org/ns#a6499> . +<http://example.org/ns#a6500> <http://example.org/ns#a6500> <http://example.org/ns#a6500> . +<http://example.org/ns#a6501> <http://example.org/ns#a6501> <http://example.org/ns#a6501> . +<http://example.org/ns#a6502> <http://example.org/ns#a6502> <http://example.org/ns#a6502> . +<http://example.org/ns#a6503> <http://example.org/ns#a6503> <http://example.org/ns#a6503> . +<http://example.org/ns#a6504> <http://example.org/ns#a6504> <http://example.org/ns#a6504> . +<http://example.org/ns#a6505> <http://example.org/ns#a6505> <http://example.org/ns#a6505> . +<http://example.org/ns#a6506> <http://example.org/ns#a6506> <http://example.org/ns#a6506> . +<http://example.org/ns#a6507> <http://example.org/ns#a6507> <http://example.org/ns#a6507> . +<http://example.org/ns#a6508> <http://example.org/ns#a6508> <http://example.org/ns#a6508> . +<http://example.org/ns#a6509> <http://example.org/ns#a6509> <http://example.org/ns#a6509> . +<http://example.org/ns#a6510> <http://example.org/ns#a6510> <http://example.org/ns#a6510> . +<http://example.org/ns#a6511> <http://example.org/ns#a6511> <http://example.org/ns#a6511> . +<http://example.org/ns#a6512> <http://example.org/ns#a6512> <http://example.org/ns#a6512> . +<http://example.org/ns#a6513> <http://example.org/ns#a6513> <http://example.org/ns#a6513> . +<http://example.org/ns#a6514> <http://example.org/ns#a6514> <http://example.org/ns#a6514> . +<http://example.org/ns#a6515> <http://example.org/ns#a6515> <http://example.org/ns#a6515> . +<http://example.org/ns#a6516> <http://example.org/ns#a6516> <http://example.org/ns#a6516> . +<http://example.org/ns#a6517> <http://example.org/ns#a6517> <http://example.org/ns#a6517> . +<http://example.org/ns#a6518> <http://example.org/ns#a6518> <http://example.org/ns#a6518> . +<http://example.org/ns#a6519> <http://example.org/ns#a6519> <http://example.org/ns#a6519> . +<http://example.org/ns#a6520> <http://example.org/ns#a6520> <http://example.org/ns#a6520> . +<http://example.org/ns#a6521> <http://example.org/ns#a6521> <http://example.org/ns#a6521> . +<http://example.org/ns#a6522> <http://example.org/ns#a6522> <http://example.org/ns#a6522> . +<http://example.org/ns#a6523> <http://example.org/ns#a6523> <http://example.org/ns#a6523> . +<http://example.org/ns#a6524> <http://example.org/ns#a6524> <http://example.org/ns#a6524> . +<http://example.org/ns#a6525> <http://example.org/ns#a6525> <http://example.org/ns#a6525> . +<http://example.org/ns#a6526> <http://example.org/ns#a6526> <http://example.org/ns#a6526> . +<http://example.org/ns#a6527> <http://example.org/ns#a6527> <http://example.org/ns#a6527> . +<http://example.org/ns#a6528> <http://example.org/ns#a6528> <http://example.org/ns#a6528> . +<http://example.org/ns#a6529> <http://example.org/ns#a6529> <http://example.org/ns#a6529> . +<http://example.org/ns#a6530> <http://example.org/ns#a6530> <http://example.org/ns#a6530> . +<http://example.org/ns#a6531> <http://example.org/ns#a6531> <http://example.org/ns#a6531> . +<http://example.org/ns#a6532> <http://example.org/ns#a6532> <http://example.org/ns#a6532> . +<http://example.org/ns#a6533> <http://example.org/ns#a6533> <http://example.org/ns#a6533> . +<http://example.org/ns#a6534> <http://example.org/ns#a6534> <http://example.org/ns#a6534> . +<http://example.org/ns#a6535> <http://example.org/ns#a6535> <http://example.org/ns#a6535> . +<http://example.org/ns#a6536> <http://example.org/ns#a6536> <http://example.org/ns#a6536> . +<http://example.org/ns#a6537> <http://example.org/ns#a6537> <http://example.org/ns#a6537> . +<http://example.org/ns#a6538> <http://example.org/ns#a6538> <http://example.org/ns#a6538> . +<http://example.org/ns#a6539> <http://example.org/ns#a6539> <http://example.org/ns#a6539> . +<http://example.org/ns#a6540> <http://example.org/ns#a6540> <http://example.org/ns#a6540> . +<http://example.org/ns#a6541> <http://example.org/ns#a6541> <http://example.org/ns#a6541> . +<http://example.org/ns#a6542> <http://example.org/ns#a6542> <http://example.org/ns#a6542> . +<http://example.org/ns#a6543> <http://example.org/ns#a6543> <http://example.org/ns#a6543> . +<http://example.org/ns#a6544> <http://example.org/ns#a6544> <http://example.org/ns#a6544> . +<http://example.org/ns#a6545> <http://example.org/ns#a6545> <http://example.org/ns#a6545> . +<http://example.org/ns#a6546> <http://example.org/ns#a6546> <http://example.org/ns#a6546> . +<http://example.org/ns#a6547> <http://example.org/ns#a6547> <http://example.org/ns#a6547> . +<http://example.org/ns#a6548> <http://example.org/ns#a6548> <http://example.org/ns#a6548> . +<http://example.org/ns#a6549> <http://example.org/ns#a6549> <http://example.org/ns#a6549> . +<http://example.org/ns#a6550> <http://example.org/ns#a6550> <http://example.org/ns#a6550> . +<http://example.org/ns#a6551> <http://example.org/ns#a6551> <http://example.org/ns#a6551> . +<http://example.org/ns#a6552> <http://example.org/ns#a6552> <http://example.org/ns#a6552> . +<http://example.org/ns#a6553> <http://example.org/ns#a6553> <http://example.org/ns#a6553> . +<http://example.org/ns#a6554> <http://example.org/ns#a6554> <http://example.org/ns#a6554> . +<http://example.org/ns#a6555> <http://example.org/ns#a6555> <http://example.org/ns#a6555> . +<http://example.org/ns#a6556> <http://example.org/ns#a6556> <http://example.org/ns#a6556> . +<http://example.org/ns#a6557> <http://example.org/ns#a6557> <http://example.org/ns#a6557> . +<http://example.org/ns#a6558> <http://example.org/ns#a6558> <http://example.org/ns#a6558> . +<http://example.org/ns#a6559> <http://example.org/ns#a6559> <http://example.org/ns#a6559> . +<http://example.org/ns#a6560> <http://example.org/ns#a6560> <http://example.org/ns#a6560> . +<http://example.org/ns#a6561> <http://example.org/ns#a6561> <http://example.org/ns#a6561> . +<http://example.org/ns#a6562> <http://example.org/ns#a6562> <http://example.org/ns#a6562> . +<http://example.org/ns#a6563> <http://example.org/ns#a6563> <http://example.org/ns#a6563> . +<http://example.org/ns#a6564> <http://example.org/ns#a6564> <http://example.org/ns#a6564> . +<http://example.org/ns#a6565> <http://example.org/ns#a6565> <http://example.org/ns#a6565> . +<http://example.org/ns#a6566> <http://example.org/ns#a6566> <http://example.org/ns#a6566> . +<http://example.org/ns#a6567> <http://example.org/ns#a6567> <http://example.org/ns#a6567> . +<http://example.org/ns#a6568> <http://example.org/ns#a6568> <http://example.org/ns#a6568> . +<http://example.org/ns#a6569> <http://example.org/ns#a6569> <http://example.org/ns#a6569> . +<http://example.org/ns#a6570> <http://example.org/ns#a6570> <http://example.org/ns#a6570> . +<http://example.org/ns#a6571> <http://example.org/ns#a6571> <http://example.org/ns#a6571> . +<http://example.org/ns#a6572> <http://example.org/ns#a6572> <http://example.org/ns#a6572> . +<http://example.org/ns#a6573> <http://example.org/ns#a6573> <http://example.org/ns#a6573> . +<http://example.org/ns#a6574> <http://example.org/ns#a6574> <http://example.org/ns#a6574> . +<http://example.org/ns#a6575> <http://example.org/ns#a6575> <http://example.org/ns#a6575> . +<http://example.org/ns#a6576> <http://example.org/ns#a6576> <http://example.org/ns#a6576> . +<http://example.org/ns#a6577> <http://example.org/ns#a6577> <http://example.org/ns#a6577> . +<http://example.org/ns#a6578> <http://example.org/ns#a6578> <http://example.org/ns#a6578> . +<http://example.org/ns#a6579> <http://example.org/ns#a6579> <http://example.org/ns#a6579> . +<http://example.org/ns#a6580> <http://example.org/ns#a6580> <http://example.org/ns#a6580> . +<http://example.org/ns#a6581> <http://example.org/ns#a6581> <http://example.org/ns#a6581> . +<http://example.org/ns#a6582> <http://example.org/ns#a6582> <http://example.org/ns#a6582> . +<http://example.org/ns#a6583> <http://example.org/ns#a6583> <http://example.org/ns#a6583> . +<http://example.org/ns#a6584> <http://example.org/ns#a6584> <http://example.org/ns#a6584> . +<http://example.org/ns#a6585> <http://example.org/ns#a6585> <http://example.org/ns#a6585> . +<http://example.org/ns#a6586> <http://example.org/ns#a6586> <http://example.org/ns#a6586> . +<http://example.org/ns#a6587> <http://example.org/ns#a6587> <http://example.org/ns#a6587> . +<http://example.org/ns#a6588> <http://example.org/ns#a6588> <http://example.org/ns#a6588> . +<http://example.org/ns#a6589> <http://example.org/ns#a6589> <http://example.org/ns#a6589> . +<http://example.org/ns#a6590> <http://example.org/ns#a6590> <http://example.org/ns#a6590> . +<http://example.org/ns#a6591> <http://example.org/ns#a6591> <http://example.org/ns#a6591> . +<http://example.org/ns#a6592> <http://example.org/ns#a6592> <http://example.org/ns#a6592> . +<http://example.org/ns#a6593> <http://example.org/ns#a6593> <http://example.org/ns#a6593> . +<http://example.org/ns#a6594> <http://example.org/ns#a6594> <http://example.org/ns#a6594> . +<http://example.org/ns#a6595> <http://example.org/ns#a6595> <http://example.org/ns#a6595> . +<http://example.org/ns#a6596> <http://example.org/ns#a6596> <http://example.org/ns#a6596> . +<http://example.org/ns#a6597> <http://example.org/ns#a6597> <http://example.org/ns#a6597> . +<http://example.org/ns#a6598> <http://example.org/ns#a6598> <http://example.org/ns#a6598> . +<http://example.org/ns#a6599> <http://example.org/ns#a6599> <http://example.org/ns#a6599> . +<http://example.org/ns#a6600> <http://example.org/ns#a6600> <http://example.org/ns#a6600> . +<http://example.org/ns#a6601> <http://example.org/ns#a6601> <http://example.org/ns#a6601> . +<http://example.org/ns#a6602> <http://example.org/ns#a6602> <http://example.org/ns#a6602> . +<http://example.org/ns#a6603> <http://example.org/ns#a6603> <http://example.org/ns#a6603> . +<http://example.org/ns#a6604> <http://example.org/ns#a6604> <http://example.org/ns#a6604> . +<http://example.org/ns#a6605> <http://example.org/ns#a6605> <http://example.org/ns#a6605> . +<http://example.org/ns#a6606> <http://example.org/ns#a6606> <http://example.org/ns#a6606> . +<http://example.org/ns#a6607> <http://example.org/ns#a6607> <http://example.org/ns#a6607> . +<http://example.org/ns#a6608> <http://example.org/ns#a6608> <http://example.org/ns#a6608> . +<http://example.org/ns#a6609> <http://example.org/ns#a6609> <http://example.org/ns#a6609> . +<http://example.org/ns#a6610> <http://example.org/ns#a6610> <http://example.org/ns#a6610> . +<http://example.org/ns#a6611> <http://example.org/ns#a6611> <http://example.org/ns#a6611> . +<http://example.org/ns#a6612> <http://example.org/ns#a6612> <http://example.org/ns#a6612> . +<http://example.org/ns#a6613> <http://example.org/ns#a6613> <http://example.org/ns#a6613> . +<http://example.org/ns#a6614> <http://example.org/ns#a6614> <http://example.org/ns#a6614> . +<http://example.org/ns#a6615> <http://example.org/ns#a6615> <http://example.org/ns#a6615> . +<http://example.org/ns#a6616> <http://example.org/ns#a6616> <http://example.org/ns#a6616> . +<http://example.org/ns#a6617> <http://example.org/ns#a6617> <http://example.org/ns#a6617> . +<http://example.org/ns#a6618> <http://example.org/ns#a6618> <http://example.org/ns#a6618> . +<http://example.org/ns#a6619> <http://example.org/ns#a6619> <http://example.org/ns#a6619> . +<http://example.org/ns#a6620> <http://example.org/ns#a6620> <http://example.org/ns#a6620> . +<http://example.org/ns#a6621> <http://example.org/ns#a6621> <http://example.org/ns#a6621> . +<http://example.org/ns#a6622> <http://example.org/ns#a6622> <http://example.org/ns#a6622> . +<http://example.org/ns#a6623> <http://example.org/ns#a6623> <http://example.org/ns#a6623> . +<http://example.org/ns#a6624> <http://example.org/ns#a6624> <http://example.org/ns#a6624> . +<http://example.org/ns#a6625> <http://example.org/ns#a6625> <http://example.org/ns#a6625> . +<http://example.org/ns#a6626> <http://example.org/ns#a6626> <http://example.org/ns#a6626> . +<http://example.org/ns#a6627> <http://example.org/ns#a6627> <http://example.org/ns#a6627> . +<http://example.org/ns#a6628> <http://example.org/ns#a6628> <http://example.org/ns#a6628> . +<http://example.org/ns#a6629> <http://example.org/ns#a6629> <http://example.org/ns#a6629> . +<http://example.org/ns#a6630> <http://example.org/ns#a6630> <http://example.org/ns#a6630> . +<http://example.org/ns#a6631> <http://example.org/ns#a6631> <http://example.org/ns#a6631> . +<http://example.org/ns#a6632> <http://example.org/ns#a6632> <http://example.org/ns#a6632> . +<http://example.org/ns#a6633> <http://example.org/ns#a6633> <http://example.org/ns#a6633> . +<http://example.org/ns#a6634> <http://example.org/ns#a6634> <http://example.org/ns#a6634> . +<http://example.org/ns#a6635> <http://example.org/ns#a6635> <http://example.org/ns#a6635> . +<http://example.org/ns#a6636> <http://example.org/ns#a6636> <http://example.org/ns#a6636> . +<http://example.org/ns#a6637> <http://example.org/ns#a6637> <http://example.org/ns#a6637> . +<http://example.org/ns#a6638> <http://example.org/ns#a6638> <http://example.org/ns#a6638> . +<http://example.org/ns#a6639> <http://example.org/ns#a6639> <http://example.org/ns#a6639> . +<http://example.org/ns#a6640> <http://example.org/ns#a6640> <http://example.org/ns#a6640> . +<http://example.org/ns#a6641> <http://example.org/ns#a6641> <http://example.org/ns#a6641> . +<http://example.org/ns#a6642> <http://example.org/ns#a6642> <http://example.org/ns#a6642> . +<http://example.org/ns#a6643> <http://example.org/ns#a6643> <http://example.org/ns#a6643> . +<http://example.org/ns#a6644> <http://example.org/ns#a6644> <http://example.org/ns#a6644> . +<http://example.org/ns#a6645> <http://example.org/ns#a6645> <http://example.org/ns#a6645> . +<http://example.org/ns#a6646> <http://example.org/ns#a6646> <http://example.org/ns#a6646> . +<http://example.org/ns#a6647> <http://example.org/ns#a6647> <http://example.org/ns#a6647> . +<http://example.org/ns#a6648> <http://example.org/ns#a6648> <http://example.org/ns#a6648> . +<http://example.org/ns#a6649> <http://example.org/ns#a6649> <http://example.org/ns#a6649> . +<http://example.org/ns#a6650> <http://example.org/ns#a6650> <http://example.org/ns#a6650> . +<http://example.org/ns#a6651> <http://example.org/ns#a6651> <http://example.org/ns#a6651> . +<http://example.org/ns#a6652> <http://example.org/ns#a6652> <http://example.org/ns#a6652> . +<http://example.org/ns#a6653> <http://example.org/ns#a6653> <http://example.org/ns#a6653> . +<http://example.org/ns#a6654> <http://example.org/ns#a6654> <http://example.org/ns#a6654> . +<http://example.org/ns#a6655> <http://example.org/ns#a6655> <http://example.org/ns#a6655> . +<http://example.org/ns#a6656> <http://example.org/ns#a6656> <http://example.org/ns#a6656> . +<http://example.org/ns#a6657> <http://example.org/ns#a6657> <http://example.org/ns#a6657> . +<http://example.org/ns#a6658> <http://example.org/ns#a6658> <http://example.org/ns#a6658> . +<http://example.org/ns#a6659> <http://example.org/ns#a6659> <http://example.org/ns#a6659> . +<http://example.org/ns#a6660> <http://example.org/ns#a6660> <http://example.org/ns#a6660> . +<http://example.org/ns#a6661> <http://example.org/ns#a6661> <http://example.org/ns#a6661> . +<http://example.org/ns#a6662> <http://example.org/ns#a6662> <http://example.org/ns#a6662> . +<http://example.org/ns#a6663> <http://example.org/ns#a6663> <http://example.org/ns#a6663> . +<http://example.org/ns#a6664> <http://example.org/ns#a6664> <http://example.org/ns#a6664> . +<http://example.org/ns#a6665> <http://example.org/ns#a6665> <http://example.org/ns#a6665> . +<http://example.org/ns#a6666> <http://example.org/ns#a6666> <http://example.org/ns#a6666> . +<http://example.org/ns#a6667> <http://example.org/ns#a6667> <http://example.org/ns#a6667> . +<http://example.org/ns#a6668> <http://example.org/ns#a6668> <http://example.org/ns#a6668> . +<http://example.org/ns#a6669> <http://example.org/ns#a6669> <http://example.org/ns#a6669> . +<http://example.org/ns#a6670> <http://example.org/ns#a6670> <http://example.org/ns#a6670> . +<http://example.org/ns#a6671> <http://example.org/ns#a6671> <http://example.org/ns#a6671> . +<http://example.org/ns#a6672> <http://example.org/ns#a6672> <http://example.org/ns#a6672> . +<http://example.org/ns#a6673> <http://example.org/ns#a6673> <http://example.org/ns#a6673> . +<http://example.org/ns#a6674> <http://example.org/ns#a6674> <http://example.org/ns#a6674> . +<http://example.org/ns#a6675> <http://example.org/ns#a6675> <http://example.org/ns#a6675> . +<http://example.org/ns#a6676> <http://example.org/ns#a6676> <http://example.org/ns#a6676> . +<http://example.org/ns#a6677> <http://example.org/ns#a6677> <http://example.org/ns#a6677> . +<http://example.org/ns#a6678> <http://example.org/ns#a6678> <http://example.org/ns#a6678> . +<http://example.org/ns#a6679> <http://example.org/ns#a6679> <http://example.org/ns#a6679> . +<http://example.org/ns#a6680> <http://example.org/ns#a6680> <http://example.org/ns#a6680> . +<http://example.org/ns#a6681> <http://example.org/ns#a6681> <http://example.org/ns#a6681> . +<http://example.org/ns#a6682> <http://example.org/ns#a6682> <http://example.org/ns#a6682> . +<http://example.org/ns#a6683> <http://example.org/ns#a6683> <http://example.org/ns#a6683> . +<http://example.org/ns#a6684> <http://example.org/ns#a6684> <http://example.org/ns#a6684> . +<http://example.org/ns#a6685> <http://example.org/ns#a6685> <http://example.org/ns#a6685> . +<http://example.org/ns#a6686> <http://example.org/ns#a6686> <http://example.org/ns#a6686> . +<http://example.org/ns#a6687> <http://example.org/ns#a6687> <http://example.org/ns#a6687> . +<http://example.org/ns#a6688> <http://example.org/ns#a6688> <http://example.org/ns#a6688> . +<http://example.org/ns#a6689> <http://example.org/ns#a6689> <http://example.org/ns#a6689> . +<http://example.org/ns#a6690> <http://example.org/ns#a6690> <http://example.org/ns#a6690> . +<http://example.org/ns#a6691> <http://example.org/ns#a6691> <http://example.org/ns#a6691> . +<http://example.org/ns#a6692> <http://example.org/ns#a6692> <http://example.org/ns#a6692> . +<http://example.org/ns#a6693> <http://example.org/ns#a6693> <http://example.org/ns#a6693> . +<http://example.org/ns#a6694> <http://example.org/ns#a6694> <http://example.org/ns#a6694> . +<http://example.org/ns#a6695> <http://example.org/ns#a6695> <http://example.org/ns#a6695> . +<http://example.org/ns#a6696> <http://example.org/ns#a6696> <http://example.org/ns#a6696> . +<http://example.org/ns#a6697> <http://example.org/ns#a6697> <http://example.org/ns#a6697> . +<http://example.org/ns#a6698> <http://example.org/ns#a6698> <http://example.org/ns#a6698> . +<http://example.org/ns#a6699> <http://example.org/ns#a6699> <http://example.org/ns#a6699> . +<http://example.org/ns#a6700> <http://example.org/ns#a6700> <http://example.org/ns#a6700> . +<http://example.org/ns#a6701> <http://example.org/ns#a6701> <http://example.org/ns#a6701> . +<http://example.org/ns#a6702> <http://example.org/ns#a6702> <http://example.org/ns#a6702> . +<http://example.org/ns#a6703> <http://example.org/ns#a6703> <http://example.org/ns#a6703> . +<http://example.org/ns#a6704> <http://example.org/ns#a6704> <http://example.org/ns#a6704> . +<http://example.org/ns#a6705> <http://example.org/ns#a6705> <http://example.org/ns#a6705> . +<http://example.org/ns#a6706> <http://example.org/ns#a6706> <http://example.org/ns#a6706> . +<http://example.org/ns#a6707> <http://example.org/ns#a6707> <http://example.org/ns#a6707> . +<http://example.org/ns#a6708> <http://example.org/ns#a6708> <http://example.org/ns#a6708> . +<http://example.org/ns#a6709> <http://example.org/ns#a6709> <http://example.org/ns#a6709> . +<http://example.org/ns#a6710> <http://example.org/ns#a6710> <http://example.org/ns#a6710> . +<http://example.org/ns#a6711> <http://example.org/ns#a6711> <http://example.org/ns#a6711> . +<http://example.org/ns#a6712> <http://example.org/ns#a6712> <http://example.org/ns#a6712> . +<http://example.org/ns#a6713> <http://example.org/ns#a6713> <http://example.org/ns#a6713> . +<http://example.org/ns#a6714> <http://example.org/ns#a6714> <http://example.org/ns#a6714> . +<http://example.org/ns#a6715> <http://example.org/ns#a6715> <http://example.org/ns#a6715> . +<http://example.org/ns#a6716> <http://example.org/ns#a6716> <http://example.org/ns#a6716> . +<http://example.org/ns#a6717> <http://example.org/ns#a6717> <http://example.org/ns#a6717> . +<http://example.org/ns#a6718> <http://example.org/ns#a6718> <http://example.org/ns#a6718> . +<http://example.org/ns#a6719> <http://example.org/ns#a6719> <http://example.org/ns#a6719> . +<http://example.org/ns#a6720> <http://example.org/ns#a6720> <http://example.org/ns#a6720> . +<http://example.org/ns#a6721> <http://example.org/ns#a6721> <http://example.org/ns#a6721> . +<http://example.org/ns#a6722> <http://example.org/ns#a6722> <http://example.org/ns#a6722> . +<http://example.org/ns#a6723> <http://example.org/ns#a6723> <http://example.org/ns#a6723> . +<http://example.org/ns#a6724> <http://example.org/ns#a6724> <http://example.org/ns#a6724> . +<http://example.org/ns#a6725> <http://example.org/ns#a6725> <http://example.org/ns#a6725> . +<http://example.org/ns#a6726> <http://example.org/ns#a6726> <http://example.org/ns#a6726> . +<http://example.org/ns#a6727> <http://example.org/ns#a6727> <http://example.org/ns#a6727> . +<http://example.org/ns#a6728> <http://example.org/ns#a6728> <http://example.org/ns#a6728> . +<http://example.org/ns#a6729> <http://example.org/ns#a6729> <http://example.org/ns#a6729> . +<http://example.org/ns#a6730> <http://example.org/ns#a6730> <http://example.org/ns#a6730> . +<http://example.org/ns#a6731> <http://example.org/ns#a6731> <http://example.org/ns#a6731> . +<http://example.org/ns#a6732> <http://example.org/ns#a6732> <http://example.org/ns#a6732> . +<http://example.org/ns#a6733> <http://example.org/ns#a6733> <http://example.org/ns#a6733> . +<http://example.org/ns#a6734> <http://example.org/ns#a6734> <http://example.org/ns#a6734> . +<http://example.org/ns#a6735> <http://example.org/ns#a6735> <http://example.org/ns#a6735> . +<http://example.org/ns#a6736> <http://example.org/ns#a6736> <http://example.org/ns#a6736> . +<http://example.org/ns#a6737> <http://example.org/ns#a6737> <http://example.org/ns#a6737> . +<http://example.org/ns#a6738> <http://example.org/ns#a6738> <http://example.org/ns#a6738> . +<http://example.org/ns#a6739> <http://example.org/ns#a6739> <http://example.org/ns#a6739> . +<http://example.org/ns#a6740> <http://example.org/ns#a6740> <http://example.org/ns#a6740> . +<http://example.org/ns#a6741> <http://example.org/ns#a6741> <http://example.org/ns#a6741> . +<http://example.org/ns#a6742> <http://example.org/ns#a6742> <http://example.org/ns#a6742> . +<http://example.org/ns#a6743> <http://example.org/ns#a6743> <http://example.org/ns#a6743> . +<http://example.org/ns#a6744> <http://example.org/ns#a6744> <http://example.org/ns#a6744> . +<http://example.org/ns#a6745> <http://example.org/ns#a6745> <http://example.org/ns#a6745> . +<http://example.org/ns#a6746> <http://example.org/ns#a6746> <http://example.org/ns#a6746> . +<http://example.org/ns#a6747> <http://example.org/ns#a6747> <http://example.org/ns#a6747> . +<http://example.org/ns#a6748> <http://example.org/ns#a6748> <http://example.org/ns#a6748> . +<http://example.org/ns#a6749> <http://example.org/ns#a6749> <http://example.org/ns#a6749> . +<http://example.org/ns#a6750> <http://example.org/ns#a6750> <http://example.org/ns#a6750> . +<http://example.org/ns#a6751> <http://example.org/ns#a6751> <http://example.org/ns#a6751> . +<http://example.org/ns#a6752> <http://example.org/ns#a6752> <http://example.org/ns#a6752> . +<http://example.org/ns#a6753> <http://example.org/ns#a6753> <http://example.org/ns#a6753> . +<http://example.org/ns#a6754> <http://example.org/ns#a6754> <http://example.org/ns#a6754> . +<http://example.org/ns#a6755> <http://example.org/ns#a6755> <http://example.org/ns#a6755> . +<http://example.org/ns#a6756> <http://example.org/ns#a6756> <http://example.org/ns#a6756> . +<http://example.org/ns#a6757> <http://example.org/ns#a6757> <http://example.org/ns#a6757> . +<http://example.org/ns#a6758> <http://example.org/ns#a6758> <http://example.org/ns#a6758> . +<http://example.org/ns#a6759> <http://example.org/ns#a6759> <http://example.org/ns#a6759> . +<http://example.org/ns#a6760> <http://example.org/ns#a6760> <http://example.org/ns#a6760> . +<http://example.org/ns#a6761> <http://example.org/ns#a6761> <http://example.org/ns#a6761> . +<http://example.org/ns#a6762> <http://example.org/ns#a6762> <http://example.org/ns#a6762> . +<http://example.org/ns#a6763> <http://example.org/ns#a6763> <http://example.org/ns#a6763> . +<http://example.org/ns#a6764> <http://example.org/ns#a6764> <http://example.org/ns#a6764> . +<http://example.org/ns#a6765> <http://example.org/ns#a6765> <http://example.org/ns#a6765> . +<http://example.org/ns#a6766> <http://example.org/ns#a6766> <http://example.org/ns#a6766> . +<http://example.org/ns#a6767> <http://example.org/ns#a6767> <http://example.org/ns#a6767> . +<http://example.org/ns#a6768> <http://example.org/ns#a6768> <http://example.org/ns#a6768> . +<http://example.org/ns#a6769> <http://example.org/ns#a6769> <http://example.org/ns#a6769> . +<http://example.org/ns#a6770> <http://example.org/ns#a6770> <http://example.org/ns#a6770> . +<http://example.org/ns#a6771> <http://example.org/ns#a6771> <http://example.org/ns#a6771> . +<http://example.org/ns#a6772> <http://example.org/ns#a6772> <http://example.org/ns#a6772> . +<http://example.org/ns#a6773> <http://example.org/ns#a6773> <http://example.org/ns#a6773> . +<http://example.org/ns#a6774> <http://example.org/ns#a6774> <http://example.org/ns#a6774> . +<http://example.org/ns#a6775> <http://example.org/ns#a6775> <http://example.org/ns#a6775> . +<http://example.org/ns#a6776> <http://example.org/ns#a6776> <http://example.org/ns#a6776> . +<http://example.org/ns#a6777> <http://example.org/ns#a6777> <http://example.org/ns#a6777> . +<http://example.org/ns#a6778> <http://example.org/ns#a6778> <http://example.org/ns#a6778> . +<http://example.org/ns#a6779> <http://example.org/ns#a6779> <http://example.org/ns#a6779> . +<http://example.org/ns#a6780> <http://example.org/ns#a6780> <http://example.org/ns#a6780> . +<http://example.org/ns#a6781> <http://example.org/ns#a6781> <http://example.org/ns#a6781> . +<http://example.org/ns#a6782> <http://example.org/ns#a6782> <http://example.org/ns#a6782> . +<http://example.org/ns#a6783> <http://example.org/ns#a6783> <http://example.org/ns#a6783> . +<http://example.org/ns#a6784> <http://example.org/ns#a6784> <http://example.org/ns#a6784> . +<http://example.org/ns#a6785> <http://example.org/ns#a6785> <http://example.org/ns#a6785> . +<http://example.org/ns#a6786> <http://example.org/ns#a6786> <http://example.org/ns#a6786> . +<http://example.org/ns#a6787> <http://example.org/ns#a6787> <http://example.org/ns#a6787> . +<http://example.org/ns#a6788> <http://example.org/ns#a6788> <http://example.org/ns#a6788> . +<http://example.org/ns#a6789> <http://example.org/ns#a6789> <http://example.org/ns#a6789> . +<http://example.org/ns#a6790> <http://example.org/ns#a6790> <http://example.org/ns#a6790> . +<http://example.org/ns#a6791> <http://example.org/ns#a6791> <http://example.org/ns#a6791> . +<http://example.org/ns#a6792> <http://example.org/ns#a6792> <http://example.org/ns#a6792> . +<http://example.org/ns#a6793> <http://example.org/ns#a6793> <http://example.org/ns#a6793> . +<http://example.org/ns#a6794> <http://example.org/ns#a6794> <http://example.org/ns#a6794> . +<http://example.org/ns#a6795> <http://example.org/ns#a6795> <http://example.org/ns#a6795> . +<http://example.org/ns#a6796> <http://example.org/ns#a6796> <http://example.org/ns#a6796> . +<http://example.org/ns#a6797> <http://example.org/ns#a6797> <http://example.org/ns#a6797> . +<http://example.org/ns#a6798> <http://example.org/ns#a6798> <http://example.org/ns#a6798> . +<http://example.org/ns#a6799> <http://example.org/ns#a6799> <http://example.org/ns#a6799> . +<http://example.org/ns#a6800> <http://example.org/ns#a6800> <http://example.org/ns#a6800> . +<http://example.org/ns#a6801> <http://example.org/ns#a6801> <http://example.org/ns#a6801> . +<http://example.org/ns#a6802> <http://example.org/ns#a6802> <http://example.org/ns#a6802> . +<http://example.org/ns#a6803> <http://example.org/ns#a6803> <http://example.org/ns#a6803> . +<http://example.org/ns#a6804> <http://example.org/ns#a6804> <http://example.org/ns#a6804> . +<http://example.org/ns#a6805> <http://example.org/ns#a6805> <http://example.org/ns#a6805> . +<http://example.org/ns#a6806> <http://example.org/ns#a6806> <http://example.org/ns#a6806> . +<http://example.org/ns#a6807> <http://example.org/ns#a6807> <http://example.org/ns#a6807> . +<http://example.org/ns#a6808> <http://example.org/ns#a6808> <http://example.org/ns#a6808> . +<http://example.org/ns#a6809> <http://example.org/ns#a6809> <http://example.org/ns#a6809> . +<http://example.org/ns#a6810> <http://example.org/ns#a6810> <http://example.org/ns#a6810> . +<http://example.org/ns#a6811> <http://example.org/ns#a6811> <http://example.org/ns#a6811> . +<http://example.org/ns#a6812> <http://example.org/ns#a6812> <http://example.org/ns#a6812> . +<http://example.org/ns#a6813> <http://example.org/ns#a6813> <http://example.org/ns#a6813> . +<http://example.org/ns#a6814> <http://example.org/ns#a6814> <http://example.org/ns#a6814> . +<http://example.org/ns#a6815> <http://example.org/ns#a6815> <http://example.org/ns#a6815> . +<http://example.org/ns#a6816> <http://example.org/ns#a6816> <http://example.org/ns#a6816> . +<http://example.org/ns#a6817> <http://example.org/ns#a6817> <http://example.org/ns#a6817> . +<http://example.org/ns#a6818> <http://example.org/ns#a6818> <http://example.org/ns#a6818> . +<http://example.org/ns#a6819> <http://example.org/ns#a6819> <http://example.org/ns#a6819> . +<http://example.org/ns#a6820> <http://example.org/ns#a6820> <http://example.org/ns#a6820> . +<http://example.org/ns#a6821> <http://example.org/ns#a6821> <http://example.org/ns#a6821> . +<http://example.org/ns#a6822> <http://example.org/ns#a6822> <http://example.org/ns#a6822> . +<http://example.org/ns#a6823> <http://example.org/ns#a6823> <http://example.org/ns#a6823> . +<http://example.org/ns#a6824> <http://example.org/ns#a6824> <http://example.org/ns#a6824> . +<http://example.org/ns#a6825> <http://example.org/ns#a6825> <http://example.org/ns#a6825> . +<http://example.org/ns#a6826> <http://example.org/ns#a6826> <http://example.org/ns#a6826> . +<http://example.org/ns#a6827> <http://example.org/ns#a6827> <http://example.org/ns#a6827> . +<http://example.org/ns#a6828> <http://example.org/ns#a6828> <http://example.org/ns#a6828> . +<http://example.org/ns#a6829> <http://example.org/ns#a6829> <http://example.org/ns#a6829> . +<http://example.org/ns#a6830> <http://example.org/ns#a6830> <http://example.org/ns#a6830> . +<http://example.org/ns#a6831> <http://example.org/ns#a6831> <http://example.org/ns#a6831> . +<http://example.org/ns#a6832> <http://example.org/ns#a6832> <http://example.org/ns#a6832> . +<http://example.org/ns#a6833> <http://example.org/ns#a6833> <http://example.org/ns#a6833> . +<http://example.org/ns#a6834> <http://example.org/ns#a6834> <http://example.org/ns#a6834> . +<http://example.org/ns#a6835> <http://example.org/ns#a6835> <http://example.org/ns#a6835> . +<http://example.org/ns#a6836> <http://example.org/ns#a6836> <http://example.org/ns#a6836> . +<http://example.org/ns#a6837> <http://example.org/ns#a6837> <http://example.org/ns#a6837> . +<http://example.org/ns#a6838> <http://example.org/ns#a6838> <http://example.org/ns#a6838> . +<http://example.org/ns#a6839> <http://example.org/ns#a6839> <http://example.org/ns#a6839> . +<http://example.org/ns#a6840> <http://example.org/ns#a6840> <http://example.org/ns#a6840> . +<http://example.org/ns#a6841> <http://example.org/ns#a6841> <http://example.org/ns#a6841> . +<http://example.org/ns#a6842> <http://example.org/ns#a6842> <http://example.org/ns#a6842> . +<http://example.org/ns#a6843> <http://example.org/ns#a6843> <http://example.org/ns#a6843> . +<http://example.org/ns#a6844> <http://example.org/ns#a6844> <http://example.org/ns#a6844> . +<http://example.org/ns#a6845> <http://example.org/ns#a6845> <http://example.org/ns#a6845> . +<http://example.org/ns#a6846> <http://example.org/ns#a6846> <http://example.org/ns#a6846> . +<http://example.org/ns#a6847> <http://example.org/ns#a6847> <http://example.org/ns#a6847> . +<http://example.org/ns#a6848> <http://example.org/ns#a6848> <http://example.org/ns#a6848> . +<http://example.org/ns#a6849> <http://example.org/ns#a6849> <http://example.org/ns#a6849> . +<http://example.org/ns#a6850> <http://example.org/ns#a6850> <http://example.org/ns#a6850> . +<http://example.org/ns#a6851> <http://example.org/ns#a6851> <http://example.org/ns#a6851> . +<http://example.org/ns#a6852> <http://example.org/ns#a6852> <http://example.org/ns#a6852> . +<http://example.org/ns#a6853> <http://example.org/ns#a6853> <http://example.org/ns#a6853> . +<http://example.org/ns#a6854> <http://example.org/ns#a6854> <http://example.org/ns#a6854> . +<http://example.org/ns#a6855> <http://example.org/ns#a6855> <http://example.org/ns#a6855> . +<http://example.org/ns#a6856> <http://example.org/ns#a6856> <http://example.org/ns#a6856> . +<http://example.org/ns#a6857> <http://example.org/ns#a6857> <http://example.org/ns#a6857> . +<http://example.org/ns#a6858> <http://example.org/ns#a6858> <http://example.org/ns#a6858> . +<http://example.org/ns#a6859> <http://example.org/ns#a6859> <http://example.org/ns#a6859> . +<http://example.org/ns#a6860> <http://example.org/ns#a6860> <http://example.org/ns#a6860> . +<http://example.org/ns#a6861> <http://example.org/ns#a6861> <http://example.org/ns#a6861> . +<http://example.org/ns#a6862> <http://example.org/ns#a6862> <http://example.org/ns#a6862> . +<http://example.org/ns#a6863> <http://example.org/ns#a6863> <http://example.org/ns#a6863> . +<http://example.org/ns#a6864> <http://example.org/ns#a6864> <http://example.org/ns#a6864> . +<http://example.org/ns#a6865> <http://example.org/ns#a6865> <http://example.org/ns#a6865> . +<http://example.org/ns#a6866> <http://example.org/ns#a6866> <http://example.org/ns#a6866> . +<http://example.org/ns#a6867> <http://example.org/ns#a6867> <http://example.org/ns#a6867> . +<http://example.org/ns#a6868> <http://example.org/ns#a6868> <http://example.org/ns#a6868> . +<http://example.org/ns#a6869> <http://example.org/ns#a6869> <http://example.org/ns#a6869> . +<http://example.org/ns#a6870> <http://example.org/ns#a6870> <http://example.org/ns#a6870> . +<http://example.org/ns#a6871> <http://example.org/ns#a6871> <http://example.org/ns#a6871> . +<http://example.org/ns#a6872> <http://example.org/ns#a6872> <http://example.org/ns#a6872> . +<http://example.org/ns#a6873> <http://example.org/ns#a6873> <http://example.org/ns#a6873> . +<http://example.org/ns#a6874> <http://example.org/ns#a6874> <http://example.org/ns#a6874> . +<http://example.org/ns#a6875> <http://example.org/ns#a6875> <http://example.org/ns#a6875> . +<http://example.org/ns#a6876> <http://example.org/ns#a6876> <http://example.org/ns#a6876> . +<http://example.org/ns#a6877> <http://example.org/ns#a6877> <http://example.org/ns#a6877> . +<http://example.org/ns#a6878> <http://example.org/ns#a6878> <http://example.org/ns#a6878> . +<http://example.org/ns#a6879> <http://example.org/ns#a6879> <http://example.org/ns#a6879> . +<http://example.org/ns#a6880> <http://example.org/ns#a6880> <http://example.org/ns#a6880> . +<http://example.org/ns#a6881> <http://example.org/ns#a6881> <http://example.org/ns#a6881> . +<http://example.org/ns#a6882> <http://example.org/ns#a6882> <http://example.org/ns#a6882> . +<http://example.org/ns#a6883> <http://example.org/ns#a6883> <http://example.org/ns#a6883> . +<http://example.org/ns#a6884> <http://example.org/ns#a6884> <http://example.org/ns#a6884> . +<http://example.org/ns#a6885> <http://example.org/ns#a6885> <http://example.org/ns#a6885> . +<http://example.org/ns#a6886> <http://example.org/ns#a6886> <http://example.org/ns#a6886> . +<http://example.org/ns#a6887> <http://example.org/ns#a6887> <http://example.org/ns#a6887> . +<http://example.org/ns#a6888> <http://example.org/ns#a6888> <http://example.org/ns#a6888> . +<http://example.org/ns#a6889> <http://example.org/ns#a6889> <http://example.org/ns#a6889> . +<http://example.org/ns#a6890> <http://example.org/ns#a6890> <http://example.org/ns#a6890> . +<http://example.org/ns#a6891> <http://example.org/ns#a6891> <http://example.org/ns#a6891> . +<http://example.org/ns#a6892> <http://example.org/ns#a6892> <http://example.org/ns#a6892> . +<http://example.org/ns#a6893> <http://example.org/ns#a6893> <http://example.org/ns#a6893> . +<http://example.org/ns#a6894> <http://example.org/ns#a6894> <http://example.org/ns#a6894> . +<http://example.org/ns#a6895> <http://example.org/ns#a6895> <http://example.org/ns#a6895> . +<http://example.org/ns#a6896> <http://example.org/ns#a6896> <http://example.org/ns#a6896> . +<http://example.org/ns#a6897> <http://example.org/ns#a6897> <http://example.org/ns#a6897> . +<http://example.org/ns#a6898> <http://example.org/ns#a6898> <http://example.org/ns#a6898> . +<http://example.org/ns#a6899> <http://example.org/ns#a6899> <http://example.org/ns#a6899> . +<http://example.org/ns#a6900> <http://example.org/ns#a6900> <http://example.org/ns#a6900> . +<http://example.org/ns#a6901> <http://example.org/ns#a6901> <http://example.org/ns#a6901> . +<http://example.org/ns#a6902> <http://example.org/ns#a6902> <http://example.org/ns#a6902> . +<http://example.org/ns#a6903> <http://example.org/ns#a6903> <http://example.org/ns#a6903> . +<http://example.org/ns#a6904> <http://example.org/ns#a6904> <http://example.org/ns#a6904> . +<http://example.org/ns#a6905> <http://example.org/ns#a6905> <http://example.org/ns#a6905> . +<http://example.org/ns#a6906> <http://example.org/ns#a6906> <http://example.org/ns#a6906> . +<http://example.org/ns#a6907> <http://example.org/ns#a6907> <http://example.org/ns#a6907> . +<http://example.org/ns#a6908> <http://example.org/ns#a6908> <http://example.org/ns#a6908> . +<http://example.org/ns#a6909> <http://example.org/ns#a6909> <http://example.org/ns#a6909> . +<http://example.org/ns#a6910> <http://example.org/ns#a6910> <http://example.org/ns#a6910> . +<http://example.org/ns#a6911> <http://example.org/ns#a6911> <http://example.org/ns#a6911> . +<http://example.org/ns#a6912> <http://example.org/ns#a6912> <http://example.org/ns#a6912> . +<http://example.org/ns#a6913> <http://example.org/ns#a6913> <http://example.org/ns#a6913> . +<http://example.org/ns#a6914> <http://example.org/ns#a6914> <http://example.org/ns#a6914> . +<http://example.org/ns#a6915> <http://example.org/ns#a6915> <http://example.org/ns#a6915> . +<http://example.org/ns#a6916> <http://example.org/ns#a6916> <http://example.org/ns#a6916> . +<http://example.org/ns#a6917> <http://example.org/ns#a6917> <http://example.org/ns#a6917> . +<http://example.org/ns#a6918> <http://example.org/ns#a6918> <http://example.org/ns#a6918> . +<http://example.org/ns#a6919> <http://example.org/ns#a6919> <http://example.org/ns#a6919> . +<http://example.org/ns#a6920> <http://example.org/ns#a6920> <http://example.org/ns#a6920> . +<http://example.org/ns#a6921> <http://example.org/ns#a6921> <http://example.org/ns#a6921> . +<http://example.org/ns#a6922> <http://example.org/ns#a6922> <http://example.org/ns#a6922> . +<http://example.org/ns#a6923> <http://example.org/ns#a6923> <http://example.org/ns#a6923> . +<http://example.org/ns#a6924> <http://example.org/ns#a6924> <http://example.org/ns#a6924> . +<http://example.org/ns#a6925> <http://example.org/ns#a6925> <http://example.org/ns#a6925> . +<http://example.org/ns#a6926> <http://example.org/ns#a6926> <http://example.org/ns#a6926> . +<http://example.org/ns#a6927> <http://example.org/ns#a6927> <http://example.org/ns#a6927> . +<http://example.org/ns#a6928> <http://example.org/ns#a6928> <http://example.org/ns#a6928> . +<http://example.org/ns#a6929> <http://example.org/ns#a6929> <http://example.org/ns#a6929> . +<http://example.org/ns#a6930> <http://example.org/ns#a6930> <http://example.org/ns#a6930> . +<http://example.org/ns#a6931> <http://example.org/ns#a6931> <http://example.org/ns#a6931> . +<http://example.org/ns#a6932> <http://example.org/ns#a6932> <http://example.org/ns#a6932> . +<http://example.org/ns#a6933> <http://example.org/ns#a6933> <http://example.org/ns#a6933> . +<http://example.org/ns#a6934> <http://example.org/ns#a6934> <http://example.org/ns#a6934> . +<http://example.org/ns#a6935> <http://example.org/ns#a6935> <http://example.org/ns#a6935> . +<http://example.org/ns#a6936> <http://example.org/ns#a6936> <http://example.org/ns#a6936> . +<http://example.org/ns#a6937> <http://example.org/ns#a6937> <http://example.org/ns#a6937> . +<http://example.org/ns#a6938> <http://example.org/ns#a6938> <http://example.org/ns#a6938> . +<http://example.org/ns#a6939> <http://example.org/ns#a6939> <http://example.org/ns#a6939> . +<http://example.org/ns#a6940> <http://example.org/ns#a6940> <http://example.org/ns#a6940> . +<http://example.org/ns#a6941> <http://example.org/ns#a6941> <http://example.org/ns#a6941> . +<http://example.org/ns#a6942> <http://example.org/ns#a6942> <http://example.org/ns#a6942> . +<http://example.org/ns#a6943> <http://example.org/ns#a6943> <http://example.org/ns#a6943> . +<http://example.org/ns#a6944> <http://example.org/ns#a6944> <http://example.org/ns#a6944> . +<http://example.org/ns#a6945> <http://example.org/ns#a6945> <http://example.org/ns#a6945> . +<http://example.org/ns#a6946> <http://example.org/ns#a6946> <http://example.org/ns#a6946> . +<http://example.org/ns#a6947> <http://example.org/ns#a6947> <http://example.org/ns#a6947> . +<http://example.org/ns#a6948> <http://example.org/ns#a6948> <http://example.org/ns#a6948> . +<http://example.org/ns#a6949> <http://example.org/ns#a6949> <http://example.org/ns#a6949> . +<http://example.org/ns#a6950> <http://example.org/ns#a6950> <http://example.org/ns#a6950> . +<http://example.org/ns#a6951> <http://example.org/ns#a6951> <http://example.org/ns#a6951> . +<http://example.org/ns#a6952> <http://example.org/ns#a6952> <http://example.org/ns#a6952> . +<http://example.org/ns#a6953> <http://example.org/ns#a6953> <http://example.org/ns#a6953> . +<http://example.org/ns#a6954> <http://example.org/ns#a6954> <http://example.org/ns#a6954> . +<http://example.org/ns#a6955> <http://example.org/ns#a6955> <http://example.org/ns#a6955> . +<http://example.org/ns#a6956> <http://example.org/ns#a6956> <http://example.org/ns#a6956> . +<http://example.org/ns#a6957> <http://example.org/ns#a6957> <http://example.org/ns#a6957> . +<http://example.org/ns#a6958> <http://example.org/ns#a6958> <http://example.org/ns#a6958> . +<http://example.org/ns#a6959> <http://example.org/ns#a6959> <http://example.org/ns#a6959> . +<http://example.org/ns#a6960> <http://example.org/ns#a6960> <http://example.org/ns#a6960> . +<http://example.org/ns#a6961> <http://example.org/ns#a6961> <http://example.org/ns#a6961> . +<http://example.org/ns#a6962> <http://example.org/ns#a6962> <http://example.org/ns#a6962> . +<http://example.org/ns#a6963> <http://example.org/ns#a6963> <http://example.org/ns#a6963> . +<http://example.org/ns#a6964> <http://example.org/ns#a6964> <http://example.org/ns#a6964> . +<http://example.org/ns#a6965> <http://example.org/ns#a6965> <http://example.org/ns#a6965> . +<http://example.org/ns#a6966> <http://example.org/ns#a6966> <http://example.org/ns#a6966> . +<http://example.org/ns#a6967> <http://example.org/ns#a6967> <http://example.org/ns#a6967> . +<http://example.org/ns#a6968> <http://example.org/ns#a6968> <http://example.org/ns#a6968> . +<http://example.org/ns#a6969> <http://example.org/ns#a6969> <http://example.org/ns#a6969> . +<http://example.org/ns#a6970> <http://example.org/ns#a6970> <http://example.org/ns#a6970> . +<http://example.org/ns#a6971> <http://example.org/ns#a6971> <http://example.org/ns#a6971> . +<http://example.org/ns#a6972> <http://example.org/ns#a6972> <http://example.org/ns#a6972> . +<http://example.org/ns#a6973> <http://example.org/ns#a6973> <http://example.org/ns#a6973> . +<http://example.org/ns#a6974> <http://example.org/ns#a6974> <http://example.org/ns#a6974> . +<http://example.org/ns#a6975> <http://example.org/ns#a6975> <http://example.org/ns#a6975> . +<http://example.org/ns#a6976> <http://example.org/ns#a6976> <http://example.org/ns#a6976> . +<http://example.org/ns#a6977> <http://example.org/ns#a6977> <http://example.org/ns#a6977> . +<http://example.org/ns#a6978> <http://example.org/ns#a6978> <http://example.org/ns#a6978> . +<http://example.org/ns#a6979> <http://example.org/ns#a6979> <http://example.org/ns#a6979> . +<http://example.org/ns#a6980> <http://example.org/ns#a6980> <http://example.org/ns#a6980> . +<http://example.org/ns#a6981> <http://example.org/ns#a6981> <http://example.org/ns#a6981> . +<http://example.org/ns#a6982> <http://example.org/ns#a6982> <http://example.org/ns#a6982> . +<http://example.org/ns#a6983> <http://example.org/ns#a6983> <http://example.org/ns#a6983> . +<http://example.org/ns#a6984> <http://example.org/ns#a6984> <http://example.org/ns#a6984> . +<http://example.org/ns#a6985> <http://example.org/ns#a6985> <http://example.org/ns#a6985> . +<http://example.org/ns#a6986> <http://example.org/ns#a6986> <http://example.org/ns#a6986> . +<http://example.org/ns#a6987> <http://example.org/ns#a6987> <http://example.org/ns#a6987> . +<http://example.org/ns#a6988> <http://example.org/ns#a6988> <http://example.org/ns#a6988> . +<http://example.org/ns#a6989> <http://example.org/ns#a6989> <http://example.org/ns#a6989> . +<http://example.org/ns#a6990> <http://example.org/ns#a6990> <http://example.org/ns#a6990> . +<http://example.org/ns#a6991> <http://example.org/ns#a6991> <http://example.org/ns#a6991> . +<http://example.org/ns#a6992> <http://example.org/ns#a6992> <http://example.org/ns#a6992> . +<http://example.org/ns#a6993> <http://example.org/ns#a6993> <http://example.org/ns#a6993> . +<http://example.org/ns#a6994> <http://example.org/ns#a6994> <http://example.org/ns#a6994> . +<http://example.org/ns#a6995> <http://example.org/ns#a6995> <http://example.org/ns#a6995> . +<http://example.org/ns#a6996> <http://example.org/ns#a6996> <http://example.org/ns#a6996> . +<http://example.org/ns#a6997> <http://example.org/ns#a6997> <http://example.org/ns#a6997> . +<http://example.org/ns#a6998> <http://example.org/ns#a6998> <http://example.org/ns#a6998> . +<http://example.org/ns#a6999> <http://example.org/ns#a6999> <http://example.org/ns#a6999> . +<http://example.org/ns#a7000> <http://example.org/ns#a7000> <http://example.org/ns#a7000> . +<http://example.org/ns#a7001> <http://example.org/ns#a7001> <http://example.org/ns#a7001> . +<http://example.org/ns#a7002> <http://example.org/ns#a7002> <http://example.org/ns#a7002> . +<http://example.org/ns#a7003> <http://example.org/ns#a7003> <http://example.org/ns#a7003> . +<http://example.org/ns#a7004> <http://example.org/ns#a7004> <http://example.org/ns#a7004> . +<http://example.org/ns#a7005> <http://example.org/ns#a7005> <http://example.org/ns#a7005> . +<http://example.org/ns#a7006> <http://example.org/ns#a7006> <http://example.org/ns#a7006> . +<http://example.org/ns#a7007> <http://example.org/ns#a7007> <http://example.org/ns#a7007> . +<http://example.org/ns#a7008> <http://example.org/ns#a7008> <http://example.org/ns#a7008> . +<http://example.org/ns#a7009> <http://example.org/ns#a7009> <http://example.org/ns#a7009> . +<http://example.org/ns#a7010> <http://example.org/ns#a7010> <http://example.org/ns#a7010> . +<http://example.org/ns#a7011> <http://example.org/ns#a7011> <http://example.org/ns#a7011> . +<http://example.org/ns#a7012> <http://example.org/ns#a7012> <http://example.org/ns#a7012> . +<http://example.org/ns#a7013> <http://example.org/ns#a7013> <http://example.org/ns#a7013> . +<http://example.org/ns#a7014> <http://example.org/ns#a7014> <http://example.org/ns#a7014> . +<http://example.org/ns#a7015> <http://example.org/ns#a7015> <http://example.org/ns#a7015> . +<http://example.org/ns#a7016> <http://example.org/ns#a7016> <http://example.org/ns#a7016> . +<http://example.org/ns#a7017> <http://example.org/ns#a7017> <http://example.org/ns#a7017> . +<http://example.org/ns#a7018> <http://example.org/ns#a7018> <http://example.org/ns#a7018> . +<http://example.org/ns#a7019> <http://example.org/ns#a7019> <http://example.org/ns#a7019> . +<http://example.org/ns#a7020> <http://example.org/ns#a7020> <http://example.org/ns#a7020> . +<http://example.org/ns#a7021> <http://example.org/ns#a7021> <http://example.org/ns#a7021> . +<http://example.org/ns#a7022> <http://example.org/ns#a7022> <http://example.org/ns#a7022> . +<http://example.org/ns#a7023> <http://example.org/ns#a7023> <http://example.org/ns#a7023> . +<http://example.org/ns#a7024> <http://example.org/ns#a7024> <http://example.org/ns#a7024> . +<http://example.org/ns#a7025> <http://example.org/ns#a7025> <http://example.org/ns#a7025> . +<http://example.org/ns#a7026> <http://example.org/ns#a7026> <http://example.org/ns#a7026> . +<http://example.org/ns#a7027> <http://example.org/ns#a7027> <http://example.org/ns#a7027> . +<http://example.org/ns#a7028> <http://example.org/ns#a7028> <http://example.org/ns#a7028> . +<http://example.org/ns#a7029> <http://example.org/ns#a7029> <http://example.org/ns#a7029> . +<http://example.org/ns#a7030> <http://example.org/ns#a7030> <http://example.org/ns#a7030> . +<http://example.org/ns#a7031> <http://example.org/ns#a7031> <http://example.org/ns#a7031> . +<http://example.org/ns#a7032> <http://example.org/ns#a7032> <http://example.org/ns#a7032> . +<http://example.org/ns#a7033> <http://example.org/ns#a7033> <http://example.org/ns#a7033> . +<http://example.org/ns#a7034> <http://example.org/ns#a7034> <http://example.org/ns#a7034> . +<http://example.org/ns#a7035> <http://example.org/ns#a7035> <http://example.org/ns#a7035> . +<http://example.org/ns#a7036> <http://example.org/ns#a7036> <http://example.org/ns#a7036> . +<http://example.org/ns#a7037> <http://example.org/ns#a7037> <http://example.org/ns#a7037> . +<http://example.org/ns#a7038> <http://example.org/ns#a7038> <http://example.org/ns#a7038> . +<http://example.org/ns#a7039> <http://example.org/ns#a7039> <http://example.org/ns#a7039> . +<http://example.org/ns#a7040> <http://example.org/ns#a7040> <http://example.org/ns#a7040> . +<http://example.org/ns#a7041> <http://example.org/ns#a7041> <http://example.org/ns#a7041> . +<http://example.org/ns#a7042> <http://example.org/ns#a7042> <http://example.org/ns#a7042> . +<http://example.org/ns#a7043> <http://example.org/ns#a7043> <http://example.org/ns#a7043> . +<http://example.org/ns#a7044> <http://example.org/ns#a7044> <http://example.org/ns#a7044> . +<http://example.org/ns#a7045> <http://example.org/ns#a7045> <http://example.org/ns#a7045> . +<http://example.org/ns#a7046> <http://example.org/ns#a7046> <http://example.org/ns#a7046> . +<http://example.org/ns#a7047> <http://example.org/ns#a7047> <http://example.org/ns#a7047> . +<http://example.org/ns#a7048> <http://example.org/ns#a7048> <http://example.org/ns#a7048> . +<http://example.org/ns#a7049> <http://example.org/ns#a7049> <http://example.org/ns#a7049> . +<http://example.org/ns#a7050> <http://example.org/ns#a7050> <http://example.org/ns#a7050> . +<http://example.org/ns#a7051> <http://example.org/ns#a7051> <http://example.org/ns#a7051> . +<http://example.org/ns#a7052> <http://example.org/ns#a7052> <http://example.org/ns#a7052> . +<http://example.org/ns#a7053> <http://example.org/ns#a7053> <http://example.org/ns#a7053> . +<http://example.org/ns#a7054> <http://example.org/ns#a7054> <http://example.org/ns#a7054> . +<http://example.org/ns#a7055> <http://example.org/ns#a7055> <http://example.org/ns#a7055> . +<http://example.org/ns#a7056> <http://example.org/ns#a7056> <http://example.org/ns#a7056> . +<http://example.org/ns#a7057> <http://example.org/ns#a7057> <http://example.org/ns#a7057> . +<http://example.org/ns#a7058> <http://example.org/ns#a7058> <http://example.org/ns#a7058> . +<http://example.org/ns#a7059> <http://example.org/ns#a7059> <http://example.org/ns#a7059> . +<http://example.org/ns#a7060> <http://example.org/ns#a7060> <http://example.org/ns#a7060> . +<http://example.org/ns#a7061> <http://example.org/ns#a7061> <http://example.org/ns#a7061> . +<http://example.org/ns#a7062> <http://example.org/ns#a7062> <http://example.org/ns#a7062> . +<http://example.org/ns#a7063> <http://example.org/ns#a7063> <http://example.org/ns#a7063> . +<http://example.org/ns#a7064> <http://example.org/ns#a7064> <http://example.org/ns#a7064> . +<http://example.org/ns#a7065> <http://example.org/ns#a7065> <http://example.org/ns#a7065> . +<http://example.org/ns#a7066> <http://example.org/ns#a7066> <http://example.org/ns#a7066> . +<http://example.org/ns#a7067> <http://example.org/ns#a7067> <http://example.org/ns#a7067> . +<http://example.org/ns#a7068> <http://example.org/ns#a7068> <http://example.org/ns#a7068> . +<http://example.org/ns#a7069> <http://example.org/ns#a7069> <http://example.org/ns#a7069> . +<http://example.org/ns#a7070> <http://example.org/ns#a7070> <http://example.org/ns#a7070> . +<http://example.org/ns#a7071> <http://example.org/ns#a7071> <http://example.org/ns#a7071> . +<http://example.org/ns#a7072> <http://example.org/ns#a7072> <http://example.org/ns#a7072> . +<http://example.org/ns#a7073> <http://example.org/ns#a7073> <http://example.org/ns#a7073> . +<http://example.org/ns#a7074> <http://example.org/ns#a7074> <http://example.org/ns#a7074> . +<http://example.org/ns#a7075> <http://example.org/ns#a7075> <http://example.org/ns#a7075> . +<http://example.org/ns#a7076> <http://example.org/ns#a7076> <http://example.org/ns#a7076> . +<http://example.org/ns#a7077> <http://example.org/ns#a7077> <http://example.org/ns#a7077> . +<http://example.org/ns#a7078> <http://example.org/ns#a7078> <http://example.org/ns#a7078> . +<http://example.org/ns#a7079> <http://example.org/ns#a7079> <http://example.org/ns#a7079> . +<http://example.org/ns#a7080> <http://example.org/ns#a7080> <http://example.org/ns#a7080> . +<http://example.org/ns#a7081> <http://example.org/ns#a7081> <http://example.org/ns#a7081> . +<http://example.org/ns#a7082> <http://example.org/ns#a7082> <http://example.org/ns#a7082> . +<http://example.org/ns#a7083> <http://example.org/ns#a7083> <http://example.org/ns#a7083> . +<http://example.org/ns#a7084> <http://example.org/ns#a7084> <http://example.org/ns#a7084> . +<http://example.org/ns#a7085> <http://example.org/ns#a7085> <http://example.org/ns#a7085> . +<http://example.org/ns#a7086> <http://example.org/ns#a7086> <http://example.org/ns#a7086> . +<http://example.org/ns#a7087> <http://example.org/ns#a7087> <http://example.org/ns#a7087> . +<http://example.org/ns#a7088> <http://example.org/ns#a7088> <http://example.org/ns#a7088> . +<http://example.org/ns#a7089> <http://example.org/ns#a7089> <http://example.org/ns#a7089> . +<http://example.org/ns#a7090> <http://example.org/ns#a7090> <http://example.org/ns#a7090> . +<http://example.org/ns#a7091> <http://example.org/ns#a7091> <http://example.org/ns#a7091> . +<http://example.org/ns#a7092> <http://example.org/ns#a7092> <http://example.org/ns#a7092> . +<http://example.org/ns#a7093> <http://example.org/ns#a7093> <http://example.org/ns#a7093> . +<http://example.org/ns#a7094> <http://example.org/ns#a7094> <http://example.org/ns#a7094> . +<http://example.org/ns#a7095> <http://example.org/ns#a7095> <http://example.org/ns#a7095> . +<http://example.org/ns#a7096> <http://example.org/ns#a7096> <http://example.org/ns#a7096> . +<http://example.org/ns#a7097> <http://example.org/ns#a7097> <http://example.org/ns#a7097> . +<http://example.org/ns#a7098> <http://example.org/ns#a7098> <http://example.org/ns#a7098> . +<http://example.org/ns#a7099> <http://example.org/ns#a7099> <http://example.org/ns#a7099> . +<http://example.org/ns#a7100> <http://example.org/ns#a7100> <http://example.org/ns#a7100> . +<http://example.org/ns#a7101> <http://example.org/ns#a7101> <http://example.org/ns#a7101> . +<http://example.org/ns#a7102> <http://example.org/ns#a7102> <http://example.org/ns#a7102> . +<http://example.org/ns#a7103> <http://example.org/ns#a7103> <http://example.org/ns#a7103> . +<http://example.org/ns#a7104> <http://example.org/ns#a7104> <http://example.org/ns#a7104> . +<http://example.org/ns#a7105> <http://example.org/ns#a7105> <http://example.org/ns#a7105> . +<http://example.org/ns#a7106> <http://example.org/ns#a7106> <http://example.org/ns#a7106> . +<http://example.org/ns#a7107> <http://example.org/ns#a7107> <http://example.org/ns#a7107> . +<http://example.org/ns#a7108> <http://example.org/ns#a7108> <http://example.org/ns#a7108> . +<http://example.org/ns#a7109> <http://example.org/ns#a7109> <http://example.org/ns#a7109> . +<http://example.org/ns#a7110> <http://example.org/ns#a7110> <http://example.org/ns#a7110> . +<http://example.org/ns#a7111> <http://example.org/ns#a7111> <http://example.org/ns#a7111> . +<http://example.org/ns#a7112> <http://example.org/ns#a7112> <http://example.org/ns#a7112> . +<http://example.org/ns#a7113> <http://example.org/ns#a7113> <http://example.org/ns#a7113> . +<http://example.org/ns#a7114> <http://example.org/ns#a7114> <http://example.org/ns#a7114> . +<http://example.org/ns#a7115> <http://example.org/ns#a7115> <http://example.org/ns#a7115> . +<http://example.org/ns#a7116> <http://example.org/ns#a7116> <http://example.org/ns#a7116> . +<http://example.org/ns#a7117> <http://example.org/ns#a7117> <http://example.org/ns#a7117> . +<http://example.org/ns#a7118> <http://example.org/ns#a7118> <http://example.org/ns#a7118> . +<http://example.org/ns#a7119> <http://example.org/ns#a7119> <http://example.org/ns#a7119> . +<http://example.org/ns#a7120> <http://example.org/ns#a7120> <http://example.org/ns#a7120> . +<http://example.org/ns#a7121> <http://example.org/ns#a7121> <http://example.org/ns#a7121> . +<http://example.org/ns#a7122> <http://example.org/ns#a7122> <http://example.org/ns#a7122> . +<http://example.org/ns#a7123> <http://example.org/ns#a7123> <http://example.org/ns#a7123> . +<http://example.org/ns#a7124> <http://example.org/ns#a7124> <http://example.org/ns#a7124> . +<http://example.org/ns#a7125> <http://example.org/ns#a7125> <http://example.org/ns#a7125> . +<http://example.org/ns#a7126> <http://example.org/ns#a7126> <http://example.org/ns#a7126> . +<http://example.org/ns#a7127> <http://example.org/ns#a7127> <http://example.org/ns#a7127> . +<http://example.org/ns#a7128> <http://example.org/ns#a7128> <http://example.org/ns#a7128> . +<http://example.org/ns#a7129> <http://example.org/ns#a7129> <http://example.org/ns#a7129> . +<http://example.org/ns#a7130> <http://example.org/ns#a7130> <http://example.org/ns#a7130> . +<http://example.org/ns#a7131> <http://example.org/ns#a7131> <http://example.org/ns#a7131> . +<http://example.org/ns#a7132> <http://example.org/ns#a7132> <http://example.org/ns#a7132> . +<http://example.org/ns#a7133> <http://example.org/ns#a7133> <http://example.org/ns#a7133> . +<http://example.org/ns#a7134> <http://example.org/ns#a7134> <http://example.org/ns#a7134> . +<http://example.org/ns#a7135> <http://example.org/ns#a7135> <http://example.org/ns#a7135> . +<http://example.org/ns#a7136> <http://example.org/ns#a7136> <http://example.org/ns#a7136> . +<http://example.org/ns#a7137> <http://example.org/ns#a7137> <http://example.org/ns#a7137> . +<http://example.org/ns#a7138> <http://example.org/ns#a7138> <http://example.org/ns#a7138> . +<http://example.org/ns#a7139> <http://example.org/ns#a7139> <http://example.org/ns#a7139> . +<http://example.org/ns#a7140> <http://example.org/ns#a7140> <http://example.org/ns#a7140> . +<http://example.org/ns#a7141> <http://example.org/ns#a7141> <http://example.org/ns#a7141> . +<http://example.org/ns#a7142> <http://example.org/ns#a7142> <http://example.org/ns#a7142> . +<http://example.org/ns#a7143> <http://example.org/ns#a7143> <http://example.org/ns#a7143> . +<http://example.org/ns#a7144> <http://example.org/ns#a7144> <http://example.org/ns#a7144> . +<http://example.org/ns#a7145> <http://example.org/ns#a7145> <http://example.org/ns#a7145> . +<http://example.org/ns#a7146> <http://example.org/ns#a7146> <http://example.org/ns#a7146> . +<http://example.org/ns#a7147> <http://example.org/ns#a7147> <http://example.org/ns#a7147> . +<http://example.org/ns#a7148> <http://example.org/ns#a7148> <http://example.org/ns#a7148> . +<http://example.org/ns#a7149> <http://example.org/ns#a7149> <http://example.org/ns#a7149> . +<http://example.org/ns#a7150> <http://example.org/ns#a7150> <http://example.org/ns#a7150> . +<http://example.org/ns#a7151> <http://example.org/ns#a7151> <http://example.org/ns#a7151> . +<http://example.org/ns#a7152> <http://example.org/ns#a7152> <http://example.org/ns#a7152> . +<http://example.org/ns#a7153> <http://example.org/ns#a7153> <http://example.org/ns#a7153> . +<http://example.org/ns#a7154> <http://example.org/ns#a7154> <http://example.org/ns#a7154> . +<http://example.org/ns#a7155> <http://example.org/ns#a7155> <http://example.org/ns#a7155> . +<http://example.org/ns#a7156> <http://example.org/ns#a7156> <http://example.org/ns#a7156> . +<http://example.org/ns#a7157> <http://example.org/ns#a7157> <http://example.org/ns#a7157> . +<http://example.org/ns#a7158> <http://example.org/ns#a7158> <http://example.org/ns#a7158> . +<http://example.org/ns#a7159> <http://example.org/ns#a7159> <http://example.org/ns#a7159> . +<http://example.org/ns#a7160> <http://example.org/ns#a7160> <http://example.org/ns#a7160> . +<http://example.org/ns#a7161> <http://example.org/ns#a7161> <http://example.org/ns#a7161> . +<http://example.org/ns#a7162> <http://example.org/ns#a7162> <http://example.org/ns#a7162> . +<http://example.org/ns#a7163> <http://example.org/ns#a7163> <http://example.org/ns#a7163> . +<http://example.org/ns#a7164> <http://example.org/ns#a7164> <http://example.org/ns#a7164> . +<http://example.org/ns#a7165> <http://example.org/ns#a7165> <http://example.org/ns#a7165> . +<http://example.org/ns#a7166> <http://example.org/ns#a7166> <http://example.org/ns#a7166> . +<http://example.org/ns#a7167> <http://example.org/ns#a7167> <http://example.org/ns#a7167> . +<http://example.org/ns#a7168> <http://example.org/ns#a7168> <http://example.org/ns#a7168> . +<http://example.org/ns#a7169> <http://example.org/ns#a7169> <http://example.org/ns#a7169> . +<http://example.org/ns#a7170> <http://example.org/ns#a7170> <http://example.org/ns#a7170> . +<http://example.org/ns#a7171> <http://example.org/ns#a7171> <http://example.org/ns#a7171> . +<http://example.org/ns#a7172> <http://example.org/ns#a7172> <http://example.org/ns#a7172> . +<http://example.org/ns#a7173> <http://example.org/ns#a7173> <http://example.org/ns#a7173> . +<http://example.org/ns#a7174> <http://example.org/ns#a7174> <http://example.org/ns#a7174> . +<http://example.org/ns#a7175> <http://example.org/ns#a7175> <http://example.org/ns#a7175> . +<http://example.org/ns#a7176> <http://example.org/ns#a7176> <http://example.org/ns#a7176> . +<http://example.org/ns#a7177> <http://example.org/ns#a7177> <http://example.org/ns#a7177> . +<http://example.org/ns#a7178> <http://example.org/ns#a7178> <http://example.org/ns#a7178> . +<http://example.org/ns#a7179> <http://example.org/ns#a7179> <http://example.org/ns#a7179> . +<http://example.org/ns#a7180> <http://example.org/ns#a7180> <http://example.org/ns#a7180> . +<http://example.org/ns#a7181> <http://example.org/ns#a7181> <http://example.org/ns#a7181> . +<http://example.org/ns#a7182> <http://example.org/ns#a7182> <http://example.org/ns#a7182> . +<http://example.org/ns#a7183> <http://example.org/ns#a7183> <http://example.org/ns#a7183> . +<http://example.org/ns#a7184> <http://example.org/ns#a7184> <http://example.org/ns#a7184> . +<http://example.org/ns#a7185> <http://example.org/ns#a7185> <http://example.org/ns#a7185> . +<http://example.org/ns#a7186> <http://example.org/ns#a7186> <http://example.org/ns#a7186> . +<http://example.org/ns#a7187> <http://example.org/ns#a7187> <http://example.org/ns#a7187> . +<http://example.org/ns#a7188> <http://example.org/ns#a7188> <http://example.org/ns#a7188> . +<http://example.org/ns#a7189> <http://example.org/ns#a7189> <http://example.org/ns#a7189> . +<http://example.org/ns#a7190> <http://example.org/ns#a7190> <http://example.org/ns#a7190> . +<http://example.org/ns#a7191> <http://example.org/ns#a7191> <http://example.org/ns#a7191> . +<http://example.org/ns#a7192> <http://example.org/ns#a7192> <http://example.org/ns#a7192> . +<http://example.org/ns#a7193> <http://example.org/ns#a7193> <http://example.org/ns#a7193> . +<http://example.org/ns#a7194> <http://example.org/ns#a7194> <http://example.org/ns#a7194> . +<http://example.org/ns#a7195> <http://example.org/ns#a7195> <http://example.org/ns#a7195> . +<http://example.org/ns#a7196> <http://example.org/ns#a7196> <http://example.org/ns#a7196> . +<http://example.org/ns#a7197> <http://example.org/ns#a7197> <http://example.org/ns#a7197> . +<http://example.org/ns#a7198> <http://example.org/ns#a7198> <http://example.org/ns#a7198> . +<http://example.org/ns#a7199> <http://example.org/ns#a7199> <http://example.org/ns#a7199> . +<http://example.org/ns#a7200> <http://example.org/ns#a7200> <http://example.org/ns#a7200> . +<http://example.org/ns#a7201> <http://example.org/ns#a7201> <http://example.org/ns#a7201> . +<http://example.org/ns#a7202> <http://example.org/ns#a7202> <http://example.org/ns#a7202> . +<http://example.org/ns#a7203> <http://example.org/ns#a7203> <http://example.org/ns#a7203> . +<http://example.org/ns#a7204> <http://example.org/ns#a7204> <http://example.org/ns#a7204> . +<http://example.org/ns#a7205> <http://example.org/ns#a7205> <http://example.org/ns#a7205> . +<http://example.org/ns#a7206> <http://example.org/ns#a7206> <http://example.org/ns#a7206> . +<http://example.org/ns#a7207> <http://example.org/ns#a7207> <http://example.org/ns#a7207> . +<http://example.org/ns#a7208> <http://example.org/ns#a7208> <http://example.org/ns#a7208> . +<http://example.org/ns#a7209> <http://example.org/ns#a7209> <http://example.org/ns#a7209> . +<http://example.org/ns#a7210> <http://example.org/ns#a7210> <http://example.org/ns#a7210> . +<http://example.org/ns#a7211> <http://example.org/ns#a7211> <http://example.org/ns#a7211> . +<http://example.org/ns#a7212> <http://example.org/ns#a7212> <http://example.org/ns#a7212> . +<http://example.org/ns#a7213> <http://example.org/ns#a7213> <http://example.org/ns#a7213> . +<http://example.org/ns#a7214> <http://example.org/ns#a7214> <http://example.org/ns#a7214> . +<http://example.org/ns#a7215> <http://example.org/ns#a7215> <http://example.org/ns#a7215> . +<http://example.org/ns#a7216> <http://example.org/ns#a7216> <http://example.org/ns#a7216> . +<http://example.org/ns#a7217> <http://example.org/ns#a7217> <http://example.org/ns#a7217> . +<http://example.org/ns#a7218> <http://example.org/ns#a7218> <http://example.org/ns#a7218> . +<http://example.org/ns#a7219> <http://example.org/ns#a7219> <http://example.org/ns#a7219> . +<http://example.org/ns#a7220> <http://example.org/ns#a7220> <http://example.org/ns#a7220> . +<http://example.org/ns#a7221> <http://example.org/ns#a7221> <http://example.org/ns#a7221> . +<http://example.org/ns#a7222> <http://example.org/ns#a7222> <http://example.org/ns#a7222> . +<http://example.org/ns#a7223> <http://example.org/ns#a7223> <http://example.org/ns#a7223> . +<http://example.org/ns#a7224> <http://example.org/ns#a7224> <http://example.org/ns#a7224> . +<http://example.org/ns#a7225> <http://example.org/ns#a7225> <http://example.org/ns#a7225> . +<http://example.org/ns#a7226> <http://example.org/ns#a7226> <http://example.org/ns#a7226> . +<http://example.org/ns#a7227> <http://example.org/ns#a7227> <http://example.org/ns#a7227> . +<http://example.org/ns#a7228> <http://example.org/ns#a7228> <http://example.org/ns#a7228> . +<http://example.org/ns#a7229> <http://example.org/ns#a7229> <http://example.org/ns#a7229> . +<http://example.org/ns#a7230> <http://example.org/ns#a7230> <http://example.org/ns#a7230> . +<http://example.org/ns#a7231> <http://example.org/ns#a7231> <http://example.org/ns#a7231> . +<http://example.org/ns#a7232> <http://example.org/ns#a7232> <http://example.org/ns#a7232> . +<http://example.org/ns#a7233> <http://example.org/ns#a7233> <http://example.org/ns#a7233> . +<http://example.org/ns#a7234> <http://example.org/ns#a7234> <http://example.org/ns#a7234> . +<http://example.org/ns#a7235> <http://example.org/ns#a7235> <http://example.org/ns#a7235> . +<http://example.org/ns#a7236> <http://example.org/ns#a7236> <http://example.org/ns#a7236> . +<http://example.org/ns#a7237> <http://example.org/ns#a7237> <http://example.org/ns#a7237> . +<http://example.org/ns#a7238> <http://example.org/ns#a7238> <http://example.org/ns#a7238> . +<http://example.org/ns#a7239> <http://example.org/ns#a7239> <http://example.org/ns#a7239> . +<http://example.org/ns#a7240> <http://example.org/ns#a7240> <http://example.org/ns#a7240> . +<http://example.org/ns#a7241> <http://example.org/ns#a7241> <http://example.org/ns#a7241> . +<http://example.org/ns#a7242> <http://example.org/ns#a7242> <http://example.org/ns#a7242> . +<http://example.org/ns#a7243> <http://example.org/ns#a7243> <http://example.org/ns#a7243> . +<http://example.org/ns#a7244> <http://example.org/ns#a7244> <http://example.org/ns#a7244> . +<http://example.org/ns#a7245> <http://example.org/ns#a7245> <http://example.org/ns#a7245> . +<http://example.org/ns#a7246> <http://example.org/ns#a7246> <http://example.org/ns#a7246> . +<http://example.org/ns#a7247> <http://example.org/ns#a7247> <http://example.org/ns#a7247> . +<http://example.org/ns#a7248> <http://example.org/ns#a7248> <http://example.org/ns#a7248> . +<http://example.org/ns#a7249> <http://example.org/ns#a7249> <http://example.org/ns#a7249> . +<http://example.org/ns#a7250> <http://example.org/ns#a7250> <http://example.org/ns#a7250> . +<http://example.org/ns#a7251> <http://example.org/ns#a7251> <http://example.org/ns#a7251> . +<http://example.org/ns#a7252> <http://example.org/ns#a7252> <http://example.org/ns#a7252> . +<http://example.org/ns#a7253> <http://example.org/ns#a7253> <http://example.org/ns#a7253> . +<http://example.org/ns#a7254> <http://example.org/ns#a7254> <http://example.org/ns#a7254> . +<http://example.org/ns#a7255> <http://example.org/ns#a7255> <http://example.org/ns#a7255> . +<http://example.org/ns#a7256> <http://example.org/ns#a7256> <http://example.org/ns#a7256> . +<http://example.org/ns#a7257> <http://example.org/ns#a7257> <http://example.org/ns#a7257> . +<http://example.org/ns#a7258> <http://example.org/ns#a7258> <http://example.org/ns#a7258> . +<http://example.org/ns#a7259> <http://example.org/ns#a7259> <http://example.org/ns#a7259> . +<http://example.org/ns#a7260> <http://example.org/ns#a7260> <http://example.org/ns#a7260> . +<http://example.org/ns#a7261> <http://example.org/ns#a7261> <http://example.org/ns#a7261> . +<http://example.org/ns#a7262> <http://example.org/ns#a7262> <http://example.org/ns#a7262> . +<http://example.org/ns#a7263> <http://example.org/ns#a7263> <http://example.org/ns#a7263> . +<http://example.org/ns#a7264> <http://example.org/ns#a7264> <http://example.org/ns#a7264> . +<http://example.org/ns#a7265> <http://example.org/ns#a7265> <http://example.org/ns#a7265> . +<http://example.org/ns#a7266> <http://example.org/ns#a7266> <http://example.org/ns#a7266> . +<http://example.org/ns#a7267> <http://example.org/ns#a7267> <http://example.org/ns#a7267> . +<http://example.org/ns#a7268> <http://example.org/ns#a7268> <http://example.org/ns#a7268> . +<http://example.org/ns#a7269> <http://example.org/ns#a7269> <http://example.org/ns#a7269> . +<http://example.org/ns#a7270> <http://example.org/ns#a7270> <http://example.org/ns#a7270> . +<http://example.org/ns#a7271> <http://example.org/ns#a7271> <http://example.org/ns#a7271> . +<http://example.org/ns#a7272> <http://example.org/ns#a7272> <http://example.org/ns#a7272> . +<http://example.org/ns#a7273> <http://example.org/ns#a7273> <http://example.org/ns#a7273> . +<http://example.org/ns#a7274> <http://example.org/ns#a7274> <http://example.org/ns#a7274> . +<http://example.org/ns#a7275> <http://example.org/ns#a7275> <http://example.org/ns#a7275> . +<http://example.org/ns#a7276> <http://example.org/ns#a7276> <http://example.org/ns#a7276> . +<http://example.org/ns#a7277> <http://example.org/ns#a7277> <http://example.org/ns#a7277> . +<http://example.org/ns#a7278> <http://example.org/ns#a7278> <http://example.org/ns#a7278> . +<http://example.org/ns#a7279> <http://example.org/ns#a7279> <http://example.org/ns#a7279> . +<http://example.org/ns#a7280> <http://example.org/ns#a7280> <http://example.org/ns#a7280> . +<http://example.org/ns#a7281> <http://example.org/ns#a7281> <http://example.org/ns#a7281> . +<http://example.org/ns#a7282> <http://example.org/ns#a7282> <http://example.org/ns#a7282> . +<http://example.org/ns#a7283> <http://example.org/ns#a7283> <http://example.org/ns#a7283> . +<http://example.org/ns#a7284> <http://example.org/ns#a7284> <http://example.org/ns#a7284> . +<http://example.org/ns#a7285> <http://example.org/ns#a7285> <http://example.org/ns#a7285> . +<http://example.org/ns#a7286> <http://example.org/ns#a7286> <http://example.org/ns#a7286> . +<http://example.org/ns#a7287> <http://example.org/ns#a7287> <http://example.org/ns#a7287> . +<http://example.org/ns#a7288> <http://example.org/ns#a7288> <http://example.org/ns#a7288> . +<http://example.org/ns#a7289> <http://example.org/ns#a7289> <http://example.org/ns#a7289> . +<http://example.org/ns#a7290> <http://example.org/ns#a7290> <http://example.org/ns#a7290> . +<http://example.org/ns#a7291> <http://example.org/ns#a7291> <http://example.org/ns#a7291> . +<http://example.org/ns#a7292> <http://example.org/ns#a7292> <http://example.org/ns#a7292> . +<http://example.org/ns#a7293> <http://example.org/ns#a7293> <http://example.org/ns#a7293> . +<http://example.org/ns#a7294> <http://example.org/ns#a7294> <http://example.org/ns#a7294> . +<http://example.org/ns#a7295> <http://example.org/ns#a7295> <http://example.org/ns#a7295> . +<http://example.org/ns#a7296> <http://example.org/ns#a7296> <http://example.org/ns#a7296> . +<http://example.org/ns#a7297> <http://example.org/ns#a7297> <http://example.org/ns#a7297> . +<http://example.org/ns#a7298> <http://example.org/ns#a7298> <http://example.org/ns#a7298> . +<http://example.org/ns#a7299> <http://example.org/ns#a7299> <http://example.org/ns#a7299> . +<http://example.org/ns#a7300> <http://example.org/ns#a7300> <http://example.org/ns#a7300> . +<http://example.org/ns#a7301> <http://example.org/ns#a7301> <http://example.org/ns#a7301> . +<http://example.org/ns#a7302> <http://example.org/ns#a7302> <http://example.org/ns#a7302> . +<http://example.org/ns#a7303> <http://example.org/ns#a7303> <http://example.org/ns#a7303> . +<http://example.org/ns#a7304> <http://example.org/ns#a7304> <http://example.org/ns#a7304> . +<http://example.org/ns#a7305> <http://example.org/ns#a7305> <http://example.org/ns#a7305> . +<http://example.org/ns#a7306> <http://example.org/ns#a7306> <http://example.org/ns#a7306> . +<http://example.org/ns#a7307> <http://example.org/ns#a7307> <http://example.org/ns#a7307> . +<http://example.org/ns#a7308> <http://example.org/ns#a7308> <http://example.org/ns#a7308> . +<http://example.org/ns#a7309> <http://example.org/ns#a7309> <http://example.org/ns#a7309> . +<http://example.org/ns#a7310> <http://example.org/ns#a7310> <http://example.org/ns#a7310> . +<http://example.org/ns#a7311> <http://example.org/ns#a7311> <http://example.org/ns#a7311> . +<http://example.org/ns#a7312> <http://example.org/ns#a7312> <http://example.org/ns#a7312> . +<http://example.org/ns#a7313> <http://example.org/ns#a7313> <http://example.org/ns#a7313> . +<http://example.org/ns#a7314> <http://example.org/ns#a7314> <http://example.org/ns#a7314> . +<http://example.org/ns#a7315> <http://example.org/ns#a7315> <http://example.org/ns#a7315> . +<http://example.org/ns#a7316> <http://example.org/ns#a7316> <http://example.org/ns#a7316> . +<http://example.org/ns#a7317> <http://example.org/ns#a7317> <http://example.org/ns#a7317> . +<http://example.org/ns#a7318> <http://example.org/ns#a7318> <http://example.org/ns#a7318> . +<http://example.org/ns#a7319> <http://example.org/ns#a7319> <http://example.org/ns#a7319> . +<http://example.org/ns#a7320> <http://example.org/ns#a7320> <http://example.org/ns#a7320> . +<http://example.org/ns#a7321> <http://example.org/ns#a7321> <http://example.org/ns#a7321> . +<http://example.org/ns#a7322> <http://example.org/ns#a7322> <http://example.org/ns#a7322> . +<http://example.org/ns#a7323> <http://example.org/ns#a7323> <http://example.org/ns#a7323> . +<http://example.org/ns#a7324> <http://example.org/ns#a7324> <http://example.org/ns#a7324> . +<http://example.org/ns#a7325> <http://example.org/ns#a7325> <http://example.org/ns#a7325> . +<http://example.org/ns#a7326> <http://example.org/ns#a7326> <http://example.org/ns#a7326> . +<http://example.org/ns#a7327> <http://example.org/ns#a7327> <http://example.org/ns#a7327> . +<http://example.org/ns#a7328> <http://example.org/ns#a7328> <http://example.org/ns#a7328> . +<http://example.org/ns#a7329> <http://example.org/ns#a7329> <http://example.org/ns#a7329> . +<http://example.org/ns#a7330> <http://example.org/ns#a7330> <http://example.org/ns#a7330> . +<http://example.org/ns#a7331> <http://example.org/ns#a7331> <http://example.org/ns#a7331> . +<http://example.org/ns#a7332> <http://example.org/ns#a7332> <http://example.org/ns#a7332> . +<http://example.org/ns#a7333> <http://example.org/ns#a7333> <http://example.org/ns#a7333> . +<http://example.org/ns#a7334> <http://example.org/ns#a7334> <http://example.org/ns#a7334> . +<http://example.org/ns#a7335> <http://example.org/ns#a7335> <http://example.org/ns#a7335> . +<http://example.org/ns#a7336> <http://example.org/ns#a7336> <http://example.org/ns#a7336> . +<http://example.org/ns#a7337> <http://example.org/ns#a7337> <http://example.org/ns#a7337> . +<http://example.org/ns#a7338> <http://example.org/ns#a7338> <http://example.org/ns#a7338> . +<http://example.org/ns#a7339> <http://example.org/ns#a7339> <http://example.org/ns#a7339> . +<http://example.org/ns#a7340> <http://example.org/ns#a7340> <http://example.org/ns#a7340> . +<http://example.org/ns#a7341> <http://example.org/ns#a7341> <http://example.org/ns#a7341> . +<http://example.org/ns#a7342> <http://example.org/ns#a7342> <http://example.org/ns#a7342> . +<http://example.org/ns#a7343> <http://example.org/ns#a7343> <http://example.org/ns#a7343> . +<http://example.org/ns#a7344> <http://example.org/ns#a7344> <http://example.org/ns#a7344> . +<http://example.org/ns#a7345> <http://example.org/ns#a7345> <http://example.org/ns#a7345> . +<http://example.org/ns#a7346> <http://example.org/ns#a7346> <http://example.org/ns#a7346> . +<http://example.org/ns#a7347> <http://example.org/ns#a7347> <http://example.org/ns#a7347> . +<http://example.org/ns#a7348> <http://example.org/ns#a7348> <http://example.org/ns#a7348> . +<http://example.org/ns#a7349> <http://example.org/ns#a7349> <http://example.org/ns#a7349> . +<http://example.org/ns#a7350> <http://example.org/ns#a7350> <http://example.org/ns#a7350> . +<http://example.org/ns#a7351> <http://example.org/ns#a7351> <http://example.org/ns#a7351> . +<http://example.org/ns#a7352> <http://example.org/ns#a7352> <http://example.org/ns#a7352> . +<http://example.org/ns#a7353> <http://example.org/ns#a7353> <http://example.org/ns#a7353> . +<http://example.org/ns#a7354> <http://example.org/ns#a7354> <http://example.org/ns#a7354> . +<http://example.org/ns#a7355> <http://example.org/ns#a7355> <http://example.org/ns#a7355> . +<http://example.org/ns#a7356> <http://example.org/ns#a7356> <http://example.org/ns#a7356> . +<http://example.org/ns#a7357> <http://example.org/ns#a7357> <http://example.org/ns#a7357> . +<http://example.org/ns#a7358> <http://example.org/ns#a7358> <http://example.org/ns#a7358> . +<http://example.org/ns#a7359> <http://example.org/ns#a7359> <http://example.org/ns#a7359> . +<http://example.org/ns#a7360> <http://example.org/ns#a7360> <http://example.org/ns#a7360> . +<http://example.org/ns#a7361> <http://example.org/ns#a7361> <http://example.org/ns#a7361> . +<http://example.org/ns#a7362> <http://example.org/ns#a7362> <http://example.org/ns#a7362> . +<http://example.org/ns#a7363> <http://example.org/ns#a7363> <http://example.org/ns#a7363> . +<http://example.org/ns#a7364> <http://example.org/ns#a7364> <http://example.org/ns#a7364> . +<http://example.org/ns#a7365> <http://example.org/ns#a7365> <http://example.org/ns#a7365> . +<http://example.org/ns#a7366> <http://example.org/ns#a7366> <http://example.org/ns#a7366> . +<http://example.org/ns#a7367> <http://example.org/ns#a7367> <http://example.org/ns#a7367> . +<http://example.org/ns#a7368> <http://example.org/ns#a7368> <http://example.org/ns#a7368> . +<http://example.org/ns#a7369> <http://example.org/ns#a7369> <http://example.org/ns#a7369> . +<http://example.org/ns#a7370> <http://example.org/ns#a7370> <http://example.org/ns#a7370> . +<http://example.org/ns#a7371> <http://example.org/ns#a7371> <http://example.org/ns#a7371> . +<http://example.org/ns#a7372> <http://example.org/ns#a7372> <http://example.org/ns#a7372> . +<http://example.org/ns#a7373> <http://example.org/ns#a7373> <http://example.org/ns#a7373> . +<http://example.org/ns#a7374> <http://example.org/ns#a7374> <http://example.org/ns#a7374> . +<http://example.org/ns#a7375> <http://example.org/ns#a7375> <http://example.org/ns#a7375> . +<http://example.org/ns#a7376> <http://example.org/ns#a7376> <http://example.org/ns#a7376> . +<http://example.org/ns#a7377> <http://example.org/ns#a7377> <http://example.org/ns#a7377> . +<http://example.org/ns#a7378> <http://example.org/ns#a7378> <http://example.org/ns#a7378> . +<http://example.org/ns#a7379> <http://example.org/ns#a7379> <http://example.org/ns#a7379> . +<http://example.org/ns#a7380> <http://example.org/ns#a7380> <http://example.org/ns#a7380> . +<http://example.org/ns#a7381> <http://example.org/ns#a7381> <http://example.org/ns#a7381> . +<http://example.org/ns#a7382> <http://example.org/ns#a7382> <http://example.org/ns#a7382> . +<http://example.org/ns#a7383> <http://example.org/ns#a7383> <http://example.org/ns#a7383> . +<http://example.org/ns#a7384> <http://example.org/ns#a7384> <http://example.org/ns#a7384> . +<http://example.org/ns#a7385> <http://example.org/ns#a7385> <http://example.org/ns#a7385> . +<http://example.org/ns#a7386> <http://example.org/ns#a7386> <http://example.org/ns#a7386> . +<http://example.org/ns#a7387> <http://example.org/ns#a7387> <http://example.org/ns#a7387> . +<http://example.org/ns#a7388> <http://example.org/ns#a7388> <http://example.org/ns#a7388> . +<http://example.org/ns#a7389> <http://example.org/ns#a7389> <http://example.org/ns#a7389> . +<http://example.org/ns#a7390> <http://example.org/ns#a7390> <http://example.org/ns#a7390> . +<http://example.org/ns#a7391> <http://example.org/ns#a7391> <http://example.org/ns#a7391> . +<http://example.org/ns#a7392> <http://example.org/ns#a7392> <http://example.org/ns#a7392> . +<http://example.org/ns#a7393> <http://example.org/ns#a7393> <http://example.org/ns#a7393> . +<http://example.org/ns#a7394> <http://example.org/ns#a7394> <http://example.org/ns#a7394> . +<http://example.org/ns#a7395> <http://example.org/ns#a7395> <http://example.org/ns#a7395> . +<http://example.org/ns#a7396> <http://example.org/ns#a7396> <http://example.org/ns#a7396> . +<http://example.org/ns#a7397> <http://example.org/ns#a7397> <http://example.org/ns#a7397> . +<http://example.org/ns#a7398> <http://example.org/ns#a7398> <http://example.org/ns#a7398> . +<http://example.org/ns#a7399> <http://example.org/ns#a7399> <http://example.org/ns#a7399> . +<http://example.org/ns#a7400> <http://example.org/ns#a7400> <http://example.org/ns#a7400> . +<http://example.org/ns#a7401> <http://example.org/ns#a7401> <http://example.org/ns#a7401> . +<http://example.org/ns#a7402> <http://example.org/ns#a7402> <http://example.org/ns#a7402> . +<http://example.org/ns#a7403> <http://example.org/ns#a7403> <http://example.org/ns#a7403> . +<http://example.org/ns#a7404> <http://example.org/ns#a7404> <http://example.org/ns#a7404> . +<http://example.org/ns#a7405> <http://example.org/ns#a7405> <http://example.org/ns#a7405> . +<http://example.org/ns#a7406> <http://example.org/ns#a7406> <http://example.org/ns#a7406> . +<http://example.org/ns#a7407> <http://example.org/ns#a7407> <http://example.org/ns#a7407> . +<http://example.org/ns#a7408> <http://example.org/ns#a7408> <http://example.org/ns#a7408> . +<http://example.org/ns#a7409> <http://example.org/ns#a7409> <http://example.org/ns#a7409> . +<http://example.org/ns#a7410> <http://example.org/ns#a7410> <http://example.org/ns#a7410> . +<http://example.org/ns#a7411> <http://example.org/ns#a7411> <http://example.org/ns#a7411> . +<http://example.org/ns#a7412> <http://example.org/ns#a7412> <http://example.org/ns#a7412> . +<http://example.org/ns#a7413> <http://example.org/ns#a7413> <http://example.org/ns#a7413> . +<http://example.org/ns#a7414> <http://example.org/ns#a7414> <http://example.org/ns#a7414> . +<http://example.org/ns#a7415> <http://example.org/ns#a7415> <http://example.org/ns#a7415> . +<http://example.org/ns#a7416> <http://example.org/ns#a7416> <http://example.org/ns#a7416> . +<http://example.org/ns#a7417> <http://example.org/ns#a7417> <http://example.org/ns#a7417> . +<http://example.org/ns#a7418> <http://example.org/ns#a7418> <http://example.org/ns#a7418> . +<http://example.org/ns#a7419> <http://example.org/ns#a7419> <http://example.org/ns#a7419> . +<http://example.org/ns#a7420> <http://example.org/ns#a7420> <http://example.org/ns#a7420> . +<http://example.org/ns#a7421> <http://example.org/ns#a7421> <http://example.org/ns#a7421> . +<http://example.org/ns#a7422> <http://example.org/ns#a7422> <http://example.org/ns#a7422> . +<http://example.org/ns#a7423> <http://example.org/ns#a7423> <http://example.org/ns#a7423> . +<http://example.org/ns#a7424> <http://example.org/ns#a7424> <http://example.org/ns#a7424> . +<http://example.org/ns#a7425> <http://example.org/ns#a7425> <http://example.org/ns#a7425> . +<http://example.org/ns#a7426> <http://example.org/ns#a7426> <http://example.org/ns#a7426> . +<http://example.org/ns#a7427> <http://example.org/ns#a7427> <http://example.org/ns#a7427> . +<http://example.org/ns#a7428> <http://example.org/ns#a7428> <http://example.org/ns#a7428> . +<http://example.org/ns#a7429> <http://example.org/ns#a7429> <http://example.org/ns#a7429> . +<http://example.org/ns#a7430> <http://example.org/ns#a7430> <http://example.org/ns#a7430> . +<http://example.org/ns#a7431> <http://example.org/ns#a7431> <http://example.org/ns#a7431> . +<http://example.org/ns#a7432> <http://example.org/ns#a7432> <http://example.org/ns#a7432> . +<http://example.org/ns#a7433> <http://example.org/ns#a7433> <http://example.org/ns#a7433> . +<http://example.org/ns#a7434> <http://example.org/ns#a7434> <http://example.org/ns#a7434> . +<http://example.org/ns#a7435> <http://example.org/ns#a7435> <http://example.org/ns#a7435> . +<http://example.org/ns#a7436> <http://example.org/ns#a7436> <http://example.org/ns#a7436> . +<http://example.org/ns#a7437> <http://example.org/ns#a7437> <http://example.org/ns#a7437> . +<http://example.org/ns#a7438> <http://example.org/ns#a7438> <http://example.org/ns#a7438> . +<http://example.org/ns#a7439> <http://example.org/ns#a7439> <http://example.org/ns#a7439> . +<http://example.org/ns#a7440> <http://example.org/ns#a7440> <http://example.org/ns#a7440> . +<http://example.org/ns#a7441> <http://example.org/ns#a7441> <http://example.org/ns#a7441> . +<http://example.org/ns#a7442> <http://example.org/ns#a7442> <http://example.org/ns#a7442> . +<http://example.org/ns#a7443> <http://example.org/ns#a7443> <http://example.org/ns#a7443> . +<http://example.org/ns#a7444> <http://example.org/ns#a7444> <http://example.org/ns#a7444> . +<http://example.org/ns#a7445> <http://example.org/ns#a7445> <http://example.org/ns#a7445> . +<http://example.org/ns#a7446> <http://example.org/ns#a7446> <http://example.org/ns#a7446> . +<http://example.org/ns#a7447> <http://example.org/ns#a7447> <http://example.org/ns#a7447> . +<http://example.org/ns#a7448> <http://example.org/ns#a7448> <http://example.org/ns#a7448> . +<http://example.org/ns#a7449> <http://example.org/ns#a7449> <http://example.org/ns#a7449> . +<http://example.org/ns#a7450> <http://example.org/ns#a7450> <http://example.org/ns#a7450> . +<http://example.org/ns#a7451> <http://example.org/ns#a7451> <http://example.org/ns#a7451> . +<http://example.org/ns#a7452> <http://example.org/ns#a7452> <http://example.org/ns#a7452> . +<http://example.org/ns#a7453> <http://example.org/ns#a7453> <http://example.org/ns#a7453> . +<http://example.org/ns#a7454> <http://example.org/ns#a7454> <http://example.org/ns#a7454> . +<http://example.org/ns#a7455> <http://example.org/ns#a7455> <http://example.org/ns#a7455> . +<http://example.org/ns#a7456> <http://example.org/ns#a7456> <http://example.org/ns#a7456> . +<http://example.org/ns#a7457> <http://example.org/ns#a7457> <http://example.org/ns#a7457> . +<http://example.org/ns#a7458> <http://example.org/ns#a7458> <http://example.org/ns#a7458> . +<http://example.org/ns#a7459> <http://example.org/ns#a7459> <http://example.org/ns#a7459> . +<http://example.org/ns#a7460> <http://example.org/ns#a7460> <http://example.org/ns#a7460> . +<http://example.org/ns#a7461> <http://example.org/ns#a7461> <http://example.org/ns#a7461> . +<http://example.org/ns#a7462> <http://example.org/ns#a7462> <http://example.org/ns#a7462> . +<http://example.org/ns#a7463> <http://example.org/ns#a7463> <http://example.org/ns#a7463> . +<http://example.org/ns#a7464> <http://example.org/ns#a7464> <http://example.org/ns#a7464> . +<http://example.org/ns#a7465> <http://example.org/ns#a7465> <http://example.org/ns#a7465> . +<http://example.org/ns#a7466> <http://example.org/ns#a7466> <http://example.org/ns#a7466> . +<http://example.org/ns#a7467> <http://example.org/ns#a7467> <http://example.org/ns#a7467> . +<http://example.org/ns#a7468> <http://example.org/ns#a7468> <http://example.org/ns#a7468> . +<http://example.org/ns#a7469> <http://example.org/ns#a7469> <http://example.org/ns#a7469> . +<http://example.org/ns#a7470> <http://example.org/ns#a7470> <http://example.org/ns#a7470> . +<http://example.org/ns#a7471> <http://example.org/ns#a7471> <http://example.org/ns#a7471> . +<http://example.org/ns#a7472> <http://example.org/ns#a7472> <http://example.org/ns#a7472> . +<http://example.org/ns#a7473> <http://example.org/ns#a7473> <http://example.org/ns#a7473> . +<http://example.org/ns#a7474> <http://example.org/ns#a7474> <http://example.org/ns#a7474> . +<http://example.org/ns#a7475> <http://example.org/ns#a7475> <http://example.org/ns#a7475> . +<http://example.org/ns#a7476> <http://example.org/ns#a7476> <http://example.org/ns#a7476> . +<http://example.org/ns#a7477> <http://example.org/ns#a7477> <http://example.org/ns#a7477> . +<http://example.org/ns#a7478> <http://example.org/ns#a7478> <http://example.org/ns#a7478> . +<http://example.org/ns#a7479> <http://example.org/ns#a7479> <http://example.org/ns#a7479> . +<http://example.org/ns#a7480> <http://example.org/ns#a7480> <http://example.org/ns#a7480> . +<http://example.org/ns#a7481> <http://example.org/ns#a7481> <http://example.org/ns#a7481> . +<http://example.org/ns#a7482> <http://example.org/ns#a7482> <http://example.org/ns#a7482> . +<http://example.org/ns#a7483> <http://example.org/ns#a7483> <http://example.org/ns#a7483> . +<http://example.org/ns#a7484> <http://example.org/ns#a7484> <http://example.org/ns#a7484> . +<http://example.org/ns#a7485> <http://example.org/ns#a7485> <http://example.org/ns#a7485> . +<http://example.org/ns#a7486> <http://example.org/ns#a7486> <http://example.org/ns#a7486> . +<http://example.org/ns#a7487> <http://example.org/ns#a7487> <http://example.org/ns#a7487> . +<http://example.org/ns#a7488> <http://example.org/ns#a7488> <http://example.org/ns#a7488> . +<http://example.org/ns#a7489> <http://example.org/ns#a7489> <http://example.org/ns#a7489> . +<http://example.org/ns#a7490> <http://example.org/ns#a7490> <http://example.org/ns#a7490> . +<http://example.org/ns#a7491> <http://example.org/ns#a7491> <http://example.org/ns#a7491> . +<http://example.org/ns#a7492> <http://example.org/ns#a7492> <http://example.org/ns#a7492> . +<http://example.org/ns#a7493> <http://example.org/ns#a7493> <http://example.org/ns#a7493> . +<http://example.org/ns#a7494> <http://example.org/ns#a7494> <http://example.org/ns#a7494> . +<http://example.org/ns#a7495> <http://example.org/ns#a7495> <http://example.org/ns#a7495> . +<http://example.org/ns#a7496> <http://example.org/ns#a7496> <http://example.org/ns#a7496> . +<http://example.org/ns#a7497> <http://example.org/ns#a7497> <http://example.org/ns#a7497> . +<http://example.org/ns#a7498> <http://example.org/ns#a7498> <http://example.org/ns#a7498> . +<http://example.org/ns#a7499> <http://example.org/ns#a7499> <http://example.org/ns#a7499> . +<http://example.org/ns#a7500> <http://example.org/ns#a7500> <http://example.org/ns#a7500> . +<http://example.org/ns#a7501> <http://example.org/ns#a7501> <http://example.org/ns#a7501> . +<http://example.org/ns#a7502> <http://example.org/ns#a7502> <http://example.org/ns#a7502> . +<http://example.org/ns#a7503> <http://example.org/ns#a7503> <http://example.org/ns#a7503> . +<http://example.org/ns#a7504> <http://example.org/ns#a7504> <http://example.org/ns#a7504> . +<http://example.org/ns#a7505> <http://example.org/ns#a7505> <http://example.org/ns#a7505> . +<http://example.org/ns#a7506> <http://example.org/ns#a7506> <http://example.org/ns#a7506> . +<http://example.org/ns#a7507> <http://example.org/ns#a7507> <http://example.org/ns#a7507> . +<http://example.org/ns#a7508> <http://example.org/ns#a7508> <http://example.org/ns#a7508> . +<http://example.org/ns#a7509> <http://example.org/ns#a7509> <http://example.org/ns#a7509> . +<http://example.org/ns#a7510> <http://example.org/ns#a7510> <http://example.org/ns#a7510> . +<http://example.org/ns#a7511> <http://example.org/ns#a7511> <http://example.org/ns#a7511> . +<http://example.org/ns#a7512> <http://example.org/ns#a7512> <http://example.org/ns#a7512> . +<http://example.org/ns#a7513> <http://example.org/ns#a7513> <http://example.org/ns#a7513> . +<http://example.org/ns#a7514> <http://example.org/ns#a7514> <http://example.org/ns#a7514> . +<http://example.org/ns#a7515> <http://example.org/ns#a7515> <http://example.org/ns#a7515> . +<http://example.org/ns#a7516> <http://example.org/ns#a7516> <http://example.org/ns#a7516> . +<http://example.org/ns#a7517> <http://example.org/ns#a7517> <http://example.org/ns#a7517> . +<http://example.org/ns#a7518> <http://example.org/ns#a7518> <http://example.org/ns#a7518> . +<http://example.org/ns#a7519> <http://example.org/ns#a7519> <http://example.org/ns#a7519> . +<http://example.org/ns#a7520> <http://example.org/ns#a7520> <http://example.org/ns#a7520> . +<http://example.org/ns#a7521> <http://example.org/ns#a7521> <http://example.org/ns#a7521> . +<http://example.org/ns#a7522> <http://example.org/ns#a7522> <http://example.org/ns#a7522> . +<http://example.org/ns#a7523> <http://example.org/ns#a7523> <http://example.org/ns#a7523> . +<http://example.org/ns#a7524> <http://example.org/ns#a7524> <http://example.org/ns#a7524> . +<http://example.org/ns#a7525> <http://example.org/ns#a7525> <http://example.org/ns#a7525> . +<http://example.org/ns#a7526> <http://example.org/ns#a7526> <http://example.org/ns#a7526> . +<http://example.org/ns#a7527> <http://example.org/ns#a7527> <http://example.org/ns#a7527> . +<http://example.org/ns#a7528> <http://example.org/ns#a7528> <http://example.org/ns#a7528> . +<http://example.org/ns#a7529> <http://example.org/ns#a7529> <http://example.org/ns#a7529> . +<http://example.org/ns#a7530> <http://example.org/ns#a7530> <http://example.org/ns#a7530> . +<http://example.org/ns#a7531> <http://example.org/ns#a7531> <http://example.org/ns#a7531> . +<http://example.org/ns#a7532> <http://example.org/ns#a7532> <http://example.org/ns#a7532> . +<http://example.org/ns#a7533> <http://example.org/ns#a7533> <http://example.org/ns#a7533> . +<http://example.org/ns#a7534> <http://example.org/ns#a7534> <http://example.org/ns#a7534> . +<http://example.org/ns#a7535> <http://example.org/ns#a7535> <http://example.org/ns#a7535> . +<http://example.org/ns#a7536> <http://example.org/ns#a7536> <http://example.org/ns#a7536> . +<http://example.org/ns#a7537> <http://example.org/ns#a7537> <http://example.org/ns#a7537> . +<http://example.org/ns#a7538> <http://example.org/ns#a7538> <http://example.org/ns#a7538> . +<http://example.org/ns#a7539> <http://example.org/ns#a7539> <http://example.org/ns#a7539> . +<http://example.org/ns#a7540> <http://example.org/ns#a7540> <http://example.org/ns#a7540> . +<http://example.org/ns#a7541> <http://example.org/ns#a7541> <http://example.org/ns#a7541> . +<http://example.org/ns#a7542> <http://example.org/ns#a7542> <http://example.org/ns#a7542> . +<http://example.org/ns#a7543> <http://example.org/ns#a7543> <http://example.org/ns#a7543> . +<http://example.org/ns#a7544> <http://example.org/ns#a7544> <http://example.org/ns#a7544> . +<http://example.org/ns#a7545> <http://example.org/ns#a7545> <http://example.org/ns#a7545> . +<http://example.org/ns#a7546> <http://example.org/ns#a7546> <http://example.org/ns#a7546> . +<http://example.org/ns#a7547> <http://example.org/ns#a7547> <http://example.org/ns#a7547> . +<http://example.org/ns#a7548> <http://example.org/ns#a7548> <http://example.org/ns#a7548> . +<http://example.org/ns#a7549> <http://example.org/ns#a7549> <http://example.org/ns#a7549> . +<http://example.org/ns#a7550> <http://example.org/ns#a7550> <http://example.org/ns#a7550> . +<http://example.org/ns#a7551> <http://example.org/ns#a7551> <http://example.org/ns#a7551> . +<http://example.org/ns#a7552> <http://example.org/ns#a7552> <http://example.org/ns#a7552> . +<http://example.org/ns#a7553> <http://example.org/ns#a7553> <http://example.org/ns#a7553> . +<http://example.org/ns#a7554> <http://example.org/ns#a7554> <http://example.org/ns#a7554> . +<http://example.org/ns#a7555> <http://example.org/ns#a7555> <http://example.org/ns#a7555> . +<http://example.org/ns#a7556> <http://example.org/ns#a7556> <http://example.org/ns#a7556> . +<http://example.org/ns#a7557> <http://example.org/ns#a7557> <http://example.org/ns#a7557> . +<http://example.org/ns#a7558> <http://example.org/ns#a7558> <http://example.org/ns#a7558> . +<http://example.org/ns#a7559> <http://example.org/ns#a7559> <http://example.org/ns#a7559> . +<http://example.org/ns#a7560> <http://example.org/ns#a7560> <http://example.org/ns#a7560> . +<http://example.org/ns#a7561> <http://example.org/ns#a7561> <http://example.org/ns#a7561> . +<http://example.org/ns#a7562> <http://example.org/ns#a7562> <http://example.org/ns#a7562> . +<http://example.org/ns#a7563> <http://example.org/ns#a7563> <http://example.org/ns#a7563> . +<http://example.org/ns#a7564> <http://example.org/ns#a7564> <http://example.org/ns#a7564> . +<http://example.org/ns#a7565> <http://example.org/ns#a7565> <http://example.org/ns#a7565> . +<http://example.org/ns#a7566> <http://example.org/ns#a7566> <http://example.org/ns#a7566> . +<http://example.org/ns#a7567> <http://example.org/ns#a7567> <http://example.org/ns#a7567> . +<http://example.org/ns#a7568> <http://example.org/ns#a7568> <http://example.org/ns#a7568> . +<http://example.org/ns#a7569> <http://example.org/ns#a7569> <http://example.org/ns#a7569> . +<http://example.org/ns#a7570> <http://example.org/ns#a7570> <http://example.org/ns#a7570> . +<http://example.org/ns#a7571> <http://example.org/ns#a7571> <http://example.org/ns#a7571> . +<http://example.org/ns#a7572> <http://example.org/ns#a7572> <http://example.org/ns#a7572> . +<http://example.org/ns#a7573> <http://example.org/ns#a7573> <http://example.org/ns#a7573> . +<http://example.org/ns#a7574> <http://example.org/ns#a7574> <http://example.org/ns#a7574> . +<http://example.org/ns#a7575> <http://example.org/ns#a7575> <http://example.org/ns#a7575> . +<http://example.org/ns#a7576> <http://example.org/ns#a7576> <http://example.org/ns#a7576> . +<http://example.org/ns#a7577> <http://example.org/ns#a7577> <http://example.org/ns#a7577> . +<http://example.org/ns#a7578> <http://example.org/ns#a7578> <http://example.org/ns#a7578> . +<http://example.org/ns#a7579> <http://example.org/ns#a7579> <http://example.org/ns#a7579> . +<http://example.org/ns#a7580> <http://example.org/ns#a7580> <http://example.org/ns#a7580> . +<http://example.org/ns#a7581> <http://example.org/ns#a7581> <http://example.org/ns#a7581> . +<http://example.org/ns#a7582> <http://example.org/ns#a7582> <http://example.org/ns#a7582> . +<http://example.org/ns#a7583> <http://example.org/ns#a7583> <http://example.org/ns#a7583> . +<http://example.org/ns#a7584> <http://example.org/ns#a7584> <http://example.org/ns#a7584> . +<http://example.org/ns#a7585> <http://example.org/ns#a7585> <http://example.org/ns#a7585> . +<http://example.org/ns#a7586> <http://example.org/ns#a7586> <http://example.org/ns#a7586> . +<http://example.org/ns#a7587> <http://example.org/ns#a7587> <http://example.org/ns#a7587> . +<http://example.org/ns#a7588> <http://example.org/ns#a7588> <http://example.org/ns#a7588> . +<http://example.org/ns#a7589> <http://example.org/ns#a7589> <http://example.org/ns#a7589> . +<http://example.org/ns#a7590> <http://example.org/ns#a7590> <http://example.org/ns#a7590> . +<http://example.org/ns#a7591> <http://example.org/ns#a7591> <http://example.org/ns#a7591> . +<http://example.org/ns#a7592> <http://example.org/ns#a7592> <http://example.org/ns#a7592> . +<http://example.org/ns#a7593> <http://example.org/ns#a7593> <http://example.org/ns#a7593> . +<http://example.org/ns#a7594> <http://example.org/ns#a7594> <http://example.org/ns#a7594> . +<http://example.org/ns#a7595> <http://example.org/ns#a7595> <http://example.org/ns#a7595> . +<http://example.org/ns#a7596> <http://example.org/ns#a7596> <http://example.org/ns#a7596> . +<http://example.org/ns#a7597> <http://example.org/ns#a7597> <http://example.org/ns#a7597> . +<http://example.org/ns#a7598> <http://example.org/ns#a7598> <http://example.org/ns#a7598> . +<http://example.org/ns#a7599> <http://example.org/ns#a7599> <http://example.org/ns#a7599> . +<http://example.org/ns#a7600> <http://example.org/ns#a7600> <http://example.org/ns#a7600> . +<http://example.org/ns#a7601> <http://example.org/ns#a7601> <http://example.org/ns#a7601> . +<http://example.org/ns#a7602> <http://example.org/ns#a7602> <http://example.org/ns#a7602> . +<http://example.org/ns#a7603> <http://example.org/ns#a7603> <http://example.org/ns#a7603> . +<http://example.org/ns#a7604> <http://example.org/ns#a7604> <http://example.org/ns#a7604> . +<http://example.org/ns#a7605> <http://example.org/ns#a7605> <http://example.org/ns#a7605> . +<http://example.org/ns#a7606> <http://example.org/ns#a7606> <http://example.org/ns#a7606> . +<http://example.org/ns#a7607> <http://example.org/ns#a7607> <http://example.org/ns#a7607> . +<http://example.org/ns#a7608> <http://example.org/ns#a7608> <http://example.org/ns#a7608> . +<http://example.org/ns#a7609> <http://example.org/ns#a7609> <http://example.org/ns#a7609> . +<http://example.org/ns#a7610> <http://example.org/ns#a7610> <http://example.org/ns#a7610> . +<http://example.org/ns#a7611> <http://example.org/ns#a7611> <http://example.org/ns#a7611> . +<http://example.org/ns#a7612> <http://example.org/ns#a7612> <http://example.org/ns#a7612> . +<http://example.org/ns#a7613> <http://example.org/ns#a7613> <http://example.org/ns#a7613> . +<http://example.org/ns#a7614> <http://example.org/ns#a7614> <http://example.org/ns#a7614> . +<http://example.org/ns#a7615> <http://example.org/ns#a7615> <http://example.org/ns#a7615> . +<http://example.org/ns#a7616> <http://example.org/ns#a7616> <http://example.org/ns#a7616> . +<http://example.org/ns#a7617> <http://example.org/ns#a7617> <http://example.org/ns#a7617> . +<http://example.org/ns#a7618> <http://example.org/ns#a7618> <http://example.org/ns#a7618> . +<http://example.org/ns#a7619> <http://example.org/ns#a7619> <http://example.org/ns#a7619> . +<http://example.org/ns#a7620> <http://example.org/ns#a7620> <http://example.org/ns#a7620> . +<http://example.org/ns#a7621> <http://example.org/ns#a7621> <http://example.org/ns#a7621> . +<http://example.org/ns#a7622> <http://example.org/ns#a7622> <http://example.org/ns#a7622> . +<http://example.org/ns#a7623> <http://example.org/ns#a7623> <http://example.org/ns#a7623> . +<http://example.org/ns#a7624> <http://example.org/ns#a7624> <http://example.org/ns#a7624> . +<http://example.org/ns#a7625> <http://example.org/ns#a7625> <http://example.org/ns#a7625> . +<http://example.org/ns#a7626> <http://example.org/ns#a7626> <http://example.org/ns#a7626> . +<http://example.org/ns#a7627> <http://example.org/ns#a7627> <http://example.org/ns#a7627> . +<http://example.org/ns#a7628> <http://example.org/ns#a7628> <http://example.org/ns#a7628> . +<http://example.org/ns#a7629> <http://example.org/ns#a7629> <http://example.org/ns#a7629> . +<http://example.org/ns#a7630> <http://example.org/ns#a7630> <http://example.org/ns#a7630> . +<http://example.org/ns#a7631> <http://example.org/ns#a7631> <http://example.org/ns#a7631> . +<http://example.org/ns#a7632> <http://example.org/ns#a7632> <http://example.org/ns#a7632> . +<http://example.org/ns#a7633> <http://example.org/ns#a7633> <http://example.org/ns#a7633> . +<http://example.org/ns#a7634> <http://example.org/ns#a7634> <http://example.org/ns#a7634> . +<http://example.org/ns#a7635> <http://example.org/ns#a7635> <http://example.org/ns#a7635> . +<http://example.org/ns#a7636> <http://example.org/ns#a7636> <http://example.org/ns#a7636> . +<http://example.org/ns#a7637> <http://example.org/ns#a7637> <http://example.org/ns#a7637> . +<http://example.org/ns#a7638> <http://example.org/ns#a7638> <http://example.org/ns#a7638> . +<http://example.org/ns#a7639> <http://example.org/ns#a7639> <http://example.org/ns#a7639> . +<http://example.org/ns#a7640> <http://example.org/ns#a7640> <http://example.org/ns#a7640> . +<http://example.org/ns#a7641> <http://example.org/ns#a7641> <http://example.org/ns#a7641> . +<http://example.org/ns#a7642> <http://example.org/ns#a7642> <http://example.org/ns#a7642> . +<http://example.org/ns#a7643> <http://example.org/ns#a7643> <http://example.org/ns#a7643> . +<http://example.org/ns#a7644> <http://example.org/ns#a7644> <http://example.org/ns#a7644> . +<http://example.org/ns#a7645> <http://example.org/ns#a7645> <http://example.org/ns#a7645> . +<http://example.org/ns#a7646> <http://example.org/ns#a7646> <http://example.org/ns#a7646> . +<http://example.org/ns#a7647> <http://example.org/ns#a7647> <http://example.org/ns#a7647> . +<http://example.org/ns#a7648> <http://example.org/ns#a7648> <http://example.org/ns#a7648> . +<http://example.org/ns#a7649> <http://example.org/ns#a7649> <http://example.org/ns#a7649> . +<http://example.org/ns#a7650> <http://example.org/ns#a7650> <http://example.org/ns#a7650> . +<http://example.org/ns#a7651> <http://example.org/ns#a7651> <http://example.org/ns#a7651> . +<http://example.org/ns#a7652> <http://example.org/ns#a7652> <http://example.org/ns#a7652> . +<http://example.org/ns#a7653> <http://example.org/ns#a7653> <http://example.org/ns#a7653> . +<http://example.org/ns#a7654> <http://example.org/ns#a7654> <http://example.org/ns#a7654> . +<http://example.org/ns#a7655> <http://example.org/ns#a7655> <http://example.org/ns#a7655> . +<http://example.org/ns#a7656> <http://example.org/ns#a7656> <http://example.org/ns#a7656> . +<http://example.org/ns#a7657> <http://example.org/ns#a7657> <http://example.org/ns#a7657> . +<http://example.org/ns#a7658> <http://example.org/ns#a7658> <http://example.org/ns#a7658> . +<http://example.org/ns#a7659> <http://example.org/ns#a7659> <http://example.org/ns#a7659> . +<http://example.org/ns#a7660> <http://example.org/ns#a7660> <http://example.org/ns#a7660> . +<http://example.org/ns#a7661> <http://example.org/ns#a7661> <http://example.org/ns#a7661> . +<http://example.org/ns#a7662> <http://example.org/ns#a7662> <http://example.org/ns#a7662> . +<http://example.org/ns#a7663> <http://example.org/ns#a7663> <http://example.org/ns#a7663> . +<http://example.org/ns#a7664> <http://example.org/ns#a7664> <http://example.org/ns#a7664> . +<http://example.org/ns#a7665> <http://example.org/ns#a7665> <http://example.org/ns#a7665> . +<http://example.org/ns#a7666> <http://example.org/ns#a7666> <http://example.org/ns#a7666> . +<http://example.org/ns#a7667> <http://example.org/ns#a7667> <http://example.org/ns#a7667> . +<http://example.org/ns#a7668> <http://example.org/ns#a7668> <http://example.org/ns#a7668> . +<http://example.org/ns#a7669> <http://example.org/ns#a7669> <http://example.org/ns#a7669> . +<http://example.org/ns#a7670> <http://example.org/ns#a7670> <http://example.org/ns#a7670> . +<http://example.org/ns#a7671> <http://example.org/ns#a7671> <http://example.org/ns#a7671> . +<http://example.org/ns#a7672> <http://example.org/ns#a7672> <http://example.org/ns#a7672> . +<http://example.org/ns#a7673> <http://example.org/ns#a7673> <http://example.org/ns#a7673> . +<http://example.org/ns#a7674> <http://example.org/ns#a7674> <http://example.org/ns#a7674> . +<http://example.org/ns#a7675> <http://example.org/ns#a7675> <http://example.org/ns#a7675> . +<http://example.org/ns#a7676> <http://example.org/ns#a7676> <http://example.org/ns#a7676> . +<http://example.org/ns#a7677> <http://example.org/ns#a7677> <http://example.org/ns#a7677> . +<http://example.org/ns#a7678> <http://example.org/ns#a7678> <http://example.org/ns#a7678> . +<http://example.org/ns#a7679> <http://example.org/ns#a7679> <http://example.org/ns#a7679> . +<http://example.org/ns#a7680> <http://example.org/ns#a7680> <http://example.org/ns#a7680> . +<http://example.org/ns#a7681> <http://example.org/ns#a7681> <http://example.org/ns#a7681> . +<http://example.org/ns#a7682> <http://example.org/ns#a7682> <http://example.org/ns#a7682> . +<http://example.org/ns#a7683> <http://example.org/ns#a7683> <http://example.org/ns#a7683> . +<http://example.org/ns#a7684> <http://example.org/ns#a7684> <http://example.org/ns#a7684> . +<http://example.org/ns#a7685> <http://example.org/ns#a7685> <http://example.org/ns#a7685> . +<http://example.org/ns#a7686> <http://example.org/ns#a7686> <http://example.org/ns#a7686> . +<http://example.org/ns#a7687> <http://example.org/ns#a7687> <http://example.org/ns#a7687> . +<http://example.org/ns#a7688> <http://example.org/ns#a7688> <http://example.org/ns#a7688> . +<http://example.org/ns#a7689> <http://example.org/ns#a7689> <http://example.org/ns#a7689> . +<http://example.org/ns#a7690> <http://example.org/ns#a7690> <http://example.org/ns#a7690> . +<http://example.org/ns#a7691> <http://example.org/ns#a7691> <http://example.org/ns#a7691> . +<http://example.org/ns#a7692> <http://example.org/ns#a7692> <http://example.org/ns#a7692> . +<http://example.org/ns#a7693> <http://example.org/ns#a7693> <http://example.org/ns#a7693> . +<http://example.org/ns#a7694> <http://example.org/ns#a7694> <http://example.org/ns#a7694> . +<http://example.org/ns#a7695> <http://example.org/ns#a7695> <http://example.org/ns#a7695> . +<http://example.org/ns#a7696> <http://example.org/ns#a7696> <http://example.org/ns#a7696> . +<http://example.org/ns#a7697> <http://example.org/ns#a7697> <http://example.org/ns#a7697> . +<http://example.org/ns#a7698> <http://example.org/ns#a7698> <http://example.org/ns#a7698> . +<http://example.org/ns#a7699> <http://example.org/ns#a7699> <http://example.org/ns#a7699> . +<http://example.org/ns#a7700> <http://example.org/ns#a7700> <http://example.org/ns#a7700> . +<http://example.org/ns#a7701> <http://example.org/ns#a7701> <http://example.org/ns#a7701> . +<http://example.org/ns#a7702> <http://example.org/ns#a7702> <http://example.org/ns#a7702> . +<http://example.org/ns#a7703> <http://example.org/ns#a7703> <http://example.org/ns#a7703> . +<http://example.org/ns#a7704> <http://example.org/ns#a7704> <http://example.org/ns#a7704> . +<http://example.org/ns#a7705> <http://example.org/ns#a7705> <http://example.org/ns#a7705> . +<http://example.org/ns#a7706> <http://example.org/ns#a7706> <http://example.org/ns#a7706> . +<http://example.org/ns#a7707> <http://example.org/ns#a7707> <http://example.org/ns#a7707> . +<http://example.org/ns#a7708> <http://example.org/ns#a7708> <http://example.org/ns#a7708> . +<http://example.org/ns#a7709> <http://example.org/ns#a7709> <http://example.org/ns#a7709> . +<http://example.org/ns#a7710> <http://example.org/ns#a7710> <http://example.org/ns#a7710> . +<http://example.org/ns#a7711> <http://example.org/ns#a7711> <http://example.org/ns#a7711> . +<http://example.org/ns#a7712> <http://example.org/ns#a7712> <http://example.org/ns#a7712> . +<http://example.org/ns#a7713> <http://example.org/ns#a7713> <http://example.org/ns#a7713> . +<http://example.org/ns#a7714> <http://example.org/ns#a7714> <http://example.org/ns#a7714> . +<http://example.org/ns#a7715> <http://example.org/ns#a7715> <http://example.org/ns#a7715> . +<http://example.org/ns#a7716> <http://example.org/ns#a7716> <http://example.org/ns#a7716> . +<http://example.org/ns#a7717> <http://example.org/ns#a7717> <http://example.org/ns#a7717> . +<http://example.org/ns#a7718> <http://example.org/ns#a7718> <http://example.org/ns#a7718> . +<http://example.org/ns#a7719> <http://example.org/ns#a7719> <http://example.org/ns#a7719> . +<http://example.org/ns#a7720> <http://example.org/ns#a7720> <http://example.org/ns#a7720> . +<http://example.org/ns#a7721> <http://example.org/ns#a7721> <http://example.org/ns#a7721> . +<http://example.org/ns#a7722> <http://example.org/ns#a7722> <http://example.org/ns#a7722> . +<http://example.org/ns#a7723> <http://example.org/ns#a7723> <http://example.org/ns#a7723> . +<http://example.org/ns#a7724> <http://example.org/ns#a7724> <http://example.org/ns#a7724> . +<http://example.org/ns#a7725> <http://example.org/ns#a7725> <http://example.org/ns#a7725> . +<http://example.org/ns#a7726> <http://example.org/ns#a7726> <http://example.org/ns#a7726> . +<http://example.org/ns#a7727> <http://example.org/ns#a7727> <http://example.org/ns#a7727> . +<http://example.org/ns#a7728> <http://example.org/ns#a7728> <http://example.org/ns#a7728> . +<http://example.org/ns#a7729> <http://example.org/ns#a7729> <http://example.org/ns#a7729> . +<http://example.org/ns#a7730> <http://example.org/ns#a7730> <http://example.org/ns#a7730> . +<http://example.org/ns#a7731> <http://example.org/ns#a7731> <http://example.org/ns#a7731> . +<http://example.org/ns#a7732> <http://example.org/ns#a7732> <http://example.org/ns#a7732> . +<http://example.org/ns#a7733> <http://example.org/ns#a7733> <http://example.org/ns#a7733> . +<http://example.org/ns#a7734> <http://example.org/ns#a7734> <http://example.org/ns#a7734> . +<http://example.org/ns#a7735> <http://example.org/ns#a7735> <http://example.org/ns#a7735> . +<http://example.org/ns#a7736> <http://example.org/ns#a7736> <http://example.org/ns#a7736> . +<http://example.org/ns#a7737> <http://example.org/ns#a7737> <http://example.org/ns#a7737> . +<http://example.org/ns#a7738> <http://example.org/ns#a7738> <http://example.org/ns#a7738> . +<http://example.org/ns#a7739> <http://example.org/ns#a7739> <http://example.org/ns#a7739> . +<http://example.org/ns#a7740> <http://example.org/ns#a7740> <http://example.org/ns#a7740> . +<http://example.org/ns#a7741> <http://example.org/ns#a7741> <http://example.org/ns#a7741> . +<http://example.org/ns#a7742> <http://example.org/ns#a7742> <http://example.org/ns#a7742> . +<http://example.org/ns#a7743> <http://example.org/ns#a7743> <http://example.org/ns#a7743> . +<http://example.org/ns#a7744> <http://example.org/ns#a7744> <http://example.org/ns#a7744> . +<http://example.org/ns#a7745> <http://example.org/ns#a7745> <http://example.org/ns#a7745> . +<http://example.org/ns#a7746> <http://example.org/ns#a7746> <http://example.org/ns#a7746> . +<http://example.org/ns#a7747> <http://example.org/ns#a7747> <http://example.org/ns#a7747> . +<http://example.org/ns#a7748> <http://example.org/ns#a7748> <http://example.org/ns#a7748> . +<http://example.org/ns#a7749> <http://example.org/ns#a7749> <http://example.org/ns#a7749> . +<http://example.org/ns#a7750> <http://example.org/ns#a7750> <http://example.org/ns#a7750> . +<http://example.org/ns#a7751> <http://example.org/ns#a7751> <http://example.org/ns#a7751> . +<http://example.org/ns#a7752> <http://example.org/ns#a7752> <http://example.org/ns#a7752> . +<http://example.org/ns#a7753> <http://example.org/ns#a7753> <http://example.org/ns#a7753> . +<http://example.org/ns#a7754> <http://example.org/ns#a7754> <http://example.org/ns#a7754> . +<http://example.org/ns#a7755> <http://example.org/ns#a7755> <http://example.org/ns#a7755> . +<http://example.org/ns#a7756> <http://example.org/ns#a7756> <http://example.org/ns#a7756> . +<http://example.org/ns#a7757> <http://example.org/ns#a7757> <http://example.org/ns#a7757> . +<http://example.org/ns#a7758> <http://example.org/ns#a7758> <http://example.org/ns#a7758> . +<http://example.org/ns#a7759> <http://example.org/ns#a7759> <http://example.org/ns#a7759> . +<http://example.org/ns#a7760> <http://example.org/ns#a7760> <http://example.org/ns#a7760> . +<http://example.org/ns#a7761> <http://example.org/ns#a7761> <http://example.org/ns#a7761> . +<http://example.org/ns#a7762> <http://example.org/ns#a7762> <http://example.org/ns#a7762> . +<http://example.org/ns#a7763> <http://example.org/ns#a7763> <http://example.org/ns#a7763> . +<http://example.org/ns#a7764> <http://example.org/ns#a7764> <http://example.org/ns#a7764> . +<http://example.org/ns#a7765> <http://example.org/ns#a7765> <http://example.org/ns#a7765> . +<http://example.org/ns#a7766> <http://example.org/ns#a7766> <http://example.org/ns#a7766> . +<http://example.org/ns#a7767> <http://example.org/ns#a7767> <http://example.org/ns#a7767> . +<http://example.org/ns#a7768> <http://example.org/ns#a7768> <http://example.org/ns#a7768> . +<http://example.org/ns#a7769> <http://example.org/ns#a7769> <http://example.org/ns#a7769> . +<http://example.org/ns#a7770> <http://example.org/ns#a7770> <http://example.org/ns#a7770> . +<http://example.org/ns#a7771> <http://example.org/ns#a7771> <http://example.org/ns#a7771> . +<http://example.org/ns#a7772> <http://example.org/ns#a7772> <http://example.org/ns#a7772> . +<http://example.org/ns#a7773> <http://example.org/ns#a7773> <http://example.org/ns#a7773> . +<http://example.org/ns#a7774> <http://example.org/ns#a7774> <http://example.org/ns#a7774> . +<http://example.org/ns#a7775> <http://example.org/ns#a7775> <http://example.org/ns#a7775> . +<http://example.org/ns#a7776> <http://example.org/ns#a7776> <http://example.org/ns#a7776> . +<http://example.org/ns#a7777> <http://example.org/ns#a7777> <http://example.org/ns#a7777> . +<http://example.org/ns#a7778> <http://example.org/ns#a7778> <http://example.org/ns#a7778> . +<http://example.org/ns#a7779> <http://example.org/ns#a7779> <http://example.org/ns#a7779> . +<http://example.org/ns#a7780> <http://example.org/ns#a7780> <http://example.org/ns#a7780> . +<http://example.org/ns#a7781> <http://example.org/ns#a7781> <http://example.org/ns#a7781> . +<http://example.org/ns#a7782> <http://example.org/ns#a7782> <http://example.org/ns#a7782> . +<http://example.org/ns#a7783> <http://example.org/ns#a7783> <http://example.org/ns#a7783> . +<http://example.org/ns#a7784> <http://example.org/ns#a7784> <http://example.org/ns#a7784> . +<http://example.org/ns#a7785> <http://example.org/ns#a7785> <http://example.org/ns#a7785> . +<http://example.org/ns#a7786> <http://example.org/ns#a7786> <http://example.org/ns#a7786> . +<http://example.org/ns#a7787> <http://example.org/ns#a7787> <http://example.org/ns#a7787> . +<http://example.org/ns#a7788> <http://example.org/ns#a7788> <http://example.org/ns#a7788> . +<http://example.org/ns#a7789> <http://example.org/ns#a7789> <http://example.org/ns#a7789> . +<http://example.org/ns#a7790> <http://example.org/ns#a7790> <http://example.org/ns#a7790> . +<http://example.org/ns#a7791> <http://example.org/ns#a7791> <http://example.org/ns#a7791> . +<http://example.org/ns#a7792> <http://example.org/ns#a7792> <http://example.org/ns#a7792> . +<http://example.org/ns#a7793> <http://example.org/ns#a7793> <http://example.org/ns#a7793> . +<http://example.org/ns#a7794> <http://example.org/ns#a7794> <http://example.org/ns#a7794> . +<http://example.org/ns#a7795> <http://example.org/ns#a7795> <http://example.org/ns#a7795> . +<http://example.org/ns#a7796> <http://example.org/ns#a7796> <http://example.org/ns#a7796> . +<http://example.org/ns#a7797> <http://example.org/ns#a7797> <http://example.org/ns#a7797> . +<http://example.org/ns#a7798> <http://example.org/ns#a7798> <http://example.org/ns#a7798> . +<http://example.org/ns#a7799> <http://example.org/ns#a7799> <http://example.org/ns#a7799> . +<http://example.org/ns#a7800> <http://example.org/ns#a7800> <http://example.org/ns#a7800> . +<http://example.org/ns#a7801> <http://example.org/ns#a7801> <http://example.org/ns#a7801> . +<http://example.org/ns#a7802> <http://example.org/ns#a7802> <http://example.org/ns#a7802> . +<http://example.org/ns#a7803> <http://example.org/ns#a7803> <http://example.org/ns#a7803> . +<http://example.org/ns#a7804> <http://example.org/ns#a7804> <http://example.org/ns#a7804> . +<http://example.org/ns#a7805> <http://example.org/ns#a7805> <http://example.org/ns#a7805> . +<http://example.org/ns#a7806> <http://example.org/ns#a7806> <http://example.org/ns#a7806> . +<http://example.org/ns#a7807> <http://example.org/ns#a7807> <http://example.org/ns#a7807> . +<http://example.org/ns#a7808> <http://example.org/ns#a7808> <http://example.org/ns#a7808> . +<http://example.org/ns#a7809> <http://example.org/ns#a7809> <http://example.org/ns#a7809> . +<http://example.org/ns#a7810> <http://example.org/ns#a7810> <http://example.org/ns#a7810> . +<http://example.org/ns#a7811> <http://example.org/ns#a7811> <http://example.org/ns#a7811> . +<http://example.org/ns#a7812> <http://example.org/ns#a7812> <http://example.org/ns#a7812> . +<http://example.org/ns#a7813> <http://example.org/ns#a7813> <http://example.org/ns#a7813> . +<http://example.org/ns#a7814> <http://example.org/ns#a7814> <http://example.org/ns#a7814> . +<http://example.org/ns#a7815> <http://example.org/ns#a7815> <http://example.org/ns#a7815> . +<http://example.org/ns#a7816> <http://example.org/ns#a7816> <http://example.org/ns#a7816> . +<http://example.org/ns#a7817> <http://example.org/ns#a7817> <http://example.org/ns#a7817> . +<http://example.org/ns#a7818> <http://example.org/ns#a7818> <http://example.org/ns#a7818> . +<http://example.org/ns#a7819> <http://example.org/ns#a7819> <http://example.org/ns#a7819> . +<http://example.org/ns#a7820> <http://example.org/ns#a7820> <http://example.org/ns#a7820> . +<http://example.org/ns#a7821> <http://example.org/ns#a7821> <http://example.org/ns#a7821> . +<http://example.org/ns#a7822> <http://example.org/ns#a7822> <http://example.org/ns#a7822> . +<http://example.org/ns#a7823> <http://example.org/ns#a7823> <http://example.org/ns#a7823> . +<http://example.org/ns#a7824> <http://example.org/ns#a7824> <http://example.org/ns#a7824> . +<http://example.org/ns#a7825> <http://example.org/ns#a7825> <http://example.org/ns#a7825> . +<http://example.org/ns#a7826> <http://example.org/ns#a7826> <http://example.org/ns#a7826> . +<http://example.org/ns#a7827> <http://example.org/ns#a7827> <http://example.org/ns#a7827> . +<http://example.org/ns#a7828> <http://example.org/ns#a7828> <http://example.org/ns#a7828> . +<http://example.org/ns#a7829> <http://example.org/ns#a7829> <http://example.org/ns#a7829> . +<http://example.org/ns#a7830> <http://example.org/ns#a7830> <http://example.org/ns#a7830> . +<http://example.org/ns#a7831> <http://example.org/ns#a7831> <http://example.org/ns#a7831> . +<http://example.org/ns#a7832> <http://example.org/ns#a7832> <http://example.org/ns#a7832> . +<http://example.org/ns#a7833> <http://example.org/ns#a7833> <http://example.org/ns#a7833> . +<http://example.org/ns#a7834> <http://example.org/ns#a7834> <http://example.org/ns#a7834> . +<http://example.org/ns#a7835> <http://example.org/ns#a7835> <http://example.org/ns#a7835> . +<http://example.org/ns#a7836> <http://example.org/ns#a7836> <http://example.org/ns#a7836> . +<http://example.org/ns#a7837> <http://example.org/ns#a7837> <http://example.org/ns#a7837> . +<http://example.org/ns#a7838> <http://example.org/ns#a7838> <http://example.org/ns#a7838> . +<http://example.org/ns#a7839> <http://example.org/ns#a7839> <http://example.org/ns#a7839> . +<http://example.org/ns#a7840> <http://example.org/ns#a7840> <http://example.org/ns#a7840> . +<http://example.org/ns#a7841> <http://example.org/ns#a7841> <http://example.org/ns#a7841> . +<http://example.org/ns#a7842> <http://example.org/ns#a7842> <http://example.org/ns#a7842> . +<http://example.org/ns#a7843> <http://example.org/ns#a7843> <http://example.org/ns#a7843> . +<http://example.org/ns#a7844> <http://example.org/ns#a7844> <http://example.org/ns#a7844> . +<http://example.org/ns#a7845> <http://example.org/ns#a7845> <http://example.org/ns#a7845> . +<http://example.org/ns#a7846> <http://example.org/ns#a7846> <http://example.org/ns#a7846> . +<http://example.org/ns#a7847> <http://example.org/ns#a7847> <http://example.org/ns#a7847> . +<http://example.org/ns#a7848> <http://example.org/ns#a7848> <http://example.org/ns#a7848> . +<http://example.org/ns#a7849> <http://example.org/ns#a7849> <http://example.org/ns#a7849> . +<http://example.org/ns#a7850> <http://example.org/ns#a7850> <http://example.org/ns#a7850> . +<http://example.org/ns#a7851> <http://example.org/ns#a7851> <http://example.org/ns#a7851> . +<http://example.org/ns#a7852> <http://example.org/ns#a7852> <http://example.org/ns#a7852> . +<http://example.org/ns#a7853> <http://example.org/ns#a7853> <http://example.org/ns#a7853> . +<http://example.org/ns#a7854> <http://example.org/ns#a7854> <http://example.org/ns#a7854> . +<http://example.org/ns#a7855> <http://example.org/ns#a7855> <http://example.org/ns#a7855> . +<http://example.org/ns#a7856> <http://example.org/ns#a7856> <http://example.org/ns#a7856> . +<http://example.org/ns#a7857> <http://example.org/ns#a7857> <http://example.org/ns#a7857> . +<http://example.org/ns#a7858> <http://example.org/ns#a7858> <http://example.org/ns#a7858> . +<http://example.org/ns#a7859> <http://example.org/ns#a7859> <http://example.org/ns#a7859> . +<http://example.org/ns#a7860> <http://example.org/ns#a7860> <http://example.org/ns#a7860> . +<http://example.org/ns#a7861> <http://example.org/ns#a7861> <http://example.org/ns#a7861> . +<http://example.org/ns#a7862> <http://example.org/ns#a7862> <http://example.org/ns#a7862> . +<http://example.org/ns#a7863> <http://example.org/ns#a7863> <http://example.org/ns#a7863> . +<http://example.org/ns#a7864> <http://example.org/ns#a7864> <http://example.org/ns#a7864> . +<http://example.org/ns#a7865> <http://example.org/ns#a7865> <http://example.org/ns#a7865> . +<http://example.org/ns#a7866> <http://example.org/ns#a7866> <http://example.org/ns#a7866> . +<http://example.org/ns#a7867> <http://example.org/ns#a7867> <http://example.org/ns#a7867> . +<http://example.org/ns#a7868> <http://example.org/ns#a7868> <http://example.org/ns#a7868> . +<http://example.org/ns#a7869> <http://example.org/ns#a7869> <http://example.org/ns#a7869> . +<http://example.org/ns#a7870> <http://example.org/ns#a7870> <http://example.org/ns#a7870> . +<http://example.org/ns#a7871> <http://example.org/ns#a7871> <http://example.org/ns#a7871> . +<http://example.org/ns#a7872> <http://example.org/ns#a7872> <http://example.org/ns#a7872> . +<http://example.org/ns#a7873> <http://example.org/ns#a7873> <http://example.org/ns#a7873> . +<http://example.org/ns#a7874> <http://example.org/ns#a7874> <http://example.org/ns#a7874> . +<http://example.org/ns#a7875> <http://example.org/ns#a7875> <http://example.org/ns#a7875> . +<http://example.org/ns#a7876> <http://example.org/ns#a7876> <http://example.org/ns#a7876> . +<http://example.org/ns#a7877> <http://example.org/ns#a7877> <http://example.org/ns#a7877> . +<http://example.org/ns#a7878> <http://example.org/ns#a7878> <http://example.org/ns#a7878> . +<http://example.org/ns#a7879> <http://example.org/ns#a7879> <http://example.org/ns#a7879> . +<http://example.org/ns#a7880> <http://example.org/ns#a7880> <http://example.org/ns#a7880> . +<http://example.org/ns#a7881> <http://example.org/ns#a7881> <http://example.org/ns#a7881> . +<http://example.org/ns#a7882> <http://example.org/ns#a7882> <http://example.org/ns#a7882> . +<http://example.org/ns#a7883> <http://example.org/ns#a7883> <http://example.org/ns#a7883> . +<http://example.org/ns#a7884> <http://example.org/ns#a7884> <http://example.org/ns#a7884> . +<http://example.org/ns#a7885> <http://example.org/ns#a7885> <http://example.org/ns#a7885> . +<http://example.org/ns#a7886> <http://example.org/ns#a7886> <http://example.org/ns#a7886> . +<http://example.org/ns#a7887> <http://example.org/ns#a7887> <http://example.org/ns#a7887> . +<http://example.org/ns#a7888> <http://example.org/ns#a7888> <http://example.org/ns#a7888> . +<http://example.org/ns#a7889> <http://example.org/ns#a7889> <http://example.org/ns#a7889> . +<http://example.org/ns#a7890> <http://example.org/ns#a7890> <http://example.org/ns#a7890> . +<http://example.org/ns#a7891> <http://example.org/ns#a7891> <http://example.org/ns#a7891> . +<http://example.org/ns#a7892> <http://example.org/ns#a7892> <http://example.org/ns#a7892> . +<http://example.org/ns#a7893> <http://example.org/ns#a7893> <http://example.org/ns#a7893> . +<http://example.org/ns#a7894> <http://example.org/ns#a7894> <http://example.org/ns#a7894> . +<http://example.org/ns#a7895> <http://example.org/ns#a7895> <http://example.org/ns#a7895> . +<http://example.org/ns#a7896> <http://example.org/ns#a7896> <http://example.org/ns#a7896> . +<http://example.org/ns#a7897> <http://example.org/ns#a7897> <http://example.org/ns#a7897> . +<http://example.org/ns#a7898> <http://example.org/ns#a7898> <http://example.org/ns#a7898> . +<http://example.org/ns#a7899> <http://example.org/ns#a7899> <http://example.org/ns#a7899> . +<http://example.org/ns#a7900> <http://example.org/ns#a7900> <http://example.org/ns#a7900> . +<http://example.org/ns#a7901> <http://example.org/ns#a7901> <http://example.org/ns#a7901> . +<http://example.org/ns#a7902> <http://example.org/ns#a7902> <http://example.org/ns#a7902> . +<http://example.org/ns#a7903> <http://example.org/ns#a7903> <http://example.org/ns#a7903> . +<http://example.org/ns#a7904> <http://example.org/ns#a7904> <http://example.org/ns#a7904> . +<http://example.org/ns#a7905> <http://example.org/ns#a7905> <http://example.org/ns#a7905> . +<http://example.org/ns#a7906> <http://example.org/ns#a7906> <http://example.org/ns#a7906> . +<http://example.org/ns#a7907> <http://example.org/ns#a7907> <http://example.org/ns#a7907> . +<http://example.org/ns#a7908> <http://example.org/ns#a7908> <http://example.org/ns#a7908> . +<http://example.org/ns#a7909> <http://example.org/ns#a7909> <http://example.org/ns#a7909> . +<http://example.org/ns#a7910> <http://example.org/ns#a7910> <http://example.org/ns#a7910> . +<http://example.org/ns#a7911> <http://example.org/ns#a7911> <http://example.org/ns#a7911> . +<http://example.org/ns#a7912> <http://example.org/ns#a7912> <http://example.org/ns#a7912> . +<http://example.org/ns#a7913> <http://example.org/ns#a7913> <http://example.org/ns#a7913> . +<http://example.org/ns#a7914> <http://example.org/ns#a7914> <http://example.org/ns#a7914> . +<http://example.org/ns#a7915> <http://example.org/ns#a7915> <http://example.org/ns#a7915> . +<http://example.org/ns#a7916> <http://example.org/ns#a7916> <http://example.org/ns#a7916> . +<http://example.org/ns#a7917> <http://example.org/ns#a7917> <http://example.org/ns#a7917> . +<http://example.org/ns#a7918> <http://example.org/ns#a7918> <http://example.org/ns#a7918> . +<http://example.org/ns#a7919> <http://example.org/ns#a7919> <http://example.org/ns#a7919> . +<http://example.org/ns#a7920> <http://example.org/ns#a7920> <http://example.org/ns#a7920> . +<http://example.org/ns#a7921> <http://example.org/ns#a7921> <http://example.org/ns#a7921> . +<http://example.org/ns#a7922> <http://example.org/ns#a7922> <http://example.org/ns#a7922> . +<http://example.org/ns#a7923> <http://example.org/ns#a7923> <http://example.org/ns#a7923> . +<http://example.org/ns#a7924> <http://example.org/ns#a7924> <http://example.org/ns#a7924> . +<http://example.org/ns#a7925> <http://example.org/ns#a7925> <http://example.org/ns#a7925> . +<http://example.org/ns#a7926> <http://example.org/ns#a7926> <http://example.org/ns#a7926> . +<http://example.org/ns#a7927> <http://example.org/ns#a7927> <http://example.org/ns#a7927> . +<http://example.org/ns#a7928> <http://example.org/ns#a7928> <http://example.org/ns#a7928> . +<http://example.org/ns#a7929> <http://example.org/ns#a7929> <http://example.org/ns#a7929> . +<http://example.org/ns#a7930> <http://example.org/ns#a7930> <http://example.org/ns#a7930> . +<http://example.org/ns#a7931> <http://example.org/ns#a7931> <http://example.org/ns#a7931> . +<http://example.org/ns#a7932> <http://example.org/ns#a7932> <http://example.org/ns#a7932> . +<http://example.org/ns#a7933> <http://example.org/ns#a7933> <http://example.org/ns#a7933> . +<http://example.org/ns#a7934> <http://example.org/ns#a7934> <http://example.org/ns#a7934> . +<http://example.org/ns#a7935> <http://example.org/ns#a7935> <http://example.org/ns#a7935> . +<http://example.org/ns#a7936> <http://example.org/ns#a7936> <http://example.org/ns#a7936> . +<http://example.org/ns#a7937> <http://example.org/ns#a7937> <http://example.org/ns#a7937> . +<http://example.org/ns#a7938> <http://example.org/ns#a7938> <http://example.org/ns#a7938> . +<http://example.org/ns#a7939> <http://example.org/ns#a7939> <http://example.org/ns#a7939> . +<http://example.org/ns#a7940> <http://example.org/ns#a7940> <http://example.org/ns#a7940> . +<http://example.org/ns#a7941> <http://example.org/ns#a7941> <http://example.org/ns#a7941> . +<http://example.org/ns#a7942> <http://example.org/ns#a7942> <http://example.org/ns#a7942> . +<http://example.org/ns#a7943> <http://example.org/ns#a7943> <http://example.org/ns#a7943> . +<http://example.org/ns#a7944> <http://example.org/ns#a7944> <http://example.org/ns#a7944> . +<http://example.org/ns#a7945> <http://example.org/ns#a7945> <http://example.org/ns#a7945> . +<http://example.org/ns#a7946> <http://example.org/ns#a7946> <http://example.org/ns#a7946> . +<http://example.org/ns#a7947> <http://example.org/ns#a7947> <http://example.org/ns#a7947> . +<http://example.org/ns#a7948> <http://example.org/ns#a7948> <http://example.org/ns#a7948> . +<http://example.org/ns#a7949> <http://example.org/ns#a7949> <http://example.org/ns#a7949> . +<http://example.org/ns#a7950> <http://example.org/ns#a7950> <http://example.org/ns#a7950> . +<http://example.org/ns#a7951> <http://example.org/ns#a7951> <http://example.org/ns#a7951> . +<http://example.org/ns#a7952> <http://example.org/ns#a7952> <http://example.org/ns#a7952> . +<http://example.org/ns#a7953> <http://example.org/ns#a7953> <http://example.org/ns#a7953> . +<http://example.org/ns#a7954> <http://example.org/ns#a7954> <http://example.org/ns#a7954> . +<http://example.org/ns#a7955> <http://example.org/ns#a7955> <http://example.org/ns#a7955> . +<http://example.org/ns#a7956> <http://example.org/ns#a7956> <http://example.org/ns#a7956> . +<http://example.org/ns#a7957> <http://example.org/ns#a7957> <http://example.org/ns#a7957> . +<http://example.org/ns#a7958> <http://example.org/ns#a7958> <http://example.org/ns#a7958> . +<http://example.org/ns#a7959> <http://example.org/ns#a7959> <http://example.org/ns#a7959> . +<http://example.org/ns#a7960> <http://example.org/ns#a7960> <http://example.org/ns#a7960> . +<http://example.org/ns#a7961> <http://example.org/ns#a7961> <http://example.org/ns#a7961> . +<http://example.org/ns#a7962> <http://example.org/ns#a7962> <http://example.org/ns#a7962> . +<http://example.org/ns#a7963> <http://example.org/ns#a7963> <http://example.org/ns#a7963> . +<http://example.org/ns#a7964> <http://example.org/ns#a7964> <http://example.org/ns#a7964> . +<http://example.org/ns#a7965> <http://example.org/ns#a7965> <http://example.org/ns#a7965> . +<http://example.org/ns#a7966> <http://example.org/ns#a7966> <http://example.org/ns#a7966> . +<http://example.org/ns#a7967> <http://example.org/ns#a7967> <http://example.org/ns#a7967> . +<http://example.org/ns#a7968> <http://example.org/ns#a7968> <http://example.org/ns#a7968> . +<http://example.org/ns#a7969> <http://example.org/ns#a7969> <http://example.org/ns#a7969> . +<http://example.org/ns#a7970> <http://example.org/ns#a7970> <http://example.org/ns#a7970> . +<http://example.org/ns#a7971> <http://example.org/ns#a7971> <http://example.org/ns#a7971> . +<http://example.org/ns#a7972> <http://example.org/ns#a7972> <http://example.org/ns#a7972> . +<http://example.org/ns#a7973> <http://example.org/ns#a7973> <http://example.org/ns#a7973> . +<http://example.org/ns#a7974> <http://example.org/ns#a7974> <http://example.org/ns#a7974> . +<http://example.org/ns#a7975> <http://example.org/ns#a7975> <http://example.org/ns#a7975> . +<http://example.org/ns#a7976> <http://example.org/ns#a7976> <http://example.org/ns#a7976> . +<http://example.org/ns#a7977> <http://example.org/ns#a7977> <http://example.org/ns#a7977> . +<http://example.org/ns#a7978> <http://example.org/ns#a7978> <http://example.org/ns#a7978> . +<http://example.org/ns#a7979> <http://example.org/ns#a7979> <http://example.org/ns#a7979> . +<http://example.org/ns#a7980> <http://example.org/ns#a7980> <http://example.org/ns#a7980> . +<http://example.org/ns#a7981> <http://example.org/ns#a7981> <http://example.org/ns#a7981> . +<http://example.org/ns#a7982> <http://example.org/ns#a7982> <http://example.org/ns#a7982> . +<http://example.org/ns#a7983> <http://example.org/ns#a7983> <http://example.org/ns#a7983> . +<http://example.org/ns#a7984> <http://example.org/ns#a7984> <http://example.org/ns#a7984> . +<http://example.org/ns#a7985> <http://example.org/ns#a7985> <http://example.org/ns#a7985> . +<http://example.org/ns#a7986> <http://example.org/ns#a7986> <http://example.org/ns#a7986> . +<http://example.org/ns#a7987> <http://example.org/ns#a7987> <http://example.org/ns#a7987> . +<http://example.org/ns#a7988> <http://example.org/ns#a7988> <http://example.org/ns#a7988> . +<http://example.org/ns#a7989> <http://example.org/ns#a7989> <http://example.org/ns#a7989> . +<http://example.org/ns#a7990> <http://example.org/ns#a7990> <http://example.org/ns#a7990> . +<http://example.org/ns#a7991> <http://example.org/ns#a7991> <http://example.org/ns#a7991> . +<http://example.org/ns#a7992> <http://example.org/ns#a7992> <http://example.org/ns#a7992> . +<http://example.org/ns#a7993> <http://example.org/ns#a7993> <http://example.org/ns#a7993> . +<http://example.org/ns#a7994> <http://example.org/ns#a7994> <http://example.org/ns#a7994> . +<http://example.org/ns#a7995> <http://example.org/ns#a7995> <http://example.org/ns#a7995> . +<http://example.org/ns#a7996> <http://example.org/ns#a7996> <http://example.org/ns#a7996> . +<http://example.org/ns#a7997> <http://example.org/ns#a7997> <http://example.org/ns#a7997> . +<http://example.org/ns#a7998> <http://example.org/ns#a7998> <http://example.org/ns#a7998> . +<http://example.org/ns#a7999> <http://example.org/ns#a7999> <http://example.org/ns#a7999> . +<http://example.org/ns#a8000> <http://example.org/ns#a8000> <http://example.org/ns#a8000> . +<http://example.org/ns#a8001> <http://example.org/ns#a8001> <http://example.org/ns#a8001> . +<http://example.org/ns#a8002> <http://example.org/ns#a8002> <http://example.org/ns#a8002> . +<http://example.org/ns#a8003> <http://example.org/ns#a8003> <http://example.org/ns#a8003> . +<http://example.org/ns#a8004> <http://example.org/ns#a8004> <http://example.org/ns#a8004> . +<http://example.org/ns#a8005> <http://example.org/ns#a8005> <http://example.org/ns#a8005> . +<http://example.org/ns#a8006> <http://example.org/ns#a8006> <http://example.org/ns#a8006> . +<http://example.org/ns#a8007> <http://example.org/ns#a8007> <http://example.org/ns#a8007> . +<http://example.org/ns#a8008> <http://example.org/ns#a8008> <http://example.org/ns#a8008> . +<http://example.org/ns#a8009> <http://example.org/ns#a8009> <http://example.org/ns#a8009> . +<http://example.org/ns#a8010> <http://example.org/ns#a8010> <http://example.org/ns#a8010> . +<http://example.org/ns#a8011> <http://example.org/ns#a8011> <http://example.org/ns#a8011> . +<http://example.org/ns#a8012> <http://example.org/ns#a8012> <http://example.org/ns#a8012> . +<http://example.org/ns#a8013> <http://example.org/ns#a8013> <http://example.org/ns#a8013> . +<http://example.org/ns#a8014> <http://example.org/ns#a8014> <http://example.org/ns#a8014> . +<http://example.org/ns#a8015> <http://example.org/ns#a8015> <http://example.org/ns#a8015> . +<http://example.org/ns#a8016> <http://example.org/ns#a8016> <http://example.org/ns#a8016> . +<http://example.org/ns#a8017> <http://example.org/ns#a8017> <http://example.org/ns#a8017> . +<http://example.org/ns#a8018> <http://example.org/ns#a8018> <http://example.org/ns#a8018> . +<http://example.org/ns#a8019> <http://example.org/ns#a8019> <http://example.org/ns#a8019> . +<http://example.org/ns#a8020> <http://example.org/ns#a8020> <http://example.org/ns#a8020> . +<http://example.org/ns#a8021> <http://example.org/ns#a8021> <http://example.org/ns#a8021> . +<http://example.org/ns#a8022> <http://example.org/ns#a8022> <http://example.org/ns#a8022> . +<http://example.org/ns#a8023> <http://example.org/ns#a8023> <http://example.org/ns#a8023> . +<http://example.org/ns#a8024> <http://example.org/ns#a8024> <http://example.org/ns#a8024> . +<http://example.org/ns#a8025> <http://example.org/ns#a8025> <http://example.org/ns#a8025> . +<http://example.org/ns#a8026> <http://example.org/ns#a8026> <http://example.org/ns#a8026> . +<http://example.org/ns#a8027> <http://example.org/ns#a8027> <http://example.org/ns#a8027> . +<http://example.org/ns#a8028> <http://example.org/ns#a8028> <http://example.org/ns#a8028> . +<http://example.org/ns#a8029> <http://example.org/ns#a8029> <http://example.org/ns#a8029> . +<http://example.org/ns#a8030> <http://example.org/ns#a8030> <http://example.org/ns#a8030> . +<http://example.org/ns#a8031> <http://example.org/ns#a8031> <http://example.org/ns#a8031> . +<http://example.org/ns#a8032> <http://example.org/ns#a8032> <http://example.org/ns#a8032> . +<http://example.org/ns#a8033> <http://example.org/ns#a8033> <http://example.org/ns#a8033> . +<http://example.org/ns#a8034> <http://example.org/ns#a8034> <http://example.org/ns#a8034> . +<http://example.org/ns#a8035> <http://example.org/ns#a8035> <http://example.org/ns#a8035> . +<http://example.org/ns#a8036> <http://example.org/ns#a8036> <http://example.org/ns#a8036> . +<http://example.org/ns#a8037> <http://example.org/ns#a8037> <http://example.org/ns#a8037> . +<http://example.org/ns#a8038> <http://example.org/ns#a8038> <http://example.org/ns#a8038> . +<http://example.org/ns#a8039> <http://example.org/ns#a8039> <http://example.org/ns#a8039> . +<http://example.org/ns#a8040> <http://example.org/ns#a8040> <http://example.org/ns#a8040> . +<http://example.org/ns#a8041> <http://example.org/ns#a8041> <http://example.org/ns#a8041> . +<http://example.org/ns#a8042> <http://example.org/ns#a8042> <http://example.org/ns#a8042> . +<http://example.org/ns#a8043> <http://example.org/ns#a8043> <http://example.org/ns#a8043> . +<http://example.org/ns#a8044> <http://example.org/ns#a8044> <http://example.org/ns#a8044> . +<http://example.org/ns#a8045> <http://example.org/ns#a8045> <http://example.org/ns#a8045> . +<http://example.org/ns#a8046> <http://example.org/ns#a8046> <http://example.org/ns#a8046> . +<http://example.org/ns#a8047> <http://example.org/ns#a8047> <http://example.org/ns#a8047> . +<http://example.org/ns#a8048> <http://example.org/ns#a8048> <http://example.org/ns#a8048> . +<http://example.org/ns#a8049> <http://example.org/ns#a8049> <http://example.org/ns#a8049> . +<http://example.org/ns#a8050> <http://example.org/ns#a8050> <http://example.org/ns#a8050> . +<http://example.org/ns#a8051> <http://example.org/ns#a8051> <http://example.org/ns#a8051> . +<http://example.org/ns#a8052> <http://example.org/ns#a8052> <http://example.org/ns#a8052> . +<http://example.org/ns#a8053> <http://example.org/ns#a8053> <http://example.org/ns#a8053> . +<http://example.org/ns#a8054> <http://example.org/ns#a8054> <http://example.org/ns#a8054> . +<http://example.org/ns#a8055> <http://example.org/ns#a8055> <http://example.org/ns#a8055> . +<http://example.org/ns#a8056> <http://example.org/ns#a8056> <http://example.org/ns#a8056> . +<http://example.org/ns#a8057> <http://example.org/ns#a8057> <http://example.org/ns#a8057> . +<http://example.org/ns#a8058> <http://example.org/ns#a8058> <http://example.org/ns#a8058> . +<http://example.org/ns#a8059> <http://example.org/ns#a8059> <http://example.org/ns#a8059> . +<http://example.org/ns#a8060> <http://example.org/ns#a8060> <http://example.org/ns#a8060> . +<http://example.org/ns#a8061> <http://example.org/ns#a8061> <http://example.org/ns#a8061> . +<http://example.org/ns#a8062> <http://example.org/ns#a8062> <http://example.org/ns#a8062> . +<http://example.org/ns#a8063> <http://example.org/ns#a8063> <http://example.org/ns#a8063> . +<http://example.org/ns#a8064> <http://example.org/ns#a8064> <http://example.org/ns#a8064> . +<http://example.org/ns#a8065> <http://example.org/ns#a8065> <http://example.org/ns#a8065> . +<http://example.org/ns#a8066> <http://example.org/ns#a8066> <http://example.org/ns#a8066> . +<http://example.org/ns#a8067> <http://example.org/ns#a8067> <http://example.org/ns#a8067> . +<http://example.org/ns#a8068> <http://example.org/ns#a8068> <http://example.org/ns#a8068> . +<http://example.org/ns#a8069> <http://example.org/ns#a8069> <http://example.org/ns#a8069> . +<http://example.org/ns#a8070> <http://example.org/ns#a8070> <http://example.org/ns#a8070> . +<http://example.org/ns#a8071> <http://example.org/ns#a8071> <http://example.org/ns#a8071> . +<http://example.org/ns#a8072> <http://example.org/ns#a8072> <http://example.org/ns#a8072> . +<http://example.org/ns#a8073> <http://example.org/ns#a8073> <http://example.org/ns#a8073> . +<http://example.org/ns#a8074> <http://example.org/ns#a8074> <http://example.org/ns#a8074> . +<http://example.org/ns#a8075> <http://example.org/ns#a8075> <http://example.org/ns#a8075> . +<http://example.org/ns#a8076> <http://example.org/ns#a8076> <http://example.org/ns#a8076> . +<http://example.org/ns#a8077> <http://example.org/ns#a8077> <http://example.org/ns#a8077> . +<http://example.org/ns#a8078> <http://example.org/ns#a8078> <http://example.org/ns#a8078> . +<http://example.org/ns#a8079> <http://example.org/ns#a8079> <http://example.org/ns#a8079> . +<http://example.org/ns#a8080> <http://example.org/ns#a8080> <http://example.org/ns#a8080> . +<http://example.org/ns#a8081> <http://example.org/ns#a8081> <http://example.org/ns#a8081> . +<http://example.org/ns#a8082> <http://example.org/ns#a8082> <http://example.org/ns#a8082> . +<http://example.org/ns#a8083> <http://example.org/ns#a8083> <http://example.org/ns#a8083> . +<http://example.org/ns#a8084> <http://example.org/ns#a8084> <http://example.org/ns#a8084> . +<http://example.org/ns#a8085> <http://example.org/ns#a8085> <http://example.org/ns#a8085> . +<http://example.org/ns#a8086> <http://example.org/ns#a8086> <http://example.org/ns#a8086> . +<http://example.org/ns#a8087> <http://example.org/ns#a8087> <http://example.org/ns#a8087> . +<http://example.org/ns#a8088> <http://example.org/ns#a8088> <http://example.org/ns#a8088> . +<http://example.org/ns#a8089> <http://example.org/ns#a8089> <http://example.org/ns#a8089> . +<http://example.org/ns#a8090> <http://example.org/ns#a8090> <http://example.org/ns#a8090> . +<http://example.org/ns#a8091> <http://example.org/ns#a8091> <http://example.org/ns#a8091> . +<http://example.org/ns#a8092> <http://example.org/ns#a8092> <http://example.org/ns#a8092> . +<http://example.org/ns#a8093> <http://example.org/ns#a8093> <http://example.org/ns#a8093> . +<http://example.org/ns#a8094> <http://example.org/ns#a8094> <http://example.org/ns#a8094> . +<http://example.org/ns#a8095> <http://example.org/ns#a8095> <http://example.org/ns#a8095> . +<http://example.org/ns#a8096> <http://example.org/ns#a8096> <http://example.org/ns#a8096> . +<http://example.org/ns#a8097> <http://example.org/ns#a8097> <http://example.org/ns#a8097> . +<http://example.org/ns#a8098> <http://example.org/ns#a8098> <http://example.org/ns#a8098> . +<http://example.org/ns#a8099> <http://example.org/ns#a8099> <http://example.org/ns#a8099> . +<http://example.org/ns#a8100> <http://example.org/ns#a8100> <http://example.org/ns#a8100> . +<http://example.org/ns#a8101> <http://example.org/ns#a8101> <http://example.org/ns#a8101> . +<http://example.org/ns#a8102> <http://example.org/ns#a8102> <http://example.org/ns#a8102> . +<http://example.org/ns#a8103> <http://example.org/ns#a8103> <http://example.org/ns#a8103> . +<http://example.org/ns#a8104> <http://example.org/ns#a8104> <http://example.org/ns#a8104> . +<http://example.org/ns#a8105> <http://example.org/ns#a8105> <http://example.org/ns#a8105> . +<http://example.org/ns#a8106> <http://example.org/ns#a8106> <http://example.org/ns#a8106> . +<http://example.org/ns#a8107> <http://example.org/ns#a8107> <http://example.org/ns#a8107> . +<http://example.org/ns#a8108> <http://example.org/ns#a8108> <http://example.org/ns#a8108> . +<http://example.org/ns#a8109> <http://example.org/ns#a8109> <http://example.org/ns#a8109> . +<http://example.org/ns#a8110> <http://example.org/ns#a8110> <http://example.org/ns#a8110> . +<http://example.org/ns#a8111> <http://example.org/ns#a8111> <http://example.org/ns#a8111> . +<http://example.org/ns#a8112> <http://example.org/ns#a8112> <http://example.org/ns#a8112> . +<http://example.org/ns#a8113> <http://example.org/ns#a8113> <http://example.org/ns#a8113> . +<http://example.org/ns#a8114> <http://example.org/ns#a8114> <http://example.org/ns#a8114> . +<http://example.org/ns#a8115> <http://example.org/ns#a8115> <http://example.org/ns#a8115> . +<http://example.org/ns#a8116> <http://example.org/ns#a8116> <http://example.org/ns#a8116> . +<http://example.org/ns#a8117> <http://example.org/ns#a8117> <http://example.org/ns#a8117> . +<http://example.org/ns#a8118> <http://example.org/ns#a8118> <http://example.org/ns#a8118> . +<http://example.org/ns#a8119> <http://example.org/ns#a8119> <http://example.org/ns#a8119> . +<http://example.org/ns#a8120> <http://example.org/ns#a8120> <http://example.org/ns#a8120> . +<http://example.org/ns#a8121> <http://example.org/ns#a8121> <http://example.org/ns#a8121> . +<http://example.org/ns#a8122> <http://example.org/ns#a8122> <http://example.org/ns#a8122> . +<http://example.org/ns#a8123> <http://example.org/ns#a8123> <http://example.org/ns#a8123> . +<http://example.org/ns#a8124> <http://example.org/ns#a8124> <http://example.org/ns#a8124> . +<http://example.org/ns#a8125> <http://example.org/ns#a8125> <http://example.org/ns#a8125> . +<http://example.org/ns#a8126> <http://example.org/ns#a8126> <http://example.org/ns#a8126> . +<http://example.org/ns#a8127> <http://example.org/ns#a8127> <http://example.org/ns#a8127> . +<http://example.org/ns#a8128> <http://example.org/ns#a8128> <http://example.org/ns#a8128> . +<http://example.org/ns#a8129> <http://example.org/ns#a8129> <http://example.org/ns#a8129> . +<http://example.org/ns#a8130> <http://example.org/ns#a8130> <http://example.org/ns#a8130> . +<http://example.org/ns#a8131> <http://example.org/ns#a8131> <http://example.org/ns#a8131> . +<http://example.org/ns#a8132> <http://example.org/ns#a8132> <http://example.org/ns#a8132> . +<http://example.org/ns#a8133> <http://example.org/ns#a8133> <http://example.org/ns#a8133> . +<http://example.org/ns#a8134> <http://example.org/ns#a8134> <http://example.org/ns#a8134> . +<http://example.org/ns#a8135> <http://example.org/ns#a8135> <http://example.org/ns#a8135> . +<http://example.org/ns#a8136> <http://example.org/ns#a8136> <http://example.org/ns#a8136> . +<http://example.org/ns#a8137> <http://example.org/ns#a8137> <http://example.org/ns#a8137> . +<http://example.org/ns#a8138> <http://example.org/ns#a8138> <http://example.org/ns#a8138> . +<http://example.org/ns#a8139> <http://example.org/ns#a8139> <http://example.org/ns#a8139> . +<http://example.org/ns#a8140> <http://example.org/ns#a8140> <http://example.org/ns#a8140> . +<http://example.org/ns#a8141> <http://example.org/ns#a8141> <http://example.org/ns#a8141> . +<http://example.org/ns#a8142> <http://example.org/ns#a8142> <http://example.org/ns#a8142> . +<http://example.org/ns#a8143> <http://example.org/ns#a8143> <http://example.org/ns#a8143> . +<http://example.org/ns#a8144> <http://example.org/ns#a8144> <http://example.org/ns#a8144> . +<http://example.org/ns#a8145> <http://example.org/ns#a8145> <http://example.org/ns#a8145> . +<http://example.org/ns#a8146> <http://example.org/ns#a8146> <http://example.org/ns#a8146> . +<http://example.org/ns#a8147> <http://example.org/ns#a8147> <http://example.org/ns#a8147> . +<http://example.org/ns#a8148> <http://example.org/ns#a8148> <http://example.org/ns#a8148> . +<http://example.org/ns#a8149> <http://example.org/ns#a8149> <http://example.org/ns#a8149> . +<http://example.org/ns#a8150> <http://example.org/ns#a8150> <http://example.org/ns#a8150> . +<http://example.org/ns#a8151> <http://example.org/ns#a8151> <http://example.org/ns#a8151> . +<http://example.org/ns#a8152> <http://example.org/ns#a8152> <http://example.org/ns#a8152> . +<http://example.org/ns#a8153> <http://example.org/ns#a8153> <http://example.org/ns#a8153> . +<http://example.org/ns#a8154> <http://example.org/ns#a8154> <http://example.org/ns#a8154> . +<http://example.org/ns#a8155> <http://example.org/ns#a8155> <http://example.org/ns#a8155> . +<http://example.org/ns#a8156> <http://example.org/ns#a8156> <http://example.org/ns#a8156> . +<http://example.org/ns#a8157> <http://example.org/ns#a8157> <http://example.org/ns#a8157> . +<http://example.org/ns#a8158> <http://example.org/ns#a8158> <http://example.org/ns#a8158> . +<http://example.org/ns#a8159> <http://example.org/ns#a8159> <http://example.org/ns#a8159> . +<http://example.org/ns#a8160> <http://example.org/ns#a8160> <http://example.org/ns#a8160> . +<http://example.org/ns#a8161> <http://example.org/ns#a8161> <http://example.org/ns#a8161> . +<http://example.org/ns#a8162> <http://example.org/ns#a8162> <http://example.org/ns#a8162> . +<http://example.org/ns#a8163> <http://example.org/ns#a8163> <http://example.org/ns#a8163> . +<http://example.org/ns#a8164> <http://example.org/ns#a8164> <http://example.org/ns#a8164> . +<http://example.org/ns#a8165> <http://example.org/ns#a8165> <http://example.org/ns#a8165> . +<http://example.org/ns#a8166> <http://example.org/ns#a8166> <http://example.org/ns#a8166> . +<http://example.org/ns#a8167> <http://example.org/ns#a8167> <http://example.org/ns#a8167> . +<http://example.org/ns#a8168> <http://example.org/ns#a8168> <http://example.org/ns#a8168> . +<http://example.org/ns#a8169> <http://example.org/ns#a8169> <http://example.org/ns#a8169> . +<http://example.org/ns#a8170> <http://example.org/ns#a8170> <http://example.org/ns#a8170> . +<http://example.org/ns#a8171> <http://example.org/ns#a8171> <http://example.org/ns#a8171> . +<http://example.org/ns#a8172> <http://example.org/ns#a8172> <http://example.org/ns#a8172> . +<http://example.org/ns#a8173> <http://example.org/ns#a8173> <http://example.org/ns#a8173> . +<http://example.org/ns#a8174> <http://example.org/ns#a8174> <http://example.org/ns#a8174> . +<http://example.org/ns#a8175> <http://example.org/ns#a8175> <http://example.org/ns#a8175> . +<http://example.org/ns#a8176> <http://example.org/ns#a8176> <http://example.org/ns#a8176> . +<http://example.org/ns#a8177> <http://example.org/ns#a8177> <http://example.org/ns#a8177> . +<http://example.org/ns#a8178> <http://example.org/ns#a8178> <http://example.org/ns#a8178> . +<http://example.org/ns#a8179> <http://example.org/ns#a8179> <http://example.org/ns#a8179> . +<http://example.org/ns#a8180> <http://example.org/ns#a8180> <http://example.org/ns#a8180> . +<http://example.org/ns#a8181> <http://example.org/ns#a8181> <http://example.org/ns#a8181> . +<http://example.org/ns#a8182> <http://example.org/ns#a8182> <http://example.org/ns#a8182> . +<http://example.org/ns#a8183> <http://example.org/ns#a8183> <http://example.org/ns#a8183> . +<http://example.org/ns#a8184> <http://example.org/ns#a8184> <http://example.org/ns#a8184> . +<http://example.org/ns#a8185> <http://example.org/ns#a8185> <http://example.org/ns#a8185> . +<http://example.org/ns#a8186> <http://example.org/ns#a8186> <http://example.org/ns#a8186> . +<http://example.org/ns#a8187> <http://example.org/ns#a8187> <http://example.org/ns#a8187> . +<http://example.org/ns#a8188> <http://example.org/ns#a8188> <http://example.org/ns#a8188> . +<http://example.org/ns#a8189> <http://example.org/ns#a8189> <http://example.org/ns#a8189> . +<http://example.org/ns#a8190> <http://example.org/ns#a8190> <http://example.org/ns#a8190> . +<http://example.org/ns#a8191> <http://example.org/ns#a8191> <http://example.org/ns#a8191> . +<http://example.org/ns#a8192> <http://example.org/ns#a8192> <http://example.org/ns#a8192> . +<http://example.org/ns#a8193> <http://example.org/ns#a8193> <http://example.org/ns#a8193> . +<http://example.org/ns#a8194> <http://example.org/ns#a8194> <http://example.org/ns#a8194> . +<http://example.org/ns#a8195> <http://example.org/ns#a8195> <http://example.org/ns#a8195> . +<http://example.org/ns#a8196> <http://example.org/ns#a8196> <http://example.org/ns#a8196> . +<http://example.org/ns#a8197> <http://example.org/ns#a8197> <http://example.org/ns#a8197> . +<http://example.org/ns#a8198> <http://example.org/ns#a8198> <http://example.org/ns#a8198> . +<http://example.org/ns#a8199> <http://example.org/ns#a8199> <http://example.org/ns#a8199> . +<http://example.org/ns#a8200> <http://example.org/ns#a8200> <http://example.org/ns#a8200> . +<http://example.org/ns#a8201> <http://example.org/ns#a8201> <http://example.org/ns#a8201> . +<http://example.org/ns#a8202> <http://example.org/ns#a8202> <http://example.org/ns#a8202> . +<http://example.org/ns#a8203> <http://example.org/ns#a8203> <http://example.org/ns#a8203> . +<http://example.org/ns#a8204> <http://example.org/ns#a8204> <http://example.org/ns#a8204> . +<http://example.org/ns#a8205> <http://example.org/ns#a8205> <http://example.org/ns#a8205> . +<http://example.org/ns#a8206> <http://example.org/ns#a8206> <http://example.org/ns#a8206> . +<http://example.org/ns#a8207> <http://example.org/ns#a8207> <http://example.org/ns#a8207> . +<http://example.org/ns#a8208> <http://example.org/ns#a8208> <http://example.org/ns#a8208> . +<http://example.org/ns#a8209> <http://example.org/ns#a8209> <http://example.org/ns#a8209> . +<http://example.org/ns#a8210> <http://example.org/ns#a8210> <http://example.org/ns#a8210> . +<http://example.org/ns#a8211> <http://example.org/ns#a8211> <http://example.org/ns#a8211> . +<http://example.org/ns#a8212> <http://example.org/ns#a8212> <http://example.org/ns#a8212> . +<http://example.org/ns#a8213> <http://example.org/ns#a8213> <http://example.org/ns#a8213> . +<http://example.org/ns#a8214> <http://example.org/ns#a8214> <http://example.org/ns#a8214> . +<http://example.org/ns#a8215> <http://example.org/ns#a8215> <http://example.org/ns#a8215> . +<http://example.org/ns#a8216> <http://example.org/ns#a8216> <http://example.org/ns#a8216> . +<http://example.org/ns#a8217> <http://example.org/ns#a8217> <http://example.org/ns#a8217> . +<http://example.org/ns#a8218> <http://example.org/ns#a8218> <http://example.org/ns#a8218> . +<http://example.org/ns#a8219> <http://example.org/ns#a8219> <http://example.org/ns#a8219> . +<http://example.org/ns#a8220> <http://example.org/ns#a8220> <http://example.org/ns#a8220> . +<http://example.org/ns#a8221> <http://example.org/ns#a8221> <http://example.org/ns#a8221> . +<http://example.org/ns#a8222> <http://example.org/ns#a8222> <http://example.org/ns#a8222> . +<http://example.org/ns#a8223> <http://example.org/ns#a8223> <http://example.org/ns#a8223> . +<http://example.org/ns#a8224> <http://example.org/ns#a8224> <http://example.org/ns#a8224> . +<http://example.org/ns#a8225> <http://example.org/ns#a8225> <http://example.org/ns#a8225> . +<http://example.org/ns#a8226> <http://example.org/ns#a8226> <http://example.org/ns#a8226> . +<http://example.org/ns#a8227> <http://example.org/ns#a8227> <http://example.org/ns#a8227> . +<http://example.org/ns#a8228> <http://example.org/ns#a8228> <http://example.org/ns#a8228> . +<http://example.org/ns#a8229> <http://example.org/ns#a8229> <http://example.org/ns#a8229> . +<http://example.org/ns#a8230> <http://example.org/ns#a8230> <http://example.org/ns#a8230> . +<http://example.org/ns#a8231> <http://example.org/ns#a8231> <http://example.org/ns#a8231> . +<http://example.org/ns#a8232> <http://example.org/ns#a8232> <http://example.org/ns#a8232> . +<http://example.org/ns#a8233> <http://example.org/ns#a8233> <http://example.org/ns#a8233> . +<http://example.org/ns#a8234> <http://example.org/ns#a8234> <http://example.org/ns#a8234> . +<http://example.org/ns#a8235> <http://example.org/ns#a8235> <http://example.org/ns#a8235> . +<http://example.org/ns#a8236> <http://example.org/ns#a8236> <http://example.org/ns#a8236> . +<http://example.org/ns#a8237> <http://example.org/ns#a8237> <http://example.org/ns#a8237> . +<http://example.org/ns#a8238> <http://example.org/ns#a8238> <http://example.org/ns#a8238> . +<http://example.org/ns#a8239> <http://example.org/ns#a8239> <http://example.org/ns#a8239> . +<http://example.org/ns#a8240> <http://example.org/ns#a8240> <http://example.org/ns#a8240> . +<http://example.org/ns#a8241> <http://example.org/ns#a8241> <http://example.org/ns#a8241> . +<http://example.org/ns#a8242> <http://example.org/ns#a8242> <http://example.org/ns#a8242> . +<http://example.org/ns#a8243> <http://example.org/ns#a8243> <http://example.org/ns#a8243> . +<http://example.org/ns#a8244> <http://example.org/ns#a8244> <http://example.org/ns#a8244> . +<http://example.org/ns#a8245> <http://example.org/ns#a8245> <http://example.org/ns#a8245> . +<http://example.org/ns#a8246> <http://example.org/ns#a8246> <http://example.org/ns#a8246> . +<http://example.org/ns#a8247> <http://example.org/ns#a8247> <http://example.org/ns#a8247> . +<http://example.org/ns#a8248> <http://example.org/ns#a8248> <http://example.org/ns#a8248> . +<http://example.org/ns#a8249> <http://example.org/ns#a8249> <http://example.org/ns#a8249> . +<http://example.org/ns#a8250> <http://example.org/ns#a8250> <http://example.org/ns#a8250> . +<http://example.org/ns#a8251> <http://example.org/ns#a8251> <http://example.org/ns#a8251> . +<http://example.org/ns#a8252> <http://example.org/ns#a8252> <http://example.org/ns#a8252> . +<http://example.org/ns#a8253> <http://example.org/ns#a8253> <http://example.org/ns#a8253> . +<http://example.org/ns#a8254> <http://example.org/ns#a8254> <http://example.org/ns#a8254> . +<http://example.org/ns#a8255> <http://example.org/ns#a8255> <http://example.org/ns#a8255> . +<http://example.org/ns#a8256> <http://example.org/ns#a8256> <http://example.org/ns#a8256> . +<http://example.org/ns#a8257> <http://example.org/ns#a8257> <http://example.org/ns#a8257> . +<http://example.org/ns#a8258> <http://example.org/ns#a8258> <http://example.org/ns#a8258> . +<http://example.org/ns#a8259> <http://example.org/ns#a8259> <http://example.org/ns#a8259> . +<http://example.org/ns#a8260> <http://example.org/ns#a8260> <http://example.org/ns#a8260> . +<http://example.org/ns#a8261> <http://example.org/ns#a8261> <http://example.org/ns#a8261> . +<http://example.org/ns#a8262> <http://example.org/ns#a8262> <http://example.org/ns#a8262> . +<http://example.org/ns#a8263> <http://example.org/ns#a8263> <http://example.org/ns#a8263> . +<http://example.org/ns#a8264> <http://example.org/ns#a8264> <http://example.org/ns#a8264> . +<http://example.org/ns#a8265> <http://example.org/ns#a8265> <http://example.org/ns#a8265> . +<http://example.org/ns#a8266> <http://example.org/ns#a8266> <http://example.org/ns#a8266> . +<http://example.org/ns#a8267> <http://example.org/ns#a8267> <http://example.org/ns#a8267> . +<http://example.org/ns#a8268> <http://example.org/ns#a8268> <http://example.org/ns#a8268> . +<http://example.org/ns#a8269> <http://example.org/ns#a8269> <http://example.org/ns#a8269> . +<http://example.org/ns#a8270> <http://example.org/ns#a8270> <http://example.org/ns#a8270> . +<http://example.org/ns#a8271> <http://example.org/ns#a8271> <http://example.org/ns#a8271> . +<http://example.org/ns#a8272> <http://example.org/ns#a8272> <http://example.org/ns#a8272> . +<http://example.org/ns#a8273> <http://example.org/ns#a8273> <http://example.org/ns#a8273> . +<http://example.org/ns#a8274> <http://example.org/ns#a8274> <http://example.org/ns#a8274> . +<http://example.org/ns#a8275> <http://example.org/ns#a8275> <http://example.org/ns#a8275> . +<http://example.org/ns#a8276> <http://example.org/ns#a8276> <http://example.org/ns#a8276> . +<http://example.org/ns#a8277> <http://example.org/ns#a8277> <http://example.org/ns#a8277> . +<http://example.org/ns#a8278> <http://example.org/ns#a8278> <http://example.org/ns#a8278> . +<http://example.org/ns#a8279> <http://example.org/ns#a8279> <http://example.org/ns#a8279> . +<http://example.org/ns#a8280> <http://example.org/ns#a8280> <http://example.org/ns#a8280> . +<http://example.org/ns#a8281> <http://example.org/ns#a8281> <http://example.org/ns#a8281> . +<http://example.org/ns#a8282> <http://example.org/ns#a8282> <http://example.org/ns#a8282> . +<http://example.org/ns#a8283> <http://example.org/ns#a8283> <http://example.org/ns#a8283> . +<http://example.org/ns#a8284> <http://example.org/ns#a8284> <http://example.org/ns#a8284> . +<http://example.org/ns#a8285> <http://example.org/ns#a8285> <http://example.org/ns#a8285> . +<http://example.org/ns#a8286> <http://example.org/ns#a8286> <http://example.org/ns#a8286> . +<http://example.org/ns#a8287> <http://example.org/ns#a8287> <http://example.org/ns#a8287> . +<http://example.org/ns#a8288> <http://example.org/ns#a8288> <http://example.org/ns#a8288> . +<http://example.org/ns#a8289> <http://example.org/ns#a8289> <http://example.org/ns#a8289> . +<http://example.org/ns#a8290> <http://example.org/ns#a8290> <http://example.org/ns#a8290> . +<http://example.org/ns#a8291> <http://example.org/ns#a8291> <http://example.org/ns#a8291> . +<http://example.org/ns#a8292> <http://example.org/ns#a8292> <http://example.org/ns#a8292> . +<http://example.org/ns#a8293> <http://example.org/ns#a8293> <http://example.org/ns#a8293> . +<http://example.org/ns#a8294> <http://example.org/ns#a8294> <http://example.org/ns#a8294> . +<http://example.org/ns#a8295> <http://example.org/ns#a8295> <http://example.org/ns#a8295> . +<http://example.org/ns#a8296> <http://example.org/ns#a8296> <http://example.org/ns#a8296> . +<http://example.org/ns#a8297> <http://example.org/ns#a8297> <http://example.org/ns#a8297> . +<http://example.org/ns#a8298> <http://example.org/ns#a8298> <http://example.org/ns#a8298> . +<http://example.org/ns#a8299> <http://example.org/ns#a8299> <http://example.org/ns#a8299> . +<http://example.org/ns#a8300> <http://example.org/ns#a8300> <http://example.org/ns#a8300> . +<http://example.org/ns#a8301> <http://example.org/ns#a8301> <http://example.org/ns#a8301> . +<http://example.org/ns#a8302> <http://example.org/ns#a8302> <http://example.org/ns#a8302> . +<http://example.org/ns#a8303> <http://example.org/ns#a8303> <http://example.org/ns#a8303> . +<http://example.org/ns#a8304> <http://example.org/ns#a8304> <http://example.org/ns#a8304> . +<http://example.org/ns#a8305> <http://example.org/ns#a8305> <http://example.org/ns#a8305> . +<http://example.org/ns#a8306> <http://example.org/ns#a8306> <http://example.org/ns#a8306> . +<http://example.org/ns#a8307> <http://example.org/ns#a8307> <http://example.org/ns#a8307> . +<http://example.org/ns#a8308> <http://example.org/ns#a8308> <http://example.org/ns#a8308> . +<http://example.org/ns#a8309> <http://example.org/ns#a8309> <http://example.org/ns#a8309> . +<http://example.org/ns#a8310> <http://example.org/ns#a8310> <http://example.org/ns#a8310> . +<http://example.org/ns#a8311> <http://example.org/ns#a8311> <http://example.org/ns#a8311> . +<http://example.org/ns#a8312> <http://example.org/ns#a8312> <http://example.org/ns#a8312> . +<http://example.org/ns#a8313> <http://example.org/ns#a8313> <http://example.org/ns#a8313> . +<http://example.org/ns#a8314> <http://example.org/ns#a8314> <http://example.org/ns#a8314> . +<http://example.org/ns#a8315> <http://example.org/ns#a8315> <http://example.org/ns#a8315> . +<http://example.org/ns#a8316> <http://example.org/ns#a8316> <http://example.org/ns#a8316> . +<http://example.org/ns#a8317> <http://example.org/ns#a8317> <http://example.org/ns#a8317> . +<http://example.org/ns#a8318> <http://example.org/ns#a8318> <http://example.org/ns#a8318> . +<http://example.org/ns#a8319> <http://example.org/ns#a8319> <http://example.org/ns#a8319> . +<http://example.org/ns#a8320> <http://example.org/ns#a8320> <http://example.org/ns#a8320> . +<http://example.org/ns#a8321> <http://example.org/ns#a8321> <http://example.org/ns#a8321> . +<http://example.org/ns#a8322> <http://example.org/ns#a8322> <http://example.org/ns#a8322> . +<http://example.org/ns#a8323> <http://example.org/ns#a8323> <http://example.org/ns#a8323> . +<http://example.org/ns#a8324> <http://example.org/ns#a8324> <http://example.org/ns#a8324> . +<http://example.org/ns#a8325> <http://example.org/ns#a8325> <http://example.org/ns#a8325> . +<http://example.org/ns#a8326> <http://example.org/ns#a8326> <http://example.org/ns#a8326> . +<http://example.org/ns#a8327> <http://example.org/ns#a8327> <http://example.org/ns#a8327> . +<http://example.org/ns#a8328> <http://example.org/ns#a8328> <http://example.org/ns#a8328> . +<http://example.org/ns#a8329> <http://example.org/ns#a8329> <http://example.org/ns#a8329> . +<http://example.org/ns#a8330> <http://example.org/ns#a8330> <http://example.org/ns#a8330> . +<http://example.org/ns#a8331> <http://example.org/ns#a8331> <http://example.org/ns#a8331> . +<http://example.org/ns#a8332> <http://example.org/ns#a8332> <http://example.org/ns#a8332> . +<http://example.org/ns#a8333> <http://example.org/ns#a8333> <http://example.org/ns#a8333> . +<http://example.org/ns#a8334> <http://example.org/ns#a8334> <http://example.org/ns#a8334> . +<http://example.org/ns#a8335> <http://example.org/ns#a8335> <http://example.org/ns#a8335> . +<http://example.org/ns#a8336> <http://example.org/ns#a8336> <http://example.org/ns#a8336> . +<http://example.org/ns#a8337> <http://example.org/ns#a8337> <http://example.org/ns#a8337> . +<http://example.org/ns#a8338> <http://example.org/ns#a8338> <http://example.org/ns#a8338> . +<http://example.org/ns#a8339> <http://example.org/ns#a8339> <http://example.org/ns#a8339> . +<http://example.org/ns#a8340> <http://example.org/ns#a8340> <http://example.org/ns#a8340> . +<http://example.org/ns#a8341> <http://example.org/ns#a8341> <http://example.org/ns#a8341> . +<http://example.org/ns#a8342> <http://example.org/ns#a8342> <http://example.org/ns#a8342> . +<http://example.org/ns#a8343> <http://example.org/ns#a8343> <http://example.org/ns#a8343> . +<http://example.org/ns#a8344> <http://example.org/ns#a8344> <http://example.org/ns#a8344> . +<http://example.org/ns#a8345> <http://example.org/ns#a8345> <http://example.org/ns#a8345> . +<http://example.org/ns#a8346> <http://example.org/ns#a8346> <http://example.org/ns#a8346> . +<http://example.org/ns#a8347> <http://example.org/ns#a8347> <http://example.org/ns#a8347> . +<http://example.org/ns#a8348> <http://example.org/ns#a8348> <http://example.org/ns#a8348> . +<http://example.org/ns#a8349> <http://example.org/ns#a8349> <http://example.org/ns#a8349> . +<http://example.org/ns#a8350> <http://example.org/ns#a8350> <http://example.org/ns#a8350> . +<http://example.org/ns#a8351> <http://example.org/ns#a8351> <http://example.org/ns#a8351> . +<http://example.org/ns#a8352> <http://example.org/ns#a8352> <http://example.org/ns#a8352> . +<http://example.org/ns#a8353> <http://example.org/ns#a8353> <http://example.org/ns#a8353> . +<http://example.org/ns#a8354> <http://example.org/ns#a8354> <http://example.org/ns#a8354> . +<http://example.org/ns#a8355> <http://example.org/ns#a8355> <http://example.org/ns#a8355> . +<http://example.org/ns#a8356> <http://example.org/ns#a8356> <http://example.org/ns#a8356> . +<http://example.org/ns#a8357> <http://example.org/ns#a8357> <http://example.org/ns#a8357> . +<http://example.org/ns#a8358> <http://example.org/ns#a8358> <http://example.org/ns#a8358> . +<http://example.org/ns#a8359> <http://example.org/ns#a8359> <http://example.org/ns#a8359> . +<http://example.org/ns#a8360> <http://example.org/ns#a8360> <http://example.org/ns#a8360> . +<http://example.org/ns#a8361> <http://example.org/ns#a8361> <http://example.org/ns#a8361> . +<http://example.org/ns#a8362> <http://example.org/ns#a8362> <http://example.org/ns#a8362> . +<http://example.org/ns#a8363> <http://example.org/ns#a8363> <http://example.org/ns#a8363> . +<http://example.org/ns#a8364> <http://example.org/ns#a8364> <http://example.org/ns#a8364> . +<http://example.org/ns#a8365> <http://example.org/ns#a8365> <http://example.org/ns#a8365> . +<http://example.org/ns#a8366> <http://example.org/ns#a8366> <http://example.org/ns#a8366> . +<http://example.org/ns#a8367> <http://example.org/ns#a8367> <http://example.org/ns#a8367> . +<http://example.org/ns#a8368> <http://example.org/ns#a8368> <http://example.org/ns#a8368> . +<http://example.org/ns#a8369> <http://example.org/ns#a8369> <http://example.org/ns#a8369> . +<http://example.org/ns#a8370> <http://example.org/ns#a8370> <http://example.org/ns#a8370> . +<http://example.org/ns#a8371> <http://example.org/ns#a8371> <http://example.org/ns#a8371> . +<http://example.org/ns#a8372> <http://example.org/ns#a8372> <http://example.org/ns#a8372> . +<http://example.org/ns#a8373> <http://example.org/ns#a8373> <http://example.org/ns#a8373> . +<http://example.org/ns#a8374> <http://example.org/ns#a8374> <http://example.org/ns#a8374> . +<http://example.org/ns#a8375> <http://example.org/ns#a8375> <http://example.org/ns#a8375> . +<http://example.org/ns#a8376> <http://example.org/ns#a8376> <http://example.org/ns#a8376> . +<http://example.org/ns#a8377> <http://example.org/ns#a8377> <http://example.org/ns#a8377> . +<http://example.org/ns#a8378> <http://example.org/ns#a8378> <http://example.org/ns#a8378> . +<http://example.org/ns#a8379> <http://example.org/ns#a8379> <http://example.org/ns#a8379> . +<http://example.org/ns#a8380> <http://example.org/ns#a8380> <http://example.org/ns#a8380> . +<http://example.org/ns#a8381> <http://example.org/ns#a8381> <http://example.org/ns#a8381> . +<http://example.org/ns#a8382> <http://example.org/ns#a8382> <http://example.org/ns#a8382> . +<http://example.org/ns#a8383> <http://example.org/ns#a8383> <http://example.org/ns#a8383> . +<http://example.org/ns#a8384> <http://example.org/ns#a8384> <http://example.org/ns#a8384> . +<http://example.org/ns#a8385> <http://example.org/ns#a8385> <http://example.org/ns#a8385> . +<http://example.org/ns#a8386> <http://example.org/ns#a8386> <http://example.org/ns#a8386> . +<http://example.org/ns#a8387> <http://example.org/ns#a8387> <http://example.org/ns#a8387> . +<http://example.org/ns#a8388> <http://example.org/ns#a8388> <http://example.org/ns#a8388> . +<http://example.org/ns#a8389> <http://example.org/ns#a8389> <http://example.org/ns#a8389> . +<http://example.org/ns#a8390> <http://example.org/ns#a8390> <http://example.org/ns#a8390> . +<http://example.org/ns#a8391> <http://example.org/ns#a8391> <http://example.org/ns#a8391> . +<http://example.org/ns#a8392> <http://example.org/ns#a8392> <http://example.org/ns#a8392> . +<http://example.org/ns#a8393> <http://example.org/ns#a8393> <http://example.org/ns#a8393> . +<http://example.org/ns#a8394> <http://example.org/ns#a8394> <http://example.org/ns#a8394> . +<http://example.org/ns#a8395> <http://example.org/ns#a8395> <http://example.org/ns#a8395> . +<http://example.org/ns#a8396> <http://example.org/ns#a8396> <http://example.org/ns#a8396> . +<http://example.org/ns#a8397> <http://example.org/ns#a8397> <http://example.org/ns#a8397> . +<http://example.org/ns#a8398> <http://example.org/ns#a8398> <http://example.org/ns#a8398> . +<http://example.org/ns#a8399> <http://example.org/ns#a8399> <http://example.org/ns#a8399> . +<http://example.org/ns#a8400> <http://example.org/ns#a8400> <http://example.org/ns#a8400> . +<http://example.org/ns#a8401> <http://example.org/ns#a8401> <http://example.org/ns#a8401> . +<http://example.org/ns#a8402> <http://example.org/ns#a8402> <http://example.org/ns#a8402> . +<http://example.org/ns#a8403> <http://example.org/ns#a8403> <http://example.org/ns#a8403> . +<http://example.org/ns#a8404> <http://example.org/ns#a8404> <http://example.org/ns#a8404> . +<http://example.org/ns#a8405> <http://example.org/ns#a8405> <http://example.org/ns#a8405> . +<http://example.org/ns#a8406> <http://example.org/ns#a8406> <http://example.org/ns#a8406> . +<http://example.org/ns#a8407> <http://example.org/ns#a8407> <http://example.org/ns#a8407> . +<http://example.org/ns#a8408> <http://example.org/ns#a8408> <http://example.org/ns#a8408> . +<http://example.org/ns#a8409> <http://example.org/ns#a8409> <http://example.org/ns#a8409> . +<http://example.org/ns#a8410> <http://example.org/ns#a8410> <http://example.org/ns#a8410> . +<http://example.org/ns#a8411> <http://example.org/ns#a8411> <http://example.org/ns#a8411> . +<http://example.org/ns#a8412> <http://example.org/ns#a8412> <http://example.org/ns#a8412> . +<http://example.org/ns#a8413> <http://example.org/ns#a8413> <http://example.org/ns#a8413> . +<http://example.org/ns#a8414> <http://example.org/ns#a8414> <http://example.org/ns#a8414> . +<http://example.org/ns#a8415> <http://example.org/ns#a8415> <http://example.org/ns#a8415> . +<http://example.org/ns#a8416> <http://example.org/ns#a8416> <http://example.org/ns#a8416> . +<http://example.org/ns#a8417> <http://example.org/ns#a8417> <http://example.org/ns#a8417> . +<http://example.org/ns#a8418> <http://example.org/ns#a8418> <http://example.org/ns#a8418> . +<http://example.org/ns#a8419> <http://example.org/ns#a8419> <http://example.org/ns#a8419> . +<http://example.org/ns#a8420> <http://example.org/ns#a8420> <http://example.org/ns#a8420> . +<http://example.org/ns#a8421> <http://example.org/ns#a8421> <http://example.org/ns#a8421> . +<http://example.org/ns#a8422> <http://example.org/ns#a8422> <http://example.org/ns#a8422> . +<http://example.org/ns#a8423> <http://example.org/ns#a8423> <http://example.org/ns#a8423> . +<http://example.org/ns#a8424> <http://example.org/ns#a8424> <http://example.org/ns#a8424> . +<http://example.org/ns#a8425> <http://example.org/ns#a8425> <http://example.org/ns#a8425> . +<http://example.org/ns#a8426> <http://example.org/ns#a8426> <http://example.org/ns#a8426> . +<http://example.org/ns#a8427> <http://example.org/ns#a8427> <http://example.org/ns#a8427> . +<http://example.org/ns#a8428> <http://example.org/ns#a8428> <http://example.org/ns#a8428> . +<http://example.org/ns#a8429> <http://example.org/ns#a8429> <http://example.org/ns#a8429> . +<http://example.org/ns#a8430> <http://example.org/ns#a8430> <http://example.org/ns#a8430> . +<http://example.org/ns#a8431> <http://example.org/ns#a8431> <http://example.org/ns#a8431> . +<http://example.org/ns#a8432> <http://example.org/ns#a8432> <http://example.org/ns#a8432> . +<http://example.org/ns#a8433> <http://example.org/ns#a8433> <http://example.org/ns#a8433> . +<http://example.org/ns#a8434> <http://example.org/ns#a8434> <http://example.org/ns#a8434> . +<http://example.org/ns#a8435> <http://example.org/ns#a8435> <http://example.org/ns#a8435> . +<http://example.org/ns#a8436> <http://example.org/ns#a8436> <http://example.org/ns#a8436> . +<http://example.org/ns#a8437> <http://example.org/ns#a8437> <http://example.org/ns#a8437> . +<http://example.org/ns#a8438> <http://example.org/ns#a8438> <http://example.org/ns#a8438> . +<http://example.org/ns#a8439> <http://example.org/ns#a8439> <http://example.org/ns#a8439> . +<http://example.org/ns#a8440> <http://example.org/ns#a8440> <http://example.org/ns#a8440> . +<http://example.org/ns#a8441> <http://example.org/ns#a8441> <http://example.org/ns#a8441> . +<http://example.org/ns#a8442> <http://example.org/ns#a8442> <http://example.org/ns#a8442> . +<http://example.org/ns#a8443> <http://example.org/ns#a8443> <http://example.org/ns#a8443> . +<http://example.org/ns#a8444> <http://example.org/ns#a8444> <http://example.org/ns#a8444> . +<http://example.org/ns#a8445> <http://example.org/ns#a8445> <http://example.org/ns#a8445> . +<http://example.org/ns#a8446> <http://example.org/ns#a8446> <http://example.org/ns#a8446> . +<http://example.org/ns#a8447> <http://example.org/ns#a8447> <http://example.org/ns#a8447> . +<http://example.org/ns#a8448> <http://example.org/ns#a8448> <http://example.org/ns#a8448> . +<http://example.org/ns#a8449> <http://example.org/ns#a8449> <http://example.org/ns#a8449> . +<http://example.org/ns#a8450> <http://example.org/ns#a8450> <http://example.org/ns#a8450> . +<http://example.org/ns#a8451> <http://example.org/ns#a8451> <http://example.org/ns#a8451> . +<http://example.org/ns#a8452> <http://example.org/ns#a8452> <http://example.org/ns#a8452> . +<http://example.org/ns#a8453> <http://example.org/ns#a8453> <http://example.org/ns#a8453> . +<http://example.org/ns#a8454> <http://example.org/ns#a8454> <http://example.org/ns#a8454> . +<http://example.org/ns#a8455> <http://example.org/ns#a8455> <http://example.org/ns#a8455> . +<http://example.org/ns#a8456> <http://example.org/ns#a8456> <http://example.org/ns#a8456> . +<http://example.org/ns#a8457> <http://example.org/ns#a8457> <http://example.org/ns#a8457> . +<http://example.org/ns#a8458> <http://example.org/ns#a8458> <http://example.org/ns#a8458> . +<http://example.org/ns#a8459> <http://example.org/ns#a8459> <http://example.org/ns#a8459> . +<http://example.org/ns#a8460> <http://example.org/ns#a8460> <http://example.org/ns#a8460> . +<http://example.org/ns#a8461> <http://example.org/ns#a8461> <http://example.org/ns#a8461> . +<http://example.org/ns#a8462> <http://example.org/ns#a8462> <http://example.org/ns#a8462> . +<http://example.org/ns#a8463> <http://example.org/ns#a8463> <http://example.org/ns#a8463> . +<http://example.org/ns#a8464> <http://example.org/ns#a8464> <http://example.org/ns#a8464> . +<http://example.org/ns#a8465> <http://example.org/ns#a8465> <http://example.org/ns#a8465> . +<http://example.org/ns#a8466> <http://example.org/ns#a8466> <http://example.org/ns#a8466> . +<http://example.org/ns#a8467> <http://example.org/ns#a8467> <http://example.org/ns#a8467> . +<http://example.org/ns#a8468> <http://example.org/ns#a8468> <http://example.org/ns#a8468> . +<http://example.org/ns#a8469> <http://example.org/ns#a8469> <http://example.org/ns#a8469> . +<http://example.org/ns#a8470> <http://example.org/ns#a8470> <http://example.org/ns#a8470> . +<http://example.org/ns#a8471> <http://example.org/ns#a8471> <http://example.org/ns#a8471> . +<http://example.org/ns#a8472> <http://example.org/ns#a8472> <http://example.org/ns#a8472> . +<http://example.org/ns#a8473> <http://example.org/ns#a8473> <http://example.org/ns#a8473> . +<http://example.org/ns#a8474> <http://example.org/ns#a8474> <http://example.org/ns#a8474> . +<http://example.org/ns#a8475> <http://example.org/ns#a8475> <http://example.org/ns#a8475> . +<http://example.org/ns#a8476> <http://example.org/ns#a8476> <http://example.org/ns#a8476> . +<http://example.org/ns#a8477> <http://example.org/ns#a8477> <http://example.org/ns#a8477> . +<http://example.org/ns#a8478> <http://example.org/ns#a8478> <http://example.org/ns#a8478> . +<http://example.org/ns#a8479> <http://example.org/ns#a8479> <http://example.org/ns#a8479> . +<http://example.org/ns#a8480> <http://example.org/ns#a8480> <http://example.org/ns#a8480> . +<http://example.org/ns#a8481> <http://example.org/ns#a8481> <http://example.org/ns#a8481> . +<http://example.org/ns#a8482> <http://example.org/ns#a8482> <http://example.org/ns#a8482> . +<http://example.org/ns#a8483> <http://example.org/ns#a8483> <http://example.org/ns#a8483> . +<http://example.org/ns#a8484> <http://example.org/ns#a8484> <http://example.org/ns#a8484> . +<http://example.org/ns#a8485> <http://example.org/ns#a8485> <http://example.org/ns#a8485> . +<http://example.org/ns#a8486> <http://example.org/ns#a8486> <http://example.org/ns#a8486> . +<http://example.org/ns#a8487> <http://example.org/ns#a8487> <http://example.org/ns#a8487> . +<http://example.org/ns#a8488> <http://example.org/ns#a8488> <http://example.org/ns#a8488> . +<http://example.org/ns#a8489> <http://example.org/ns#a8489> <http://example.org/ns#a8489> . +<http://example.org/ns#a8490> <http://example.org/ns#a8490> <http://example.org/ns#a8490> . +<http://example.org/ns#a8491> <http://example.org/ns#a8491> <http://example.org/ns#a8491> . +<http://example.org/ns#a8492> <http://example.org/ns#a8492> <http://example.org/ns#a8492> . +<http://example.org/ns#a8493> <http://example.org/ns#a8493> <http://example.org/ns#a8493> . +<http://example.org/ns#a8494> <http://example.org/ns#a8494> <http://example.org/ns#a8494> . +<http://example.org/ns#a8495> <http://example.org/ns#a8495> <http://example.org/ns#a8495> . +<http://example.org/ns#a8496> <http://example.org/ns#a8496> <http://example.org/ns#a8496> . +<http://example.org/ns#a8497> <http://example.org/ns#a8497> <http://example.org/ns#a8497> . +<http://example.org/ns#a8498> <http://example.org/ns#a8498> <http://example.org/ns#a8498> . +<http://example.org/ns#a8499> <http://example.org/ns#a8499> <http://example.org/ns#a8499> . +<http://example.org/ns#a8500> <http://example.org/ns#a8500> <http://example.org/ns#a8500> . +<http://example.org/ns#a8501> <http://example.org/ns#a8501> <http://example.org/ns#a8501> . +<http://example.org/ns#a8502> <http://example.org/ns#a8502> <http://example.org/ns#a8502> . +<http://example.org/ns#a8503> <http://example.org/ns#a8503> <http://example.org/ns#a8503> . +<http://example.org/ns#a8504> <http://example.org/ns#a8504> <http://example.org/ns#a8504> . +<http://example.org/ns#a8505> <http://example.org/ns#a8505> <http://example.org/ns#a8505> . +<http://example.org/ns#a8506> <http://example.org/ns#a8506> <http://example.org/ns#a8506> . +<http://example.org/ns#a8507> <http://example.org/ns#a8507> <http://example.org/ns#a8507> . +<http://example.org/ns#a8508> <http://example.org/ns#a8508> <http://example.org/ns#a8508> . +<http://example.org/ns#a8509> <http://example.org/ns#a8509> <http://example.org/ns#a8509> . +<http://example.org/ns#a8510> <http://example.org/ns#a8510> <http://example.org/ns#a8510> . +<http://example.org/ns#a8511> <http://example.org/ns#a8511> <http://example.org/ns#a8511> . +<http://example.org/ns#a8512> <http://example.org/ns#a8512> <http://example.org/ns#a8512> . +<http://example.org/ns#a8513> <http://example.org/ns#a8513> <http://example.org/ns#a8513> . +<http://example.org/ns#a8514> <http://example.org/ns#a8514> <http://example.org/ns#a8514> . +<http://example.org/ns#a8515> <http://example.org/ns#a8515> <http://example.org/ns#a8515> . +<http://example.org/ns#a8516> <http://example.org/ns#a8516> <http://example.org/ns#a8516> . +<http://example.org/ns#a8517> <http://example.org/ns#a8517> <http://example.org/ns#a8517> . +<http://example.org/ns#a8518> <http://example.org/ns#a8518> <http://example.org/ns#a8518> . +<http://example.org/ns#a8519> <http://example.org/ns#a8519> <http://example.org/ns#a8519> . +<http://example.org/ns#a8520> <http://example.org/ns#a8520> <http://example.org/ns#a8520> . +<http://example.org/ns#a8521> <http://example.org/ns#a8521> <http://example.org/ns#a8521> . +<http://example.org/ns#a8522> <http://example.org/ns#a8522> <http://example.org/ns#a8522> . +<http://example.org/ns#a8523> <http://example.org/ns#a8523> <http://example.org/ns#a8523> . +<http://example.org/ns#a8524> <http://example.org/ns#a8524> <http://example.org/ns#a8524> . +<http://example.org/ns#a8525> <http://example.org/ns#a8525> <http://example.org/ns#a8525> . +<http://example.org/ns#a8526> <http://example.org/ns#a8526> <http://example.org/ns#a8526> . +<http://example.org/ns#a8527> <http://example.org/ns#a8527> <http://example.org/ns#a8527> . +<http://example.org/ns#a8528> <http://example.org/ns#a8528> <http://example.org/ns#a8528> . +<http://example.org/ns#a8529> <http://example.org/ns#a8529> <http://example.org/ns#a8529> . +<http://example.org/ns#a8530> <http://example.org/ns#a8530> <http://example.org/ns#a8530> . +<http://example.org/ns#a8531> <http://example.org/ns#a8531> <http://example.org/ns#a8531> . +<http://example.org/ns#a8532> <http://example.org/ns#a8532> <http://example.org/ns#a8532> . +<http://example.org/ns#a8533> <http://example.org/ns#a8533> <http://example.org/ns#a8533> . +<http://example.org/ns#a8534> <http://example.org/ns#a8534> <http://example.org/ns#a8534> . +<http://example.org/ns#a8535> <http://example.org/ns#a8535> <http://example.org/ns#a8535> . +<http://example.org/ns#a8536> <http://example.org/ns#a8536> <http://example.org/ns#a8536> . +<http://example.org/ns#a8537> <http://example.org/ns#a8537> <http://example.org/ns#a8537> . +<http://example.org/ns#a8538> <http://example.org/ns#a8538> <http://example.org/ns#a8538> . +<http://example.org/ns#a8539> <http://example.org/ns#a8539> <http://example.org/ns#a8539> . +<http://example.org/ns#a8540> <http://example.org/ns#a8540> <http://example.org/ns#a8540> . +<http://example.org/ns#a8541> <http://example.org/ns#a8541> <http://example.org/ns#a8541> . +<http://example.org/ns#a8542> <http://example.org/ns#a8542> <http://example.org/ns#a8542> . +<http://example.org/ns#a8543> <http://example.org/ns#a8543> <http://example.org/ns#a8543> . +<http://example.org/ns#a8544> <http://example.org/ns#a8544> <http://example.org/ns#a8544> . +<http://example.org/ns#a8545> <http://example.org/ns#a8545> <http://example.org/ns#a8545> . +<http://example.org/ns#a8546> <http://example.org/ns#a8546> <http://example.org/ns#a8546> . +<http://example.org/ns#a8547> <http://example.org/ns#a8547> <http://example.org/ns#a8547> . +<http://example.org/ns#a8548> <http://example.org/ns#a8548> <http://example.org/ns#a8548> . +<http://example.org/ns#a8549> <http://example.org/ns#a8549> <http://example.org/ns#a8549> . +<http://example.org/ns#a8550> <http://example.org/ns#a8550> <http://example.org/ns#a8550> . +<http://example.org/ns#a8551> <http://example.org/ns#a8551> <http://example.org/ns#a8551> . +<http://example.org/ns#a8552> <http://example.org/ns#a8552> <http://example.org/ns#a8552> . +<http://example.org/ns#a8553> <http://example.org/ns#a8553> <http://example.org/ns#a8553> . +<http://example.org/ns#a8554> <http://example.org/ns#a8554> <http://example.org/ns#a8554> . +<http://example.org/ns#a8555> <http://example.org/ns#a8555> <http://example.org/ns#a8555> . +<http://example.org/ns#a8556> <http://example.org/ns#a8556> <http://example.org/ns#a8556> . +<http://example.org/ns#a8557> <http://example.org/ns#a8557> <http://example.org/ns#a8557> . +<http://example.org/ns#a8558> <http://example.org/ns#a8558> <http://example.org/ns#a8558> . +<http://example.org/ns#a8559> <http://example.org/ns#a8559> <http://example.org/ns#a8559> . +<http://example.org/ns#a8560> <http://example.org/ns#a8560> <http://example.org/ns#a8560> . +<http://example.org/ns#a8561> <http://example.org/ns#a8561> <http://example.org/ns#a8561> . +<http://example.org/ns#a8562> <http://example.org/ns#a8562> <http://example.org/ns#a8562> . +<http://example.org/ns#a8563> <http://example.org/ns#a8563> <http://example.org/ns#a8563> . +<http://example.org/ns#a8564> <http://example.org/ns#a8564> <http://example.org/ns#a8564> . +<http://example.org/ns#a8565> <http://example.org/ns#a8565> <http://example.org/ns#a8565> . +<http://example.org/ns#a8566> <http://example.org/ns#a8566> <http://example.org/ns#a8566> . +<http://example.org/ns#a8567> <http://example.org/ns#a8567> <http://example.org/ns#a8567> . +<http://example.org/ns#a8568> <http://example.org/ns#a8568> <http://example.org/ns#a8568> . +<http://example.org/ns#a8569> <http://example.org/ns#a8569> <http://example.org/ns#a8569> . +<http://example.org/ns#a8570> <http://example.org/ns#a8570> <http://example.org/ns#a8570> . +<http://example.org/ns#a8571> <http://example.org/ns#a8571> <http://example.org/ns#a8571> . +<http://example.org/ns#a8572> <http://example.org/ns#a8572> <http://example.org/ns#a8572> . +<http://example.org/ns#a8573> <http://example.org/ns#a8573> <http://example.org/ns#a8573> . +<http://example.org/ns#a8574> <http://example.org/ns#a8574> <http://example.org/ns#a8574> . +<http://example.org/ns#a8575> <http://example.org/ns#a8575> <http://example.org/ns#a8575> . +<http://example.org/ns#a8576> <http://example.org/ns#a8576> <http://example.org/ns#a8576> . +<http://example.org/ns#a8577> <http://example.org/ns#a8577> <http://example.org/ns#a8577> . +<http://example.org/ns#a8578> <http://example.org/ns#a8578> <http://example.org/ns#a8578> . +<http://example.org/ns#a8579> <http://example.org/ns#a8579> <http://example.org/ns#a8579> . +<http://example.org/ns#a8580> <http://example.org/ns#a8580> <http://example.org/ns#a8580> . +<http://example.org/ns#a8581> <http://example.org/ns#a8581> <http://example.org/ns#a8581> . +<http://example.org/ns#a8582> <http://example.org/ns#a8582> <http://example.org/ns#a8582> . +<http://example.org/ns#a8583> <http://example.org/ns#a8583> <http://example.org/ns#a8583> . +<http://example.org/ns#a8584> <http://example.org/ns#a8584> <http://example.org/ns#a8584> . +<http://example.org/ns#a8585> <http://example.org/ns#a8585> <http://example.org/ns#a8585> . +<http://example.org/ns#a8586> <http://example.org/ns#a8586> <http://example.org/ns#a8586> . +<http://example.org/ns#a8587> <http://example.org/ns#a8587> <http://example.org/ns#a8587> . +<http://example.org/ns#a8588> <http://example.org/ns#a8588> <http://example.org/ns#a8588> . +<http://example.org/ns#a8589> <http://example.org/ns#a8589> <http://example.org/ns#a8589> . +<http://example.org/ns#a8590> <http://example.org/ns#a8590> <http://example.org/ns#a8590> . +<http://example.org/ns#a8591> <http://example.org/ns#a8591> <http://example.org/ns#a8591> . +<http://example.org/ns#a8592> <http://example.org/ns#a8592> <http://example.org/ns#a8592> . +<http://example.org/ns#a8593> <http://example.org/ns#a8593> <http://example.org/ns#a8593> . +<http://example.org/ns#a8594> <http://example.org/ns#a8594> <http://example.org/ns#a8594> . +<http://example.org/ns#a8595> <http://example.org/ns#a8595> <http://example.org/ns#a8595> . +<http://example.org/ns#a8596> <http://example.org/ns#a8596> <http://example.org/ns#a8596> . +<http://example.org/ns#a8597> <http://example.org/ns#a8597> <http://example.org/ns#a8597> . +<http://example.org/ns#a8598> <http://example.org/ns#a8598> <http://example.org/ns#a8598> . +<http://example.org/ns#a8599> <http://example.org/ns#a8599> <http://example.org/ns#a8599> . +<http://example.org/ns#a8600> <http://example.org/ns#a8600> <http://example.org/ns#a8600> . +<http://example.org/ns#a8601> <http://example.org/ns#a8601> <http://example.org/ns#a8601> . +<http://example.org/ns#a8602> <http://example.org/ns#a8602> <http://example.org/ns#a8602> . +<http://example.org/ns#a8603> <http://example.org/ns#a8603> <http://example.org/ns#a8603> . +<http://example.org/ns#a8604> <http://example.org/ns#a8604> <http://example.org/ns#a8604> . +<http://example.org/ns#a8605> <http://example.org/ns#a8605> <http://example.org/ns#a8605> . +<http://example.org/ns#a8606> <http://example.org/ns#a8606> <http://example.org/ns#a8606> . +<http://example.org/ns#a8607> <http://example.org/ns#a8607> <http://example.org/ns#a8607> . +<http://example.org/ns#a8608> <http://example.org/ns#a8608> <http://example.org/ns#a8608> . +<http://example.org/ns#a8609> <http://example.org/ns#a8609> <http://example.org/ns#a8609> . +<http://example.org/ns#a8610> <http://example.org/ns#a8610> <http://example.org/ns#a8610> . +<http://example.org/ns#a8611> <http://example.org/ns#a8611> <http://example.org/ns#a8611> . +<http://example.org/ns#a8612> <http://example.org/ns#a8612> <http://example.org/ns#a8612> . +<http://example.org/ns#a8613> <http://example.org/ns#a8613> <http://example.org/ns#a8613> . +<http://example.org/ns#a8614> <http://example.org/ns#a8614> <http://example.org/ns#a8614> . +<http://example.org/ns#a8615> <http://example.org/ns#a8615> <http://example.org/ns#a8615> . +<http://example.org/ns#a8616> <http://example.org/ns#a8616> <http://example.org/ns#a8616> . +<http://example.org/ns#a8617> <http://example.org/ns#a8617> <http://example.org/ns#a8617> . +<http://example.org/ns#a8618> <http://example.org/ns#a8618> <http://example.org/ns#a8618> . +<http://example.org/ns#a8619> <http://example.org/ns#a8619> <http://example.org/ns#a8619> . +<http://example.org/ns#a8620> <http://example.org/ns#a8620> <http://example.org/ns#a8620> . +<http://example.org/ns#a8621> <http://example.org/ns#a8621> <http://example.org/ns#a8621> . +<http://example.org/ns#a8622> <http://example.org/ns#a8622> <http://example.org/ns#a8622> . +<http://example.org/ns#a8623> <http://example.org/ns#a8623> <http://example.org/ns#a8623> . +<http://example.org/ns#a8624> <http://example.org/ns#a8624> <http://example.org/ns#a8624> . +<http://example.org/ns#a8625> <http://example.org/ns#a8625> <http://example.org/ns#a8625> . +<http://example.org/ns#a8626> <http://example.org/ns#a8626> <http://example.org/ns#a8626> . +<http://example.org/ns#a8627> <http://example.org/ns#a8627> <http://example.org/ns#a8627> . +<http://example.org/ns#a8628> <http://example.org/ns#a8628> <http://example.org/ns#a8628> . +<http://example.org/ns#a8629> <http://example.org/ns#a8629> <http://example.org/ns#a8629> . +<http://example.org/ns#a8630> <http://example.org/ns#a8630> <http://example.org/ns#a8630> . +<http://example.org/ns#a8631> <http://example.org/ns#a8631> <http://example.org/ns#a8631> . +<http://example.org/ns#a8632> <http://example.org/ns#a8632> <http://example.org/ns#a8632> . +<http://example.org/ns#a8633> <http://example.org/ns#a8633> <http://example.org/ns#a8633> . +<http://example.org/ns#a8634> <http://example.org/ns#a8634> <http://example.org/ns#a8634> . +<http://example.org/ns#a8635> <http://example.org/ns#a8635> <http://example.org/ns#a8635> . +<http://example.org/ns#a8636> <http://example.org/ns#a8636> <http://example.org/ns#a8636> . +<http://example.org/ns#a8637> <http://example.org/ns#a8637> <http://example.org/ns#a8637> . +<http://example.org/ns#a8638> <http://example.org/ns#a8638> <http://example.org/ns#a8638> . +<http://example.org/ns#a8639> <http://example.org/ns#a8639> <http://example.org/ns#a8639> . +<http://example.org/ns#a8640> <http://example.org/ns#a8640> <http://example.org/ns#a8640> . +<http://example.org/ns#a8641> <http://example.org/ns#a8641> <http://example.org/ns#a8641> . +<http://example.org/ns#a8642> <http://example.org/ns#a8642> <http://example.org/ns#a8642> . +<http://example.org/ns#a8643> <http://example.org/ns#a8643> <http://example.org/ns#a8643> . +<http://example.org/ns#a8644> <http://example.org/ns#a8644> <http://example.org/ns#a8644> . +<http://example.org/ns#a8645> <http://example.org/ns#a8645> <http://example.org/ns#a8645> . +<http://example.org/ns#a8646> <http://example.org/ns#a8646> <http://example.org/ns#a8646> . +<http://example.org/ns#a8647> <http://example.org/ns#a8647> <http://example.org/ns#a8647> . +<http://example.org/ns#a8648> <http://example.org/ns#a8648> <http://example.org/ns#a8648> . +<http://example.org/ns#a8649> <http://example.org/ns#a8649> <http://example.org/ns#a8649> . +<http://example.org/ns#a8650> <http://example.org/ns#a8650> <http://example.org/ns#a8650> . +<http://example.org/ns#a8651> <http://example.org/ns#a8651> <http://example.org/ns#a8651> . +<http://example.org/ns#a8652> <http://example.org/ns#a8652> <http://example.org/ns#a8652> . +<http://example.org/ns#a8653> <http://example.org/ns#a8653> <http://example.org/ns#a8653> . +<http://example.org/ns#a8654> <http://example.org/ns#a8654> <http://example.org/ns#a8654> . +<http://example.org/ns#a8655> <http://example.org/ns#a8655> <http://example.org/ns#a8655> . +<http://example.org/ns#a8656> <http://example.org/ns#a8656> <http://example.org/ns#a8656> . +<http://example.org/ns#a8657> <http://example.org/ns#a8657> <http://example.org/ns#a8657> . +<http://example.org/ns#a8658> <http://example.org/ns#a8658> <http://example.org/ns#a8658> . +<http://example.org/ns#a8659> <http://example.org/ns#a8659> <http://example.org/ns#a8659> . +<http://example.org/ns#a8660> <http://example.org/ns#a8660> <http://example.org/ns#a8660> . +<http://example.org/ns#a8661> <http://example.org/ns#a8661> <http://example.org/ns#a8661> . +<http://example.org/ns#a8662> <http://example.org/ns#a8662> <http://example.org/ns#a8662> . +<http://example.org/ns#a8663> <http://example.org/ns#a8663> <http://example.org/ns#a8663> . +<http://example.org/ns#a8664> <http://example.org/ns#a8664> <http://example.org/ns#a8664> . +<http://example.org/ns#a8665> <http://example.org/ns#a8665> <http://example.org/ns#a8665> . +<http://example.org/ns#a8666> <http://example.org/ns#a8666> <http://example.org/ns#a8666> . +<http://example.org/ns#a8667> <http://example.org/ns#a8667> <http://example.org/ns#a8667> . +<http://example.org/ns#a8668> <http://example.org/ns#a8668> <http://example.org/ns#a8668> . +<http://example.org/ns#a8669> <http://example.org/ns#a8669> <http://example.org/ns#a8669> . +<http://example.org/ns#a8670> <http://example.org/ns#a8670> <http://example.org/ns#a8670> . +<http://example.org/ns#a8671> <http://example.org/ns#a8671> <http://example.org/ns#a8671> . +<http://example.org/ns#a8672> <http://example.org/ns#a8672> <http://example.org/ns#a8672> . +<http://example.org/ns#a8673> <http://example.org/ns#a8673> <http://example.org/ns#a8673> . +<http://example.org/ns#a8674> <http://example.org/ns#a8674> <http://example.org/ns#a8674> . +<http://example.org/ns#a8675> <http://example.org/ns#a8675> <http://example.org/ns#a8675> . +<http://example.org/ns#a8676> <http://example.org/ns#a8676> <http://example.org/ns#a8676> . +<http://example.org/ns#a8677> <http://example.org/ns#a8677> <http://example.org/ns#a8677> . +<http://example.org/ns#a8678> <http://example.org/ns#a8678> <http://example.org/ns#a8678> . +<http://example.org/ns#a8679> <http://example.org/ns#a8679> <http://example.org/ns#a8679> . +<http://example.org/ns#a8680> <http://example.org/ns#a8680> <http://example.org/ns#a8680> . +<http://example.org/ns#a8681> <http://example.org/ns#a8681> <http://example.org/ns#a8681> . +<http://example.org/ns#a8682> <http://example.org/ns#a8682> <http://example.org/ns#a8682> . +<http://example.org/ns#a8683> <http://example.org/ns#a8683> <http://example.org/ns#a8683> . +<http://example.org/ns#a8684> <http://example.org/ns#a8684> <http://example.org/ns#a8684> . +<http://example.org/ns#a8685> <http://example.org/ns#a8685> <http://example.org/ns#a8685> . +<http://example.org/ns#a8686> <http://example.org/ns#a8686> <http://example.org/ns#a8686> . +<http://example.org/ns#a8687> <http://example.org/ns#a8687> <http://example.org/ns#a8687> . +<http://example.org/ns#a8688> <http://example.org/ns#a8688> <http://example.org/ns#a8688> . +<http://example.org/ns#a8689> <http://example.org/ns#a8689> <http://example.org/ns#a8689> . +<http://example.org/ns#a8690> <http://example.org/ns#a8690> <http://example.org/ns#a8690> . +<http://example.org/ns#a8691> <http://example.org/ns#a8691> <http://example.org/ns#a8691> . +<http://example.org/ns#a8692> <http://example.org/ns#a8692> <http://example.org/ns#a8692> . +<http://example.org/ns#a8693> <http://example.org/ns#a8693> <http://example.org/ns#a8693> . +<http://example.org/ns#a8694> <http://example.org/ns#a8694> <http://example.org/ns#a8694> . +<http://example.org/ns#a8695> <http://example.org/ns#a8695> <http://example.org/ns#a8695> . +<http://example.org/ns#a8696> <http://example.org/ns#a8696> <http://example.org/ns#a8696> . +<http://example.org/ns#a8697> <http://example.org/ns#a8697> <http://example.org/ns#a8697> . +<http://example.org/ns#a8698> <http://example.org/ns#a8698> <http://example.org/ns#a8698> . +<http://example.org/ns#a8699> <http://example.org/ns#a8699> <http://example.org/ns#a8699> . +<http://example.org/ns#a8700> <http://example.org/ns#a8700> <http://example.org/ns#a8700> . +<http://example.org/ns#a8701> <http://example.org/ns#a8701> <http://example.org/ns#a8701> . +<http://example.org/ns#a8702> <http://example.org/ns#a8702> <http://example.org/ns#a8702> . +<http://example.org/ns#a8703> <http://example.org/ns#a8703> <http://example.org/ns#a8703> . +<http://example.org/ns#a8704> <http://example.org/ns#a8704> <http://example.org/ns#a8704> . +<http://example.org/ns#a8705> <http://example.org/ns#a8705> <http://example.org/ns#a8705> . +<http://example.org/ns#a8706> <http://example.org/ns#a8706> <http://example.org/ns#a8706> . +<http://example.org/ns#a8707> <http://example.org/ns#a8707> <http://example.org/ns#a8707> . +<http://example.org/ns#a8708> <http://example.org/ns#a8708> <http://example.org/ns#a8708> . +<http://example.org/ns#a8709> <http://example.org/ns#a8709> <http://example.org/ns#a8709> . +<http://example.org/ns#a8710> <http://example.org/ns#a8710> <http://example.org/ns#a8710> . +<http://example.org/ns#a8711> <http://example.org/ns#a8711> <http://example.org/ns#a8711> . +<http://example.org/ns#a8712> <http://example.org/ns#a8712> <http://example.org/ns#a8712> . +<http://example.org/ns#a8713> <http://example.org/ns#a8713> <http://example.org/ns#a8713> . +<http://example.org/ns#a8714> <http://example.org/ns#a8714> <http://example.org/ns#a8714> . +<http://example.org/ns#a8715> <http://example.org/ns#a8715> <http://example.org/ns#a8715> . +<http://example.org/ns#a8716> <http://example.org/ns#a8716> <http://example.org/ns#a8716> . +<http://example.org/ns#a8717> <http://example.org/ns#a8717> <http://example.org/ns#a8717> . +<http://example.org/ns#a8718> <http://example.org/ns#a8718> <http://example.org/ns#a8718> . +<http://example.org/ns#a8719> <http://example.org/ns#a8719> <http://example.org/ns#a8719> . +<http://example.org/ns#a8720> <http://example.org/ns#a8720> <http://example.org/ns#a8720> . +<http://example.org/ns#a8721> <http://example.org/ns#a8721> <http://example.org/ns#a8721> . +<http://example.org/ns#a8722> <http://example.org/ns#a8722> <http://example.org/ns#a8722> . +<http://example.org/ns#a8723> <http://example.org/ns#a8723> <http://example.org/ns#a8723> . +<http://example.org/ns#a8724> <http://example.org/ns#a8724> <http://example.org/ns#a8724> . +<http://example.org/ns#a8725> <http://example.org/ns#a8725> <http://example.org/ns#a8725> . +<http://example.org/ns#a8726> <http://example.org/ns#a8726> <http://example.org/ns#a8726> . +<http://example.org/ns#a8727> <http://example.org/ns#a8727> <http://example.org/ns#a8727> . +<http://example.org/ns#a8728> <http://example.org/ns#a8728> <http://example.org/ns#a8728> . +<http://example.org/ns#a8729> <http://example.org/ns#a8729> <http://example.org/ns#a8729> . +<http://example.org/ns#a8730> <http://example.org/ns#a8730> <http://example.org/ns#a8730> . +<http://example.org/ns#a8731> <http://example.org/ns#a8731> <http://example.org/ns#a8731> . +<http://example.org/ns#a8732> <http://example.org/ns#a8732> <http://example.org/ns#a8732> . +<http://example.org/ns#a8733> <http://example.org/ns#a8733> <http://example.org/ns#a8733> . +<http://example.org/ns#a8734> <http://example.org/ns#a8734> <http://example.org/ns#a8734> . +<http://example.org/ns#a8735> <http://example.org/ns#a8735> <http://example.org/ns#a8735> . +<http://example.org/ns#a8736> <http://example.org/ns#a8736> <http://example.org/ns#a8736> . +<http://example.org/ns#a8737> <http://example.org/ns#a8737> <http://example.org/ns#a8737> . +<http://example.org/ns#a8738> <http://example.org/ns#a8738> <http://example.org/ns#a8738> . +<http://example.org/ns#a8739> <http://example.org/ns#a8739> <http://example.org/ns#a8739> . +<http://example.org/ns#a8740> <http://example.org/ns#a8740> <http://example.org/ns#a8740> . +<http://example.org/ns#a8741> <http://example.org/ns#a8741> <http://example.org/ns#a8741> . +<http://example.org/ns#a8742> <http://example.org/ns#a8742> <http://example.org/ns#a8742> . +<http://example.org/ns#a8743> <http://example.org/ns#a8743> <http://example.org/ns#a8743> . +<http://example.org/ns#a8744> <http://example.org/ns#a8744> <http://example.org/ns#a8744> . +<http://example.org/ns#a8745> <http://example.org/ns#a8745> <http://example.org/ns#a8745> . +<http://example.org/ns#a8746> <http://example.org/ns#a8746> <http://example.org/ns#a8746> . +<http://example.org/ns#a8747> <http://example.org/ns#a8747> <http://example.org/ns#a8747> . +<http://example.org/ns#a8748> <http://example.org/ns#a8748> <http://example.org/ns#a8748> . +<http://example.org/ns#a8749> <http://example.org/ns#a8749> <http://example.org/ns#a8749> . +<http://example.org/ns#a8750> <http://example.org/ns#a8750> <http://example.org/ns#a8750> . +<http://example.org/ns#a8751> <http://example.org/ns#a8751> <http://example.org/ns#a8751> . +<http://example.org/ns#a8752> <http://example.org/ns#a8752> <http://example.org/ns#a8752> . +<http://example.org/ns#a8753> <http://example.org/ns#a8753> <http://example.org/ns#a8753> . +<http://example.org/ns#a8754> <http://example.org/ns#a8754> <http://example.org/ns#a8754> . +<http://example.org/ns#a8755> <http://example.org/ns#a8755> <http://example.org/ns#a8755> . +<http://example.org/ns#a8756> <http://example.org/ns#a8756> <http://example.org/ns#a8756> . +<http://example.org/ns#a8757> <http://example.org/ns#a8757> <http://example.org/ns#a8757> . +<http://example.org/ns#a8758> <http://example.org/ns#a8758> <http://example.org/ns#a8758> . +<http://example.org/ns#a8759> <http://example.org/ns#a8759> <http://example.org/ns#a8759> . +<http://example.org/ns#a8760> <http://example.org/ns#a8760> <http://example.org/ns#a8760> . +<http://example.org/ns#a8761> <http://example.org/ns#a8761> <http://example.org/ns#a8761> . +<http://example.org/ns#a8762> <http://example.org/ns#a8762> <http://example.org/ns#a8762> . +<http://example.org/ns#a8763> <http://example.org/ns#a8763> <http://example.org/ns#a8763> . +<http://example.org/ns#a8764> <http://example.org/ns#a8764> <http://example.org/ns#a8764> . +<http://example.org/ns#a8765> <http://example.org/ns#a8765> <http://example.org/ns#a8765> . +<http://example.org/ns#a8766> <http://example.org/ns#a8766> <http://example.org/ns#a8766> . +<http://example.org/ns#a8767> <http://example.org/ns#a8767> <http://example.org/ns#a8767> . +<http://example.org/ns#a8768> <http://example.org/ns#a8768> <http://example.org/ns#a8768> . +<http://example.org/ns#a8769> <http://example.org/ns#a8769> <http://example.org/ns#a8769> . +<http://example.org/ns#a8770> <http://example.org/ns#a8770> <http://example.org/ns#a8770> . +<http://example.org/ns#a8771> <http://example.org/ns#a8771> <http://example.org/ns#a8771> . +<http://example.org/ns#a8772> <http://example.org/ns#a8772> <http://example.org/ns#a8772> . +<http://example.org/ns#a8773> <http://example.org/ns#a8773> <http://example.org/ns#a8773> . +<http://example.org/ns#a8774> <http://example.org/ns#a8774> <http://example.org/ns#a8774> . +<http://example.org/ns#a8775> <http://example.org/ns#a8775> <http://example.org/ns#a8775> . +<http://example.org/ns#a8776> <http://example.org/ns#a8776> <http://example.org/ns#a8776> . +<http://example.org/ns#a8777> <http://example.org/ns#a8777> <http://example.org/ns#a8777> . +<http://example.org/ns#a8778> <http://example.org/ns#a8778> <http://example.org/ns#a8778> . +<http://example.org/ns#a8779> <http://example.org/ns#a8779> <http://example.org/ns#a8779> . +<http://example.org/ns#a8780> <http://example.org/ns#a8780> <http://example.org/ns#a8780> . +<http://example.org/ns#a8781> <http://example.org/ns#a8781> <http://example.org/ns#a8781> . +<http://example.org/ns#a8782> <http://example.org/ns#a8782> <http://example.org/ns#a8782> . +<http://example.org/ns#a8783> <http://example.org/ns#a8783> <http://example.org/ns#a8783> . +<http://example.org/ns#a8784> <http://example.org/ns#a8784> <http://example.org/ns#a8784> . +<http://example.org/ns#a8785> <http://example.org/ns#a8785> <http://example.org/ns#a8785> . +<http://example.org/ns#a8786> <http://example.org/ns#a8786> <http://example.org/ns#a8786> . +<http://example.org/ns#a8787> <http://example.org/ns#a8787> <http://example.org/ns#a8787> . +<http://example.org/ns#a8788> <http://example.org/ns#a8788> <http://example.org/ns#a8788> . +<http://example.org/ns#a8789> <http://example.org/ns#a8789> <http://example.org/ns#a8789> . +<http://example.org/ns#a8790> <http://example.org/ns#a8790> <http://example.org/ns#a8790> . +<http://example.org/ns#a8791> <http://example.org/ns#a8791> <http://example.org/ns#a8791> . +<http://example.org/ns#a8792> <http://example.org/ns#a8792> <http://example.org/ns#a8792> . +<http://example.org/ns#a8793> <http://example.org/ns#a8793> <http://example.org/ns#a8793> . +<http://example.org/ns#a8794> <http://example.org/ns#a8794> <http://example.org/ns#a8794> . +<http://example.org/ns#a8795> <http://example.org/ns#a8795> <http://example.org/ns#a8795> . +<http://example.org/ns#a8796> <http://example.org/ns#a8796> <http://example.org/ns#a8796> . +<http://example.org/ns#a8797> <http://example.org/ns#a8797> <http://example.org/ns#a8797> . +<http://example.org/ns#a8798> <http://example.org/ns#a8798> <http://example.org/ns#a8798> . +<http://example.org/ns#a8799> <http://example.org/ns#a8799> <http://example.org/ns#a8799> . +<http://example.org/ns#a8800> <http://example.org/ns#a8800> <http://example.org/ns#a8800> . +<http://example.org/ns#a8801> <http://example.org/ns#a8801> <http://example.org/ns#a8801> . +<http://example.org/ns#a8802> <http://example.org/ns#a8802> <http://example.org/ns#a8802> . +<http://example.org/ns#a8803> <http://example.org/ns#a8803> <http://example.org/ns#a8803> . +<http://example.org/ns#a8804> <http://example.org/ns#a8804> <http://example.org/ns#a8804> . +<http://example.org/ns#a8805> <http://example.org/ns#a8805> <http://example.org/ns#a8805> . +<http://example.org/ns#a8806> <http://example.org/ns#a8806> <http://example.org/ns#a8806> . +<http://example.org/ns#a8807> <http://example.org/ns#a8807> <http://example.org/ns#a8807> . +<http://example.org/ns#a8808> <http://example.org/ns#a8808> <http://example.org/ns#a8808> . +<http://example.org/ns#a8809> <http://example.org/ns#a8809> <http://example.org/ns#a8809> . +<http://example.org/ns#a8810> <http://example.org/ns#a8810> <http://example.org/ns#a8810> . +<http://example.org/ns#a8811> <http://example.org/ns#a8811> <http://example.org/ns#a8811> . +<http://example.org/ns#a8812> <http://example.org/ns#a8812> <http://example.org/ns#a8812> . +<http://example.org/ns#a8813> <http://example.org/ns#a8813> <http://example.org/ns#a8813> . +<http://example.org/ns#a8814> <http://example.org/ns#a8814> <http://example.org/ns#a8814> . +<http://example.org/ns#a8815> <http://example.org/ns#a8815> <http://example.org/ns#a8815> . +<http://example.org/ns#a8816> <http://example.org/ns#a8816> <http://example.org/ns#a8816> . +<http://example.org/ns#a8817> <http://example.org/ns#a8817> <http://example.org/ns#a8817> . +<http://example.org/ns#a8818> <http://example.org/ns#a8818> <http://example.org/ns#a8818> . +<http://example.org/ns#a8819> <http://example.org/ns#a8819> <http://example.org/ns#a8819> . +<http://example.org/ns#a8820> <http://example.org/ns#a8820> <http://example.org/ns#a8820> . +<http://example.org/ns#a8821> <http://example.org/ns#a8821> <http://example.org/ns#a8821> . +<http://example.org/ns#a8822> <http://example.org/ns#a8822> <http://example.org/ns#a8822> . +<http://example.org/ns#a8823> <http://example.org/ns#a8823> <http://example.org/ns#a8823> . +<http://example.org/ns#a8824> <http://example.org/ns#a8824> <http://example.org/ns#a8824> . +<http://example.org/ns#a8825> <http://example.org/ns#a8825> <http://example.org/ns#a8825> . +<http://example.org/ns#a8826> <http://example.org/ns#a8826> <http://example.org/ns#a8826> . +<http://example.org/ns#a8827> <http://example.org/ns#a8827> <http://example.org/ns#a8827> . +<http://example.org/ns#a8828> <http://example.org/ns#a8828> <http://example.org/ns#a8828> . +<http://example.org/ns#a8829> <http://example.org/ns#a8829> <http://example.org/ns#a8829> . +<http://example.org/ns#a8830> <http://example.org/ns#a8830> <http://example.org/ns#a8830> . +<http://example.org/ns#a8831> <http://example.org/ns#a8831> <http://example.org/ns#a8831> . +<http://example.org/ns#a8832> <http://example.org/ns#a8832> <http://example.org/ns#a8832> . +<http://example.org/ns#a8833> <http://example.org/ns#a8833> <http://example.org/ns#a8833> . +<http://example.org/ns#a8834> <http://example.org/ns#a8834> <http://example.org/ns#a8834> . +<http://example.org/ns#a8835> <http://example.org/ns#a8835> <http://example.org/ns#a8835> . +<http://example.org/ns#a8836> <http://example.org/ns#a8836> <http://example.org/ns#a8836> . +<http://example.org/ns#a8837> <http://example.org/ns#a8837> <http://example.org/ns#a8837> . +<http://example.org/ns#a8838> <http://example.org/ns#a8838> <http://example.org/ns#a8838> . +<http://example.org/ns#a8839> <http://example.org/ns#a8839> <http://example.org/ns#a8839> . +<http://example.org/ns#a8840> <http://example.org/ns#a8840> <http://example.org/ns#a8840> . +<http://example.org/ns#a8841> <http://example.org/ns#a8841> <http://example.org/ns#a8841> . +<http://example.org/ns#a8842> <http://example.org/ns#a8842> <http://example.org/ns#a8842> . +<http://example.org/ns#a8843> <http://example.org/ns#a8843> <http://example.org/ns#a8843> . +<http://example.org/ns#a8844> <http://example.org/ns#a8844> <http://example.org/ns#a8844> . +<http://example.org/ns#a8845> <http://example.org/ns#a8845> <http://example.org/ns#a8845> . +<http://example.org/ns#a8846> <http://example.org/ns#a8846> <http://example.org/ns#a8846> . +<http://example.org/ns#a8847> <http://example.org/ns#a8847> <http://example.org/ns#a8847> . +<http://example.org/ns#a8848> <http://example.org/ns#a8848> <http://example.org/ns#a8848> . +<http://example.org/ns#a8849> <http://example.org/ns#a8849> <http://example.org/ns#a8849> . +<http://example.org/ns#a8850> <http://example.org/ns#a8850> <http://example.org/ns#a8850> . +<http://example.org/ns#a8851> <http://example.org/ns#a8851> <http://example.org/ns#a8851> . +<http://example.org/ns#a8852> <http://example.org/ns#a8852> <http://example.org/ns#a8852> . +<http://example.org/ns#a8853> <http://example.org/ns#a8853> <http://example.org/ns#a8853> . +<http://example.org/ns#a8854> <http://example.org/ns#a8854> <http://example.org/ns#a8854> . +<http://example.org/ns#a8855> <http://example.org/ns#a8855> <http://example.org/ns#a8855> . +<http://example.org/ns#a8856> <http://example.org/ns#a8856> <http://example.org/ns#a8856> . +<http://example.org/ns#a8857> <http://example.org/ns#a8857> <http://example.org/ns#a8857> . +<http://example.org/ns#a8858> <http://example.org/ns#a8858> <http://example.org/ns#a8858> . +<http://example.org/ns#a8859> <http://example.org/ns#a8859> <http://example.org/ns#a8859> . +<http://example.org/ns#a8860> <http://example.org/ns#a8860> <http://example.org/ns#a8860> . +<http://example.org/ns#a8861> <http://example.org/ns#a8861> <http://example.org/ns#a8861> . +<http://example.org/ns#a8862> <http://example.org/ns#a8862> <http://example.org/ns#a8862> . +<http://example.org/ns#a8863> <http://example.org/ns#a8863> <http://example.org/ns#a8863> . +<http://example.org/ns#a8864> <http://example.org/ns#a8864> <http://example.org/ns#a8864> . +<http://example.org/ns#a8865> <http://example.org/ns#a8865> <http://example.org/ns#a8865> . +<http://example.org/ns#a8866> <http://example.org/ns#a8866> <http://example.org/ns#a8866> . +<http://example.org/ns#a8867> <http://example.org/ns#a8867> <http://example.org/ns#a8867> . +<http://example.org/ns#a8868> <http://example.org/ns#a8868> <http://example.org/ns#a8868> . +<http://example.org/ns#a8869> <http://example.org/ns#a8869> <http://example.org/ns#a8869> . +<http://example.org/ns#a8870> <http://example.org/ns#a8870> <http://example.org/ns#a8870> . +<http://example.org/ns#a8871> <http://example.org/ns#a8871> <http://example.org/ns#a8871> . +<http://example.org/ns#a8872> <http://example.org/ns#a8872> <http://example.org/ns#a8872> . +<http://example.org/ns#a8873> <http://example.org/ns#a8873> <http://example.org/ns#a8873> . +<http://example.org/ns#a8874> <http://example.org/ns#a8874> <http://example.org/ns#a8874> . +<http://example.org/ns#a8875> <http://example.org/ns#a8875> <http://example.org/ns#a8875> . +<http://example.org/ns#a8876> <http://example.org/ns#a8876> <http://example.org/ns#a8876> . +<http://example.org/ns#a8877> <http://example.org/ns#a8877> <http://example.org/ns#a8877> . +<http://example.org/ns#a8878> <http://example.org/ns#a8878> <http://example.org/ns#a8878> . +<http://example.org/ns#a8879> <http://example.org/ns#a8879> <http://example.org/ns#a8879> . +<http://example.org/ns#a8880> <http://example.org/ns#a8880> <http://example.org/ns#a8880> . +<http://example.org/ns#a8881> <http://example.org/ns#a8881> <http://example.org/ns#a8881> . +<http://example.org/ns#a8882> <http://example.org/ns#a8882> <http://example.org/ns#a8882> . +<http://example.org/ns#a8883> <http://example.org/ns#a8883> <http://example.org/ns#a8883> . +<http://example.org/ns#a8884> <http://example.org/ns#a8884> <http://example.org/ns#a8884> . +<http://example.org/ns#a8885> <http://example.org/ns#a8885> <http://example.org/ns#a8885> . +<http://example.org/ns#a8886> <http://example.org/ns#a8886> <http://example.org/ns#a8886> . +<http://example.org/ns#a8887> <http://example.org/ns#a8887> <http://example.org/ns#a8887> . +<http://example.org/ns#a8888> <http://example.org/ns#a8888> <http://example.org/ns#a8888> . +<http://example.org/ns#a8889> <http://example.org/ns#a8889> <http://example.org/ns#a8889> . +<http://example.org/ns#a8890> <http://example.org/ns#a8890> <http://example.org/ns#a8890> . +<http://example.org/ns#a8891> <http://example.org/ns#a8891> <http://example.org/ns#a8891> . +<http://example.org/ns#a8892> <http://example.org/ns#a8892> <http://example.org/ns#a8892> . +<http://example.org/ns#a8893> <http://example.org/ns#a8893> <http://example.org/ns#a8893> . +<http://example.org/ns#a8894> <http://example.org/ns#a8894> <http://example.org/ns#a8894> . +<http://example.org/ns#a8895> <http://example.org/ns#a8895> <http://example.org/ns#a8895> . +<http://example.org/ns#a8896> <http://example.org/ns#a8896> <http://example.org/ns#a8896> . +<http://example.org/ns#a8897> <http://example.org/ns#a8897> <http://example.org/ns#a8897> . +<http://example.org/ns#a8898> <http://example.org/ns#a8898> <http://example.org/ns#a8898> . +<http://example.org/ns#a8899> <http://example.org/ns#a8899> <http://example.org/ns#a8899> . +<http://example.org/ns#a8900> <http://example.org/ns#a8900> <http://example.org/ns#a8900> . +<http://example.org/ns#a8901> <http://example.org/ns#a8901> <http://example.org/ns#a8901> . +<http://example.org/ns#a8902> <http://example.org/ns#a8902> <http://example.org/ns#a8902> . +<http://example.org/ns#a8903> <http://example.org/ns#a8903> <http://example.org/ns#a8903> . +<http://example.org/ns#a8904> <http://example.org/ns#a8904> <http://example.org/ns#a8904> . +<http://example.org/ns#a8905> <http://example.org/ns#a8905> <http://example.org/ns#a8905> . +<http://example.org/ns#a8906> <http://example.org/ns#a8906> <http://example.org/ns#a8906> . +<http://example.org/ns#a8907> <http://example.org/ns#a8907> <http://example.org/ns#a8907> . +<http://example.org/ns#a8908> <http://example.org/ns#a8908> <http://example.org/ns#a8908> . +<http://example.org/ns#a8909> <http://example.org/ns#a8909> <http://example.org/ns#a8909> . +<http://example.org/ns#a8910> <http://example.org/ns#a8910> <http://example.org/ns#a8910> . +<http://example.org/ns#a8911> <http://example.org/ns#a8911> <http://example.org/ns#a8911> . +<http://example.org/ns#a8912> <http://example.org/ns#a8912> <http://example.org/ns#a8912> . +<http://example.org/ns#a8913> <http://example.org/ns#a8913> <http://example.org/ns#a8913> . +<http://example.org/ns#a8914> <http://example.org/ns#a8914> <http://example.org/ns#a8914> . +<http://example.org/ns#a8915> <http://example.org/ns#a8915> <http://example.org/ns#a8915> . +<http://example.org/ns#a8916> <http://example.org/ns#a8916> <http://example.org/ns#a8916> . +<http://example.org/ns#a8917> <http://example.org/ns#a8917> <http://example.org/ns#a8917> . +<http://example.org/ns#a8918> <http://example.org/ns#a8918> <http://example.org/ns#a8918> . +<http://example.org/ns#a8919> <http://example.org/ns#a8919> <http://example.org/ns#a8919> . +<http://example.org/ns#a8920> <http://example.org/ns#a8920> <http://example.org/ns#a8920> . +<http://example.org/ns#a8921> <http://example.org/ns#a8921> <http://example.org/ns#a8921> . +<http://example.org/ns#a8922> <http://example.org/ns#a8922> <http://example.org/ns#a8922> . +<http://example.org/ns#a8923> <http://example.org/ns#a8923> <http://example.org/ns#a8923> . +<http://example.org/ns#a8924> <http://example.org/ns#a8924> <http://example.org/ns#a8924> . +<http://example.org/ns#a8925> <http://example.org/ns#a8925> <http://example.org/ns#a8925> . +<http://example.org/ns#a8926> <http://example.org/ns#a8926> <http://example.org/ns#a8926> . +<http://example.org/ns#a8927> <http://example.org/ns#a8927> <http://example.org/ns#a8927> . +<http://example.org/ns#a8928> <http://example.org/ns#a8928> <http://example.org/ns#a8928> . +<http://example.org/ns#a8929> <http://example.org/ns#a8929> <http://example.org/ns#a8929> . +<http://example.org/ns#a8930> <http://example.org/ns#a8930> <http://example.org/ns#a8930> . +<http://example.org/ns#a8931> <http://example.org/ns#a8931> <http://example.org/ns#a8931> . +<http://example.org/ns#a8932> <http://example.org/ns#a8932> <http://example.org/ns#a8932> . +<http://example.org/ns#a8933> <http://example.org/ns#a8933> <http://example.org/ns#a8933> . +<http://example.org/ns#a8934> <http://example.org/ns#a8934> <http://example.org/ns#a8934> . +<http://example.org/ns#a8935> <http://example.org/ns#a8935> <http://example.org/ns#a8935> . +<http://example.org/ns#a8936> <http://example.org/ns#a8936> <http://example.org/ns#a8936> . +<http://example.org/ns#a8937> <http://example.org/ns#a8937> <http://example.org/ns#a8937> . +<http://example.org/ns#a8938> <http://example.org/ns#a8938> <http://example.org/ns#a8938> . +<http://example.org/ns#a8939> <http://example.org/ns#a8939> <http://example.org/ns#a8939> . +<http://example.org/ns#a8940> <http://example.org/ns#a8940> <http://example.org/ns#a8940> . +<http://example.org/ns#a8941> <http://example.org/ns#a8941> <http://example.org/ns#a8941> . +<http://example.org/ns#a8942> <http://example.org/ns#a8942> <http://example.org/ns#a8942> . +<http://example.org/ns#a8943> <http://example.org/ns#a8943> <http://example.org/ns#a8943> . +<http://example.org/ns#a8944> <http://example.org/ns#a8944> <http://example.org/ns#a8944> . +<http://example.org/ns#a8945> <http://example.org/ns#a8945> <http://example.org/ns#a8945> . +<http://example.org/ns#a8946> <http://example.org/ns#a8946> <http://example.org/ns#a8946> . +<http://example.org/ns#a8947> <http://example.org/ns#a8947> <http://example.org/ns#a8947> . +<http://example.org/ns#a8948> <http://example.org/ns#a8948> <http://example.org/ns#a8948> . +<http://example.org/ns#a8949> <http://example.org/ns#a8949> <http://example.org/ns#a8949> . +<http://example.org/ns#a8950> <http://example.org/ns#a8950> <http://example.org/ns#a8950> . +<http://example.org/ns#a8951> <http://example.org/ns#a8951> <http://example.org/ns#a8951> . +<http://example.org/ns#a8952> <http://example.org/ns#a8952> <http://example.org/ns#a8952> . +<http://example.org/ns#a8953> <http://example.org/ns#a8953> <http://example.org/ns#a8953> . +<http://example.org/ns#a8954> <http://example.org/ns#a8954> <http://example.org/ns#a8954> . +<http://example.org/ns#a8955> <http://example.org/ns#a8955> <http://example.org/ns#a8955> . +<http://example.org/ns#a8956> <http://example.org/ns#a8956> <http://example.org/ns#a8956> . +<http://example.org/ns#a8957> <http://example.org/ns#a8957> <http://example.org/ns#a8957> . +<http://example.org/ns#a8958> <http://example.org/ns#a8958> <http://example.org/ns#a8958> . +<http://example.org/ns#a8959> <http://example.org/ns#a8959> <http://example.org/ns#a8959> . +<http://example.org/ns#a8960> <http://example.org/ns#a8960> <http://example.org/ns#a8960> . +<http://example.org/ns#a8961> <http://example.org/ns#a8961> <http://example.org/ns#a8961> . +<http://example.org/ns#a8962> <http://example.org/ns#a8962> <http://example.org/ns#a8962> . +<http://example.org/ns#a8963> <http://example.org/ns#a8963> <http://example.org/ns#a8963> . +<http://example.org/ns#a8964> <http://example.org/ns#a8964> <http://example.org/ns#a8964> . +<http://example.org/ns#a8965> <http://example.org/ns#a8965> <http://example.org/ns#a8965> . +<http://example.org/ns#a8966> <http://example.org/ns#a8966> <http://example.org/ns#a8966> . +<http://example.org/ns#a8967> <http://example.org/ns#a8967> <http://example.org/ns#a8967> . +<http://example.org/ns#a8968> <http://example.org/ns#a8968> <http://example.org/ns#a8968> . +<http://example.org/ns#a8969> <http://example.org/ns#a8969> <http://example.org/ns#a8969> . +<http://example.org/ns#a8970> <http://example.org/ns#a8970> <http://example.org/ns#a8970> . +<http://example.org/ns#a8971> <http://example.org/ns#a8971> <http://example.org/ns#a8971> . +<http://example.org/ns#a8972> <http://example.org/ns#a8972> <http://example.org/ns#a8972> . +<http://example.org/ns#a8973> <http://example.org/ns#a8973> <http://example.org/ns#a8973> . +<http://example.org/ns#a8974> <http://example.org/ns#a8974> <http://example.org/ns#a8974> . +<http://example.org/ns#a8975> <http://example.org/ns#a8975> <http://example.org/ns#a8975> . +<http://example.org/ns#a8976> <http://example.org/ns#a8976> <http://example.org/ns#a8976> . +<http://example.org/ns#a8977> <http://example.org/ns#a8977> <http://example.org/ns#a8977> . +<http://example.org/ns#a8978> <http://example.org/ns#a8978> <http://example.org/ns#a8978> . +<http://example.org/ns#a8979> <http://example.org/ns#a8979> <http://example.org/ns#a8979> . +<http://example.org/ns#a8980> <http://example.org/ns#a8980> <http://example.org/ns#a8980> . +<http://example.org/ns#a8981> <http://example.org/ns#a8981> <http://example.org/ns#a8981> . +<http://example.org/ns#a8982> <http://example.org/ns#a8982> <http://example.org/ns#a8982> . +<http://example.org/ns#a8983> <http://example.org/ns#a8983> <http://example.org/ns#a8983> . +<http://example.org/ns#a8984> <http://example.org/ns#a8984> <http://example.org/ns#a8984> . +<http://example.org/ns#a8985> <http://example.org/ns#a8985> <http://example.org/ns#a8985> . +<http://example.org/ns#a8986> <http://example.org/ns#a8986> <http://example.org/ns#a8986> . +<http://example.org/ns#a8987> <http://example.org/ns#a8987> <http://example.org/ns#a8987> . +<http://example.org/ns#a8988> <http://example.org/ns#a8988> <http://example.org/ns#a8988> . +<http://example.org/ns#a8989> <http://example.org/ns#a8989> <http://example.org/ns#a8989> . +<http://example.org/ns#a8990> <http://example.org/ns#a8990> <http://example.org/ns#a8990> . +<http://example.org/ns#a8991> <http://example.org/ns#a8991> <http://example.org/ns#a8991> . +<http://example.org/ns#a8992> <http://example.org/ns#a8992> <http://example.org/ns#a8992> . +<http://example.org/ns#a8993> <http://example.org/ns#a8993> <http://example.org/ns#a8993> . +<http://example.org/ns#a8994> <http://example.org/ns#a8994> <http://example.org/ns#a8994> . +<http://example.org/ns#a8995> <http://example.org/ns#a8995> <http://example.org/ns#a8995> . +<http://example.org/ns#a8996> <http://example.org/ns#a8996> <http://example.org/ns#a8996> . +<http://example.org/ns#a8997> <http://example.org/ns#a8997> <http://example.org/ns#a8997> . +<http://example.org/ns#a8998> <http://example.org/ns#a8998> <http://example.org/ns#a8998> . +<http://example.org/ns#a8999> <http://example.org/ns#a8999> <http://example.org/ns#a8999> . +<http://example.org/ns#a9000> <http://example.org/ns#a9000> <http://example.org/ns#a9000> . +<http://example.org/ns#a9001> <http://example.org/ns#a9001> <http://example.org/ns#a9001> . +<http://example.org/ns#a9002> <http://example.org/ns#a9002> <http://example.org/ns#a9002> . +<http://example.org/ns#a9003> <http://example.org/ns#a9003> <http://example.org/ns#a9003> . +<http://example.org/ns#a9004> <http://example.org/ns#a9004> <http://example.org/ns#a9004> . +<http://example.org/ns#a9005> <http://example.org/ns#a9005> <http://example.org/ns#a9005> . +<http://example.org/ns#a9006> <http://example.org/ns#a9006> <http://example.org/ns#a9006> . +<http://example.org/ns#a9007> <http://example.org/ns#a9007> <http://example.org/ns#a9007> . +<http://example.org/ns#a9008> <http://example.org/ns#a9008> <http://example.org/ns#a9008> . +<http://example.org/ns#a9009> <http://example.org/ns#a9009> <http://example.org/ns#a9009> . +<http://example.org/ns#a9010> <http://example.org/ns#a9010> <http://example.org/ns#a9010> . +<http://example.org/ns#a9011> <http://example.org/ns#a9011> <http://example.org/ns#a9011> . +<http://example.org/ns#a9012> <http://example.org/ns#a9012> <http://example.org/ns#a9012> . +<http://example.org/ns#a9013> <http://example.org/ns#a9013> <http://example.org/ns#a9013> . +<http://example.org/ns#a9014> <http://example.org/ns#a9014> <http://example.org/ns#a9014> . +<http://example.org/ns#a9015> <http://example.org/ns#a9015> <http://example.org/ns#a9015> . +<http://example.org/ns#a9016> <http://example.org/ns#a9016> <http://example.org/ns#a9016> . +<http://example.org/ns#a9017> <http://example.org/ns#a9017> <http://example.org/ns#a9017> . +<http://example.org/ns#a9018> <http://example.org/ns#a9018> <http://example.org/ns#a9018> . +<http://example.org/ns#a9019> <http://example.org/ns#a9019> <http://example.org/ns#a9019> . +<http://example.org/ns#a9020> <http://example.org/ns#a9020> <http://example.org/ns#a9020> . +<http://example.org/ns#a9021> <http://example.org/ns#a9021> <http://example.org/ns#a9021> . +<http://example.org/ns#a9022> <http://example.org/ns#a9022> <http://example.org/ns#a9022> . +<http://example.org/ns#a9023> <http://example.org/ns#a9023> <http://example.org/ns#a9023> . +<http://example.org/ns#a9024> <http://example.org/ns#a9024> <http://example.org/ns#a9024> . +<http://example.org/ns#a9025> <http://example.org/ns#a9025> <http://example.org/ns#a9025> . +<http://example.org/ns#a9026> <http://example.org/ns#a9026> <http://example.org/ns#a9026> . +<http://example.org/ns#a9027> <http://example.org/ns#a9027> <http://example.org/ns#a9027> . +<http://example.org/ns#a9028> <http://example.org/ns#a9028> <http://example.org/ns#a9028> . +<http://example.org/ns#a9029> <http://example.org/ns#a9029> <http://example.org/ns#a9029> . +<http://example.org/ns#a9030> <http://example.org/ns#a9030> <http://example.org/ns#a9030> . +<http://example.org/ns#a9031> <http://example.org/ns#a9031> <http://example.org/ns#a9031> . +<http://example.org/ns#a9032> <http://example.org/ns#a9032> <http://example.org/ns#a9032> . +<http://example.org/ns#a9033> <http://example.org/ns#a9033> <http://example.org/ns#a9033> . +<http://example.org/ns#a9034> <http://example.org/ns#a9034> <http://example.org/ns#a9034> . +<http://example.org/ns#a9035> <http://example.org/ns#a9035> <http://example.org/ns#a9035> . +<http://example.org/ns#a9036> <http://example.org/ns#a9036> <http://example.org/ns#a9036> . +<http://example.org/ns#a9037> <http://example.org/ns#a9037> <http://example.org/ns#a9037> . +<http://example.org/ns#a9038> <http://example.org/ns#a9038> <http://example.org/ns#a9038> . +<http://example.org/ns#a9039> <http://example.org/ns#a9039> <http://example.org/ns#a9039> . +<http://example.org/ns#a9040> <http://example.org/ns#a9040> <http://example.org/ns#a9040> . +<http://example.org/ns#a9041> <http://example.org/ns#a9041> <http://example.org/ns#a9041> . +<http://example.org/ns#a9042> <http://example.org/ns#a9042> <http://example.org/ns#a9042> . +<http://example.org/ns#a9043> <http://example.org/ns#a9043> <http://example.org/ns#a9043> . +<http://example.org/ns#a9044> <http://example.org/ns#a9044> <http://example.org/ns#a9044> . +<http://example.org/ns#a9045> <http://example.org/ns#a9045> <http://example.org/ns#a9045> . +<http://example.org/ns#a9046> <http://example.org/ns#a9046> <http://example.org/ns#a9046> . +<http://example.org/ns#a9047> <http://example.org/ns#a9047> <http://example.org/ns#a9047> . +<http://example.org/ns#a9048> <http://example.org/ns#a9048> <http://example.org/ns#a9048> . +<http://example.org/ns#a9049> <http://example.org/ns#a9049> <http://example.org/ns#a9049> . +<http://example.org/ns#a9050> <http://example.org/ns#a9050> <http://example.org/ns#a9050> . +<http://example.org/ns#a9051> <http://example.org/ns#a9051> <http://example.org/ns#a9051> . +<http://example.org/ns#a9052> <http://example.org/ns#a9052> <http://example.org/ns#a9052> . +<http://example.org/ns#a9053> <http://example.org/ns#a9053> <http://example.org/ns#a9053> . +<http://example.org/ns#a9054> <http://example.org/ns#a9054> <http://example.org/ns#a9054> . +<http://example.org/ns#a9055> <http://example.org/ns#a9055> <http://example.org/ns#a9055> . +<http://example.org/ns#a9056> <http://example.org/ns#a9056> <http://example.org/ns#a9056> . +<http://example.org/ns#a9057> <http://example.org/ns#a9057> <http://example.org/ns#a9057> . +<http://example.org/ns#a9058> <http://example.org/ns#a9058> <http://example.org/ns#a9058> . +<http://example.org/ns#a9059> <http://example.org/ns#a9059> <http://example.org/ns#a9059> . +<http://example.org/ns#a9060> <http://example.org/ns#a9060> <http://example.org/ns#a9060> . +<http://example.org/ns#a9061> <http://example.org/ns#a9061> <http://example.org/ns#a9061> . +<http://example.org/ns#a9062> <http://example.org/ns#a9062> <http://example.org/ns#a9062> . +<http://example.org/ns#a9063> <http://example.org/ns#a9063> <http://example.org/ns#a9063> . +<http://example.org/ns#a9064> <http://example.org/ns#a9064> <http://example.org/ns#a9064> . +<http://example.org/ns#a9065> <http://example.org/ns#a9065> <http://example.org/ns#a9065> . +<http://example.org/ns#a9066> <http://example.org/ns#a9066> <http://example.org/ns#a9066> . +<http://example.org/ns#a9067> <http://example.org/ns#a9067> <http://example.org/ns#a9067> . +<http://example.org/ns#a9068> <http://example.org/ns#a9068> <http://example.org/ns#a9068> . +<http://example.org/ns#a9069> <http://example.org/ns#a9069> <http://example.org/ns#a9069> . +<http://example.org/ns#a9070> <http://example.org/ns#a9070> <http://example.org/ns#a9070> . +<http://example.org/ns#a9071> <http://example.org/ns#a9071> <http://example.org/ns#a9071> . +<http://example.org/ns#a9072> <http://example.org/ns#a9072> <http://example.org/ns#a9072> . +<http://example.org/ns#a9073> <http://example.org/ns#a9073> <http://example.org/ns#a9073> . +<http://example.org/ns#a9074> <http://example.org/ns#a9074> <http://example.org/ns#a9074> . +<http://example.org/ns#a9075> <http://example.org/ns#a9075> <http://example.org/ns#a9075> . +<http://example.org/ns#a9076> <http://example.org/ns#a9076> <http://example.org/ns#a9076> . +<http://example.org/ns#a9077> <http://example.org/ns#a9077> <http://example.org/ns#a9077> . +<http://example.org/ns#a9078> <http://example.org/ns#a9078> <http://example.org/ns#a9078> . +<http://example.org/ns#a9079> <http://example.org/ns#a9079> <http://example.org/ns#a9079> . +<http://example.org/ns#a9080> <http://example.org/ns#a9080> <http://example.org/ns#a9080> . +<http://example.org/ns#a9081> <http://example.org/ns#a9081> <http://example.org/ns#a9081> . +<http://example.org/ns#a9082> <http://example.org/ns#a9082> <http://example.org/ns#a9082> . +<http://example.org/ns#a9083> <http://example.org/ns#a9083> <http://example.org/ns#a9083> . +<http://example.org/ns#a9084> <http://example.org/ns#a9084> <http://example.org/ns#a9084> . +<http://example.org/ns#a9085> <http://example.org/ns#a9085> <http://example.org/ns#a9085> . +<http://example.org/ns#a9086> <http://example.org/ns#a9086> <http://example.org/ns#a9086> . +<http://example.org/ns#a9087> <http://example.org/ns#a9087> <http://example.org/ns#a9087> . +<http://example.org/ns#a9088> <http://example.org/ns#a9088> <http://example.org/ns#a9088> . +<http://example.org/ns#a9089> <http://example.org/ns#a9089> <http://example.org/ns#a9089> . +<http://example.org/ns#a9090> <http://example.org/ns#a9090> <http://example.org/ns#a9090> . +<http://example.org/ns#a9091> <http://example.org/ns#a9091> <http://example.org/ns#a9091> . +<http://example.org/ns#a9092> <http://example.org/ns#a9092> <http://example.org/ns#a9092> . +<http://example.org/ns#a9093> <http://example.org/ns#a9093> <http://example.org/ns#a9093> . +<http://example.org/ns#a9094> <http://example.org/ns#a9094> <http://example.org/ns#a9094> . +<http://example.org/ns#a9095> <http://example.org/ns#a9095> <http://example.org/ns#a9095> . +<http://example.org/ns#a9096> <http://example.org/ns#a9096> <http://example.org/ns#a9096> . +<http://example.org/ns#a9097> <http://example.org/ns#a9097> <http://example.org/ns#a9097> . +<http://example.org/ns#a9098> <http://example.org/ns#a9098> <http://example.org/ns#a9098> . +<http://example.org/ns#a9099> <http://example.org/ns#a9099> <http://example.org/ns#a9099> . +<http://example.org/ns#a9100> <http://example.org/ns#a9100> <http://example.org/ns#a9100> . +<http://example.org/ns#a9101> <http://example.org/ns#a9101> <http://example.org/ns#a9101> . +<http://example.org/ns#a9102> <http://example.org/ns#a9102> <http://example.org/ns#a9102> . +<http://example.org/ns#a9103> <http://example.org/ns#a9103> <http://example.org/ns#a9103> . +<http://example.org/ns#a9104> <http://example.org/ns#a9104> <http://example.org/ns#a9104> . +<http://example.org/ns#a9105> <http://example.org/ns#a9105> <http://example.org/ns#a9105> . +<http://example.org/ns#a9106> <http://example.org/ns#a9106> <http://example.org/ns#a9106> . +<http://example.org/ns#a9107> <http://example.org/ns#a9107> <http://example.org/ns#a9107> . +<http://example.org/ns#a9108> <http://example.org/ns#a9108> <http://example.org/ns#a9108> . +<http://example.org/ns#a9109> <http://example.org/ns#a9109> <http://example.org/ns#a9109> . +<http://example.org/ns#a9110> <http://example.org/ns#a9110> <http://example.org/ns#a9110> . +<http://example.org/ns#a9111> <http://example.org/ns#a9111> <http://example.org/ns#a9111> . +<http://example.org/ns#a9112> <http://example.org/ns#a9112> <http://example.org/ns#a9112> . +<http://example.org/ns#a9113> <http://example.org/ns#a9113> <http://example.org/ns#a9113> . +<http://example.org/ns#a9114> <http://example.org/ns#a9114> <http://example.org/ns#a9114> . +<http://example.org/ns#a9115> <http://example.org/ns#a9115> <http://example.org/ns#a9115> . +<http://example.org/ns#a9116> <http://example.org/ns#a9116> <http://example.org/ns#a9116> . +<http://example.org/ns#a9117> <http://example.org/ns#a9117> <http://example.org/ns#a9117> . +<http://example.org/ns#a9118> <http://example.org/ns#a9118> <http://example.org/ns#a9118> . +<http://example.org/ns#a9119> <http://example.org/ns#a9119> <http://example.org/ns#a9119> . +<http://example.org/ns#a9120> <http://example.org/ns#a9120> <http://example.org/ns#a9120> . +<http://example.org/ns#a9121> <http://example.org/ns#a9121> <http://example.org/ns#a9121> . +<http://example.org/ns#a9122> <http://example.org/ns#a9122> <http://example.org/ns#a9122> . +<http://example.org/ns#a9123> <http://example.org/ns#a9123> <http://example.org/ns#a9123> . +<http://example.org/ns#a9124> <http://example.org/ns#a9124> <http://example.org/ns#a9124> . +<http://example.org/ns#a9125> <http://example.org/ns#a9125> <http://example.org/ns#a9125> . +<http://example.org/ns#a9126> <http://example.org/ns#a9126> <http://example.org/ns#a9126> . +<http://example.org/ns#a9127> <http://example.org/ns#a9127> <http://example.org/ns#a9127> . +<http://example.org/ns#a9128> <http://example.org/ns#a9128> <http://example.org/ns#a9128> . +<http://example.org/ns#a9129> <http://example.org/ns#a9129> <http://example.org/ns#a9129> . +<http://example.org/ns#a9130> <http://example.org/ns#a9130> <http://example.org/ns#a9130> . +<http://example.org/ns#a9131> <http://example.org/ns#a9131> <http://example.org/ns#a9131> . +<http://example.org/ns#a9132> <http://example.org/ns#a9132> <http://example.org/ns#a9132> . +<http://example.org/ns#a9133> <http://example.org/ns#a9133> <http://example.org/ns#a9133> . +<http://example.org/ns#a9134> <http://example.org/ns#a9134> <http://example.org/ns#a9134> . +<http://example.org/ns#a9135> <http://example.org/ns#a9135> <http://example.org/ns#a9135> . +<http://example.org/ns#a9136> <http://example.org/ns#a9136> <http://example.org/ns#a9136> . +<http://example.org/ns#a9137> <http://example.org/ns#a9137> <http://example.org/ns#a9137> . +<http://example.org/ns#a9138> <http://example.org/ns#a9138> <http://example.org/ns#a9138> . +<http://example.org/ns#a9139> <http://example.org/ns#a9139> <http://example.org/ns#a9139> . +<http://example.org/ns#a9140> <http://example.org/ns#a9140> <http://example.org/ns#a9140> . +<http://example.org/ns#a9141> <http://example.org/ns#a9141> <http://example.org/ns#a9141> . +<http://example.org/ns#a9142> <http://example.org/ns#a9142> <http://example.org/ns#a9142> . +<http://example.org/ns#a9143> <http://example.org/ns#a9143> <http://example.org/ns#a9143> . +<http://example.org/ns#a9144> <http://example.org/ns#a9144> <http://example.org/ns#a9144> . +<http://example.org/ns#a9145> <http://example.org/ns#a9145> <http://example.org/ns#a9145> . +<http://example.org/ns#a9146> <http://example.org/ns#a9146> <http://example.org/ns#a9146> . +<http://example.org/ns#a9147> <http://example.org/ns#a9147> <http://example.org/ns#a9147> . +<http://example.org/ns#a9148> <http://example.org/ns#a9148> <http://example.org/ns#a9148> . +<http://example.org/ns#a9149> <http://example.org/ns#a9149> <http://example.org/ns#a9149> . +<http://example.org/ns#a9150> <http://example.org/ns#a9150> <http://example.org/ns#a9150> . +<http://example.org/ns#a9151> <http://example.org/ns#a9151> <http://example.org/ns#a9151> . +<http://example.org/ns#a9152> <http://example.org/ns#a9152> <http://example.org/ns#a9152> . +<http://example.org/ns#a9153> <http://example.org/ns#a9153> <http://example.org/ns#a9153> . +<http://example.org/ns#a9154> <http://example.org/ns#a9154> <http://example.org/ns#a9154> . +<http://example.org/ns#a9155> <http://example.org/ns#a9155> <http://example.org/ns#a9155> . +<http://example.org/ns#a9156> <http://example.org/ns#a9156> <http://example.org/ns#a9156> . +<http://example.org/ns#a9157> <http://example.org/ns#a9157> <http://example.org/ns#a9157> . +<http://example.org/ns#a9158> <http://example.org/ns#a9158> <http://example.org/ns#a9158> . +<http://example.org/ns#a9159> <http://example.org/ns#a9159> <http://example.org/ns#a9159> . +<http://example.org/ns#a9160> <http://example.org/ns#a9160> <http://example.org/ns#a9160> . +<http://example.org/ns#a9161> <http://example.org/ns#a9161> <http://example.org/ns#a9161> . +<http://example.org/ns#a9162> <http://example.org/ns#a9162> <http://example.org/ns#a9162> . +<http://example.org/ns#a9163> <http://example.org/ns#a9163> <http://example.org/ns#a9163> . +<http://example.org/ns#a9164> <http://example.org/ns#a9164> <http://example.org/ns#a9164> . +<http://example.org/ns#a9165> <http://example.org/ns#a9165> <http://example.org/ns#a9165> . +<http://example.org/ns#a9166> <http://example.org/ns#a9166> <http://example.org/ns#a9166> . +<http://example.org/ns#a9167> <http://example.org/ns#a9167> <http://example.org/ns#a9167> . +<http://example.org/ns#a9168> <http://example.org/ns#a9168> <http://example.org/ns#a9168> . +<http://example.org/ns#a9169> <http://example.org/ns#a9169> <http://example.org/ns#a9169> . +<http://example.org/ns#a9170> <http://example.org/ns#a9170> <http://example.org/ns#a9170> . +<http://example.org/ns#a9171> <http://example.org/ns#a9171> <http://example.org/ns#a9171> . +<http://example.org/ns#a9172> <http://example.org/ns#a9172> <http://example.org/ns#a9172> . +<http://example.org/ns#a9173> <http://example.org/ns#a9173> <http://example.org/ns#a9173> . +<http://example.org/ns#a9174> <http://example.org/ns#a9174> <http://example.org/ns#a9174> . +<http://example.org/ns#a9175> <http://example.org/ns#a9175> <http://example.org/ns#a9175> . +<http://example.org/ns#a9176> <http://example.org/ns#a9176> <http://example.org/ns#a9176> . +<http://example.org/ns#a9177> <http://example.org/ns#a9177> <http://example.org/ns#a9177> . +<http://example.org/ns#a9178> <http://example.org/ns#a9178> <http://example.org/ns#a9178> . +<http://example.org/ns#a9179> <http://example.org/ns#a9179> <http://example.org/ns#a9179> . +<http://example.org/ns#a9180> <http://example.org/ns#a9180> <http://example.org/ns#a9180> . +<http://example.org/ns#a9181> <http://example.org/ns#a9181> <http://example.org/ns#a9181> . +<http://example.org/ns#a9182> <http://example.org/ns#a9182> <http://example.org/ns#a9182> . +<http://example.org/ns#a9183> <http://example.org/ns#a9183> <http://example.org/ns#a9183> . +<http://example.org/ns#a9184> <http://example.org/ns#a9184> <http://example.org/ns#a9184> . +<http://example.org/ns#a9185> <http://example.org/ns#a9185> <http://example.org/ns#a9185> . +<http://example.org/ns#a9186> <http://example.org/ns#a9186> <http://example.org/ns#a9186> . +<http://example.org/ns#a9187> <http://example.org/ns#a9187> <http://example.org/ns#a9187> . +<http://example.org/ns#a9188> <http://example.org/ns#a9188> <http://example.org/ns#a9188> . +<http://example.org/ns#a9189> <http://example.org/ns#a9189> <http://example.org/ns#a9189> . +<http://example.org/ns#a9190> <http://example.org/ns#a9190> <http://example.org/ns#a9190> . +<http://example.org/ns#a9191> <http://example.org/ns#a9191> <http://example.org/ns#a9191> . +<http://example.org/ns#a9192> <http://example.org/ns#a9192> <http://example.org/ns#a9192> . +<http://example.org/ns#a9193> <http://example.org/ns#a9193> <http://example.org/ns#a9193> . +<http://example.org/ns#a9194> <http://example.org/ns#a9194> <http://example.org/ns#a9194> . +<http://example.org/ns#a9195> <http://example.org/ns#a9195> <http://example.org/ns#a9195> . +<http://example.org/ns#a9196> <http://example.org/ns#a9196> <http://example.org/ns#a9196> . +<http://example.org/ns#a9197> <http://example.org/ns#a9197> <http://example.org/ns#a9197> . +<http://example.org/ns#a9198> <http://example.org/ns#a9198> <http://example.org/ns#a9198> . +<http://example.org/ns#a9199> <http://example.org/ns#a9199> <http://example.org/ns#a9199> . +<http://example.org/ns#a9200> <http://example.org/ns#a9200> <http://example.org/ns#a9200> . +<http://example.org/ns#a9201> <http://example.org/ns#a9201> <http://example.org/ns#a9201> . +<http://example.org/ns#a9202> <http://example.org/ns#a9202> <http://example.org/ns#a9202> . +<http://example.org/ns#a9203> <http://example.org/ns#a9203> <http://example.org/ns#a9203> . +<http://example.org/ns#a9204> <http://example.org/ns#a9204> <http://example.org/ns#a9204> . +<http://example.org/ns#a9205> <http://example.org/ns#a9205> <http://example.org/ns#a9205> . +<http://example.org/ns#a9206> <http://example.org/ns#a9206> <http://example.org/ns#a9206> . +<http://example.org/ns#a9207> <http://example.org/ns#a9207> <http://example.org/ns#a9207> . +<http://example.org/ns#a9208> <http://example.org/ns#a9208> <http://example.org/ns#a9208> . +<http://example.org/ns#a9209> <http://example.org/ns#a9209> <http://example.org/ns#a9209> . +<http://example.org/ns#a9210> <http://example.org/ns#a9210> <http://example.org/ns#a9210> . +<http://example.org/ns#a9211> <http://example.org/ns#a9211> <http://example.org/ns#a9211> . +<http://example.org/ns#a9212> <http://example.org/ns#a9212> <http://example.org/ns#a9212> . +<http://example.org/ns#a9213> <http://example.org/ns#a9213> <http://example.org/ns#a9213> . +<http://example.org/ns#a9214> <http://example.org/ns#a9214> <http://example.org/ns#a9214> . +<http://example.org/ns#a9215> <http://example.org/ns#a9215> <http://example.org/ns#a9215> . +<http://example.org/ns#a9216> <http://example.org/ns#a9216> <http://example.org/ns#a9216> . +<http://example.org/ns#a9217> <http://example.org/ns#a9217> <http://example.org/ns#a9217> . +<http://example.org/ns#a9218> <http://example.org/ns#a9218> <http://example.org/ns#a9218> . +<http://example.org/ns#a9219> <http://example.org/ns#a9219> <http://example.org/ns#a9219> . +<http://example.org/ns#a9220> <http://example.org/ns#a9220> <http://example.org/ns#a9220> . +<http://example.org/ns#a9221> <http://example.org/ns#a9221> <http://example.org/ns#a9221> . +<http://example.org/ns#a9222> <http://example.org/ns#a9222> <http://example.org/ns#a9222> . +<http://example.org/ns#a9223> <http://example.org/ns#a9223> <http://example.org/ns#a9223> . +<http://example.org/ns#a9224> <http://example.org/ns#a9224> <http://example.org/ns#a9224> . +<http://example.org/ns#a9225> <http://example.org/ns#a9225> <http://example.org/ns#a9225> . +<http://example.org/ns#a9226> <http://example.org/ns#a9226> <http://example.org/ns#a9226> . +<http://example.org/ns#a9227> <http://example.org/ns#a9227> <http://example.org/ns#a9227> . +<http://example.org/ns#a9228> <http://example.org/ns#a9228> <http://example.org/ns#a9228> . +<http://example.org/ns#a9229> <http://example.org/ns#a9229> <http://example.org/ns#a9229> . +<http://example.org/ns#a9230> <http://example.org/ns#a9230> <http://example.org/ns#a9230> . +<http://example.org/ns#a9231> <http://example.org/ns#a9231> <http://example.org/ns#a9231> . +<http://example.org/ns#a9232> <http://example.org/ns#a9232> <http://example.org/ns#a9232> . +<http://example.org/ns#a9233> <http://example.org/ns#a9233> <http://example.org/ns#a9233> . +<http://example.org/ns#a9234> <http://example.org/ns#a9234> <http://example.org/ns#a9234> . +<http://example.org/ns#a9235> <http://example.org/ns#a9235> <http://example.org/ns#a9235> . +<http://example.org/ns#a9236> <http://example.org/ns#a9236> <http://example.org/ns#a9236> . +<http://example.org/ns#a9237> <http://example.org/ns#a9237> <http://example.org/ns#a9237> . +<http://example.org/ns#a9238> <http://example.org/ns#a9238> <http://example.org/ns#a9238> . +<http://example.org/ns#a9239> <http://example.org/ns#a9239> <http://example.org/ns#a9239> . +<http://example.org/ns#a9240> <http://example.org/ns#a9240> <http://example.org/ns#a9240> . +<http://example.org/ns#a9241> <http://example.org/ns#a9241> <http://example.org/ns#a9241> . +<http://example.org/ns#a9242> <http://example.org/ns#a9242> <http://example.org/ns#a9242> . +<http://example.org/ns#a9243> <http://example.org/ns#a9243> <http://example.org/ns#a9243> . +<http://example.org/ns#a9244> <http://example.org/ns#a9244> <http://example.org/ns#a9244> . +<http://example.org/ns#a9245> <http://example.org/ns#a9245> <http://example.org/ns#a9245> . +<http://example.org/ns#a9246> <http://example.org/ns#a9246> <http://example.org/ns#a9246> . +<http://example.org/ns#a9247> <http://example.org/ns#a9247> <http://example.org/ns#a9247> . +<http://example.org/ns#a9248> <http://example.org/ns#a9248> <http://example.org/ns#a9248> . +<http://example.org/ns#a9249> <http://example.org/ns#a9249> <http://example.org/ns#a9249> . +<http://example.org/ns#a9250> <http://example.org/ns#a9250> <http://example.org/ns#a9250> . +<http://example.org/ns#a9251> <http://example.org/ns#a9251> <http://example.org/ns#a9251> . +<http://example.org/ns#a9252> <http://example.org/ns#a9252> <http://example.org/ns#a9252> . +<http://example.org/ns#a9253> <http://example.org/ns#a9253> <http://example.org/ns#a9253> . +<http://example.org/ns#a9254> <http://example.org/ns#a9254> <http://example.org/ns#a9254> . +<http://example.org/ns#a9255> <http://example.org/ns#a9255> <http://example.org/ns#a9255> . +<http://example.org/ns#a9256> <http://example.org/ns#a9256> <http://example.org/ns#a9256> . +<http://example.org/ns#a9257> <http://example.org/ns#a9257> <http://example.org/ns#a9257> . +<http://example.org/ns#a9258> <http://example.org/ns#a9258> <http://example.org/ns#a9258> . +<http://example.org/ns#a9259> <http://example.org/ns#a9259> <http://example.org/ns#a9259> . +<http://example.org/ns#a9260> <http://example.org/ns#a9260> <http://example.org/ns#a9260> . +<http://example.org/ns#a9261> <http://example.org/ns#a9261> <http://example.org/ns#a9261> . +<http://example.org/ns#a9262> <http://example.org/ns#a9262> <http://example.org/ns#a9262> . +<http://example.org/ns#a9263> <http://example.org/ns#a9263> <http://example.org/ns#a9263> . +<http://example.org/ns#a9264> <http://example.org/ns#a9264> <http://example.org/ns#a9264> . +<http://example.org/ns#a9265> <http://example.org/ns#a9265> <http://example.org/ns#a9265> . +<http://example.org/ns#a9266> <http://example.org/ns#a9266> <http://example.org/ns#a9266> . +<http://example.org/ns#a9267> <http://example.org/ns#a9267> <http://example.org/ns#a9267> . +<http://example.org/ns#a9268> <http://example.org/ns#a9268> <http://example.org/ns#a9268> . +<http://example.org/ns#a9269> <http://example.org/ns#a9269> <http://example.org/ns#a9269> . +<http://example.org/ns#a9270> <http://example.org/ns#a9270> <http://example.org/ns#a9270> . +<http://example.org/ns#a9271> <http://example.org/ns#a9271> <http://example.org/ns#a9271> . +<http://example.org/ns#a9272> <http://example.org/ns#a9272> <http://example.org/ns#a9272> . +<http://example.org/ns#a9273> <http://example.org/ns#a9273> <http://example.org/ns#a9273> . +<http://example.org/ns#a9274> <http://example.org/ns#a9274> <http://example.org/ns#a9274> . +<http://example.org/ns#a9275> <http://example.org/ns#a9275> <http://example.org/ns#a9275> . +<http://example.org/ns#a9276> <http://example.org/ns#a9276> <http://example.org/ns#a9276> . +<http://example.org/ns#a9277> <http://example.org/ns#a9277> <http://example.org/ns#a9277> . +<http://example.org/ns#a9278> <http://example.org/ns#a9278> <http://example.org/ns#a9278> . +<http://example.org/ns#a9279> <http://example.org/ns#a9279> <http://example.org/ns#a9279> . +<http://example.org/ns#a9280> <http://example.org/ns#a9280> <http://example.org/ns#a9280> . +<http://example.org/ns#a9281> <http://example.org/ns#a9281> <http://example.org/ns#a9281> . +<http://example.org/ns#a9282> <http://example.org/ns#a9282> <http://example.org/ns#a9282> . +<http://example.org/ns#a9283> <http://example.org/ns#a9283> <http://example.org/ns#a9283> . +<http://example.org/ns#a9284> <http://example.org/ns#a9284> <http://example.org/ns#a9284> . +<http://example.org/ns#a9285> <http://example.org/ns#a9285> <http://example.org/ns#a9285> . +<http://example.org/ns#a9286> <http://example.org/ns#a9286> <http://example.org/ns#a9286> . +<http://example.org/ns#a9287> <http://example.org/ns#a9287> <http://example.org/ns#a9287> . +<http://example.org/ns#a9288> <http://example.org/ns#a9288> <http://example.org/ns#a9288> . +<http://example.org/ns#a9289> <http://example.org/ns#a9289> <http://example.org/ns#a9289> . +<http://example.org/ns#a9290> <http://example.org/ns#a9290> <http://example.org/ns#a9290> . +<http://example.org/ns#a9291> <http://example.org/ns#a9291> <http://example.org/ns#a9291> . +<http://example.org/ns#a9292> <http://example.org/ns#a9292> <http://example.org/ns#a9292> . +<http://example.org/ns#a9293> <http://example.org/ns#a9293> <http://example.org/ns#a9293> . +<http://example.org/ns#a9294> <http://example.org/ns#a9294> <http://example.org/ns#a9294> . +<http://example.org/ns#a9295> <http://example.org/ns#a9295> <http://example.org/ns#a9295> . +<http://example.org/ns#a9296> <http://example.org/ns#a9296> <http://example.org/ns#a9296> . +<http://example.org/ns#a9297> <http://example.org/ns#a9297> <http://example.org/ns#a9297> . +<http://example.org/ns#a9298> <http://example.org/ns#a9298> <http://example.org/ns#a9298> . +<http://example.org/ns#a9299> <http://example.org/ns#a9299> <http://example.org/ns#a9299> . +<http://example.org/ns#a9300> <http://example.org/ns#a9300> <http://example.org/ns#a9300> . +<http://example.org/ns#a9301> <http://example.org/ns#a9301> <http://example.org/ns#a9301> . +<http://example.org/ns#a9302> <http://example.org/ns#a9302> <http://example.org/ns#a9302> . +<http://example.org/ns#a9303> <http://example.org/ns#a9303> <http://example.org/ns#a9303> . +<http://example.org/ns#a9304> <http://example.org/ns#a9304> <http://example.org/ns#a9304> . +<http://example.org/ns#a9305> <http://example.org/ns#a9305> <http://example.org/ns#a9305> . +<http://example.org/ns#a9306> <http://example.org/ns#a9306> <http://example.org/ns#a9306> . +<http://example.org/ns#a9307> <http://example.org/ns#a9307> <http://example.org/ns#a9307> . +<http://example.org/ns#a9308> <http://example.org/ns#a9308> <http://example.org/ns#a9308> . +<http://example.org/ns#a9309> <http://example.org/ns#a9309> <http://example.org/ns#a9309> . +<http://example.org/ns#a9310> <http://example.org/ns#a9310> <http://example.org/ns#a9310> . +<http://example.org/ns#a9311> <http://example.org/ns#a9311> <http://example.org/ns#a9311> . +<http://example.org/ns#a9312> <http://example.org/ns#a9312> <http://example.org/ns#a9312> . +<http://example.org/ns#a9313> <http://example.org/ns#a9313> <http://example.org/ns#a9313> . +<http://example.org/ns#a9314> <http://example.org/ns#a9314> <http://example.org/ns#a9314> . +<http://example.org/ns#a9315> <http://example.org/ns#a9315> <http://example.org/ns#a9315> . +<http://example.org/ns#a9316> <http://example.org/ns#a9316> <http://example.org/ns#a9316> . +<http://example.org/ns#a9317> <http://example.org/ns#a9317> <http://example.org/ns#a9317> . +<http://example.org/ns#a9318> <http://example.org/ns#a9318> <http://example.org/ns#a9318> . +<http://example.org/ns#a9319> <http://example.org/ns#a9319> <http://example.org/ns#a9319> . +<http://example.org/ns#a9320> <http://example.org/ns#a9320> <http://example.org/ns#a9320> . +<http://example.org/ns#a9321> <http://example.org/ns#a9321> <http://example.org/ns#a9321> . +<http://example.org/ns#a9322> <http://example.org/ns#a9322> <http://example.org/ns#a9322> . +<http://example.org/ns#a9323> <http://example.org/ns#a9323> <http://example.org/ns#a9323> . +<http://example.org/ns#a9324> <http://example.org/ns#a9324> <http://example.org/ns#a9324> . +<http://example.org/ns#a9325> <http://example.org/ns#a9325> <http://example.org/ns#a9325> . +<http://example.org/ns#a9326> <http://example.org/ns#a9326> <http://example.org/ns#a9326> . +<http://example.org/ns#a9327> <http://example.org/ns#a9327> <http://example.org/ns#a9327> . +<http://example.org/ns#a9328> <http://example.org/ns#a9328> <http://example.org/ns#a9328> . +<http://example.org/ns#a9329> <http://example.org/ns#a9329> <http://example.org/ns#a9329> . +<http://example.org/ns#a9330> <http://example.org/ns#a9330> <http://example.org/ns#a9330> . +<http://example.org/ns#a9331> <http://example.org/ns#a9331> <http://example.org/ns#a9331> . +<http://example.org/ns#a9332> <http://example.org/ns#a9332> <http://example.org/ns#a9332> . +<http://example.org/ns#a9333> <http://example.org/ns#a9333> <http://example.org/ns#a9333> . +<http://example.org/ns#a9334> <http://example.org/ns#a9334> <http://example.org/ns#a9334> . +<http://example.org/ns#a9335> <http://example.org/ns#a9335> <http://example.org/ns#a9335> . +<http://example.org/ns#a9336> <http://example.org/ns#a9336> <http://example.org/ns#a9336> . +<http://example.org/ns#a9337> <http://example.org/ns#a9337> <http://example.org/ns#a9337> . +<http://example.org/ns#a9338> <http://example.org/ns#a9338> <http://example.org/ns#a9338> . +<http://example.org/ns#a9339> <http://example.org/ns#a9339> <http://example.org/ns#a9339> . +<http://example.org/ns#a9340> <http://example.org/ns#a9340> <http://example.org/ns#a9340> . +<http://example.org/ns#a9341> <http://example.org/ns#a9341> <http://example.org/ns#a9341> . +<http://example.org/ns#a9342> <http://example.org/ns#a9342> <http://example.org/ns#a9342> . +<http://example.org/ns#a9343> <http://example.org/ns#a9343> <http://example.org/ns#a9343> . +<http://example.org/ns#a9344> <http://example.org/ns#a9344> <http://example.org/ns#a9344> . +<http://example.org/ns#a9345> <http://example.org/ns#a9345> <http://example.org/ns#a9345> . +<http://example.org/ns#a9346> <http://example.org/ns#a9346> <http://example.org/ns#a9346> . +<http://example.org/ns#a9347> <http://example.org/ns#a9347> <http://example.org/ns#a9347> . +<http://example.org/ns#a9348> <http://example.org/ns#a9348> <http://example.org/ns#a9348> . +<http://example.org/ns#a9349> <http://example.org/ns#a9349> <http://example.org/ns#a9349> . +<http://example.org/ns#a9350> <http://example.org/ns#a9350> <http://example.org/ns#a9350> . +<http://example.org/ns#a9351> <http://example.org/ns#a9351> <http://example.org/ns#a9351> . +<http://example.org/ns#a9352> <http://example.org/ns#a9352> <http://example.org/ns#a9352> . +<http://example.org/ns#a9353> <http://example.org/ns#a9353> <http://example.org/ns#a9353> . +<http://example.org/ns#a9354> <http://example.org/ns#a9354> <http://example.org/ns#a9354> . +<http://example.org/ns#a9355> <http://example.org/ns#a9355> <http://example.org/ns#a9355> . +<http://example.org/ns#a9356> <http://example.org/ns#a9356> <http://example.org/ns#a9356> . +<http://example.org/ns#a9357> <http://example.org/ns#a9357> <http://example.org/ns#a9357> . +<http://example.org/ns#a9358> <http://example.org/ns#a9358> <http://example.org/ns#a9358> . +<http://example.org/ns#a9359> <http://example.org/ns#a9359> <http://example.org/ns#a9359> . +<http://example.org/ns#a9360> <http://example.org/ns#a9360> <http://example.org/ns#a9360> . +<http://example.org/ns#a9361> <http://example.org/ns#a9361> <http://example.org/ns#a9361> . +<http://example.org/ns#a9362> <http://example.org/ns#a9362> <http://example.org/ns#a9362> . +<http://example.org/ns#a9363> <http://example.org/ns#a9363> <http://example.org/ns#a9363> . +<http://example.org/ns#a9364> <http://example.org/ns#a9364> <http://example.org/ns#a9364> . +<http://example.org/ns#a9365> <http://example.org/ns#a9365> <http://example.org/ns#a9365> . +<http://example.org/ns#a9366> <http://example.org/ns#a9366> <http://example.org/ns#a9366> . +<http://example.org/ns#a9367> <http://example.org/ns#a9367> <http://example.org/ns#a9367> . +<http://example.org/ns#a9368> <http://example.org/ns#a9368> <http://example.org/ns#a9368> . +<http://example.org/ns#a9369> <http://example.org/ns#a9369> <http://example.org/ns#a9369> . +<http://example.org/ns#a9370> <http://example.org/ns#a9370> <http://example.org/ns#a9370> . +<http://example.org/ns#a9371> <http://example.org/ns#a9371> <http://example.org/ns#a9371> . +<http://example.org/ns#a9372> <http://example.org/ns#a9372> <http://example.org/ns#a9372> . +<http://example.org/ns#a9373> <http://example.org/ns#a9373> <http://example.org/ns#a9373> . +<http://example.org/ns#a9374> <http://example.org/ns#a9374> <http://example.org/ns#a9374> . +<http://example.org/ns#a9375> <http://example.org/ns#a9375> <http://example.org/ns#a9375> . +<http://example.org/ns#a9376> <http://example.org/ns#a9376> <http://example.org/ns#a9376> . +<http://example.org/ns#a9377> <http://example.org/ns#a9377> <http://example.org/ns#a9377> . +<http://example.org/ns#a9378> <http://example.org/ns#a9378> <http://example.org/ns#a9378> . +<http://example.org/ns#a9379> <http://example.org/ns#a9379> <http://example.org/ns#a9379> . +<http://example.org/ns#a9380> <http://example.org/ns#a9380> <http://example.org/ns#a9380> . +<http://example.org/ns#a9381> <http://example.org/ns#a9381> <http://example.org/ns#a9381> . +<http://example.org/ns#a9382> <http://example.org/ns#a9382> <http://example.org/ns#a9382> . +<http://example.org/ns#a9383> <http://example.org/ns#a9383> <http://example.org/ns#a9383> . +<http://example.org/ns#a9384> <http://example.org/ns#a9384> <http://example.org/ns#a9384> . +<http://example.org/ns#a9385> <http://example.org/ns#a9385> <http://example.org/ns#a9385> . +<http://example.org/ns#a9386> <http://example.org/ns#a9386> <http://example.org/ns#a9386> . +<http://example.org/ns#a9387> <http://example.org/ns#a9387> <http://example.org/ns#a9387> . +<http://example.org/ns#a9388> <http://example.org/ns#a9388> <http://example.org/ns#a9388> . +<http://example.org/ns#a9389> <http://example.org/ns#a9389> <http://example.org/ns#a9389> . +<http://example.org/ns#a9390> <http://example.org/ns#a9390> <http://example.org/ns#a9390> . +<http://example.org/ns#a9391> <http://example.org/ns#a9391> <http://example.org/ns#a9391> . +<http://example.org/ns#a9392> <http://example.org/ns#a9392> <http://example.org/ns#a9392> . +<http://example.org/ns#a9393> <http://example.org/ns#a9393> <http://example.org/ns#a9393> . +<http://example.org/ns#a9394> <http://example.org/ns#a9394> <http://example.org/ns#a9394> . +<http://example.org/ns#a9395> <http://example.org/ns#a9395> <http://example.org/ns#a9395> . +<http://example.org/ns#a9396> <http://example.org/ns#a9396> <http://example.org/ns#a9396> . +<http://example.org/ns#a9397> <http://example.org/ns#a9397> <http://example.org/ns#a9397> . +<http://example.org/ns#a9398> <http://example.org/ns#a9398> <http://example.org/ns#a9398> . +<http://example.org/ns#a9399> <http://example.org/ns#a9399> <http://example.org/ns#a9399> . +<http://example.org/ns#a9400> <http://example.org/ns#a9400> <http://example.org/ns#a9400> . +<http://example.org/ns#a9401> <http://example.org/ns#a9401> <http://example.org/ns#a9401> . +<http://example.org/ns#a9402> <http://example.org/ns#a9402> <http://example.org/ns#a9402> . +<http://example.org/ns#a9403> <http://example.org/ns#a9403> <http://example.org/ns#a9403> . +<http://example.org/ns#a9404> <http://example.org/ns#a9404> <http://example.org/ns#a9404> . +<http://example.org/ns#a9405> <http://example.org/ns#a9405> <http://example.org/ns#a9405> . +<http://example.org/ns#a9406> <http://example.org/ns#a9406> <http://example.org/ns#a9406> . +<http://example.org/ns#a9407> <http://example.org/ns#a9407> <http://example.org/ns#a9407> . +<http://example.org/ns#a9408> <http://example.org/ns#a9408> <http://example.org/ns#a9408> . +<http://example.org/ns#a9409> <http://example.org/ns#a9409> <http://example.org/ns#a9409> . +<http://example.org/ns#a9410> <http://example.org/ns#a9410> <http://example.org/ns#a9410> . +<http://example.org/ns#a9411> <http://example.org/ns#a9411> <http://example.org/ns#a9411> . +<http://example.org/ns#a9412> <http://example.org/ns#a9412> <http://example.org/ns#a9412> . +<http://example.org/ns#a9413> <http://example.org/ns#a9413> <http://example.org/ns#a9413> . +<http://example.org/ns#a9414> <http://example.org/ns#a9414> <http://example.org/ns#a9414> . +<http://example.org/ns#a9415> <http://example.org/ns#a9415> <http://example.org/ns#a9415> . +<http://example.org/ns#a9416> <http://example.org/ns#a9416> <http://example.org/ns#a9416> . +<http://example.org/ns#a9417> <http://example.org/ns#a9417> <http://example.org/ns#a9417> . +<http://example.org/ns#a9418> <http://example.org/ns#a9418> <http://example.org/ns#a9418> . +<http://example.org/ns#a9419> <http://example.org/ns#a9419> <http://example.org/ns#a9419> . +<http://example.org/ns#a9420> <http://example.org/ns#a9420> <http://example.org/ns#a9420> . +<http://example.org/ns#a9421> <http://example.org/ns#a9421> <http://example.org/ns#a9421> . +<http://example.org/ns#a9422> <http://example.org/ns#a9422> <http://example.org/ns#a9422> . +<http://example.org/ns#a9423> <http://example.org/ns#a9423> <http://example.org/ns#a9423> . +<http://example.org/ns#a9424> <http://example.org/ns#a9424> <http://example.org/ns#a9424> . +<http://example.org/ns#a9425> <http://example.org/ns#a9425> <http://example.org/ns#a9425> . +<http://example.org/ns#a9426> <http://example.org/ns#a9426> <http://example.org/ns#a9426> . +<http://example.org/ns#a9427> <http://example.org/ns#a9427> <http://example.org/ns#a9427> . +<http://example.org/ns#a9428> <http://example.org/ns#a9428> <http://example.org/ns#a9428> . +<http://example.org/ns#a9429> <http://example.org/ns#a9429> <http://example.org/ns#a9429> . +<http://example.org/ns#a9430> <http://example.org/ns#a9430> <http://example.org/ns#a9430> . +<http://example.org/ns#a9431> <http://example.org/ns#a9431> <http://example.org/ns#a9431> . +<http://example.org/ns#a9432> <http://example.org/ns#a9432> <http://example.org/ns#a9432> . +<http://example.org/ns#a9433> <http://example.org/ns#a9433> <http://example.org/ns#a9433> . +<http://example.org/ns#a9434> <http://example.org/ns#a9434> <http://example.org/ns#a9434> . +<http://example.org/ns#a9435> <http://example.org/ns#a9435> <http://example.org/ns#a9435> . +<http://example.org/ns#a9436> <http://example.org/ns#a9436> <http://example.org/ns#a9436> . +<http://example.org/ns#a9437> <http://example.org/ns#a9437> <http://example.org/ns#a9437> . +<http://example.org/ns#a9438> <http://example.org/ns#a9438> <http://example.org/ns#a9438> . +<http://example.org/ns#a9439> <http://example.org/ns#a9439> <http://example.org/ns#a9439> . +<http://example.org/ns#a9440> <http://example.org/ns#a9440> <http://example.org/ns#a9440> . +<http://example.org/ns#a9441> <http://example.org/ns#a9441> <http://example.org/ns#a9441> . +<http://example.org/ns#a9442> <http://example.org/ns#a9442> <http://example.org/ns#a9442> . +<http://example.org/ns#a9443> <http://example.org/ns#a9443> <http://example.org/ns#a9443> . +<http://example.org/ns#a9444> <http://example.org/ns#a9444> <http://example.org/ns#a9444> . +<http://example.org/ns#a9445> <http://example.org/ns#a9445> <http://example.org/ns#a9445> . +<http://example.org/ns#a9446> <http://example.org/ns#a9446> <http://example.org/ns#a9446> . +<http://example.org/ns#a9447> <http://example.org/ns#a9447> <http://example.org/ns#a9447> . +<http://example.org/ns#a9448> <http://example.org/ns#a9448> <http://example.org/ns#a9448> . +<http://example.org/ns#a9449> <http://example.org/ns#a9449> <http://example.org/ns#a9449> . +<http://example.org/ns#a9450> <http://example.org/ns#a9450> <http://example.org/ns#a9450> . +<http://example.org/ns#a9451> <http://example.org/ns#a9451> <http://example.org/ns#a9451> . +<http://example.org/ns#a9452> <http://example.org/ns#a9452> <http://example.org/ns#a9452> . +<http://example.org/ns#a9453> <http://example.org/ns#a9453> <http://example.org/ns#a9453> . +<http://example.org/ns#a9454> <http://example.org/ns#a9454> <http://example.org/ns#a9454> . +<http://example.org/ns#a9455> <http://example.org/ns#a9455> <http://example.org/ns#a9455> . +<http://example.org/ns#a9456> <http://example.org/ns#a9456> <http://example.org/ns#a9456> . +<http://example.org/ns#a9457> <http://example.org/ns#a9457> <http://example.org/ns#a9457> . +<http://example.org/ns#a9458> <http://example.org/ns#a9458> <http://example.org/ns#a9458> . +<http://example.org/ns#a9459> <http://example.org/ns#a9459> <http://example.org/ns#a9459> . +<http://example.org/ns#a9460> <http://example.org/ns#a9460> <http://example.org/ns#a9460> . +<http://example.org/ns#a9461> <http://example.org/ns#a9461> <http://example.org/ns#a9461> . +<http://example.org/ns#a9462> <http://example.org/ns#a9462> <http://example.org/ns#a9462> . +<http://example.org/ns#a9463> <http://example.org/ns#a9463> <http://example.org/ns#a9463> . +<http://example.org/ns#a9464> <http://example.org/ns#a9464> <http://example.org/ns#a9464> . +<http://example.org/ns#a9465> <http://example.org/ns#a9465> <http://example.org/ns#a9465> . +<http://example.org/ns#a9466> <http://example.org/ns#a9466> <http://example.org/ns#a9466> . +<http://example.org/ns#a9467> <http://example.org/ns#a9467> <http://example.org/ns#a9467> . +<http://example.org/ns#a9468> <http://example.org/ns#a9468> <http://example.org/ns#a9468> . +<http://example.org/ns#a9469> <http://example.org/ns#a9469> <http://example.org/ns#a9469> . +<http://example.org/ns#a9470> <http://example.org/ns#a9470> <http://example.org/ns#a9470> . +<http://example.org/ns#a9471> <http://example.org/ns#a9471> <http://example.org/ns#a9471> . +<http://example.org/ns#a9472> <http://example.org/ns#a9472> <http://example.org/ns#a9472> . +<http://example.org/ns#a9473> <http://example.org/ns#a9473> <http://example.org/ns#a9473> . +<http://example.org/ns#a9474> <http://example.org/ns#a9474> <http://example.org/ns#a9474> . +<http://example.org/ns#a9475> <http://example.org/ns#a9475> <http://example.org/ns#a9475> . +<http://example.org/ns#a9476> <http://example.org/ns#a9476> <http://example.org/ns#a9476> . +<http://example.org/ns#a9477> <http://example.org/ns#a9477> <http://example.org/ns#a9477> . +<http://example.org/ns#a9478> <http://example.org/ns#a9478> <http://example.org/ns#a9478> . +<http://example.org/ns#a9479> <http://example.org/ns#a9479> <http://example.org/ns#a9479> . +<http://example.org/ns#a9480> <http://example.org/ns#a9480> <http://example.org/ns#a9480> . +<http://example.org/ns#a9481> <http://example.org/ns#a9481> <http://example.org/ns#a9481> . +<http://example.org/ns#a9482> <http://example.org/ns#a9482> <http://example.org/ns#a9482> . +<http://example.org/ns#a9483> <http://example.org/ns#a9483> <http://example.org/ns#a9483> . +<http://example.org/ns#a9484> <http://example.org/ns#a9484> <http://example.org/ns#a9484> . +<http://example.org/ns#a9485> <http://example.org/ns#a9485> <http://example.org/ns#a9485> . +<http://example.org/ns#a9486> <http://example.org/ns#a9486> <http://example.org/ns#a9486> . +<http://example.org/ns#a9487> <http://example.org/ns#a9487> <http://example.org/ns#a9487> . +<http://example.org/ns#a9488> <http://example.org/ns#a9488> <http://example.org/ns#a9488> . +<http://example.org/ns#a9489> <http://example.org/ns#a9489> <http://example.org/ns#a9489> . +<http://example.org/ns#a9490> <http://example.org/ns#a9490> <http://example.org/ns#a9490> . +<http://example.org/ns#a9491> <http://example.org/ns#a9491> <http://example.org/ns#a9491> . +<http://example.org/ns#a9492> <http://example.org/ns#a9492> <http://example.org/ns#a9492> . +<http://example.org/ns#a9493> <http://example.org/ns#a9493> <http://example.org/ns#a9493> . +<http://example.org/ns#a9494> <http://example.org/ns#a9494> <http://example.org/ns#a9494> . +<http://example.org/ns#a9495> <http://example.org/ns#a9495> <http://example.org/ns#a9495> . +<http://example.org/ns#a9496> <http://example.org/ns#a9496> <http://example.org/ns#a9496> . +<http://example.org/ns#a9497> <http://example.org/ns#a9497> <http://example.org/ns#a9497> . +<http://example.org/ns#a9498> <http://example.org/ns#a9498> <http://example.org/ns#a9498> . +<http://example.org/ns#a9499> <http://example.org/ns#a9499> <http://example.org/ns#a9499> . +<http://example.org/ns#a9500> <http://example.org/ns#a9500> <http://example.org/ns#a9500> . +<http://example.org/ns#a9501> <http://example.org/ns#a9501> <http://example.org/ns#a9501> . +<http://example.org/ns#a9502> <http://example.org/ns#a9502> <http://example.org/ns#a9502> . +<http://example.org/ns#a9503> <http://example.org/ns#a9503> <http://example.org/ns#a9503> . +<http://example.org/ns#a9504> <http://example.org/ns#a9504> <http://example.org/ns#a9504> . +<http://example.org/ns#a9505> <http://example.org/ns#a9505> <http://example.org/ns#a9505> . +<http://example.org/ns#a9506> <http://example.org/ns#a9506> <http://example.org/ns#a9506> . +<http://example.org/ns#a9507> <http://example.org/ns#a9507> <http://example.org/ns#a9507> . +<http://example.org/ns#a9508> <http://example.org/ns#a9508> <http://example.org/ns#a9508> . +<http://example.org/ns#a9509> <http://example.org/ns#a9509> <http://example.org/ns#a9509> . +<http://example.org/ns#a9510> <http://example.org/ns#a9510> <http://example.org/ns#a9510> . +<http://example.org/ns#a9511> <http://example.org/ns#a9511> <http://example.org/ns#a9511> . +<http://example.org/ns#a9512> <http://example.org/ns#a9512> <http://example.org/ns#a9512> . +<http://example.org/ns#a9513> <http://example.org/ns#a9513> <http://example.org/ns#a9513> . +<http://example.org/ns#a9514> <http://example.org/ns#a9514> <http://example.org/ns#a9514> . +<http://example.org/ns#a9515> <http://example.org/ns#a9515> <http://example.org/ns#a9515> . +<http://example.org/ns#a9516> <http://example.org/ns#a9516> <http://example.org/ns#a9516> . +<http://example.org/ns#a9517> <http://example.org/ns#a9517> <http://example.org/ns#a9517> . +<http://example.org/ns#a9518> <http://example.org/ns#a9518> <http://example.org/ns#a9518> . +<http://example.org/ns#a9519> <http://example.org/ns#a9519> <http://example.org/ns#a9519> . +<http://example.org/ns#a9520> <http://example.org/ns#a9520> <http://example.org/ns#a9520> . +<http://example.org/ns#a9521> <http://example.org/ns#a9521> <http://example.org/ns#a9521> . +<http://example.org/ns#a9522> <http://example.org/ns#a9522> <http://example.org/ns#a9522> . +<http://example.org/ns#a9523> <http://example.org/ns#a9523> <http://example.org/ns#a9523> . +<http://example.org/ns#a9524> <http://example.org/ns#a9524> <http://example.org/ns#a9524> . +<http://example.org/ns#a9525> <http://example.org/ns#a9525> <http://example.org/ns#a9525> . +<http://example.org/ns#a9526> <http://example.org/ns#a9526> <http://example.org/ns#a9526> . +<http://example.org/ns#a9527> <http://example.org/ns#a9527> <http://example.org/ns#a9527> . +<http://example.org/ns#a9528> <http://example.org/ns#a9528> <http://example.org/ns#a9528> . +<http://example.org/ns#a9529> <http://example.org/ns#a9529> <http://example.org/ns#a9529> . +<http://example.org/ns#a9530> <http://example.org/ns#a9530> <http://example.org/ns#a9530> . +<http://example.org/ns#a9531> <http://example.org/ns#a9531> <http://example.org/ns#a9531> . +<http://example.org/ns#a9532> <http://example.org/ns#a9532> <http://example.org/ns#a9532> . +<http://example.org/ns#a9533> <http://example.org/ns#a9533> <http://example.org/ns#a9533> . +<http://example.org/ns#a9534> <http://example.org/ns#a9534> <http://example.org/ns#a9534> . +<http://example.org/ns#a9535> <http://example.org/ns#a9535> <http://example.org/ns#a9535> . +<http://example.org/ns#a9536> <http://example.org/ns#a9536> <http://example.org/ns#a9536> . +<http://example.org/ns#a9537> <http://example.org/ns#a9537> <http://example.org/ns#a9537> . +<http://example.org/ns#a9538> <http://example.org/ns#a9538> <http://example.org/ns#a9538> . +<http://example.org/ns#a9539> <http://example.org/ns#a9539> <http://example.org/ns#a9539> . +<http://example.org/ns#a9540> <http://example.org/ns#a9540> <http://example.org/ns#a9540> . +<http://example.org/ns#a9541> <http://example.org/ns#a9541> <http://example.org/ns#a9541> . +<http://example.org/ns#a9542> <http://example.org/ns#a9542> <http://example.org/ns#a9542> . +<http://example.org/ns#a9543> <http://example.org/ns#a9543> <http://example.org/ns#a9543> . +<http://example.org/ns#a9544> <http://example.org/ns#a9544> <http://example.org/ns#a9544> . +<http://example.org/ns#a9545> <http://example.org/ns#a9545> <http://example.org/ns#a9545> . +<http://example.org/ns#a9546> <http://example.org/ns#a9546> <http://example.org/ns#a9546> . +<http://example.org/ns#a9547> <http://example.org/ns#a9547> <http://example.org/ns#a9547> . +<http://example.org/ns#a9548> <http://example.org/ns#a9548> <http://example.org/ns#a9548> . +<http://example.org/ns#a9549> <http://example.org/ns#a9549> <http://example.org/ns#a9549> . +<http://example.org/ns#a9550> <http://example.org/ns#a9550> <http://example.org/ns#a9550> . +<http://example.org/ns#a9551> <http://example.org/ns#a9551> <http://example.org/ns#a9551> . +<http://example.org/ns#a9552> <http://example.org/ns#a9552> <http://example.org/ns#a9552> . +<http://example.org/ns#a9553> <http://example.org/ns#a9553> <http://example.org/ns#a9553> . +<http://example.org/ns#a9554> <http://example.org/ns#a9554> <http://example.org/ns#a9554> . +<http://example.org/ns#a9555> <http://example.org/ns#a9555> <http://example.org/ns#a9555> . +<http://example.org/ns#a9556> <http://example.org/ns#a9556> <http://example.org/ns#a9556> . +<http://example.org/ns#a9557> <http://example.org/ns#a9557> <http://example.org/ns#a9557> . +<http://example.org/ns#a9558> <http://example.org/ns#a9558> <http://example.org/ns#a9558> . +<http://example.org/ns#a9559> <http://example.org/ns#a9559> <http://example.org/ns#a9559> . +<http://example.org/ns#a9560> <http://example.org/ns#a9560> <http://example.org/ns#a9560> . +<http://example.org/ns#a9561> <http://example.org/ns#a9561> <http://example.org/ns#a9561> . +<http://example.org/ns#a9562> <http://example.org/ns#a9562> <http://example.org/ns#a9562> . +<http://example.org/ns#a9563> <http://example.org/ns#a9563> <http://example.org/ns#a9563> . +<http://example.org/ns#a9564> <http://example.org/ns#a9564> <http://example.org/ns#a9564> . +<http://example.org/ns#a9565> <http://example.org/ns#a9565> <http://example.org/ns#a9565> . +<http://example.org/ns#a9566> <http://example.org/ns#a9566> <http://example.org/ns#a9566> . +<http://example.org/ns#a9567> <http://example.org/ns#a9567> <http://example.org/ns#a9567> . +<http://example.org/ns#a9568> <http://example.org/ns#a9568> <http://example.org/ns#a9568> . +<http://example.org/ns#a9569> <http://example.org/ns#a9569> <http://example.org/ns#a9569> . +<http://example.org/ns#a9570> <http://example.org/ns#a9570> <http://example.org/ns#a9570> . +<http://example.org/ns#a9571> <http://example.org/ns#a9571> <http://example.org/ns#a9571> . +<http://example.org/ns#a9572> <http://example.org/ns#a9572> <http://example.org/ns#a9572> . +<http://example.org/ns#a9573> <http://example.org/ns#a9573> <http://example.org/ns#a9573> . +<http://example.org/ns#a9574> <http://example.org/ns#a9574> <http://example.org/ns#a9574> . +<http://example.org/ns#a9575> <http://example.org/ns#a9575> <http://example.org/ns#a9575> . +<http://example.org/ns#a9576> <http://example.org/ns#a9576> <http://example.org/ns#a9576> . +<http://example.org/ns#a9577> <http://example.org/ns#a9577> <http://example.org/ns#a9577> . +<http://example.org/ns#a9578> <http://example.org/ns#a9578> <http://example.org/ns#a9578> . +<http://example.org/ns#a9579> <http://example.org/ns#a9579> <http://example.org/ns#a9579> . +<http://example.org/ns#a9580> <http://example.org/ns#a9580> <http://example.org/ns#a9580> . +<http://example.org/ns#a9581> <http://example.org/ns#a9581> <http://example.org/ns#a9581> . +<http://example.org/ns#a9582> <http://example.org/ns#a9582> <http://example.org/ns#a9582> . +<http://example.org/ns#a9583> <http://example.org/ns#a9583> <http://example.org/ns#a9583> . +<http://example.org/ns#a9584> <http://example.org/ns#a9584> <http://example.org/ns#a9584> . +<http://example.org/ns#a9585> <http://example.org/ns#a9585> <http://example.org/ns#a9585> . +<http://example.org/ns#a9586> <http://example.org/ns#a9586> <http://example.org/ns#a9586> . +<http://example.org/ns#a9587> <http://example.org/ns#a9587> <http://example.org/ns#a9587> . +<http://example.org/ns#a9588> <http://example.org/ns#a9588> <http://example.org/ns#a9588> . +<http://example.org/ns#a9589> <http://example.org/ns#a9589> <http://example.org/ns#a9589> . +<http://example.org/ns#a9590> <http://example.org/ns#a9590> <http://example.org/ns#a9590> . +<http://example.org/ns#a9591> <http://example.org/ns#a9591> <http://example.org/ns#a9591> . +<http://example.org/ns#a9592> <http://example.org/ns#a9592> <http://example.org/ns#a9592> . +<http://example.org/ns#a9593> <http://example.org/ns#a9593> <http://example.org/ns#a9593> . +<http://example.org/ns#a9594> <http://example.org/ns#a9594> <http://example.org/ns#a9594> . +<http://example.org/ns#a9595> <http://example.org/ns#a9595> <http://example.org/ns#a9595> . +<http://example.org/ns#a9596> <http://example.org/ns#a9596> <http://example.org/ns#a9596> . +<http://example.org/ns#a9597> <http://example.org/ns#a9597> <http://example.org/ns#a9597> . +<http://example.org/ns#a9598> <http://example.org/ns#a9598> <http://example.org/ns#a9598> . +<http://example.org/ns#a9599> <http://example.org/ns#a9599> <http://example.org/ns#a9599> . +<http://example.org/ns#a9600> <http://example.org/ns#a9600> <http://example.org/ns#a9600> . +<http://example.org/ns#a9601> <http://example.org/ns#a9601> <http://example.org/ns#a9601> . +<http://example.org/ns#a9602> <http://example.org/ns#a9602> <http://example.org/ns#a9602> . +<http://example.org/ns#a9603> <http://example.org/ns#a9603> <http://example.org/ns#a9603> . +<http://example.org/ns#a9604> <http://example.org/ns#a9604> <http://example.org/ns#a9604> . +<http://example.org/ns#a9605> <http://example.org/ns#a9605> <http://example.org/ns#a9605> . +<http://example.org/ns#a9606> <http://example.org/ns#a9606> <http://example.org/ns#a9606> . +<http://example.org/ns#a9607> <http://example.org/ns#a9607> <http://example.org/ns#a9607> . +<http://example.org/ns#a9608> <http://example.org/ns#a9608> <http://example.org/ns#a9608> . +<http://example.org/ns#a9609> <http://example.org/ns#a9609> <http://example.org/ns#a9609> . +<http://example.org/ns#a9610> <http://example.org/ns#a9610> <http://example.org/ns#a9610> . +<http://example.org/ns#a9611> <http://example.org/ns#a9611> <http://example.org/ns#a9611> . +<http://example.org/ns#a9612> <http://example.org/ns#a9612> <http://example.org/ns#a9612> . +<http://example.org/ns#a9613> <http://example.org/ns#a9613> <http://example.org/ns#a9613> . +<http://example.org/ns#a9614> <http://example.org/ns#a9614> <http://example.org/ns#a9614> . +<http://example.org/ns#a9615> <http://example.org/ns#a9615> <http://example.org/ns#a9615> . +<http://example.org/ns#a9616> <http://example.org/ns#a9616> <http://example.org/ns#a9616> . +<http://example.org/ns#a9617> <http://example.org/ns#a9617> <http://example.org/ns#a9617> . +<http://example.org/ns#a9618> <http://example.org/ns#a9618> <http://example.org/ns#a9618> . +<http://example.org/ns#a9619> <http://example.org/ns#a9619> <http://example.org/ns#a9619> . +<http://example.org/ns#a9620> <http://example.org/ns#a9620> <http://example.org/ns#a9620> . +<http://example.org/ns#a9621> <http://example.org/ns#a9621> <http://example.org/ns#a9621> . +<http://example.org/ns#a9622> <http://example.org/ns#a9622> <http://example.org/ns#a9622> . +<http://example.org/ns#a9623> <http://example.org/ns#a9623> <http://example.org/ns#a9623> . +<http://example.org/ns#a9624> <http://example.org/ns#a9624> <http://example.org/ns#a9624> . +<http://example.org/ns#a9625> <http://example.org/ns#a9625> <http://example.org/ns#a9625> . +<http://example.org/ns#a9626> <http://example.org/ns#a9626> <http://example.org/ns#a9626> . +<http://example.org/ns#a9627> <http://example.org/ns#a9627> <http://example.org/ns#a9627> . +<http://example.org/ns#a9628> <http://example.org/ns#a9628> <http://example.org/ns#a9628> . +<http://example.org/ns#a9629> <http://example.org/ns#a9629> <http://example.org/ns#a9629> . +<http://example.org/ns#a9630> <http://example.org/ns#a9630> <http://example.org/ns#a9630> . +<http://example.org/ns#a9631> <http://example.org/ns#a9631> <http://example.org/ns#a9631> . +<http://example.org/ns#a9632> <http://example.org/ns#a9632> <http://example.org/ns#a9632> . +<http://example.org/ns#a9633> <http://example.org/ns#a9633> <http://example.org/ns#a9633> . +<http://example.org/ns#a9634> <http://example.org/ns#a9634> <http://example.org/ns#a9634> . +<http://example.org/ns#a9635> <http://example.org/ns#a9635> <http://example.org/ns#a9635> . +<http://example.org/ns#a9636> <http://example.org/ns#a9636> <http://example.org/ns#a9636> . +<http://example.org/ns#a9637> <http://example.org/ns#a9637> <http://example.org/ns#a9637> . +<http://example.org/ns#a9638> <http://example.org/ns#a9638> <http://example.org/ns#a9638> . +<http://example.org/ns#a9639> <http://example.org/ns#a9639> <http://example.org/ns#a9639> . +<http://example.org/ns#a9640> <http://example.org/ns#a9640> <http://example.org/ns#a9640> . +<http://example.org/ns#a9641> <http://example.org/ns#a9641> <http://example.org/ns#a9641> . +<http://example.org/ns#a9642> <http://example.org/ns#a9642> <http://example.org/ns#a9642> . +<http://example.org/ns#a9643> <http://example.org/ns#a9643> <http://example.org/ns#a9643> . +<http://example.org/ns#a9644> <http://example.org/ns#a9644> <http://example.org/ns#a9644> . +<http://example.org/ns#a9645> <http://example.org/ns#a9645> <http://example.org/ns#a9645> . +<http://example.org/ns#a9646> <http://example.org/ns#a9646> <http://example.org/ns#a9646> . +<http://example.org/ns#a9647> <http://example.org/ns#a9647> <http://example.org/ns#a9647> . +<http://example.org/ns#a9648> <http://example.org/ns#a9648> <http://example.org/ns#a9648> . +<http://example.org/ns#a9649> <http://example.org/ns#a9649> <http://example.org/ns#a9649> . +<http://example.org/ns#a9650> <http://example.org/ns#a9650> <http://example.org/ns#a9650> . +<http://example.org/ns#a9651> <http://example.org/ns#a9651> <http://example.org/ns#a9651> . +<http://example.org/ns#a9652> <http://example.org/ns#a9652> <http://example.org/ns#a9652> . +<http://example.org/ns#a9653> <http://example.org/ns#a9653> <http://example.org/ns#a9653> . +<http://example.org/ns#a9654> <http://example.org/ns#a9654> <http://example.org/ns#a9654> . +<http://example.org/ns#a9655> <http://example.org/ns#a9655> <http://example.org/ns#a9655> . +<http://example.org/ns#a9656> <http://example.org/ns#a9656> <http://example.org/ns#a9656> . +<http://example.org/ns#a9657> <http://example.org/ns#a9657> <http://example.org/ns#a9657> . +<http://example.org/ns#a9658> <http://example.org/ns#a9658> <http://example.org/ns#a9658> . +<http://example.org/ns#a9659> <http://example.org/ns#a9659> <http://example.org/ns#a9659> . +<http://example.org/ns#a9660> <http://example.org/ns#a9660> <http://example.org/ns#a9660> . +<http://example.org/ns#a9661> <http://example.org/ns#a9661> <http://example.org/ns#a9661> . +<http://example.org/ns#a9662> <http://example.org/ns#a9662> <http://example.org/ns#a9662> . +<http://example.org/ns#a9663> <http://example.org/ns#a9663> <http://example.org/ns#a9663> . +<http://example.org/ns#a9664> <http://example.org/ns#a9664> <http://example.org/ns#a9664> . +<http://example.org/ns#a9665> <http://example.org/ns#a9665> <http://example.org/ns#a9665> . +<http://example.org/ns#a9666> <http://example.org/ns#a9666> <http://example.org/ns#a9666> . +<http://example.org/ns#a9667> <http://example.org/ns#a9667> <http://example.org/ns#a9667> . +<http://example.org/ns#a9668> <http://example.org/ns#a9668> <http://example.org/ns#a9668> . +<http://example.org/ns#a9669> <http://example.org/ns#a9669> <http://example.org/ns#a9669> . +<http://example.org/ns#a9670> <http://example.org/ns#a9670> <http://example.org/ns#a9670> . +<http://example.org/ns#a9671> <http://example.org/ns#a9671> <http://example.org/ns#a9671> . +<http://example.org/ns#a9672> <http://example.org/ns#a9672> <http://example.org/ns#a9672> . +<http://example.org/ns#a9673> <http://example.org/ns#a9673> <http://example.org/ns#a9673> . +<http://example.org/ns#a9674> <http://example.org/ns#a9674> <http://example.org/ns#a9674> . +<http://example.org/ns#a9675> <http://example.org/ns#a9675> <http://example.org/ns#a9675> . +<http://example.org/ns#a9676> <http://example.org/ns#a9676> <http://example.org/ns#a9676> . +<http://example.org/ns#a9677> <http://example.org/ns#a9677> <http://example.org/ns#a9677> . +<http://example.org/ns#a9678> <http://example.org/ns#a9678> <http://example.org/ns#a9678> . +<http://example.org/ns#a9679> <http://example.org/ns#a9679> <http://example.org/ns#a9679> . +<http://example.org/ns#a9680> <http://example.org/ns#a9680> <http://example.org/ns#a9680> . +<http://example.org/ns#a9681> <http://example.org/ns#a9681> <http://example.org/ns#a9681> . +<http://example.org/ns#a9682> <http://example.org/ns#a9682> <http://example.org/ns#a9682> . +<http://example.org/ns#a9683> <http://example.org/ns#a9683> <http://example.org/ns#a9683> . +<http://example.org/ns#a9684> <http://example.org/ns#a9684> <http://example.org/ns#a9684> . +<http://example.org/ns#a9685> <http://example.org/ns#a9685> <http://example.org/ns#a9685> . +<http://example.org/ns#a9686> <http://example.org/ns#a9686> <http://example.org/ns#a9686> . +<http://example.org/ns#a9687> <http://example.org/ns#a9687> <http://example.org/ns#a9687> . +<http://example.org/ns#a9688> <http://example.org/ns#a9688> <http://example.org/ns#a9688> . +<http://example.org/ns#a9689> <http://example.org/ns#a9689> <http://example.org/ns#a9689> . +<http://example.org/ns#a9690> <http://example.org/ns#a9690> <http://example.org/ns#a9690> . +<http://example.org/ns#a9691> <http://example.org/ns#a9691> <http://example.org/ns#a9691> . +<http://example.org/ns#a9692> <http://example.org/ns#a9692> <http://example.org/ns#a9692> . +<http://example.org/ns#a9693> <http://example.org/ns#a9693> <http://example.org/ns#a9693> . +<http://example.org/ns#a9694> <http://example.org/ns#a9694> <http://example.org/ns#a9694> . +<http://example.org/ns#a9695> <http://example.org/ns#a9695> <http://example.org/ns#a9695> . +<http://example.org/ns#a9696> <http://example.org/ns#a9696> <http://example.org/ns#a9696> . +<http://example.org/ns#a9697> <http://example.org/ns#a9697> <http://example.org/ns#a9697> . +<http://example.org/ns#a9698> <http://example.org/ns#a9698> <http://example.org/ns#a9698> . +<http://example.org/ns#a9699> <http://example.org/ns#a9699> <http://example.org/ns#a9699> . +<http://example.org/ns#a9700> <http://example.org/ns#a9700> <http://example.org/ns#a9700> . +<http://example.org/ns#a9701> <http://example.org/ns#a9701> <http://example.org/ns#a9701> . +<http://example.org/ns#a9702> <http://example.org/ns#a9702> <http://example.org/ns#a9702> . +<http://example.org/ns#a9703> <http://example.org/ns#a9703> <http://example.org/ns#a9703> . +<http://example.org/ns#a9704> <http://example.org/ns#a9704> <http://example.org/ns#a9704> . +<http://example.org/ns#a9705> <http://example.org/ns#a9705> <http://example.org/ns#a9705> . +<http://example.org/ns#a9706> <http://example.org/ns#a9706> <http://example.org/ns#a9706> . +<http://example.org/ns#a9707> <http://example.org/ns#a9707> <http://example.org/ns#a9707> . +<http://example.org/ns#a9708> <http://example.org/ns#a9708> <http://example.org/ns#a9708> . +<http://example.org/ns#a9709> <http://example.org/ns#a9709> <http://example.org/ns#a9709> . +<http://example.org/ns#a9710> <http://example.org/ns#a9710> <http://example.org/ns#a9710> . +<http://example.org/ns#a9711> <http://example.org/ns#a9711> <http://example.org/ns#a9711> . +<http://example.org/ns#a9712> <http://example.org/ns#a9712> <http://example.org/ns#a9712> . +<http://example.org/ns#a9713> <http://example.org/ns#a9713> <http://example.org/ns#a9713> . +<http://example.org/ns#a9714> <http://example.org/ns#a9714> <http://example.org/ns#a9714> . +<http://example.org/ns#a9715> <http://example.org/ns#a9715> <http://example.org/ns#a9715> . +<http://example.org/ns#a9716> <http://example.org/ns#a9716> <http://example.org/ns#a9716> . +<http://example.org/ns#a9717> <http://example.org/ns#a9717> <http://example.org/ns#a9717> . +<http://example.org/ns#a9718> <http://example.org/ns#a9718> <http://example.org/ns#a9718> . +<http://example.org/ns#a9719> <http://example.org/ns#a9719> <http://example.org/ns#a9719> . +<http://example.org/ns#a9720> <http://example.org/ns#a9720> <http://example.org/ns#a9720> . +<http://example.org/ns#a9721> <http://example.org/ns#a9721> <http://example.org/ns#a9721> . +<http://example.org/ns#a9722> <http://example.org/ns#a9722> <http://example.org/ns#a9722> . +<http://example.org/ns#a9723> <http://example.org/ns#a9723> <http://example.org/ns#a9723> . +<http://example.org/ns#a9724> <http://example.org/ns#a9724> <http://example.org/ns#a9724> . +<http://example.org/ns#a9725> <http://example.org/ns#a9725> <http://example.org/ns#a9725> . +<http://example.org/ns#a9726> <http://example.org/ns#a9726> <http://example.org/ns#a9726> . +<http://example.org/ns#a9727> <http://example.org/ns#a9727> <http://example.org/ns#a9727> . +<http://example.org/ns#a9728> <http://example.org/ns#a9728> <http://example.org/ns#a9728> . +<http://example.org/ns#a9729> <http://example.org/ns#a9729> <http://example.org/ns#a9729> . +<http://example.org/ns#a9730> <http://example.org/ns#a9730> <http://example.org/ns#a9730> . +<http://example.org/ns#a9731> <http://example.org/ns#a9731> <http://example.org/ns#a9731> . +<http://example.org/ns#a9732> <http://example.org/ns#a9732> <http://example.org/ns#a9732> . +<http://example.org/ns#a9733> <http://example.org/ns#a9733> <http://example.org/ns#a9733> . +<http://example.org/ns#a9734> <http://example.org/ns#a9734> <http://example.org/ns#a9734> . +<http://example.org/ns#a9735> <http://example.org/ns#a9735> <http://example.org/ns#a9735> . +<http://example.org/ns#a9736> <http://example.org/ns#a9736> <http://example.org/ns#a9736> . +<http://example.org/ns#a9737> <http://example.org/ns#a9737> <http://example.org/ns#a9737> . +<http://example.org/ns#a9738> <http://example.org/ns#a9738> <http://example.org/ns#a9738> . +<http://example.org/ns#a9739> <http://example.org/ns#a9739> <http://example.org/ns#a9739> . +<http://example.org/ns#a9740> <http://example.org/ns#a9740> <http://example.org/ns#a9740> . +<http://example.org/ns#a9741> <http://example.org/ns#a9741> <http://example.org/ns#a9741> . +<http://example.org/ns#a9742> <http://example.org/ns#a9742> <http://example.org/ns#a9742> . +<http://example.org/ns#a9743> <http://example.org/ns#a9743> <http://example.org/ns#a9743> . +<http://example.org/ns#a9744> <http://example.org/ns#a9744> <http://example.org/ns#a9744> . +<http://example.org/ns#a9745> <http://example.org/ns#a9745> <http://example.org/ns#a9745> . +<http://example.org/ns#a9746> <http://example.org/ns#a9746> <http://example.org/ns#a9746> . +<http://example.org/ns#a9747> <http://example.org/ns#a9747> <http://example.org/ns#a9747> . +<http://example.org/ns#a9748> <http://example.org/ns#a9748> <http://example.org/ns#a9748> . +<http://example.org/ns#a9749> <http://example.org/ns#a9749> <http://example.org/ns#a9749> . +<http://example.org/ns#a9750> <http://example.org/ns#a9750> <http://example.org/ns#a9750> . +<http://example.org/ns#a9751> <http://example.org/ns#a9751> <http://example.org/ns#a9751> . +<http://example.org/ns#a9752> <http://example.org/ns#a9752> <http://example.org/ns#a9752> . +<http://example.org/ns#a9753> <http://example.org/ns#a9753> <http://example.org/ns#a9753> . +<http://example.org/ns#a9754> <http://example.org/ns#a9754> <http://example.org/ns#a9754> . +<http://example.org/ns#a9755> <http://example.org/ns#a9755> <http://example.org/ns#a9755> . +<http://example.org/ns#a9756> <http://example.org/ns#a9756> <http://example.org/ns#a9756> . +<http://example.org/ns#a9757> <http://example.org/ns#a9757> <http://example.org/ns#a9757> . +<http://example.org/ns#a9758> <http://example.org/ns#a9758> <http://example.org/ns#a9758> . +<http://example.org/ns#a9759> <http://example.org/ns#a9759> <http://example.org/ns#a9759> . +<http://example.org/ns#a9760> <http://example.org/ns#a9760> <http://example.org/ns#a9760> . +<http://example.org/ns#a9761> <http://example.org/ns#a9761> <http://example.org/ns#a9761> . +<http://example.org/ns#a9762> <http://example.org/ns#a9762> <http://example.org/ns#a9762> . +<http://example.org/ns#a9763> <http://example.org/ns#a9763> <http://example.org/ns#a9763> . +<http://example.org/ns#a9764> <http://example.org/ns#a9764> <http://example.org/ns#a9764> . +<http://example.org/ns#a9765> <http://example.org/ns#a9765> <http://example.org/ns#a9765> . +<http://example.org/ns#a9766> <http://example.org/ns#a9766> <http://example.org/ns#a9766> . +<http://example.org/ns#a9767> <http://example.org/ns#a9767> <http://example.org/ns#a9767> . +<http://example.org/ns#a9768> <http://example.org/ns#a9768> <http://example.org/ns#a9768> . +<http://example.org/ns#a9769> <http://example.org/ns#a9769> <http://example.org/ns#a9769> . +<http://example.org/ns#a9770> <http://example.org/ns#a9770> <http://example.org/ns#a9770> . +<http://example.org/ns#a9771> <http://example.org/ns#a9771> <http://example.org/ns#a9771> . +<http://example.org/ns#a9772> <http://example.org/ns#a9772> <http://example.org/ns#a9772> . +<http://example.org/ns#a9773> <http://example.org/ns#a9773> <http://example.org/ns#a9773> . +<http://example.org/ns#a9774> <http://example.org/ns#a9774> <http://example.org/ns#a9774> . +<http://example.org/ns#a9775> <http://example.org/ns#a9775> <http://example.org/ns#a9775> . +<http://example.org/ns#a9776> <http://example.org/ns#a9776> <http://example.org/ns#a9776> . +<http://example.org/ns#a9777> <http://example.org/ns#a9777> <http://example.org/ns#a9777> . +<http://example.org/ns#a9778> <http://example.org/ns#a9778> <http://example.org/ns#a9778> . +<http://example.org/ns#a9779> <http://example.org/ns#a9779> <http://example.org/ns#a9779> . +<http://example.org/ns#a9780> <http://example.org/ns#a9780> <http://example.org/ns#a9780> . +<http://example.org/ns#a9781> <http://example.org/ns#a9781> <http://example.org/ns#a9781> . +<http://example.org/ns#a9782> <http://example.org/ns#a9782> <http://example.org/ns#a9782> . +<http://example.org/ns#a9783> <http://example.org/ns#a9783> <http://example.org/ns#a9783> . +<http://example.org/ns#a9784> <http://example.org/ns#a9784> <http://example.org/ns#a9784> . +<http://example.org/ns#a9785> <http://example.org/ns#a9785> <http://example.org/ns#a9785> . +<http://example.org/ns#a9786> <http://example.org/ns#a9786> <http://example.org/ns#a9786> . +<http://example.org/ns#a9787> <http://example.org/ns#a9787> <http://example.org/ns#a9787> . +<http://example.org/ns#a9788> <http://example.org/ns#a9788> <http://example.org/ns#a9788> . +<http://example.org/ns#a9789> <http://example.org/ns#a9789> <http://example.org/ns#a9789> . +<http://example.org/ns#a9790> <http://example.org/ns#a9790> <http://example.org/ns#a9790> . +<http://example.org/ns#a9791> <http://example.org/ns#a9791> <http://example.org/ns#a9791> . +<http://example.org/ns#a9792> <http://example.org/ns#a9792> <http://example.org/ns#a9792> . +<http://example.org/ns#a9793> <http://example.org/ns#a9793> <http://example.org/ns#a9793> . +<http://example.org/ns#a9794> <http://example.org/ns#a9794> <http://example.org/ns#a9794> . +<http://example.org/ns#a9795> <http://example.org/ns#a9795> <http://example.org/ns#a9795> . +<http://example.org/ns#a9796> <http://example.org/ns#a9796> <http://example.org/ns#a9796> . +<http://example.org/ns#a9797> <http://example.org/ns#a9797> <http://example.org/ns#a9797> . +<http://example.org/ns#a9798> <http://example.org/ns#a9798> <http://example.org/ns#a9798> . +<http://example.org/ns#a9799> <http://example.org/ns#a9799> <http://example.org/ns#a9799> . +<http://example.org/ns#a9800> <http://example.org/ns#a9800> <http://example.org/ns#a9800> . +<http://example.org/ns#a9801> <http://example.org/ns#a9801> <http://example.org/ns#a9801> . +<http://example.org/ns#a9802> <http://example.org/ns#a9802> <http://example.org/ns#a9802> . +<http://example.org/ns#a9803> <http://example.org/ns#a9803> <http://example.org/ns#a9803> . +<http://example.org/ns#a9804> <http://example.org/ns#a9804> <http://example.org/ns#a9804> . +<http://example.org/ns#a9805> <http://example.org/ns#a9805> <http://example.org/ns#a9805> . +<http://example.org/ns#a9806> <http://example.org/ns#a9806> <http://example.org/ns#a9806> . +<http://example.org/ns#a9807> <http://example.org/ns#a9807> <http://example.org/ns#a9807> . +<http://example.org/ns#a9808> <http://example.org/ns#a9808> <http://example.org/ns#a9808> . +<http://example.org/ns#a9809> <http://example.org/ns#a9809> <http://example.org/ns#a9809> . +<http://example.org/ns#a9810> <http://example.org/ns#a9810> <http://example.org/ns#a9810> . +<http://example.org/ns#a9811> <http://example.org/ns#a9811> <http://example.org/ns#a9811> . +<http://example.org/ns#a9812> <http://example.org/ns#a9812> <http://example.org/ns#a9812> . +<http://example.org/ns#a9813> <http://example.org/ns#a9813> <http://example.org/ns#a9813> . +<http://example.org/ns#a9814> <http://example.org/ns#a9814> <http://example.org/ns#a9814> . +<http://example.org/ns#a9815> <http://example.org/ns#a9815> <http://example.org/ns#a9815> . +<http://example.org/ns#a9816> <http://example.org/ns#a9816> <http://example.org/ns#a9816> . +<http://example.org/ns#a9817> <http://example.org/ns#a9817> <http://example.org/ns#a9817> . +<http://example.org/ns#a9818> <http://example.org/ns#a9818> <http://example.org/ns#a9818> . +<http://example.org/ns#a9819> <http://example.org/ns#a9819> <http://example.org/ns#a9819> . +<http://example.org/ns#a9820> <http://example.org/ns#a9820> <http://example.org/ns#a9820> . +<http://example.org/ns#a9821> <http://example.org/ns#a9821> <http://example.org/ns#a9821> . +<http://example.org/ns#a9822> <http://example.org/ns#a9822> <http://example.org/ns#a9822> . +<http://example.org/ns#a9823> <http://example.org/ns#a9823> <http://example.org/ns#a9823> . +<http://example.org/ns#a9824> <http://example.org/ns#a9824> <http://example.org/ns#a9824> . +<http://example.org/ns#a9825> <http://example.org/ns#a9825> <http://example.org/ns#a9825> . +<http://example.org/ns#a9826> <http://example.org/ns#a9826> <http://example.org/ns#a9826> . +<http://example.org/ns#a9827> <http://example.org/ns#a9827> <http://example.org/ns#a9827> . +<http://example.org/ns#a9828> <http://example.org/ns#a9828> <http://example.org/ns#a9828> . +<http://example.org/ns#a9829> <http://example.org/ns#a9829> <http://example.org/ns#a9829> . +<http://example.org/ns#a9830> <http://example.org/ns#a9830> <http://example.org/ns#a9830> . +<http://example.org/ns#a9831> <http://example.org/ns#a9831> <http://example.org/ns#a9831> . +<http://example.org/ns#a9832> <http://example.org/ns#a9832> <http://example.org/ns#a9832> . +<http://example.org/ns#a9833> <http://example.org/ns#a9833> <http://example.org/ns#a9833> . +<http://example.org/ns#a9834> <http://example.org/ns#a9834> <http://example.org/ns#a9834> . +<http://example.org/ns#a9835> <http://example.org/ns#a9835> <http://example.org/ns#a9835> . +<http://example.org/ns#a9836> <http://example.org/ns#a9836> <http://example.org/ns#a9836> . +<http://example.org/ns#a9837> <http://example.org/ns#a9837> <http://example.org/ns#a9837> . +<http://example.org/ns#a9838> <http://example.org/ns#a9838> <http://example.org/ns#a9838> . +<http://example.org/ns#a9839> <http://example.org/ns#a9839> <http://example.org/ns#a9839> . +<http://example.org/ns#a9840> <http://example.org/ns#a9840> <http://example.org/ns#a9840> . +<http://example.org/ns#a9841> <http://example.org/ns#a9841> <http://example.org/ns#a9841> . +<http://example.org/ns#a9842> <http://example.org/ns#a9842> <http://example.org/ns#a9842> . +<http://example.org/ns#a9843> <http://example.org/ns#a9843> <http://example.org/ns#a9843> . +<http://example.org/ns#a9844> <http://example.org/ns#a9844> <http://example.org/ns#a9844> . +<http://example.org/ns#a9845> <http://example.org/ns#a9845> <http://example.org/ns#a9845> . +<http://example.org/ns#a9846> <http://example.org/ns#a9846> <http://example.org/ns#a9846> . +<http://example.org/ns#a9847> <http://example.org/ns#a9847> <http://example.org/ns#a9847> . +<http://example.org/ns#a9848> <http://example.org/ns#a9848> <http://example.org/ns#a9848> . +<http://example.org/ns#a9849> <http://example.org/ns#a9849> <http://example.org/ns#a9849> . +<http://example.org/ns#a9850> <http://example.org/ns#a9850> <http://example.org/ns#a9850> . +<http://example.org/ns#a9851> <http://example.org/ns#a9851> <http://example.org/ns#a9851> . +<http://example.org/ns#a9852> <http://example.org/ns#a9852> <http://example.org/ns#a9852> . +<http://example.org/ns#a9853> <http://example.org/ns#a9853> <http://example.org/ns#a9853> . +<http://example.org/ns#a9854> <http://example.org/ns#a9854> <http://example.org/ns#a9854> . +<http://example.org/ns#a9855> <http://example.org/ns#a9855> <http://example.org/ns#a9855> . +<http://example.org/ns#a9856> <http://example.org/ns#a9856> <http://example.org/ns#a9856> . +<http://example.org/ns#a9857> <http://example.org/ns#a9857> <http://example.org/ns#a9857> . +<http://example.org/ns#a9858> <http://example.org/ns#a9858> <http://example.org/ns#a9858> . +<http://example.org/ns#a9859> <http://example.org/ns#a9859> <http://example.org/ns#a9859> . +<http://example.org/ns#a9860> <http://example.org/ns#a9860> <http://example.org/ns#a9860> . +<http://example.org/ns#a9861> <http://example.org/ns#a9861> <http://example.org/ns#a9861> . +<http://example.org/ns#a9862> <http://example.org/ns#a9862> <http://example.org/ns#a9862> . +<http://example.org/ns#a9863> <http://example.org/ns#a9863> <http://example.org/ns#a9863> . +<http://example.org/ns#a9864> <http://example.org/ns#a9864> <http://example.org/ns#a9864> . +<http://example.org/ns#a9865> <http://example.org/ns#a9865> <http://example.org/ns#a9865> . +<http://example.org/ns#a9866> <http://example.org/ns#a9866> <http://example.org/ns#a9866> . +<http://example.org/ns#a9867> <http://example.org/ns#a9867> <http://example.org/ns#a9867> . +<http://example.org/ns#a9868> <http://example.org/ns#a9868> <http://example.org/ns#a9868> . +<http://example.org/ns#a9869> <http://example.org/ns#a9869> <http://example.org/ns#a9869> . +<http://example.org/ns#a9870> <http://example.org/ns#a9870> <http://example.org/ns#a9870> . +<http://example.org/ns#a9871> <http://example.org/ns#a9871> <http://example.org/ns#a9871> . +<http://example.org/ns#a9872> <http://example.org/ns#a9872> <http://example.org/ns#a9872> . +<http://example.org/ns#a9873> <http://example.org/ns#a9873> <http://example.org/ns#a9873> . +<http://example.org/ns#a9874> <http://example.org/ns#a9874> <http://example.org/ns#a9874> . +<http://example.org/ns#a9875> <http://example.org/ns#a9875> <http://example.org/ns#a9875> . +<http://example.org/ns#a9876> <http://example.org/ns#a9876> <http://example.org/ns#a9876> . +<http://example.org/ns#a9877> <http://example.org/ns#a9877> <http://example.org/ns#a9877> . +<http://example.org/ns#a9878> <http://example.org/ns#a9878> <http://example.org/ns#a9878> . +<http://example.org/ns#a9879> <http://example.org/ns#a9879> <http://example.org/ns#a9879> . +<http://example.org/ns#a9880> <http://example.org/ns#a9880> <http://example.org/ns#a9880> . +<http://example.org/ns#a9881> <http://example.org/ns#a9881> <http://example.org/ns#a9881> . +<http://example.org/ns#a9882> <http://example.org/ns#a9882> <http://example.org/ns#a9882> . +<http://example.org/ns#a9883> <http://example.org/ns#a9883> <http://example.org/ns#a9883> . +<http://example.org/ns#a9884> <http://example.org/ns#a9884> <http://example.org/ns#a9884> . +<http://example.org/ns#a9885> <http://example.org/ns#a9885> <http://example.org/ns#a9885> . +<http://example.org/ns#a9886> <http://example.org/ns#a9886> <http://example.org/ns#a9886> . +<http://example.org/ns#a9887> <http://example.org/ns#a9887> <http://example.org/ns#a9887> . +<http://example.org/ns#a9888> <http://example.org/ns#a9888> <http://example.org/ns#a9888> . +<http://example.org/ns#a9889> <http://example.org/ns#a9889> <http://example.org/ns#a9889> . +<http://example.org/ns#a9890> <http://example.org/ns#a9890> <http://example.org/ns#a9890> . +<http://example.org/ns#a9891> <http://example.org/ns#a9891> <http://example.org/ns#a9891> . +<http://example.org/ns#a9892> <http://example.org/ns#a9892> <http://example.org/ns#a9892> . +<http://example.org/ns#a9893> <http://example.org/ns#a9893> <http://example.org/ns#a9893> . +<http://example.org/ns#a9894> <http://example.org/ns#a9894> <http://example.org/ns#a9894> . +<http://example.org/ns#a9895> <http://example.org/ns#a9895> <http://example.org/ns#a9895> . +<http://example.org/ns#a9896> <http://example.org/ns#a9896> <http://example.org/ns#a9896> . +<http://example.org/ns#a9897> <http://example.org/ns#a9897> <http://example.org/ns#a9897> . +<http://example.org/ns#a9898> <http://example.org/ns#a9898> <http://example.org/ns#a9898> . +<http://example.org/ns#a9899> <http://example.org/ns#a9899> <http://example.org/ns#a9899> . +<http://example.org/ns#a9900> <http://example.org/ns#a9900> <http://example.org/ns#a9900> . +<http://example.org/ns#a9901> <http://example.org/ns#a9901> <http://example.org/ns#a9901> . +<http://example.org/ns#a9902> <http://example.org/ns#a9902> <http://example.org/ns#a9902> . +<http://example.org/ns#a9903> <http://example.org/ns#a9903> <http://example.org/ns#a9903> . +<http://example.org/ns#a9904> <http://example.org/ns#a9904> <http://example.org/ns#a9904> . +<http://example.org/ns#a9905> <http://example.org/ns#a9905> <http://example.org/ns#a9905> . +<http://example.org/ns#a9906> <http://example.org/ns#a9906> <http://example.org/ns#a9906> . +<http://example.org/ns#a9907> <http://example.org/ns#a9907> <http://example.org/ns#a9907> . +<http://example.org/ns#a9908> <http://example.org/ns#a9908> <http://example.org/ns#a9908> . +<http://example.org/ns#a9909> <http://example.org/ns#a9909> <http://example.org/ns#a9909> . +<http://example.org/ns#a9910> <http://example.org/ns#a9910> <http://example.org/ns#a9910> . +<http://example.org/ns#a9911> <http://example.org/ns#a9911> <http://example.org/ns#a9911> . +<http://example.org/ns#a9912> <http://example.org/ns#a9912> <http://example.org/ns#a9912> . +<http://example.org/ns#a9913> <http://example.org/ns#a9913> <http://example.org/ns#a9913> . +<http://example.org/ns#a9914> <http://example.org/ns#a9914> <http://example.org/ns#a9914> . +<http://example.org/ns#a9915> <http://example.org/ns#a9915> <http://example.org/ns#a9915> . +<http://example.org/ns#a9916> <http://example.org/ns#a9916> <http://example.org/ns#a9916> . +<http://example.org/ns#a9917> <http://example.org/ns#a9917> <http://example.org/ns#a9917> . +<http://example.org/ns#a9918> <http://example.org/ns#a9918> <http://example.org/ns#a9918> . +<http://example.org/ns#a9919> <http://example.org/ns#a9919> <http://example.org/ns#a9919> . +<http://example.org/ns#a9920> <http://example.org/ns#a9920> <http://example.org/ns#a9920> . +<http://example.org/ns#a9921> <http://example.org/ns#a9921> <http://example.org/ns#a9921> . +<http://example.org/ns#a9922> <http://example.org/ns#a9922> <http://example.org/ns#a9922> . +<http://example.org/ns#a9923> <http://example.org/ns#a9923> <http://example.org/ns#a9923> . +<http://example.org/ns#a9924> <http://example.org/ns#a9924> <http://example.org/ns#a9924> . +<http://example.org/ns#a9925> <http://example.org/ns#a9925> <http://example.org/ns#a9925> . +<http://example.org/ns#a9926> <http://example.org/ns#a9926> <http://example.org/ns#a9926> . +<http://example.org/ns#a9927> <http://example.org/ns#a9927> <http://example.org/ns#a9927> . +<http://example.org/ns#a9928> <http://example.org/ns#a9928> <http://example.org/ns#a9928> . +<http://example.org/ns#a9929> <http://example.org/ns#a9929> <http://example.org/ns#a9929> . +<http://example.org/ns#a9930> <http://example.org/ns#a9930> <http://example.org/ns#a9930> . +<http://example.org/ns#a9931> <http://example.org/ns#a9931> <http://example.org/ns#a9931> . +<http://example.org/ns#a9932> <http://example.org/ns#a9932> <http://example.org/ns#a9932> . +<http://example.org/ns#a9933> <http://example.org/ns#a9933> <http://example.org/ns#a9933> . +<http://example.org/ns#a9934> <http://example.org/ns#a9934> <http://example.org/ns#a9934> . +<http://example.org/ns#a9935> <http://example.org/ns#a9935> <http://example.org/ns#a9935> . +<http://example.org/ns#a9936> <http://example.org/ns#a9936> <http://example.org/ns#a9936> . +<http://example.org/ns#a9937> <http://example.org/ns#a9937> <http://example.org/ns#a9937> . +<http://example.org/ns#a9938> <http://example.org/ns#a9938> <http://example.org/ns#a9938> . +<http://example.org/ns#a9939> <http://example.org/ns#a9939> <http://example.org/ns#a9939> . +<http://example.org/ns#a9940> <http://example.org/ns#a9940> <http://example.org/ns#a9940> . +<http://example.org/ns#a9941> <http://example.org/ns#a9941> <http://example.org/ns#a9941> . +<http://example.org/ns#a9942> <http://example.org/ns#a9942> <http://example.org/ns#a9942> . +<http://example.org/ns#a9943> <http://example.org/ns#a9943> <http://example.org/ns#a9943> . +<http://example.org/ns#a9944> <http://example.org/ns#a9944> <http://example.org/ns#a9944> . +<http://example.org/ns#a9945> <http://example.org/ns#a9945> <http://example.org/ns#a9945> . +<http://example.org/ns#a9946> <http://example.org/ns#a9946> <http://example.org/ns#a9946> . +<http://example.org/ns#a9947> <http://example.org/ns#a9947> <http://example.org/ns#a9947> . +<http://example.org/ns#a9948> <http://example.org/ns#a9948> <http://example.org/ns#a9948> . +<http://example.org/ns#a9949> <http://example.org/ns#a9949> <http://example.org/ns#a9949> . +<http://example.org/ns#a9950> <http://example.org/ns#a9950> <http://example.org/ns#a9950> . +<http://example.org/ns#a9951> <http://example.org/ns#a9951> <http://example.org/ns#a9951> . +<http://example.org/ns#a9952> <http://example.org/ns#a9952> <http://example.org/ns#a9952> . +<http://example.org/ns#a9953> <http://example.org/ns#a9953> <http://example.org/ns#a9953> . +<http://example.org/ns#a9954> <http://example.org/ns#a9954> <http://example.org/ns#a9954> . +<http://example.org/ns#a9955> <http://example.org/ns#a9955> <http://example.org/ns#a9955> . +<http://example.org/ns#a9956> <http://example.org/ns#a9956> <http://example.org/ns#a9956> . +<http://example.org/ns#a9957> <http://example.org/ns#a9957> <http://example.org/ns#a9957> . +<http://example.org/ns#a9958> <http://example.org/ns#a9958> <http://example.org/ns#a9958> . +<http://example.org/ns#a9959> <http://example.org/ns#a9959> <http://example.org/ns#a9959> . +<http://example.org/ns#a9960> <http://example.org/ns#a9960> <http://example.org/ns#a9960> . +<http://example.org/ns#a9961> <http://example.org/ns#a9961> <http://example.org/ns#a9961> . +<http://example.org/ns#a9962> <http://example.org/ns#a9962> <http://example.org/ns#a9962> . +<http://example.org/ns#a9963> <http://example.org/ns#a9963> <http://example.org/ns#a9963> . +<http://example.org/ns#a9964> <http://example.org/ns#a9964> <http://example.org/ns#a9964> . +<http://example.org/ns#a9965> <http://example.org/ns#a9965> <http://example.org/ns#a9965> . +<http://example.org/ns#a9966> <http://example.org/ns#a9966> <http://example.org/ns#a9966> . +<http://example.org/ns#a9967> <http://example.org/ns#a9967> <http://example.org/ns#a9967> . +<http://example.org/ns#a9968> <http://example.org/ns#a9968> <http://example.org/ns#a9968> . +<http://example.org/ns#a9969> <http://example.org/ns#a9969> <http://example.org/ns#a9969> . +<http://example.org/ns#a9970> <http://example.org/ns#a9970> <http://example.org/ns#a9970> . +<http://example.org/ns#a9971> <http://example.org/ns#a9971> <http://example.org/ns#a9971> . +<http://example.org/ns#a9972> <http://example.org/ns#a9972> <http://example.org/ns#a9972> . +<http://example.org/ns#a9973> <http://example.org/ns#a9973> <http://example.org/ns#a9973> . +<http://example.org/ns#a9974> <http://example.org/ns#a9974> <http://example.org/ns#a9974> . +<http://example.org/ns#a9975> <http://example.org/ns#a9975> <http://example.org/ns#a9975> . +<http://example.org/ns#a9976> <http://example.org/ns#a9976> <http://example.org/ns#a9976> . +<http://example.org/ns#a9977> <http://example.org/ns#a9977> <http://example.org/ns#a9977> . +<http://example.org/ns#a9978> <http://example.org/ns#a9978> <http://example.org/ns#a9978> . +<http://example.org/ns#a9979> <http://example.org/ns#a9979> <http://example.org/ns#a9979> . +<http://example.org/ns#a9980> <http://example.org/ns#a9980> <http://example.org/ns#a9980> . +<http://example.org/ns#a9981> <http://example.org/ns#a9981> <http://example.org/ns#a9981> . +<http://example.org/ns#a9982> <http://example.org/ns#a9982> <http://example.org/ns#a9982> . +<http://example.org/ns#a9983> <http://example.org/ns#a9983> <http://example.org/ns#a9983> . +<http://example.org/ns#a9984> <http://example.org/ns#a9984> <http://example.org/ns#a9984> . +<http://example.org/ns#a9985> <http://example.org/ns#a9985> <http://example.org/ns#a9985> . +<http://example.org/ns#a9986> <http://example.org/ns#a9986> <http://example.org/ns#a9986> . +<http://example.org/ns#a9987> <http://example.org/ns#a9987> <http://example.org/ns#a9987> . +<http://example.org/ns#a9988> <http://example.org/ns#a9988> <http://example.org/ns#a9988> . +<http://example.org/ns#a9989> <http://example.org/ns#a9989> <http://example.org/ns#a9989> . +<http://example.org/ns#a9990> <http://example.org/ns#a9990> <http://example.org/ns#a9990> . +<http://example.org/ns#a9991> <http://example.org/ns#a9991> <http://example.org/ns#a9991> . +<http://example.org/ns#a9992> <http://example.org/ns#a9992> <http://example.org/ns#a9992> . +<http://example.org/ns#a9993> <http://example.org/ns#a9993> <http://example.org/ns#a9993> . +<http://example.org/ns#a9994> <http://example.org/ns#a9994> <http://example.org/ns#a9994> . +<http://example.org/ns#a9995> <http://example.org/ns#a9995> <http://example.org/ns#a9995> . +<http://example.org/ns#a9996> <http://example.org/ns#a9996> <http://example.org/ns#a9996> . +<http://example.org/ns#a9997> <http://example.org/ns#a9997> <http://example.org/ns#a9997> . +<http://example.org/ns#a9998> <http://example.org/ns#a9998> <http://example.org/ns#a9998> . +<http://example.org/ns#a9999> <http://example.org/ns#a9999> <http://example.org/ns#a9999> . +<http://example.org/ns#a10000> <http://example.org/ns#a10000> <http://example.org/ns#a10000> . diff --git a/testsuite/serd-tests/good/test-14.ttl b/testsuite/serd-tests/good/test-14.ttl new file mode 100644 index 00000000..ad9dbde8 --- /dev/null +++ b/testsuite/serd-tests/good/test-14.ttl @@ -0,0 +1,10002 @@ +# 10000 triples, more than the default Bison stack size +@prefix : <http://example.org/ns#> . +:a1 :a1 :a1. +:a2 :a2 :a2. +:a3 :a3 :a3. +:a4 :a4 :a4. +:a5 :a5 :a5. +:a6 :a6 :a6. +:a7 :a7 :a7. +:a8 :a8 :a8. +:a9 :a9 :a9. +:a10 :a10 :a10. +:a11 :a11 :a11. +:a12 :a12 :a12. +:a13 :a13 :a13. +:a14 :a14 :a14. +:a15 :a15 :a15. +:a16 :a16 :a16. +:a17 :a17 :a17. +:a18 :a18 :a18. +:a19 :a19 :a19. +:a20 :a20 :a20. +:a21 :a21 :a21. +:a22 :a22 :a22. +:a23 :a23 :a23. +:a24 :a24 :a24. +:a25 :a25 :a25. +:a26 :a26 :a26. +:a27 :a27 :a27. +:a28 :a28 :a28. +:a29 :a29 :a29. +:a30 :a30 :a30. +:a31 :a31 :a31. +:a32 :a32 :a32. +:a33 :a33 :a33. +:a34 :a34 :a34. +:a35 :a35 :a35. +:a36 :a36 :a36. +:a37 :a37 :a37. +:a38 :a38 :a38. +:a39 :a39 :a39. +:a40 :a40 :a40. +:a41 :a41 :a41. +:a42 :a42 :a42. +:a43 :a43 :a43. +:a44 :a44 :a44. +:a45 :a45 :a45. +:a46 :a46 :a46. +:a47 :a47 :a47. +:a48 :a48 :a48. +:a49 :a49 :a49. +:a50 :a50 :a50. +:a51 :a51 :a51. +:a52 :a52 :a52. +:a53 :a53 :a53. +:a54 :a54 :a54. +:a55 :a55 :a55. +:a56 :a56 :a56. +:a57 :a57 :a57. +:a58 :a58 :a58. +:a59 :a59 :a59. +:a60 :a60 :a60. +:a61 :a61 :a61. +:a62 :a62 :a62. +:a63 :a63 :a63. +:a64 :a64 :a64. +:a65 :a65 :a65. +:a66 :a66 :a66. +:a67 :a67 :a67. +:a68 :a68 :a68. +:a69 :a69 :a69. +:a70 :a70 :a70. +:a71 :a71 :a71. +:a72 :a72 :a72. +:a73 :a73 :a73. +:a74 :a74 :a74. +:a75 :a75 :a75. +:a76 :a76 :a76. +:a77 :a77 :a77. +:a78 :a78 :a78. +:a79 :a79 :a79. +:a80 :a80 :a80. +:a81 :a81 :a81. +:a82 :a82 :a82. +:a83 :a83 :a83. +:a84 :a84 :a84. +:a85 :a85 :a85. +:a86 :a86 :a86. +:a87 :a87 :a87. +:a88 :a88 :a88. +:a89 :a89 :a89. +:a90 :a90 :a90. +:a91 :a91 :a91. +:a92 :a92 :a92. +:a93 :a93 :a93. +:a94 :a94 :a94. +:a95 :a95 :a95. +:a96 :a96 :a96. +:a97 :a97 :a97. +:a98 :a98 :a98. +:a99 :a99 :a99. +:a100 :a100 :a100. +:a101 :a101 :a101. +:a102 :a102 :a102. +:a103 :a103 :a103. +:a104 :a104 :a104. +:a105 :a105 :a105. +:a106 :a106 :a106. +:a107 :a107 :a107. +:a108 :a108 :a108. +:a109 :a109 :a109. +:a110 :a110 :a110. +:a111 :a111 :a111. +:a112 :a112 :a112. +:a113 :a113 :a113. +:a114 :a114 :a114. +:a115 :a115 :a115. +:a116 :a116 :a116. +:a117 :a117 :a117. +:a118 :a118 :a118. +:a119 :a119 :a119. +:a120 :a120 :a120. +:a121 :a121 :a121. +:a122 :a122 :a122. +:a123 :a123 :a123. +:a124 :a124 :a124. +:a125 :a125 :a125. +:a126 :a126 :a126. +:a127 :a127 :a127. +:a128 :a128 :a128. +:a129 :a129 :a129. +:a130 :a130 :a130. +:a131 :a131 :a131. +:a132 :a132 :a132. +:a133 :a133 :a133. +:a134 :a134 :a134. +:a135 :a135 :a135. +:a136 :a136 :a136. +:a137 :a137 :a137. +:a138 :a138 :a138. +:a139 :a139 :a139. +:a140 :a140 :a140. +:a141 :a141 :a141. +:a142 :a142 :a142. +:a143 :a143 :a143. +:a144 :a144 :a144. +:a145 :a145 :a145. +:a146 :a146 :a146. +:a147 :a147 :a147. +:a148 :a148 :a148. +:a149 :a149 :a149. +:a150 :a150 :a150. +:a151 :a151 :a151. +:a152 :a152 :a152. +:a153 :a153 :a153. +:a154 :a154 :a154. +:a155 :a155 :a155. +:a156 :a156 :a156. +:a157 :a157 :a157. +:a158 :a158 :a158. +:a159 :a159 :a159. +:a160 :a160 :a160. +:a161 :a161 :a161. +:a162 :a162 :a162. +:a163 :a163 :a163. +:a164 :a164 :a164. +:a165 :a165 :a165. +:a166 :a166 :a166. +:a167 :a167 :a167. +:a168 :a168 :a168. +:a169 :a169 :a169. +:a170 :a170 :a170. +:a171 :a171 :a171. +:a172 :a172 :a172. +:a173 :a173 :a173. +:a174 :a174 :a174. +:a175 :a175 :a175. +:a176 :a176 :a176. +:a177 :a177 :a177. +:a178 :a178 :a178. +:a179 :a179 :a179. +:a180 :a180 :a180. +:a181 :a181 :a181. +:a182 :a182 :a182. +:a183 :a183 :a183. +:a184 :a184 :a184. +:a185 :a185 :a185. +:a186 :a186 :a186. +:a187 :a187 :a187. +:a188 :a188 :a188. +:a189 :a189 :a189. +:a190 :a190 :a190. +:a191 :a191 :a191. +:a192 :a192 :a192. +:a193 :a193 :a193. +:a194 :a194 :a194. +:a195 :a195 :a195. +:a196 :a196 :a196. +:a197 :a197 :a197. +:a198 :a198 :a198. +:a199 :a199 :a199. +:a200 :a200 :a200. +:a201 :a201 :a201. +:a202 :a202 :a202. +:a203 :a203 :a203. +:a204 :a204 :a204. +:a205 :a205 :a205. +:a206 :a206 :a206. +:a207 :a207 :a207. +:a208 :a208 :a208. +:a209 :a209 :a209. +:a210 :a210 :a210. +:a211 :a211 :a211. +:a212 :a212 :a212. +:a213 :a213 :a213. +:a214 :a214 :a214. +:a215 :a215 :a215. +:a216 :a216 :a216. +:a217 :a217 :a217. +:a218 :a218 :a218. +:a219 :a219 :a219. +:a220 :a220 :a220. +:a221 :a221 :a221. +:a222 :a222 :a222. +:a223 :a223 :a223. +:a224 :a224 :a224. +:a225 :a225 :a225. +:a226 :a226 :a226. +:a227 :a227 :a227. +:a228 :a228 :a228. +:a229 :a229 :a229. +:a230 :a230 :a230. +:a231 :a231 :a231. +:a232 :a232 :a232. +:a233 :a233 :a233. +:a234 :a234 :a234. +:a235 :a235 :a235. +:a236 :a236 :a236. +:a237 :a237 :a237. +:a238 :a238 :a238. +:a239 :a239 :a239. +:a240 :a240 :a240. +:a241 :a241 :a241. +:a242 :a242 :a242. +:a243 :a243 :a243. +:a244 :a244 :a244. +:a245 :a245 :a245. +:a246 :a246 :a246. +:a247 :a247 :a247. +:a248 :a248 :a248. +:a249 :a249 :a249. +:a250 :a250 :a250. +:a251 :a251 :a251. +:a252 :a252 :a252. +:a253 :a253 :a253. +:a254 :a254 :a254. +:a255 :a255 :a255. +:a256 :a256 :a256. +:a257 :a257 :a257. +:a258 :a258 :a258. +:a259 :a259 :a259. +:a260 :a260 :a260. +:a261 :a261 :a261. +:a262 :a262 :a262. +:a263 :a263 :a263. +:a264 :a264 :a264. +:a265 :a265 :a265. +:a266 :a266 :a266. +:a267 :a267 :a267. +:a268 :a268 :a268. +:a269 :a269 :a269. +:a270 :a270 :a270. +:a271 :a271 :a271. +:a272 :a272 :a272. +:a273 :a273 :a273. +:a274 :a274 :a274. +:a275 :a275 :a275. +:a276 :a276 :a276. +:a277 :a277 :a277. +:a278 :a278 :a278. +:a279 :a279 :a279. +:a280 :a280 :a280. +:a281 :a281 :a281. +:a282 :a282 :a282. +:a283 :a283 :a283. +:a284 :a284 :a284. +:a285 :a285 :a285. +:a286 :a286 :a286. +:a287 :a287 :a287. +:a288 :a288 :a288. +:a289 :a289 :a289. +:a290 :a290 :a290. +:a291 :a291 :a291. +:a292 :a292 :a292. +:a293 :a293 :a293. +:a294 :a294 :a294. +:a295 :a295 :a295. +:a296 :a296 :a296. +:a297 :a297 :a297. +:a298 :a298 :a298. +:a299 :a299 :a299. +:a300 :a300 :a300. +:a301 :a301 :a301. +:a302 :a302 :a302. +:a303 :a303 :a303. +:a304 :a304 :a304. +:a305 :a305 :a305. +:a306 :a306 :a306. +:a307 :a307 :a307. +:a308 :a308 :a308. +:a309 :a309 :a309. +:a310 :a310 :a310. +:a311 :a311 :a311. +:a312 :a312 :a312. +:a313 :a313 :a313. +:a314 :a314 :a314. +:a315 :a315 :a315. +:a316 :a316 :a316. +:a317 :a317 :a317. +:a318 :a318 :a318. +:a319 :a319 :a319. +:a320 :a320 :a320. +:a321 :a321 :a321. +:a322 :a322 :a322. +:a323 :a323 :a323. +:a324 :a324 :a324. +:a325 :a325 :a325. +:a326 :a326 :a326. +:a327 :a327 :a327. +:a328 :a328 :a328. +:a329 :a329 :a329. +:a330 :a330 :a330. +:a331 :a331 :a331. +:a332 :a332 :a332. +:a333 :a333 :a333. +:a334 :a334 :a334. +:a335 :a335 :a335. +:a336 :a336 :a336. +:a337 :a337 :a337. +:a338 :a338 :a338. +:a339 :a339 :a339. +:a340 :a340 :a340. +:a341 :a341 :a341. +:a342 :a342 :a342. +:a343 :a343 :a343. +:a344 :a344 :a344. +:a345 :a345 :a345. +:a346 :a346 :a346. +:a347 :a347 :a347. +:a348 :a348 :a348. +:a349 :a349 :a349. +:a350 :a350 :a350. +:a351 :a351 :a351. +:a352 :a352 :a352. +:a353 :a353 :a353. +:a354 :a354 :a354. +:a355 :a355 :a355. +:a356 :a356 :a356. +:a357 :a357 :a357. +:a358 :a358 :a358. +:a359 :a359 :a359. +:a360 :a360 :a360. +:a361 :a361 :a361. +:a362 :a362 :a362. +:a363 :a363 :a363. +:a364 :a364 :a364. +:a365 :a365 :a365. +:a366 :a366 :a366. +:a367 :a367 :a367. +:a368 :a368 :a368. +:a369 :a369 :a369. +:a370 :a370 :a370. +:a371 :a371 :a371. +:a372 :a372 :a372. +:a373 :a373 :a373. +:a374 :a374 :a374. +:a375 :a375 :a375. +:a376 :a376 :a376. +:a377 :a377 :a377. +:a378 :a378 :a378. +:a379 :a379 :a379. +:a380 :a380 :a380. +:a381 :a381 :a381. +:a382 :a382 :a382. +:a383 :a383 :a383. +:a384 :a384 :a384. +:a385 :a385 :a385. +:a386 :a386 :a386. +:a387 :a387 :a387. +:a388 :a388 :a388. +:a389 :a389 :a389. +:a390 :a390 :a390. +:a391 :a391 :a391. +:a392 :a392 :a392. +:a393 :a393 :a393. +:a394 :a394 :a394. +:a395 :a395 :a395. +:a396 :a396 :a396. +:a397 :a397 :a397. +:a398 :a398 :a398. +:a399 :a399 :a399. +:a400 :a400 :a400. +:a401 :a401 :a401. +:a402 :a402 :a402. +:a403 :a403 :a403. +:a404 :a404 :a404. +:a405 :a405 :a405. +:a406 :a406 :a406. +:a407 :a407 :a407. +:a408 :a408 :a408. +:a409 :a409 :a409. +:a410 :a410 :a410. +:a411 :a411 :a411. +:a412 :a412 :a412. +:a413 :a413 :a413. +:a414 :a414 :a414. +:a415 :a415 :a415. +:a416 :a416 :a416. +:a417 :a417 :a417. +:a418 :a418 :a418. +:a419 :a419 :a419. +:a420 :a420 :a420. +:a421 :a421 :a421. +:a422 :a422 :a422. +:a423 :a423 :a423. +:a424 :a424 :a424. +:a425 :a425 :a425. +:a426 :a426 :a426. +:a427 :a427 :a427. +:a428 :a428 :a428. +:a429 :a429 :a429. +:a430 :a430 :a430. +:a431 :a431 :a431. +:a432 :a432 :a432. +:a433 :a433 :a433. +:a434 :a434 :a434. +:a435 :a435 :a435. +:a436 :a436 :a436. +:a437 :a437 :a437. +:a438 :a438 :a438. +:a439 :a439 :a439. +:a440 :a440 :a440. +:a441 :a441 :a441. +:a442 :a442 :a442. +:a443 :a443 :a443. +:a444 :a444 :a444. +:a445 :a445 :a445. +:a446 :a446 :a446. +:a447 :a447 :a447. +:a448 :a448 :a448. +:a449 :a449 :a449. +:a450 :a450 :a450. +:a451 :a451 :a451. +:a452 :a452 :a452. +:a453 :a453 :a453. +:a454 :a454 :a454. +:a455 :a455 :a455. +:a456 :a456 :a456. +:a457 :a457 :a457. +:a458 :a458 :a458. +:a459 :a459 :a459. +:a460 :a460 :a460. +:a461 :a461 :a461. +:a462 :a462 :a462. +:a463 :a463 :a463. +:a464 :a464 :a464. +:a465 :a465 :a465. +:a466 :a466 :a466. +:a467 :a467 :a467. +:a468 :a468 :a468. +:a469 :a469 :a469. +:a470 :a470 :a470. +:a471 :a471 :a471. +:a472 :a472 :a472. +:a473 :a473 :a473. +:a474 :a474 :a474. +:a475 :a475 :a475. +:a476 :a476 :a476. +:a477 :a477 :a477. +:a478 :a478 :a478. +:a479 :a479 :a479. +:a480 :a480 :a480. +:a481 :a481 :a481. +:a482 :a482 :a482. +:a483 :a483 :a483. +:a484 :a484 :a484. +:a485 :a485 :a485. +:a486 :a486 :a486. +:a487 :a487 :a487. +:a488 :a488 :a488. +:a489 :a489 :a489. +:a490 :a490 :a490. +:a491 :a491 :a491. +:a492 :a492 :a492. +:a493 :a493 :a493. +:a494 :a494 :a494. +:a495 :a495 :a495. +:a496 :a496 :a496. +:a497 :a497 :a497. +:a498 :a498 :a498. +:a499 :a499 :a499. +:a500 :a500 :a500. +:a501 :a501 :a501. +:a502 :a502 :a502. +:a503 :a503 :a503. +:a504 :a504 :a504. +:a505 :a505 :a505. +:a506 :a506 :a506. +:a507 :a507 :a507. +:a508 :a508 :a508. +:a509 :a509 :a509. +:a510 :a510 :a510. +:a511 :a511 :a511. +:a512 :a512 :a512. +:a513 :a513 :a513. +:a514 :a514 :a514. +:a515 :a515 :a515. +:a516 :a516 :a516. +:a517 :a517 :a517. +:a518 :a518 :a518. +:a519 :a519 :a519. +:a520 :a520 :a520. +:a521 :a521 :a521. +:a522 :a522 :a522. +:a523 :a523 :a523. +:a524 :a524 :a524. +:a525 :a525 :a525. +:a526 :a526 :a526. +:a527 :a527 :a527. +:a528 :a528 :a528. +:a529 :a529 :a529. +:a530 :a530 :a530. +:a531 :a531 :a531. +:a532 :a532 :a532. +:a533 :a533 :a533. +:a534 :a534 :a534. +:a535 :a535 :a535. +:a536 :a536 :a536. +:a537 :a537 :a537. +:a538 :a538 :a538. +:a539 :a539 :a539. +:a540 :a540 :a540. +:a541 :a541 :a541. +:a542 :a542 :a542. +:a543 :a543 :a543. +:a544 :a544 :a544. +:a545 :a545 :a545. +:a546 :a546 :a546. +:a547 :a547 :a547. +:a548 :a548 :a548. +:a549 :a549 :a549. +:a550 :a550 :a550. +:a551 :a551 :a551. +:a552 :a552 :a552. +:a553 :a553 :a553. +:a554 :a554 :a554. +:a555 :a555 :a555. +:a556 :a556 :a556. +:a557 :a557 :a557. +:a558 :a558 :a558. +:a559 :a559 :a559. +:a560 :a560 :a560. +:a561 :a561 :a561. +:a562 :a562 :a562. +:a563 :a563 :a563. +:a564 :a564 :a564. +:a565 :a565 :a565. +:a566 :a566 :a566. +:a567 :a567 :a567. +:a568 :a568 :a568. +:a569 :a569 :a569. +:a570 :a570 :a570. +:a571 :a571 :a571. +:a572 :a572 :a572. +:a573 :a573 :a573. +:a574 :a574 :a574. +:a575 :a575 :a575. +:a576 :a576 :a576. +:a577 :a577 :a577. +:a578 :a578 :a578. +:a579 :a579 :a579. +:a580 :a580 :a580. +:a581 :a581 :a581. +:a582 :a582 :a582. +:a583 :a583 :a583. +:a584 :a584 :a584. +:a585 :a585 :a585. +:a586 :a586 :a586. +:a587 :a587 :a587. +:a588 :a588 :a588. +:a589 :a589 :a589. +:a590 :a590 :a590. +:a591 :a591 :a591. +:a592 :a592 :a592. +:a593 :a593 :a593. +:a594 :a594 :a594. +:a595 :a595 :a595. +:a596 :a596 :a596. +:a597 :a597 :a597. +:a598 :a598 :a598. +:a599 :a599 :a599. +:a600 :a600 :a600. +:a601 :a601 :a601. +:a602 :a602 :a602. +:a603 :a603 :a603. +:a604 :a604 :a604. +:a605 :a605 :a605. +:a606 :a606 :a606. +:a607 :a607 :a607. +:a608 :a608 :a608. +:a609 :a609 :a609. +:a610 :a610 :a610. +:a611 :a611 :a611. +:a612 :a612 :a612. +:a613 :a613 :a613. +:a614 :a614 :a614. +:a615 :a615 :a615. +:a616 :a616 :a616. +:a617 :a617 :a617. +:a618 :a618 :a618. +:a619 :a619 :a619. +:a620 :a620 :a620. +:a621 :a621 :a621. +:a622 :a622 :a622. +:a623 :a623 :a623. +:a624 :a624 :a624. +:a625 :a625 :a625. +:a626 :a626 :a626. +:a627 :a627 :a627. +:a628 :a628 :a628. +:a629 :a629 :a629. +:a630 :a630 :a630. +:a631 :a631 :a631. +:a632 :a632 :a632. +:a633 :a633 :a633. +:a634 :a634 :a634. +:a635 :a635 :a635. +:a636 :a636 :a636. +:a637 :a637 :a637. +:a638 :a638 :a638. +:a639 :a639 :a639. +:a640 :a640 :a640. +:a641 :a641 :a641. +:a642 :a642 :a642. +:a643 :a643 :a643. +:a644 :a644 :a644. +:a645 :a645 :a645. +:a646 :a646 :a646. +:a647 :a647 :a647. +:a648 :a648 :a648. +:a649 :a649 :a649. +:a650 :a650 :a650. +:a651 :a651 :a651. +:a652 :a652 :a652. +:a653 :a653 :a653. +:a654 :a654 :a654. +:a655 :a655 :a655. +:a656 :a656 :a656. +:a657 :a657 :a657. +:a658 :a658 :a658. +:a659 :a659 :a659. +:a660 :a660 :a660. +:a661 :a661 :a661. +:a662 :a662 :a662. +:a663 :a663 :a663. +:a664 :a664 :a664. +:a665 :a665 :a665. +:a666 :a666 :a666. +:a667 :a667 :a667. +:a668 :a668 :a668. +:a669 :a669 :a669. +:a670 :a670 :a670. +:a671 :a671 :a671. +:a672 :a672 :a672. +:a673 :a673 :a673. +:a674 :a674 :a674. +:a675 :a675 :a675. +:a676 :a676 :a676. +:a677 :a677 :a677. +:a678 :a678 :a678. +:a679 :a679 :a679. +:a680 :a680 :a680. +:a681 :a681 :a681. +:a682 :a682 :a682. +:a683 :a683 :a683. +:a684 :a684 :a684. +:a685 :a685 :a685. +:a686 :a686 :a686. +:a687 :a687 :a687. +:a688 :a688 :a688. +:a689 :a689 :a689. +:a690 :a690 :a690. +:a691 :a691 :a691. +:a692 :a692 :a692. +:a693 :a693 :a693. +:a694 :a694 :a694. +:a695 :a695 :a695. +:a696 :a696 :a696. +:a697 :a697 :a697. +:a698 :a698 :a698. +:a699 :a699 :a699. +:a700 :a700 :a700. +:a701 :a701 :a701. +:a702 :a702 :a702. +:a703 :a703 :a703. +:a704 :a704 :a704. +:a705 :a705 :a705. +:a706 :a706 :a706. +:a707 :a707 :a707. +:a708 :a708 :a708. +:a709 :a709 :a709. +:a710 :a710 :a710. +:a711 :a711 :a711. +:a712 :a712 :a712. +:a713 :a713 :a713. +:a714 :a714 :a714. +:a715 :a715 :a715. +:a716 :a716 :a716. +:a717 :a717 :a717. +:a718 :a718 :a718. +:a719 :a719 :a719. +:a720 :a720 :a720. +:a721 :a721 :a721. +:a722 :a722 :a722. +:a723 :a723 :a723. +:a724 :a724 :a724. +:a725 :a725 :a725. +:a726 :a726 :a726. +:a727 :a727 :a727. +:a728 :a728 :a728. +:a729 :a729 :a729. +:a730 :a730 :a730. +:a731 :a731 :a731. +:a732 :a732 :a732. +:a733 :a733 :a733. +:a734 :a734 :a734. +:a735 :a735 :a735. +:a736 :a736 :a736. +:a737 :a737 :a737. +:a738 :a738 :a738. +:a739 :a739 :a739. +:a740 :a740 :a740. +:a741 :a741 :a741. +:a742 :a742 :a742. +:a743 :a743 :a743. +:a744 :a744 :a744. +:a745 :a745 :a745. +:a746 :a746 :a746. +:a747 :a747 :a747. +:a748 :a748 :a748. +:a749 :a749 :a749. +:a750 :a750 :a750. +:a751 :a751 :a751. +:a752 :a752 :a752. +:a753 :a753 :a753. +:a754 :a754 :a754. +:a755 :a755 :a755. +:a756 :a756 :a756. +:a757 :a757 :a757. +:a758 :a758 :a758. +:a759 :a759 :a759. +:a760 :a760 :a760. +:a761 :a761 :a761. +:a762 :a762 :a762. +:a763 :a763 :a763. +:a764 :a764 :a764. +:a765 :a765 :a765. +:a766 :a766 :a766. +:a767 :a767 :a767. +:a768 :a768 :a768. +:a769 :a769 :a769. +:a770 :a770 :a770. +:a771 :a771 :a771. +:a772 :a772 :a772. +:a773 :a773 :a773. +:a774 :a774 :a774. +:a775 :a775 :a775. +:a776 :a776 :a776. +:a777 :a777 :a777. +:a778 :a778 :a778. +:a779 :a779 :a779. +:a780 :a780 :a780. +:a781 :a781 :a781. +:a782 :a782 :a782. +:a783 :a783 :a783. +:a784 :a784 :a784. +:a785 :a785 :a785. +:a786 :a786 :a786. +:a787 :a787 :a787. +:a788 :a788 :a788. +:a789 :a789 :a789. +:a790 :a790 :a790. +:a791 :a791 :a791. +:a792 :a792 :a792. +:a793 :a793 :a793. +:a794 :a794 :a794. +:a795 :a795 :a795. +:a796 :a796 :a796. +:a797 :a797 :a797. +:a798 :a798 :a798. +:a799 :a799 :a799. +:a800 :a800 :a800. +:a801 :a801 :a801. +:a802 :a802 :a802. +:a803 :a803 :a803. +:a804 :a804 :a804. +:a805 :a805 :a805. +:a806 :a806 :a806. +:a807 :a807 :a807. +:a808 :a808 :a808. +:a809 :a809 :a809. +:a810 :a810 :a810. +:a811 :a811 :a811. +:a812 :a812 :a812. +:a813 :a813 :a813. +:a814 :a814 :a814. +:a815 :a815 :a815. +:a816 :a816 :a816. +:a817 :a817 :a817. +:a818 :a818 :a818. +:a819 :a819 :a819. +:a820 :a820 :a820. +:a821 :a821 :a821. +:a822 :a822 :a822. +:a823 :a823 :a823. +:a824 :a824 :a824. +:a825 :a825 :a825. +:a826 :a826 :a826. +:a827 :a827 :a827. +:a828 :a828 :a828. +:a829 :a829 :a829. +:a830 :a830 :a830. +:a831 :a831 :a831. +:a832 :a832 :a832. +:a833 :a833 :a833. +:a834 :a834 :a834. +:a835 :a835 :a835. +:a836 :a836 :a836. +:a837 :a837 :a837. +:a838 :a838 :a838. +:a839 :a839 :a839. +:a840 :a840 :a840. +:a841 :a841 :a841. +:a842 :a842 :a842. +:a843 :a843 :a843. +:a844 :a844 :a844. +:a845 :a845 :a845. +:a846 :a846 :a846. +:a847 :a847 :a847. +:a848 :a848 :a848. +:a849 :a849 :a849. +:a850 :a850 :a850. +:a851 :a851 :a851. +:a852 :a852 :a852. +:a853 :a853 :a853. +:a854 :a854 :a854. +:a855 :a855 :a855. +:a856 :a856 :a856. +:a857 :a857 :a857. +:a858 :a858 :a858. +:a859 :a859 :a859. +:a860 :a860 :a860. +:a861 :a861 :a861. +:a862 :a862 :a862. +:a863 :a863 :a863. +:a864 :a864 :a864. +:a865 :a865 :a865. +:a866 :a866 :a866. +:a867 :a867 :a867. +:a868 :a868 :a868. +:a869 :a869 :a869. +:a870 :a870 :a870. +:a871 :a871 :a871. +:a872 :a872 :a872. +:a873 :a873 :a873. +:a874 :a874 :a874. +:a875 :a875 :a875. +:a876 :a876 :a876. +:a877 :a877 :a877. +:a878 :a878 :a878. +:a879 :a879 :a879. +:a880 :a880 :a880. +:a881 :a881 :a881. +:a882 :a882 :a882. +:a883 :a883 :a883. +:a884 :a884 :a884. +:a885 :a885 :a885. +:a886 :a886 :a886. +:a887 :a887 :a887. +:a888 :a888 :a888. +:a889 :a889 :a889. +:a890 :a890 :a890. +:a891 :a891 :a891. +:a892 :a892 :a892. +:a893 :a893 :a893. +:a894 :a894 :a894. +:a895 :a895 :a895. +:a896 :a896 :a896. +:a897 :a897 :a897. +:a898 :a898 :a898. +:a899 :a899 :a899. +:a900 :a900 :a900. +:a901 :a901 :a901. +:a902 :a902 :a902. +:a903 :a903 :a903. +:a904 :a904 :a904. +:a905 :a905 :a905. +:a906 :a906 :a906. +:a907 :a907 :a907. +:a908 :a908 :a908. +:a909 :a909 :a909. +:a910 :a910 :a910. +:a911 :a911 :a911. +:a912 :a912 :a912. +:a913 :a913 :a913. +:a914 :a914 :a914. +:a915 :a915 :a915. +:a916 :a916 :a916. +:a917 :a917 :a917. +:a918 :a918 :a918. +:a919 :a919 :a919. +:a920 :a920 :a920. +:a921 :a921 :a921. +:a922 :a922 :a922. +:a923 :a923 :a923. +:a924 :a924 :a924. +:a925 :a925 :a925. +:a926 :a926 :a926. +:a927 :a927 :a927. +:a928 :a928 :a928. +:a929 :a929 :a929. +:a930 :a930 :a930. +:a931 :a931 :a931. +:a932 :a932 :a932. +:a933 :a933 :a933. +:a934 :a934 :a934. +:a935 :a935 :a935. +:a936 :a936 :a936. +:a937 :a937 :a937. +:a938 :a938 :a938. +:a939 :a939 :a939. +:a940 :a940 :a940. +:a941 :a941 :a941. +:a942 :a942 :a942. +:a943 :a943 :a943. +:a944 :a944 :a944. +:a945 :a945 :a945. +:a946 :a946 :a946. +:a947 :a947 :a947. +:a948 :a948 :a948. +:a949 :a949 :a949. +:a950 :a950 :a950. +:a951 :a951 :a951. +:a952 :a952 :a952. +:a953 :a953 :a953. +:a954 :a954 :a954. +:a955 :a955 :a955. +:a956 :a956 :a956. +:a957 :a957 :a957. +:a958 :a958 :a958. +:a959 :a959 :a959. +:a960 :a960 :a960. +:a961 :a961 :a961. +:a962 :a962 :a962. +:a963 :a963 :a963. +:a964 :a964 :a964. +:a965 :a965 :a965. +:a966 :a966 :a966. +:a967 :a967 :a967. +:a968 :a968 :a968. +:a969 :a969 :a969. +:a970 :a970 :a970. +:a971 :a971 :a971. +:a972 :a972 :a972. +:a973 :a973 :a973. +:a974 :a974 :a974. +:a975 :a975 :a975. +:a976 :a976 :a976. +:a977 :a977 :a977. +:a978 :a978 :a978. +:a979 :a979 :a979. +:a980 :a980 :a980. +:a981 :a981 :a981. +:a982 :a982 :a982. +:a983 :a983 :a983. +:a984 :a984 :a984. +:a985 :a985 :a985. +:a986 :a986 :a986. +:a987 :a987 :a987. +:a988 :a988 :a988. +:a989 :a989 :a989. +:a990 :a990 :a990. +:a991 :a991 :a991. +:a992 :a992 :a992. +:a993 :a993 :a993. +:a994 :a994 :a994. +:a995 :a995 :a995. +:a996 :a996 :a996. +:a997 :a997 :a997. +:a998 :a998 :a998. +:a999 :a999 :a999. +:a1000 :a1000 :a1000. +:a1001 :a1001 :a1001. +:a1002 :a1002 :a1002. +:a1003 :a1003 :a1003. +:a1004 :a1004 :a1004. +:a1005 :a1005 :a1005. +:a1006 :a1006 :a1006. +:a1007 :a1007 :a1007. +:a1008 :a1008 :a1008. +:a1009 :a1009 :a1009. +:a1010 :a1010 :a1010. +:a1011 :a1011 :a1011. +:a1012 :a1012 :a1012. +:a1013 :a1013 :a1013. +:a1014 :a1014 :a1014. +:a1015 :a1015 :a1015. +:a1016 :a1016 :a1016. +:a1017 :a1017 :a1017. +:a1018 :a1018 :a1018. +:a1019 :a1019 :a1019. +:a1020 :a1020 :a1020. +:a1021 :a1021 :a1021. +:a1022 :a1022 :a1022. +:a1023 :a1023 :a1023. +:a1024 :a1024 :a1024. +:a1025 :a1025 :a1025. +:a1026 :a1026 :a1026. +:a1027 :a1027 :a1027. +:a1028 :a1028 :a1028. +:a1029 :a1029 :a1029. +:a1030 :a1030 :a1030. +:a1031 :a1031 :a1031. +:a1032 :a1032 :a1032. +:a1033 :a1033 :a1033. +:a1034 :a1034 :a1034. +:a1035 :a1035 :a1035. +:a1036 :a1036 :a1036. +:a1037 :a1037 :a1037. +:a1038 :a1038 :a1038. +:a1039 :a1039 :a1039. +:a1040 :a1040 :a1040. +:a1041 :a1041 :a1041. +:a1042 :a1042 :a1042. +:a1043 :a1043 :a1043. +:a1044 :a1044 :a1044. +:a1045 :a1045 :a1045. +:a1046 :a1046 :a1046. +:a1047 :a1047 :a1047. +:a1048 :a1048 :a1048. +:a1049 :a1049 :a1049. +:a1050 :a1050 :a1050. +:a1051 :a1051 :a1051. +:a1052 :a1052 :a1052. +:a1053 :a1053 :a1053. +:a1054 :a1054 :a1054. +:a1055 :a1055 :a1055. +:a1056 :a1056 :a1056. +:a1057 :a1057 :a1057. +:a1058 :a1058 :a1058. +:a1059 :a1059 :a1059. +:a1060 :a1060 :a1060. +:a1061 :a1061 :a1061. +:a1062 :a1062 :a1062. +:a1063 :a1063 :a1063. +:a1064 :a1064 :a1064. +:a1065 :a1065 :a1065. +:a1066 :a1066 :a1066. +:a1067 :a1067 :a1067. +:a1068 :a1068 :a1068. +:a1069 :a1069 :a1069. +:a1070 :a1070 :a1070. +:a1071 :a1071 :a1071. +:a1072 :a1072 :a1072. +:a1073 :a1073 :a1073. +:a1074 :a1074 :a1074. +:a1075 :a1075 :a1075. +:a1076 :a1076 :a1076. +:a1077 :a1077 :a1077. +:a1078 :a1078 :a1078. +:a1079 :a1079 :a1079. +:a1080 :a1080 :a1080. +:a1081 :a1081 :a1081. +:a1082 :a1082 :a1082. +:a1083 :a1083 :a1083. +:a1084 :a1084 :a1084. +:a1085 :a1085 :a1085. +:a1086 :a1086 :a1086. +:a1087 :a1087 :a1087. +:a1088 :a1088 :a1088. +:a1089 :a1089 :a1089. +:a1090 :a1090 :a1090. +:a1091 :a1091 :a1091. +:a1092 :a1092 :a1092. +:a1093 :a1093 :a1093. +:a1094 :a1094 :a1094. +:a1095 :a1095 :a1095. +:a1096 :a1096 :a1096. +:a1097 :a1097 :a1097. +:a1098 :a1098 :a1098. +:a1099 :a1099 :a1099. +:a1100 :a1100 :a1100. +:a1101 :a1101 :a1101. +:a1102 :a1102 :a1102. +:a1103 :a1103 :a1103. +:a1104 :a1104 :a1104. +:a1105 :a1105 :a1105. +:a1106 :a1106 :a1106. +:a1107 :a1107 :a1107. +:a1108 :a1108 :a1108. +:a1109 :a1109 :a1109. +:a1110 :a1110 :a1110. +:a1111 :a1111 :a1111. +:a1112 :a1112 :a1112. +:a1113 :a1113 :a1113. +:a1114 :a1114 :a1114. +:a1115 :a1115 :a1115. +:a1116 :a1116 :a1116. +:a1117 :a1117 :a1117. +:a1118 :a1118 :a1118. +:a1119 :a1119 :a1119. +:a1120 :a1120 :a1120. +:a1121 :a1121 :a1121. +:a1122 :a1122 :a1122. +:a1123 :a1123 :a1123. +:a1124 :a1124 :a1124. +:a1125 :a1125 :a1125. +:a1126 :a1126 :a1126. +:a1127 :a1127 :a1127. +:a1128 :a1128 :a1128. +:a1129 :a1129 :a1129. +:a1130 :a1130 :a1130. +:a1131 :a1131 :a1131. +:a1132 :a1132 :a1132. +:a1133 :a1133 :a1133. +:a1134 :a1134 :a1134. +:a1135 :a1135 :a1135. +:a1136 :a1136 :a1136. +:a1137 :a1137 :a1137. +:a1138 :a1138 :a1138. +:a1139 :a1139 :a1139. +:a1140 :a1140 :a1140. +:a1141 :a1141 :a1141. +:a1142 :a1142 :a1142. +:a1143 :a1143 :a1143. +:a1144 :a1144 :a1144. +:a1145 :a1145 :a1145. +:a1146 :a1146 :a1146. +:a1147 :a1147 :a1147. +:a1148 :a1148 :a1148. +:a1149 :a1149 :a1149. +:a1150 :a1150 :a1150. +:a1151 :a1151 :a1151. +:a1152 :a1152 :a1152. +:a1153 :a1153 :a1153. +:a1154 :a1154 :a1154. +:a1155 :a1155 :a1155. +:a1156 :a1156 :a1156. +:a1157 :a1157 :a1157. +:a1158 :a1158 :a1158. +:a1159 :a1159 :a1159. +:a1160 :a1160 :a1160. +:a1161 :a1161 :a1161. +:a1162 :a1162 :a1162. +:a1163 :a1163 :a1163. +:a1164 :a1164 :a1164. +:a1165 :a1165 :a1165. +:a1166 :a1166 :a1166. +:a1167 :a1167 :a1167. +:a1168 :a1168 :a1168. +:a1169 :a1169 :a1169. +:a1170 :a1170 :a1170. +:a1171 :a1171 :a1171. +:a1172 :a1172 :a1172. +:a1173 :a1173 :a1173. +:a1174 :a1174 :a1174. +:a1175 :a1175 :a1175. +:a1176 :a1176 :a1176. +:a1177 :a1177 :a1177. +:a1178 :a1178 :a1178. +:a1179 :a1179 :a1179. +:a1180 :a1180 :a1180. +:a1181 :a1181 :a1181. +:a1182 :a1182 :a1182. +:a1183 :a1183 :a1183. +:a1184 :a1184 :a1184. +:a1185 :a1185 :a1185. +:a1186 :a1186 :a1186. +:a1187 :a1187 :a1187. +:a1188 :a1188 :a1188. +:a1189 :a1189 :a1189. +:a1190 :a1190 :a1190. +:a1191 :a1191 :a1191. +:a1192 :a1192 :a1192. +:a1193 :a1193 :a1193. +:a1194 :a1194 :a1194. +:a1195 :a1195 :a1195. +:a1196 :a1196 :a1196. +:a1197 :a1197 :a1197. +:a1198 :a1198 :a1198. +:a1199 :a1199 :a1199. +:a1200 :a1200 :a1200. +:a1201 :a1201 :a1201. +:a1202 :a1202 :a1202. +:a1203 :a1203 :a1203. +:a1204 :a1204 :a1204. +:a1205 :a1205 :a1205. +:a1206 :a1206 :a1206. +:a1207 :a1207 :a1207. +:a1208 :a1208 :a1208. +:a1209 :a1209 :a1209. +:a1210 :a1210 :a1210. +:a1211 :a1211 :a1211. +:a1212 :a1212 :a1212. +:a1213 :a1213 :a1213. +:a1214 :a1214 :a1214. +:a1215 :a1215 :a1215. +:a1216 :a1216 :a1216. +:a1217 :a1217 :a1217. +:a1218 :a1218 :a1218. +:a1219 :a1219 :a1219. +:a1220 :a1220 :a1220. +:a1221 :a1221 :a1221. +:a1222 :a1222 :a1222. +:a1223 :a1223 :a1223. +:a1224 :a1224 :a1224. +:a1225 :a1225 :a1225. +:a1226 :a1226 :a1226. +:a1227 :a1227 :a1227. +:a1228 :a1228 :a1228. +:a1229 :a1229 :a1229. +:a1230 :a1230 :a1230. +:a1231 :a1231 :a1231. +:a1232 :a1232 :a1232. +:a1233 :a1233 :a1233. +:a1234 :a1234 :a1234. +:a1235 :a1235 :a1235. +:a1236 :a1236 :a1236. +:a1237 :a1237 :a1237. +:a1238 :a1238 :a1238. +:a1239 :a1239 :a1239. +:a1240 :a1240 :a1240. +:a1241 :a1241 :a1241. +:a1242 :a1242 :a1242. +:a1243 :a1243 :a1243. +:a1244 :a1244 :a1244. +:a1245 :a1245 :a1245. +:a1246 :a1246 :a1246. +:a1247 :a1247 :a1247. +:a1248 :a1248 :a1248. +:a1249 :a1249 :a1249. +:a1250 :a1250 :a1250. +:a1251 :a1251 :a1251. +:a1252 :a1252 :a1252. +:a1253 :a1253 :a1253. +:a1254 :a1254 :a1254. +:a1255 :a1255 :a1255. +:a1256 :a1256 :a1256. +:a1257 :a1257 :a1257. +:a1258 :a1258 :a1258. +:a1259 :a1259 :a1259. +:a1260 :a1260 :a1260. +:a1261 :a1261 :a1261. +:a1262 :a1262 :a1262. +:a1263 :a1263 :a1263. +:a1264 :a1264 :a1264. +:a1265 :a1265 :a1265. +:a1266 :a1266 :a1266. +:a1267 :a1267 :a1267. +:a1268 :a1268 :a1268. +:a1269 :a1269 :a1269. +:a1270 :a1270 :a1270. +:a1271 :a1271 :a1271. +:a1272 :a1272 :a1272. +:a1273 :a1273 :a1273. +:a1274 :a1274 :a1274. +:a1275 :a1275 :a1275. +:a1276 :a1276 :a1276. +:a1277 :a1277 :a1277. +:a1278 :a1278 :a1278. +:a1279 :a1279 :a1279. +:a1280 :a1280 :a1280. +:a1281 :a1281 :a1281. +:a1282 :a1282 :a1282. +:a1283 :a1283 :a1283. +:a1284 :a1284 :a1284. +:a1285 :a1285 :a1285. +:a1286 :a1286 :a1286. +:a1287 :a1287 :a1287. +:a1288 :a1288 :a1288. +:a1289 :a1289 :a1289. +:a1290 :a1290 :a1290. +:a1291 :a1291 :a1291. +:a1292 :a1292 :a1292. +:a1293 :a1293 :a1293. +:a1294 :a1294 :a1294. +:a1295 :a1295 :a1295. +:a1296 :a1296 :a1296. +:a1297 :a1297 :a1297. +:a1298 :a1298 :a1298. +:a1299 :a1299 :a1299. +:a1300 :a1300 :a1300. +:a1301 :a1301 :a1301. +:a1302 :a1302 :a1302. +:a1303 :a1303 :a1303. +:a1304 :a1304 :a1304. +:a1305 :a1305 :a1305. +:a1306 :a1306 :a1306. +:a1307 :a1307 :a1307. +:a1308 :a1308 :a1308. +:a1309 :a1309 :a1309. +:a1310 :a1310 :a1310. +:a1311 :a1311 :a1311. +:a1312 :a1312 :a1312. +:a1313 :a1313 :a1313. +:a1314 :a1314 :a1314. +:a1315 :a1315 :a1315. +:a1316 :a1316 :a1316. +:a1317 :a1317 :a1317. +:a1318 :a1318 :a1318. +:a1319 :a1319 :a1319. +:a1320 :a1320 :a1320. +:a1321 :a1321 :a1321. +:a1322 :a1322 :a1322. +:a1323 :a1323 :a1323. +:a1324 :a1324 :a1324. +:a1325 :a1325 :a1325. +:a1326 :a1326 :a1326. +:a1327 :a1327 :a1327. +:a1328 :a1328 :a1328. +:a1329 :a1329 :a1329. +:a1330 :a1330 :a1330. +:a1331 :a1331 :a1331. +:a1332 :a1332 :a1332. +:a1333 :a1333 :a1333. +:a1334 :a1334 :a1334. +:a1335 :a1335 :a1335. +:a1336 :a1336 :a1336. +:a1337 :a1337 :a1337. +:a1338 :a1338 :a1338. +:a1339 :a1339 :a1339. +:a1340 :a1340 :a1340. +:a1341 :a1341 :a1341. +:a1342 :a1342 :a1342. +:a1343 :a1343 :a1343. +:a1344 :a1344 :a1344. +:a1345 :a1345 :a1345. +:a1346 :a1346 :a1346. +:a1347 :a1347 :a1347. +:a1348 :a1348 :a1348. +:a1349 :a1349 :a1349. +:a1350 :a1350 :a1350. +:a1351 :a1351 :a1351. +:a1352 :a1352 :a1352. +:a1353 :a1353 :a1353. +:a1354 :a1354 :a1354. +:a1355 :a1355 :a1355. +:a1356 :a1356 :a1356. +:a1357 :a1357 :a1357. +:a1358 :a1358 :a1358. +:a1359 :a1359 :a1359. +:a1360 :a1360 :a1360. +:a1361 :a1361 :a1361. +:a1362 :a1362 :a1362. +:a1363 :a1363 :a1363. +:a1364 :a1364 :a1364. +:a1365 :a1365 :a1365. +:a1366 :a1366 :a1366. +:a1367 :a1367 :a1367. +:a1368 :a1368 :a1368. +:a1369 :a1369 :a1369. +:a1370 :a1370 :a1370. +:a1371 :a1371 :a1371. +:a1372 :a1372 :a1372. +:a1373 :a1373 :a1373. +:a1374 :a1374 :a1374. +:a1375 :a1375 :a1375. +:a1376 :a1376 :a1376. +:a1377 :a1377 :a1377. +:a1378 :a1378 :a1378. +:a1379 :a1379 :a1379. +:a1380 :a1380 :a1380. +:a1381 :a1381 :a1381. +:a1382 :a1382 :a1382. +:a1383 :a1383 :a1383. +:a1384 :a1384 :a1384. +:a1385 :a1385 :a1385. +:a1386 :a1386 :a1386. +:a1387 :a1387 :a1387. +:a1388 :a1388 :a1388. +:a1389 :a1389 :a1389. +:a1390 :a1390 :a1390. +:a1391 :a1391 :a1391. +:a1392 :a1392 :a1392. +:a1393 :a1393 :a1393. +:a1394 :a1394 :a1394. +:a1395 :a1395 :a1395. +:a1396 :a1396 :a1396. +:a1397 :a1397 :a1397. +:a1398 :a1398 :a1398. +:a1399 :a1399 :a1399. +:a1400 :a1400 :a1400. +:a1401 :a1401 :a1401. +:a1402 :a1402 :a1402. +:a1403 :a1403 :a1403. +:a1404 :a1404 :a1404. +:a1405 :a1405 :a1405. +:a1406 :a1406 :a1406. +:a1407 :a1407 :a1407. +:a1408 :a1408 :a1408. +:a1409 :a1409 :a1409. +:a1410 :a1410 :a1410. +:a1411 :a1411 :a1411. +:a1412 :a1412 :a1412. +:a1413 :a1413 :a1413. +:a1414 :a1414 :a1414. +:a1415 :a1415 :a1415. +:a1416 :a1416 :a1416. +:a1417 :a1417 :a1417. +:a1418 :a1418 :a1418. +:a1419 :a1419 :a1419. +:a1420 :a1420 :a1420. +:a1421 :a1421 :a1421. +:a1422 :a1422 :a1422. +:a1423 :a1423 :a1423. +:a1424 :a1424 :a1424. +:a1425 :a1425 :a1425. +:a1426 :a1426 :a1426. +:a1427 :a1427 :a1427. +:a1428 :a1428 :a1428. +:a1429 :a1429 :a1429. +:a1430 :a1430 :a1430. +:a1431 :a1431 :a1431. +:a1432 :a1432 :a1432. +:a1433 :a1433 :a1433. +:a1434 :a1434 :a1434. +:a1435 :a1435 :a1435. +:a1436 :a1436 :a1436. +:a1437 :a1437 :a1437. +:a1438 :a1438 :a1438. +:a1439 :a1439 :a1439. +:a1440 :a1440 :a1440. +:a1441 :a1441 :a1441. +:a1442 :a1442 :a1442. +:a1443 :a1443 :a1443. +:a1444 :a1444 :a1444. +:a1445 :a1445 :a1445. +:a1446 :a1446 :a1446. +:a1447 :a1447 :a1447. +:a1448 :a1448 :a1448. +:a1449 :a1449 :a1449. +:a1450 :a1450 :a1450. +:a1451 :a1451 :a1451. +:a1452 :a1452 :a1452. +:a1453 :a1453 :a1453. +:a1454 :a1454 :a1454. +:a1455 :a1455 :a1455. +:a1456 :a1456 :a1456. +:a1457 :a1457 :a1457. +:a1458 :a1458 :a1458. +:a1459 :a1459 :a1459. +:a1460 :a1460 :a1460. +:a1461 :a1461 :a1461. +:a1462 :a1462 :a1462. +:a1463 :a1463 :a1463. +:a1464 :a1464 :a1464. +:a1465 :a1465 :a1465. +:a1466 :a1466 :a1466. +:a1467 :a1467 :a1467. +:a1468 :a1468 :a1468. +:a1469 :a1469 :a1469. +:a1470 :a1470 :a1470. +:a1471 :a1471 :a1471. +:a1472 :a1472 :a1472. +:a1473 :a1473 :a1473. +:a1474 :a1474 :a1474. +:a1475 :a1475 :a1475. +:a1476 :a1476 :a1476. +:a1477 :a1477 :a1477. +:a1478 :a1478 :a1478. +:a1479 :a1479 :a1479. +:a1480 :a1480 :a1480. +:a1481 :a1481 :a1481. +:a1482 :a1482 :a1482. +:a1483 :a1483 :a1483. +:a1484 :a1484 :a1484. +:a1485 :a1485 :a1485. +:a1486 :a1486 :a1486. +:a1487 :a1487 :a1487. +:a1488 :a1488 :a1488. +:a1489 :a1489 :a1489. +:a1490 :a1490 :a1490. +:a1491 :a1491 :a1491. +:a1492 :a1492 :a1492. +:a1493 :a1493 :a1493. +:a1494 :a1494 :a1494. +:a1495 :a1495 :a1495. +:a1496 :a1496 :a1496. +:a1497 :a1497 :a1497. +:a1498 :a1498 :a1498. +:a1499 :a1499 :a1499. +:a1500 :a1500 :a1500. +:a1501 :a1501 :a1501. +:a1502 :a1502 :a1502. +:a1503 :a1503 :a1503. +:a1504 :a1504 :a1504. +:a1505 :a1505 :a1505. +:a1506 :a1506 :a1506. +:a1507 :a1507 :a1507. +:a1508 :a1508 :a1508. +:a1509 :a1509 :a1509. +:a1510 :a1510 :a1510. +:a1511 :a1511 :a1511. +:a1512 :a1512 :a1512. +:a1513 :a1513 :a1513. +:a1514 :a1514 :a1514. +:a1515 :a1515 :a1515. +:a1516 :a1516 :a1516. +:a1517 :a1517 :a1517. +:a1518 :a1518 :a1518. +:a1519 :a1519 :a1519. +:a1520 :a1520 :a1520. +:a1521 :a1521 :a1521. +:a1522 :a1522 :a1522. +:a1523 :a1523 :a1523. +:a1524 :a1524 :a1524. +:a1525 :a1525 :a1525. +:a1526 :a1526 :a1526. +:a1527 :a1527 :a1527. +:a1528 :a1528 :a1528. +:a1529 :a1529 :a1529. +:a1530 :a1530 :a1530. +:a1531 :a1531 :a1531. +:a1532 :a1532 :a1532. +:a1533 :a1533 :a1533. +:a1534 :a1534 :a1534. +:a1535 :a1535 :a1535. +:a1536 :a1536 :a1536. +:a1537 :a1537 :a1537. +:a1538 :a1538 :a1538. +:a1539 :a1539 :a1539. +:a1540 :a1540 :a1540. +:a1541 :a1541 :a1541. +:a1542 :a1542 :a1542. +:a1543 :a1543 :a1543. +:a1544 :a1544 :a1544. +:a1545 :a1545 :a1545. +:a1546 :a1546 :a1546. +:a1547 :a1547 :a1547. +:a1548 :a1548 :a1548. +:a1549 :a1549 :a1549. +:a1550 :a1550 :a1550. +:a1551 :a1551 :a1551. +:a1552 :a1552 :a1552. +:a1553 :a1553 :a1553. +:a1554 :a1554 :a1554. +:a1555 :a1555 :a1555. +:a1556 :a1556 :a1556. +:a1557 :a1557 :a1557. +:a1558 :a1558 :a1558. +:a1559 :a1559 :a1559. +:a1560 :a1560 :a1560. +:a1561 :a1561 :a1561. +:a1562 :a1562 :a1562. +:a1563 :a1563 :a1563. +:a1564 :a1564 :a1564. +:a1565 :a1565 :a1565. +:a1566 :a1566 :a1566. +:a1567 :a1567 :a1567. +:a1568 :a1568 :a1568. +:a1569 :a1569 :a1569. +:a1570 :a1570 :a1570. +:a1571 :a1571 :a1571. +:a1572 :a1572 :a1572. +:a1573 :a1573 :a1573. +:a1574 :a1574 :a1574. +:a1575 :a1575 :a1575. +:a1576 :a1576 :a1576. +:a1577 :a1577 :a1577. +:a1578 :a1578 :a1578. +:a1579 :a1579 :a1579. +:a1580 :a1580 :a1580. +:a1581 :a1581 :a1581. +:a1582 :a1582 :a1582. +:a1583 :a1583 :a1583. +:a1584 :a1584 :a1584. +:a1585 :a1585 :a1585. +:a1586 :a1586 :a1586. +:a1587 :a1587 :a1587. +:a1588 :a1588 :a1588. +:a1589 :a1589 :a1589. +:a1590 :a1590 :a1590. +:a1591 :a1591 :a1591. +:a1592 :a1592 :a1592. +:a1593 :a1593 :a1593. +:a1594 :a1594 :a1594. +:a1595 :a1595 :a1595. +:a1596 :a1596 :a1596. +:a1597 :a1597 :a1597. +:a1598 :a1598 :a1598. +:a1599 :a1599 :a1599. +:a1600 :a1600 :a1600. +:a1601 :a1601 :a1601. +:a1602 :a1602 :a1602. +:a1603 :a1603 :a1603. +:a1604 :a1604 :a1604. +:a1605 :a1605 :a1605. +:a1606 :a1606 :a1606. +:a1607 :a1607 :a1607. +:a1608 :a1608 :a1608. +:a1609 :a1609 :a1609. +:a1610 :a1610 :a1610. +:a1611 :a1611 :a1611. +:a1612 :a1612 :a1612. +:a1613 :a1613 :a1613. +:a1614 :a1614 :a1614. +:a1615 :a1615 :a1615. +:a1616 :a1616 :a1616. +:a1617 :a1617 :a1617. +:a1618 :a1618 :a1618. +:a1619 :a1619 :a1619. +:a1620 :a1620 :a1620. +:a1621 :a1621 :a1621. +:a1622 :a1622 :a1622. +:a1623 :a1623 :a1623. +:a1624 :a1624 :a1624. +:a1625 :a1625 :a1625. +:a1626 :a1626 :a1626. +:a1627 :a1627 :a1627. +:a1628 :a1628 :a1628. +:a1629 :a1629 :a1629. +:a1630 :a1630 :a1630. +:a1631 :a1631 :a1631. +:a1632 :a1632 :a1632. +:a1633 :a1633 :a1633. +:a1634 :a1634 :a1634. +:a1635 :a1635 :a1635. +:a1636 :a1636 :a1636. +:a1637 :a1637 :a1637. +:a1638 :a1638 :a1638. +:a1639 :a1639 :a1639. +:a1640 :a1640 :a1640. +:a1641 :a1641 :a1641. +:a1642 :a1642 :a1642. +:a1643 :a1643 :a1643. +:a1644 :a1644 :a1644. +:a1645 :a1645 :a1645. +:a1646 :a1646 :a1646. +:a1647 :a1647 :a1647. +:a1648 :a1648 :a1648. +:a1649 :a1649 :a1649. +:a1650 :a1650 :a1650. +:a1651 :a1651 :a1651. +:a1652 :a1652 :a1652. +:a1653 :a1653 :a1653. +:a1654 :a1654 :a1654. +:a1655 :a1655 :a1655. +:a1656 :a1656 :a1656. +:a1657 :a1657 :a1657. +:a1658 :a1658 :a1658. +:a1659 :a1659 :a1659. +:a1660 :a1660 :a1660. +:a1661 :a1661 :a1661. +:a1662 :a1662 :a1662. +:a1663 :a1663 :a1663. +:a1664 :a1664 :a1664. +:a1665 :a1665 :a1665. +:a1666 :a1666 :a1666. +:a1667 :a1667 :a1667. +:a1668 :a1668 :a1668. +:a1669 :a1669 :a1669. +:a1670 :a1670 :a1670. +:a1671 :a1671 :a1671. +:a1672 :a1672 :a1672. +:a1673 :a1673 :a1673. +:a1674 :a1674 :a1674. +:a1675 :a1675 :a1675. +:a1676 :a1676 :a1676. +:a1677 :a1677 :a1677. +:a1678 :a1678 :a1678. +:a1679 :a1679 :a1679. +:a1680 :a1680 :a1680. +:a1681 :a1681 :a1681. +:a1682 :a1682 :a1682. +:a1683 :a1683 :a1683. +:a1684 :a1684 :a1684. +:a1685 :a1685 :a1685. +:a1686 :a1686 :a1686. +:a1687 :a1687 :a1687. +:a1688 :a1688 :a1688. +:a1689 :a1689 :a1689. +:a1690 :a1690 :a1690. +:a1691 :a1691 :a1691. +:a1692 :a1692 :a1692. +:a1693 :a1693 :a1693. +:a1694 :a1694 :a1694. +:a1695 :a1695 :a1695. +:a1696 :a1696 :a1696. +:a1697 :a1697 :a1697. +:a1698 :a1698 :a1698. +:a1699 :a1699 :a1699. +:a1700 :a1700 :a1700. +:a1701 :a1701 :a1701. +:a1702 :a1702 :a1702. +:a1703 :a1703 :a1703. +:a1704 :a1704 :a1704. +:a1705 :a1705 :a1705. +:a1706 :a1706 :a1706. +:a1707 :a1707 :a1707. +:a1708 :a1708 :a1708. +:a1709 :a1709 :a1709. +:a1710 :a1710 :a1710. +:a1711 :a1711 :a1711. +:a1712 :a1712 :a1712. +:a1713 :a1713 :a1713. +:a1714 :a1714 :a1714. +:a1715 :a1715 :a1715. +:a1716 :a1716 :a1716. +:a1717 :a1717 :a1717. +:a1718 :a1718 :a1718. +:a1719 :a1719 :a1719. +:a1720 :a1720 :a1720. +:a1721 :a1721 :a1721. +:a1722 :a1722 :a1722. +:a1723 :a1723 :a1723. +:a1724 :a1724 :a1724. +:a1725 :a1725 :a1725. +:a1726 :a1726 :a1726. +:a1727 :a1727 :a1727. +:a1728 :a1728 :a1728. +:a1729 :a1729 :a1729. +:a1730 :a1730 :a1730. +:a1731 :a1731 :a1731. +:a1732 :a1732 :a1732. +:a1733 :a1733 :a1733. +:a1734 :a1734 :a1734. +:a1735 :a1735 :a1735. +:a1736 :a1736 :a1736. +:a1737 :a1737 :a1737. +:a1738 :a1738 :a1738. +:a1739 :a1739 :a1739. +:a1740 :a1740 :a1740. +:a1741 :a1741 :a1741. +:a1742 :a1742 :a1742. +:a1743 :a1743 :a1743. +:a1744 :a1744 :a1744. +:a1745 :a1745 :a1745. +:a1746 :a1746 :a1746. +:a1747 :a1747 :a1747. +:a1748 :a1748 :a1748. +:a1749 :a1749 :a1749. +:a1750 :a1750 :a1750. +:a1751 :a1751 :a1751. +:a1752 :a1752 :a1752. +:a1753 :a1753 :a1753. +:a1754 :a1754 :a1754. +:a1755 :a1755 :a1755. +:a1756 :a1756 :a1756. +:a1757 :a1757 :a1757. +:a1758 :a1758 :a1758. +:a1759 :a1759 :a1759. +:a1760 :a1760 :a1760. +:a1761 :a1761 :a1761. +:a1762 :a1762 :a1762. +:a1763 :a1763 :a1763. +:a1764 :a1764 :a1764. +:a1765 :a1765 :a1765. +:a1766 :a1766 :a1766. +:a1767 :a1767 :a1767. +:a1768 :a1768 :a1768. +:a1769 :a1769 :a1769. +:a1770 :a1770 :a1770. +:a1771 :a1771 :a1771. +:a1772 :a1772 :a1772. +:a1773 :a1773 :a1773. +:a1774 :a1774 :a1774. +:a1775 :a1775 :a1775. +:a1776 :a1776 :a1776. +:a1777 :a1777 :a1777. +:a1778 :a1778 :a1778. +:a1779 :a1779 :a1779. +:a1780 :a1780 :a1780. +:a1781 :a1781 :a1781. +:a1782 :a1782 :a1782. +:a1783 :a1783 :a1783. +:a1784 :a1784 :a1784. +:a1785 :a1785 :a1785. +:a1786 :a1786 :a1786. +:a1787 :a1787 :a1787. +:a1788 :a1788 :a1788. +:a1789 :a1789 :a1789. +:a1790 :a1790 :a1790. +:a1791 :a1791 :a1791. +:a1792 :a1792 :a1792. +:a1793 :a1793 :a1793. +:a1794 :a1794 :a1794. +:a1795 :a1795 :a1795. +:a1796 :a1796 :a1796. +:a1797 :a1797 :a1797. +:a1798 :a1798 :a1798. +:a1799 :a1799 :a1799. +:a1800 :a1800 :a1800. +:a1801 :a1801 :a1801. +:a1802 :a1802 :a1802. +:a1803 :a1803 :a1803. +:a1804 :a1804 :a1804. +:a1805 :a1805 :a1805. +:a1806 :a1806 :a1806. +:a1807 :a1807 :a1807. +:a1808 :a1808 :a1808. +:a1809 :a1809 :a1809. +:a1810 :a1810 :a1810. +:a1811 :a1811 :a1811. +:a1812 :a1812 :a1812. +:a1813 :a1813 :a1813. +:a1814 :a1814 :a1814. +:a1815 :a1815 :a1815. +:a1816 :a1816 :a1816. +:a1817 :a1817 :a1817. +:a1818 :a1818 :a1818. +:a1819 :a1819 :a1819. +:a1820 :a1820 :a1820. +:a1821 :a1821 :a1821. +:a1822 :a1822 :a1822. +:a1823 :a1823 :a1823. +:a1824 :a1824 :a1824. +:a1825 :a1825 :a1825. +:a1826 :a1826 :a1826. +:a1827 :a1827 :a1827. +:a1828 :a1828 :a1828. +:a1829 :a1829 :a1829. +:a1830 :a1830 :a1830. +:a1831 :a1831 :a1831. +:a1832 :a1832 :a1832. +:a1833 :a1833 :a1833. +:a1834 :a1834 :a1834. +:a1835 :a1835 :a1835. +:a1836 :a1836 :a1836. +:a1837 :a1837 :a1837. +:a1838 :a1838 :a1838. +:a1839 :a1839 :a1839. +:a1840 :a1840 :a1840. +:a1841 :a1841 :a1841. +:a1842 :a1842 :a1842. +:a1843 :a1843 :a1843. +:a1844 :a1844 :a1844. +:a1845 :a1845 :a1845. +:a1846 :a1846 :a1846. +:a1847 :a1847 :a1847. +:a1848 :a1848 :a1848. +:a1849 :a1849 :a1849. +:a1850 :a1850 :a1850. +:a1851 :a1851 :a1851. +:a1852 :a1852 :a1852. +:a1853 :a1853 :a1853. +:a1854 :a1854 :a1854. +:a1855 :a1855 :a1855. +:a1856 :a1856 :a1856. +:a1857 :a1857 :a1857. +:a1858 :a1858 :a1858. +:a1859 :a1859 :a1859. +:a1860 :a1860 :a1860. +:a1861 :a1861 :a1861. +:a1862 :a1862 :a1862. +:a1863 :a1863 :a1863. +:a1864 :a1864 :a1864. +:a1865 :a1865 :a1865. +:a1866 :a1866 :a1866. +:a1867 :a1867 :a1867. +:a1868 :a1868 :a1868. +:a1869 :a1869 :a1869. +:a1870 :a1870 :a1870. +:a1871 :a1871 :a1871. +:a1872 :a1872 :a1872. +:a1873 :a1873 :a1873. +:a1874 :a1874 :a1874. +:a1875 :a1875 :a1875. +:a1876 :a1876 :a1876. +:a1877 :a1877 :a1877. +:a1878 :a1878 :a1878. +:a1879 :a1879 :a1879. +:a1880 :a1880 :a1880. +:a1881 :a1881 :a1881. +:a1882 :a1882 :a1882. +:a1883 :a1883 :a1883. +:a1884 :a1884 :a1884. +:a1885 :a1885 :a1885. +:a1886 :a1886 :a1886. +:a1887 :a1887 :a1887. +:a1888 :a1888 :a1888. +:a1889 :a1889 :a1889. +:a1890 :a1890 :a1890. +:a1891 :a1891 :a1891. +:a1892 :a1892 :a1892. +:a1893 :a1893 :a1893. +:a1894 :a1894 :a1894. +:a1895 :a1895 :a1895. +:a1896 :a1896 :a1896. +:a1897 :a1897 :a1897. +:a1898 :a1898 :a1898. +:a1899 :a1899 :a1899. +:a1900 :a1900 :a1900. +:a1901 :a1901 :a1901. +:a1902 :a1902 :a1902. +:a1903 :a1903 :a1903. +:a1904 :a1904 :a1904. +:a1905 :a1905 :a1905. +:a1906 :a1906 :a1906. +:a1907 :a1907 :a1907. +:a1908 :a1908 :a1908. +:a1909 :a1909 :a1909. +:a1910 :a1910 :a1910. +:a1911 :a1911 :a1911. +:a1912 :a1912 :a1912. +:a1913 :a1913 :a1913. +:a1914 :a1914 :a1914. +:a1915 :a1915 :a1915. +:a1916 :a1916 :a1916. +:a1917 :a1917 :a1917. +:a1918 :a1918 :a1918. +:a1919 :a1919 :a1919. +:a1920 :a1920 :a1920. +:a1921 :a1921 :a1921. +:a1922 :a1922 :a1922. +:a1923 :a1923 :a1923. +:a1924 :a1924 :a1924. +:a1925 :a1925 :a1925. +:a1926 :a1926 :a1926. +:a1927 :a1927 :a1927. +:a1928 :a1928 :a1928. +:a1929 :a1929 :a1929. +:a1930 :a1930 :a1930. +:a1931 :a1931 :a1931. +:a1932 :a1932 :a1932. +:a1933 :a1933 :a1933. +:a1934 :a1934 :a1934. +:a1935 :a1935 :a1935. +:a1936 :a1936 :a1936. +:a1937 :a1937 :a1937. +:a1938 :a1938 :a1938. +:a1939 :a1939 :a1939. +:a1940 :a1940 :a1940. +:a1941 :a1941 :a1941. +:a1942 :a1942 :a1942. +:a1943 :a1943 :a1943. +:a1944 :a1944 :a1944. +:a1945 :a1945 :a1945. +:a1946 :a1946 :a1946. +:a1947 :a1947 :a1947. +:a1948 :a1948 :a1948. +:a1949 :a1949 :a1949. +:a1950 :a1950 :a1950. +:a1951 :a1951 :a1951. +:a1952 :a1952 :a1952. +:a1953 :a1953 :a1953. +:a1954 :a1954 :a1954. +:a1955 :a1955 :a1955. +:a1956 :a1956 :a1956. +:a1957 :a1957 :a1957. +:a1958 :a1958 :a1958. +:a1959 :a1959 :a1959. +:a1960 :a1960 :a1960. +:a1961 :a1961 :a1961. +:a1962 :a1962 :a1962. +:a1963 :a1963 :a1963. +:a1964 :a1964 :a1964. +:a1965 :a1965 :a1965. +:a1966 :a1966 :a1966. +:a1967 :a1967 :a1967. +:a1968 :a1968 :a1968. +:a1969 :a1969 :a1969. +:a1970 :a1970 :a1970. +:a1971 :a1971 :a1971. +:a1972 :a1972 :a1972. +:a1973 :a1973 :a1973. +:a1974 :a1974 :a1974. +:a1975 :a1975 :a1975. +:a1976 :a1976 :a1976. +:a1977 :a1977 :a1977. +:a1978 :a1978 :a1978. +:a1979 :a1979 :a1979. +:a1980 :a1980 :a1980. +:a1981 :a1981 :a1981. +:a1982 :a1982 :a1982. +:a1983 :a1983 :a1983. +:a1984 :a1984 :a1984. +:a1985 :a1985 :a1985. +:a1986 :a1986 :a1986. +:a1987 :a1987 :a1987. +:a1988 :a1988 :a1988. +:a1989 :a1989 :a1989. +:a1990 :a1990 :a1990. +:a1991 :a1991 :a1991. +:a1992 :a1992 :a1992. +:a1993 :a1993 :a1993. +:a1994 :a1994 :a1994. +:a1995 :a1995 :a1995. +:a1996 :a1996 :a1996. +:a1997 :a1997 :a1997. +:a1998 :a1998 :a1998. +:a1999 :a1999 :a1999. +:a2000 :a2000 :a2000. +:a2001 :a2001 :a2001. +:a2002 :a2002 :a2002. +:a2003 :a2003 :a2003. +:a2004 :a2004 :a2004. +:a2005 :a2005 :a2005. +:a2006 :a2006 :a2006. +:a2007 :a2007 :a2007. +:a2008 :a2008 :a2008. +:a2009 :a2009 :a2009. +:a2010 :a2010 :a2010. +:a2011 :a2011 :a2011. +:a2012 :a2012 :a2012. +:a2013 :a2013 :a2013. +:a2014 :a2014 :a2014. +:a2015 :a2015 :a2015. +:a2016 :a2016 :a2016. +:a2017 :a2017 :a2017. +:a2018 :a2018 :a2018. +:a2019 :a2019 :a2019. +:a2020 :a2020 :a2020. +:a2021 :a2021 :a2021. +:a2022 :a2022 :a2022. +:a2023 :a2023 :a2023. +:a2024 :a2024 :a2024. +:a2025 :a2025 :a2025. +:a2026 :a2026 :a2026. +:a2027 :a2027 :a2027. +:a2028 :a2028 :a2028. +:a2029 :a2029 :a2029. +:a2030 :a2030 :a2030. +:a2031 :a2031 :a2031. +:a2032 :a2032 :a2032. +:a2033 :a2033 :a2033. +:a2034 :a2034 :a2034. +:a2035 :a2035 :a2035. +:a2036 :a2036 :a2036. +:a2037 :a2037 :a2037. +:a2038 :a2038 :a2038. +:a2039 :a2039 :a2039. +:a2040 :a2040 :a2040. +:a2041 :a2041 :a2041. +:a2042 :a2042 :a2042. +:a2043 :a2043 :a2043. +:a2044 :a2044 :a2044. +:a2045 :a2045 :a2045. +:a2046 :a2046 :a2046. +:a2047 :a2047 :a2047. +:a2048 :a2048 :a2048. +:a2049 :a2049 :a2049. +:a2050 :a2050 :a2050. +:a2051 :a2051 :a2051. +:a2052 :a2052 :a2052. +:a2053 :a2053 :a2053. +:a2054 :a2054 :a2054. +:a2055 :a2055 :a2055. +:a2056 :a2056 :a2056. +:a2057 :a2057 :a2057. +:a2058 :a2058 :a2058. +:a2059 :a2059 :a2059. +:a2060 :a2060 :a2060. +:a2061 :a2061 :a2061. +:a2062 :a2062 :a2062. +:a2063 :a2063 :a2063. +:a2064 :a2064 :a2064. +:a2065 :a2065 :a2065. +:a2066 :a2066 :a2066. +:a2067 :a2067 :a2067. +:a2068 :a2068 :a2068. +:a2069 :a2069 :a2069. +:a2070 :a2070 :a2070. +:a2071 :a2071 :a2071. +:a2072 :a2072 :a2072. +:a2073 :a2073 :a2073. +:a2074 :a2074 :a2074. +:a2075 :a2075 :a2075. +:a2076 :a2076 :a2076. +:a2077 :a2077 :a2077. +:a2078 :a2078 :a2078. +:a2079 :a2079 :a2079. +:a2080 :a2080 :a2080. +:a2081 :a2081 :a2081. +:a2082 :a2082 :a2082. +:a2083 :a2083 :a2083. +:a2084 :a2084 :a2084. +:a2085 :a2085 :a2085. +:a2086 :a2086 :a2086. +:a2087 :a2087 :a2087. +:a2088 :a2088 :a2088. +:a2089 :a2089 :a2089. +:a2090 :a2090 :a2090. +:a2091 :a2091 :a2091. +:a2092 :a2092 :a2092. +:a2093 :a2093 :a2093. +:a2094 :a2094 :a2094. +:a2095 :a2095 :a2095. +:a2096 :a2096 :a2096. +:a2097 :a2097 :a2097. +:a2098 :a2098 :a2098. +:a2099 :a2099 :a2099. +:a2100 :a2100 :a2100. +:a2101 :a2101 :a2101. +:a2102 :a2102 :a2102. +:a2103 :a2103 :a2103. +:a2104 :a2104 :a2104. +:a2105 :a2105 :a2105. +:a2106 :a2106 :a2106. +:a2107 :a2107 :a2107. +:a2108 :a2108 :a2108. +:a2109 :a2109 :a2109. +:a2110 :a2110 :a2110. +:a2111 :a2111 :a2111. +:a2112 :a2112 :a2112. +:a2113 :a2113 :a2113. +:a2114 :a2114 :a2114. +:a2115 :a2115 :a2115. +:a2116 :a2116 :a2116. +:a2117 :a2117 :a2117. +:a2118 :a2118 :a2118. +:a2119 :a2119 :a2119. +:a2120 :a2120 :a2120. +:a2121 :a2121 :a2121. +:a2122 :a2122 :a2122. +:a2123 :a2123 :a2123. +:a2124 :a2124 :a2124. +:a2125 :a2125 :a2125. +:a2126 :a2126 :a2126. +:a2127 :a2127 :a2127. +:a2128 :a2128 :a2128. +:a2129 :a2129 :a2129. +:a2130 :a2130 :a2130. +:a2131 :a2131 :a2131. +:a2132 :a2132 :a2132. +:a2133 :a2133 :a2133. +:a2134 :a2134 :a2134. +:a2135 :a2135 :a2135. +:a2136 :a2136 :a2136. +:a2137 :a2137 :a2137. +:a2138 :a2138 :a2138. +:a2139 :a2139 :a2139. +:a2140 :a2140 :a2140. +:a2141 :a2141 :a2141. +:a2142 :a2142 :a2142. +:a2143 :a2143 :a2143. +:a2144 :a2144 :a2144. +:a2145 :a2145 :a2145. +:a2146 :a2146 :a2146. +:a2147 :a2147 :a2147. +:a2148 :a2148 :a2148. +:a2149 :a2149 :a2149. +:a2150 :a2150 :a2150. +:a2151 :a2151 :a2151. +:a2152 :a2152 :a2152. +:a2153 :a2153 :a2153. +:a2154 :a2154 :a2154. +:a2155 :a2155 :a2155. +:a2156 :a2156 :a2156. +:a2157 :a2157 :a2157. +:a2158 :a2158 :a2158. +:a2159 :a2159 :a2159. +:a2160 :a2160 :a2160. +:a2161 :a2161 :a2161. +:a2162 :a2162 :a2162. +:a2163 :a2163 :a2163. +:a2164 :a2164 :a2164. +:a2165 :a2165 :a2165. +:a2166 :a2166 :a2166. +:a2167 :a2167 :a2167. +:a2168 :a2168 :a2168. +:a2169 :a2169 :a2169. +:a2170 :a2170 :a2170. +:a2171 :a2171 :a2171. +:a2172 :a2172 :a2172. +:a2173 :a2173 :a2173. +:a2174 :a2174 :a2174. +:a2175 :a2175 :a2175. +:a2176 :a2176 :a2176. +:a2177 :a2177 :a2177. +:a2178 :a2178 :a2178. +:a2179 :a2179 :a2179. +:a2180 :a2180 :a2180. +:a2181 :a2181 :a2181. +:a2182 :a2182 :a2182. +:a2183 :a2183 :a2183. +:a2184 :a2184 :a2184. +:a2185 :a2185 :a2185. +:a2186 :a2186 :a2186. +:a2187 :a2187 :a2187. +:a2188 :a2188 :a2188. +:a2189 :a2189 :a2189. +:a2190 :a2190 :a2190. +:a2191 :a2191 :a2191. +:a2192 :a2192 :a2192. +:a2193 :a2193 :a2193. +:a2194 :a2194 :a2194. +:a2195 :a2195 :a2195. +:a2196 :a2196 :a2196. +:a2197 :a2197 :a2197. +:a2198 :a2198 :a2198. +:a2199 :a2199 :a2199. +:a2200 :a2200 :a2200. +:a2201 :a2201 :a2201. +:a2202 :a2202 :a2202. +:a2203 :a2203 :a2203. +:a2204 :a2204 :a2204. +:a2205 :a2205 :a2205. +:a2206 :a2206 :a2206. +:a2207 :a2207 :a2207. +:a2208 :a2208 :a2208. +:a2209 :a2209 :a2209. +:a2210 :a2210 :a2210. +:a2211 :a2211 :a2211. +:a2212 :a2212 :a2212. +:a2213 :a2213 :a2213. +:a2214 :a2214 :a2214. +:a2215 :a2215 :a2215. +:a2216 :a2216 :a2216. +:a2217 :a2217 :a2217. +:a2218 :a2218 :a2218. +:a2219 :a2219 :a2219. +:a2220 :a2220 :a2220. +:a2221 :a2221 :a2221. +:a2222 :a2222 :a2222. +:a2223 :a2223 :a2223. +:a2224 :a2224 :a2224. +:a2225 :a2225 :a2225. +:a2226 :a2226 :a2226. +:a2227 :a2227 :a2227. +:a2228 :a2228 :a2228. +:a2229 :a2229 :a2229. +:a2230 :a2230 :a2230. +:a2231 :a2231 :a2231. +:a2232 :a2232 :a2232. +:a2233 :a2233 :a2233. +:a2234 :a2234 :a2234. +:a2235 :a2235 :a2235. +:a2236 :a2236 :a2236. +:a2237 :a2237 :a2237. +:a2238 :a2238 :a2238. +:a2239 :a2239 :a2239. +:a2240 :a2240 :a2240. +:a2241 :a2241 :a2241. +:a2242 :a2242 :a2242. +:a2243 :a2243 :a2243. +:a2244 :a2244 :a2244. +:a2245 :a2245 :a2245. +:a2246 :a2246 :a2246. +:a2247 :a2247 :a2247. +:a2248 :a2248 :a2248. +:a2249 :a2249 :a2249. +:a2250 :a2250 :a2250. +:a2251 :a2251 :a2251. +:a2252 :a2252 :a2252. +:a2253 :a2253 :a2253. +:a2254 :a2254 :a2254. +:a2255 :a2255 :a2255. +:a2256 :a2256 :a2256. +:a2257 :a2257 :a2257. +:a2258 :a2258 :a2258. +:a2259 :a2259 :a2259. +:a2260 :a2260 :a2260. +:a2261 :a2261 :a2261. +:a2262 :a2262 :a2262. +:a2263 :a2263 :a2263. +:a2264 :a2264 :a2264. +:a2265 :a2265 :a2265. +:a2266 :a2266 :a2266. +:a2267 :a2267 :a2267. +:a2268 :a2268 :a2268. +:a2269 :a2269 :a2269. +:a2270 :a2270 :a2270. +:a2271 :a2271 :a2271. +:a2272 :a2272 :a2272. +:a2273 :a2273 :a2273. +:a2274 :a2274 :a2274. +:a2275 :a2275 :a2275. +:a2276 :a2276 :a2276. +:a2277 :a2277 :a2277. +:a2278 :a2278 :a2278. +:a2279 :a2279 :a2279. +:a2280 :a2280 :a2280. +:a2281 :a2281 :a2281. +:a2282 :a2282 :a2282. +:a2283 :a2283 :a2283. +:a2284 :a2284 :a2284. +:a2285 :a2285 :a2285. +:a2286 :a2286 :a2286. +:a2287 :a2287 :a2287. +:a2288 :a2288 :a2288. +:a2289 :a2289 :a2289. +:a2290 :a2290 :a2290. +:a2291 :a2291 :a2291. +:a2292 :a2292 :a2292. +:a2293 :a2293 :a2293. +:a2294 :a2294 :a2294. +:a2295 :a2295 :a2295. +:a2296 :a2296 :a2296. +:a2297 :a2297 :a2297. +:a2298 :a2298 :a2298. +:a2299 :a2299 :a2299. +:a2300 :a2300 :a2300. +:a2301 :a2301 :a2301. +:a2302 :a2302 :a2302. +:a2303 :a2303 :a2303. +:a2304 :a2304 :a2304. +:a2305 :a2305 :a2305. +:a2306 :a2306 :a2306. +:a2307 :a2307 :a2307. +:a2308 :a2308 :a2308. +:a2309 :a2309 :a2309. +:a2310 :a2310 :a2310. +:a2311 :a2311 :a2311. +:a2312 :a2312 :a2312. +:a2313 :a2313 :a2313. +:a2314 :a2314 :a2314. +:a2315 :a2315 :a2315. +:a2316 :a2316 :a2316. +:a2317 :a2317 :a2317. +:a2318 :a2318 :a2318. +:a2319 :a2319 :a2319. +:a2320 :a2320 :a2320. +:a2321 :a2321 :a2321. +:a2322 :a2322 :a2322. +:a2323 :a2323 :a2323. +:a2324 :a2324 :a2324. +:a2325 :a2325 :a2325. +:a2326 :a2326 :a2326. +:a2327 :a2327 :a2327. +:a2328 :a2328 :a2328. +:a2329 :a2329 :a2329. +:a2330 :a2330 :a2330. +:a2331 :a2331 :a2331. +:a2332 :a2332 :a2332. +:a2333 :a2333 :a2333. +:a2334 :a2334 :a2334. +:a2335 :a2335 :a2335. +:a2336 :a2336 :a2336. +:a2337 :a2337 :a2337. +:a2338 :a2338 :a2338. +:a2339 :a2339 :a2339. +:a2340 :a2340 :a2340. +:a2341 :a2341 :a2341. +:a2342 :a2342 :a2342. +:a2343 :a2343 :a2343. +:a2344 :a2344 :a2344. +:a2345 :a2345 :a2345. +:a2346 :a2346 :a2346. +:a2347 :a2347 :a2347. +:a2348 :a2348 :a2348. +:a2349 :a2349 :a2349. +:a2350 :a2350 :a2350. +:a2351 :a2351 :a2351. +:a2352 :a2352 :a2352. +:a2353 :a2353 :a2353. +:a2354 :a2354 :a2354. +:a2355 :a2355 :a2355. +:a2356 :a2356 :a2356. +:a2357 :a2357 :a2357. +:a2358 :a2358 :a2358. +:a2359 :a2359 :a2359. +:a2360 :a2360 :a2360. +:a2361 :a2361 :a2361. +:a2362 :a2362 :a2362. +:a2363 :a2363 :a2363. +:a2364 :a2364 :a2364. +:a2365 :a2365 :a2365. +:a2366 :a2366 :a2366. +:a2367 :a2367 :a2367. +:a2368 :a2368 :a2368. +:a2369 :a2369 :a2369. +:a2370 :a2370 :a2370. +:a2371 :a2371 :a2371. +:a2372 :a2372 :a2372. +:a2373 :a2373 :a2373. +:a2374 :a2374 :a2374. +:a2375 :a2375 :a2375. +:a2376 :a2376 :a2376. +:a2377 :a2377 :a2377. +:a2378 :a2378 :a2378. +:a2379 :a2379 :a2379. +:a2380 :a2380 :a2380. +:a2381 :a2381 :a2381. +:a2382 :a2382 :a2382. +:a2383 :a2383 :a2383. +:a2384 :a2384 :a2384. +:a2385 :a2385 :a2385. +:a2386 :a2386 :a2386. +:a2387 :a2387 :a2387. +:a2388 :a2388 :a2388. +:a2389 :a2389 :a2389. +:a2390 :a2390 :a2390. +:a2391 :a2391 :a2391. +:a2392 :a2392 :a2392. +:a2393 :a2393 :a2393. +:a2394 :a2394 :a2394. +:a2395 :a2395 :a2395. +:a2396 :a2396 :a2396. +:a2397 :a2397 :a2397. +:a2398 :a2398 :a2398. +:a2399 :a2399 :a2399. +:a2400 :a2400 :a2400. +:a2401 :a2401 :a2401. +:a2402 :a2402 :a2402. +:a2403 :a2403 :a2403. +:a2404 :a2404 :a2404. +:a2405 :a2405 :a2405. +:a2406 :a2406 :a2406. +:a2407 :a2407 :a2407. +:a2408 :a2408 :a2408. +:a2409 :a2409 :a2409. +:a2410 :a2410 :a2410. +:a2411 :a2411 :a2411. +:a2412 :a2412 :a2412. +:a2413 :a2413 :a2413. +:a2414 :a2414 :a2414. +:a2415 :a2415 :a2415. +:a2416 :a2416 :a2416. +:a2417 :a2417 :a2417. +:a2418 :a2418 :a2418. +:a2419 :a2419 :a2419. +:a2420 :a2420 :a2420. +:a2421 :a2421 :a2421. +:a2422 :a2422 :a2422. +:a2423 :a2423 :a2423. +:a2424 :a2424 :a2424. +:a2425 :a2425 :a2425. +:a2426 :a2426 :a2426. +:a2427 :a2427 :a2427. +:a2428 :a2428 :a2428. +:a2429 :a2429 :a2429. +:a2430 :a2430 :a2430. +:a2431 :a2431 :a2431. +:a2432 :a2432 :a2432. +:a2433 :a2433 :a2433. +:a2434 :a2434 :a2434. +:a2435 :a2435 :a2435. +:a2436 :a2436 :a2436. +:a2437 :a2437 :a2437. +:a2438 :a2438 :a2438. +:a2439 :a2439 :a2439. +:a2440 :a2440 :a2440. +:a2441 :a2441 :a2441. +:a2442 :a2442 :a2442. +:a2443 :a2443 :a2443. +:a2444 :a2444 :a2444. +:a2445 :a2445 :a2445. +:a2446 :a2446 :a2446. +:a2447 :a2447 :a2447. +:a2448 :a2448 :a2448. +:a2449 :a2449 :a2449. +:a2450 :a2450 :a2450. +:a2451 :a2451 :a2451. +:a2452 :a2452 :a2452. +:a2453 :a2453 :a2453. +:a2454 :a2454 :a2454. +:a2455 :a2455 :a2455. +:a2456 :a2456 :a2456. +:a2457 :a2457 :a2457. +:a2458 :a2458 :a2458. +:a2459 :a2459 :a2459. +:a2460 :a2460 :a2460. +:a2461 :a2461 :a2461. +:a2462 :a2462 :a2462. +:a2463 :a2463 :a2463. +:a2464 :a2464 :a2464. +:a2465 :a2465 :a2465. +:a2466 :a2466 :a2466. +:a2467 :a2467 :a2467. +:a2468 :a2468 :a2468. +:a2469 :a2469 :a2469. +:a2470 :a2470 :a2470. +:a2471 :a2471 :a2471. +:a2472 :a2472 :a2472. +:a2473 :a2473 :a2473. +:a2474 :a2474 :a2474. +:a2475 :a2475 :a2475. +:a2476 :a2476 :a2476. +:a2477 :a2477 :a2477. +:a2478 :a2478 :a2478. +:a2479 :a2479 :a2479. +:a2480 :a2480 :a2480. +:a2481 :a2481 :a2481. +:a2482 :a2482 :a2482. +:a2483 :a2483 :a2483. +:a2484 :a2484 :a2484. +:a2485 :a2485 :a2485. +:a2486 :a2486 :a2486. +:a2487 :a2487 :a2487. +:a2488 :a2488 :a2488. +:a2489 :a2489 :a2489. +:a2490 :a2490 :a2490. +:a2491 :a2491 :a2491. +:a2492 :a2492 :a2492. +:a2493 :a2493 :a2493. +:a2494 :a2494 :a2494. +:a2495 :a2495 :a2495. +:a2496 :a2496 :a2496. +:a2497 :a2497 :a2497. +:a2498 :a2498 :a2498. +:a2499 :a2499 :a2499. +:a2500 :a2500 :a2500. +:a2501 :a2501 :a2501. +:a2502 :a2502 :a2502. +:a2503 :a2503 :a2503. +:a2504 :a2504 :a2504. +:a2505 :a2505 :a2505. +:a2506 :a2506 :a2506. +:a2507 :a2507 :a2507. +:a2508 :a2508 :a2508. +:a2509 :a2509 :a2509. +:a2510 :a2510 :a2510. +:a2511 :a2511 :a2511. +:a2512 :a2512 :a2512. +:a2513 :a2513 :a2513. +:a2514 :a2514 :a2514. +:a2515 :a2515 :a2515. +:a2516 :a2516 :a2516. +:a2517 :a2517 :a2517. +:a2518 :a2518 :a2518. +:a2519 :a2519 :a2519. +:a2520 :a2520 :a2520. +:a2521 :a2521 :a2521. +:a2522 :a2522 :a2522. +:a2523 :a2523 :a2523. +:a2524 :a2524 :a2524. +:a2525 :a2525 :a2525. +:a2526 :a2526 :a2526. +:a2527 :a2527 :a2527. +:a2528 :a2528 :a2528. +:a2529 :a2529 :a2529. +:a2530 :a2530 :a2530. +:a2531 :a2531 :a2531. +:a2532 :a2532 :a2532. +:a2533 :a2533 :a2533. +:a2534 :a2534 :a2534. +:a2535 :a2535 :a2535. +:a2536 :a2536 :a2536. +:a2537 :a2537 :a2537. +:a2538 :a2538 :a2538. +:a2539 :a2539 :a2539. +:a2540 :a2540 :a2540. +:a2541 :a2541 :a2541. +:a2542 :a2542 :a2542. +:a2543 :a2543 :a2543. +:a2544 :a2544 :a2544. +:a2545 :a2545 :a2545. +:a2546 :a2546 :a2546. +:a2547 :a2547 :a2547. +:a2548 :a2548 :a2548. +:a2549 :a2549 :a2549. +:a2550 :a2550 :a2550. +:a2551 :a2551 :a2551. +:a2552 :a2552 :a2552. +:a2553 :a2553 :a2553. +:a2554 :a2554 :a2554. +:a2555 :a2555 :a2555. +:a2556 :a2556 :a2556. +:a2557 :a2557 :a2557. +:a2558 :a2558 :a2558. +:a2559 :a2559 :a2559. +:a2560 :a2560 :a2560. +:a2561 :a2561 :a2561. +:a2562 :a2562 :a2562. +:a2563 :a2563 :a2563. +:a2564 :a2564 :a2564. +:a2565 :a2565 :a2565. +:a2566 :a2566 :a2566. +:a2567 :a2567 :a2567. +:a2568 :a2568 :a2568. +:a2569 :a2569 :a2569. +:a2570 :a2570 :a2570. +:a2571 :a2571 :a2571. +:a2572 :a2572 :a2572. +:a2573 :a2573 :a2573. +:a2574 :a2574 :a2574. +:a2575 :a2575 :a2575. +:a2576 :a2576 :a2576. +:a2577 :a2577 :a2577. +:a2578 :a2578 :a2578. +:a2579 :a2579 :a2579. +:a2580 :a2580 :a2580. +:a2581 :a2581 :a2581. +:a2582 :a2582 :a2582. +:a2583 :a2583 :a2583. +:a2584 :a2584 :a2584. +:a2585 :a2585 :a2585. +:a2586 :a2586 :a2586. +:a2587 :a2587 :a2587. +:a2588 :a2588 :a2588. +:a2589 :a2589 :a2589. +:a2590 :a2590 :a2590. +:a2591 :a2591 :a2591. +:a2592 :a2592 :a2592. +:a2593 :a2593 :a2593. +:a2594 :a2594 :a2594. +:a2595 :a2595 :a2595. +:a2596 :a2596 :a2596. +:a2597 :a2597 :a2597. +:a2598 :a2598 :a2598. +:a2599 :a2599 :a2599. +:a2600 :a2600 :a2600. +:a2601 :a2601 :a2601. +:a2602 :a2602 :a2602. +:a2603 :a2603 :a2603. +:a2604 :a2604 :a2604. +:a2605 :a2605 :a2605. +:a2606 :a2606 :a2606. +:a2607 :a2607 :a2607. +:a2608 :a2608 :a2608. +:a2609 :a2609 :a2609. +:a2610 :a2610 :a2610. +:a2611 :a2611 :a2611. +:a2612 :a2612 :a2612. +:a2613 :a2613 :a2613. +:a2614 :a2614 :a2614. +:a2615 :a2615 :a2615. +:a2616 :a2616 :a2616. +:a2617 :a2617 :a2617. +:a2618 :a2618 :a2618. +:a2619 :a2619 :a2619. +:a2620 :a2620 :a2620. +:a2621 :a2621 :a2621. +:a2622 :a2622 :a2622. +:a2623 :a2623 :a2623. +:a2624 :a2624 :a2624. +:a2625 :a2625 :a2625. +:a2626 :a2626 :a2626. +:a2627 :a2627 :a2627. +:a2628 :a2628 :a2628. +:a2629 :a2629 :a2629. +:a2630 :a2630 :a2630. +:a2631 :a2631 :a2631. +:a2632 :a2632 :a2632. +:a2633 :a2633 :a2633. +:a2634 :a2634 :a2634. +:a2635 :a2635 :a2635. +:a2636 :a2636 :a2636. +:a2637 :a2637 :a2637. +:a2638 :a2638 :a2638. +:a2639 :a2639 :a2639. +:a2640 :a2640 :a2640. +:a2641 :a2641 :a2641. +:a2642 :a2642 :a2642. +:a2643 :a2643 :a2643. +:a2644 :a2644 :a2644. +:a2645 :a2645 :a2645. +:a2646 :a2646 :a2646. +:a2647 :a2647 :a2647. +:a2648 :a2648 :a2648. +:a2649 :a2649 :a2649. +:a2650 :a2650 :a2650. +:a2651 :a2651 :a2651. +:a2652 :a2652 :a2652. +:a2653 :a2653 :a2653. +:a2654 :a2654 :a2654. +:a2655 :a2655 :a2655. +:a2656 :a2656 :a2656. +:a2657 :a2657 :a2657. +:a2658 :a2658 :a2658. +:a2659 :a2659 :a2659. +:a2660 :a2660 :a2660. +:a2661 :a2661 :a2661. +:a2662 :a2662 :a2662. +:a2663 :a2663 :a2663. +:a2664 :a2664 :a2664. +:a2665 :a2665 :a2665. +:a2666 :a2666 :a2666. +:a2667 :a2667 :a2667. +:a2668 :a2668 :a2668. +:a2669 :a2669 :a2669. +:a2670 :a2670 :a2670. +:a2671 :a2671 :a2671. +:a2672 :a2672 :a2672. +:a2673 :a2673 :a2673. +:a2674 :a2674 :a2674. +:a2675 :a2675 :a2675. +:a2676 :a2676 :a2676. +:a2677 :a2677 :a2677. +:a2678 :a2678 :a2678. +:a2679 :a2679 :a2679. +:a2680 :a2680 :a2680. +:a2681 :a2681 :a2681. +:a2682 :a2682 :a2682. +:a2683 :a2683 :a2683. +:a2684 :a2684 :a2684. +:a2685 :a2685 :a2685. +:a2686 :a2686 :a2686. +:a2687 :a2687 :a2687. +:a2688 :a2688 :a2688. +:a2689 :a2689 :a2689. +:a2690 :a2690 :a2690. +:a2691 :a2691 :a2691. +:a2692 :a2692 :a2692. +:a2693 :a2693 :a2693. +:a2694 :a2694 :a2694. +:a2695 :a2695 :a2695. +:a2696 :a2696 :a2696. +:a2697 :a2697 :a2697. +:a2698 :a2698 :a2698. +:a2699 :a2699 :a2699. +:a2700 :a2700 :a2700. +:a2701 :a2701 :a2701. +:a2702 :a2702 :a2702. +:a2703 :a2703 :a2703. +:a2704 :a2704 :a2704. +:a2705 :a2705 :a2705. +:a2706 :a2706 :a2706. +:a2707 :a2707 :a2707. +:a2708 :a2708 :a2708. +:a2709 :a2709 :a2709. +:a2710 :a2710 :a2710. +:a2711 :a2711 :a2711. +:a2712 :a2712 :a2712. +:a2713 :a2713 :a2713. +:a2714 :a2714 :a2714. +:a2715 :a2715 :a2715. +:a2716 :a2716 :a2716. +:a2717 :a2717 :a2717. +:a2718 :a2718 :a2718. +:a2719 :a2719 :a2719. +:a2720 :a2720 :a2720. +:a2721 :a2721 :a2721. +:a2722 :a2722 :a2722. +:a2723 :a2723 :a2723. +:a2724 :a2724 :a2724. +:a2725 :a2725 :a2725. +:a2726 :a2726 :a2726. +:a2727 :a2727 :a2727. +:a2728 :a2728 :a2728. +:a2729 :a2729 :a2729. +:a2730 :a2730 :a2730. +:a2731 :a2731 :a2731. +:a2732 :a2732 :a2732. +:a2733 :a2733 :a2733. +:a2734 :a2734 :a2734. +:a2735 :a2735 :a2735. +:a2736 :a2736 :a2736. +:a2737 :a2737 :a2737. +:a2738 :a2738 :a2738. +:a2739 :a2739 :a2739. +:a2740 :a2740 :a2740. +:a2741 :a2741 :a2741. +:a2742 :a2742 :a2742. +:a2743 :a2743 :a2743. +:a2744 :a2744 :a2744. +:a2745 :a2745 :a2745. +:a2746 :a2746 :a2746. +:a2747 :a2747 :a2747. +:a2748 :a2748 :a2748. +:a2749 :a2749 :a2749. +:a2750 :a2750 :a2750. +:a2751 :a2751 :a2751. +:a2752 :a2752 :a2752. +:a2753 :a2753 :a2753. +:a2754 :a2754 :a2754. +:a2755 :a2755 :a2755. +:a2756 :a2756 :a2756. +:a2757 :a2757 :a2757. +:a2758 :a2758 :a2758. +:a2759 :a2759 :a2759. +:a2760 :a2760 :a2760. +:a2761 :a2761 :a2761. +:a2762 :a2762 :a2762. +:a2763 :a2763 :a2763. +:a2764 :a2764 :a2764. +:a2765 :a2765 :a2765. +:a2766 :a2766 :a2766. +:a2767 :a2767 :a2767. +:a2768 :a2768 :a2768. +:a2769 :a2769 :a2769. +:a2770 :a2770 :a2770. +:a2771 :a2771 :a2771. +:a2772 :a2772 :a2772. +:a2773 :a2773 :a2773. +:a2774 :a2774 :a2774. +:a2775 :a2775 :a2775. +:a2776 :a2776 :a2776. +:a2777 :a2777 :a2777. +:a2778 :a2778 :a2778. +:a2779 :a2779 :a2779. +:a2780 :a2780 :a2780. +:a2781 :a2781 :a2781. +:a2782 :a2782 :a2782. +:a2783 :a2783 :a2783. +:a2784 :a2784 :a2784. +:a2785 :a2785 :a2785. +:a2786 :a2786 :a2786. +:a2787 :a2787 :a2787. +:a2788 :a2788 :a2788. +:a2789 :a2789 :a2789. +:a2790 :a2790 :a2790. +:a2791 :a2791 :a2791. +:a2792 :a2792 :a2792. +:a2793 :a2793 :a2793. +:a2794 :a2794 :a2794. +:a2795 :a2795 :a2795. +:a2796 :a2796 :a2796. +:a2797 :a2797 :a2797. +:a2798 :a2798 :a2798. +:a2799 :a2799 :a2799. +:a2800 :a2800 :a2800. +:a2801 :a2801 :a2801. +:a2802 :a2802 :a2802. +:a2803 :a2803 :a2803. +:a2804 :a2804 :a2804. +:a2805 :a2805 :a2805. +:a2806 :a2806 :a2806. +:a2807 :a2807 :a2807. +:a2808 :a2808 :a2808. +:a2809 :a2809 :a2809. +:a2810 :a2810 :a2810. +:a2811 :a2811 :a2811. +:a2812 :a2812 :a2812. +:a2813 :a2813 :a2813. +:a2814 :a2814 :a2814. +:a2815 :a2815 :a2815. +:a2816 :a2816 :a2816. +:a2817 :a2817 :a2817. +:a2818 :a2818 :a2818. +:a2819 :a2819 :a2819. +:a2820 :a2820 :a2820. +:a2821 :a2821 :a2821. +:a2822 :a2822 :a2822. +:a2823 :a2823 :a2823. +:a2824 :a2824 :a2824. +:a2825 :a2825 :a2825. +:a2826 :a2826 :a2826. +:a2827 :a2827 :a2827. +:a2828 :a2828 :a2828. +:a2829 :a2829 :a2829. +:a2830 :a2830 :a2830. +:a2831 :a2831 :a2831. +:a2832 :a2832 :a2832. +:a2833 :a2833 :a2833. +:a2834 :a2834 :a2834. +:a2835 :a2835 :a2835. +:a2836 :a2836 :a2836. +:a2837 :a2837 :a2837. +:a2838 :a2838 :a2838. +:a2839 :a2839 :a2839. +:a2840 :a2840 :a2840. +:a2841 :a2841 :a2841. +:a2842 :a2842 :a2842. +:a2843 :a2843 :a2843. +:a2844 :a2844 :a2844. +:a2845 :a2845 :a2845. +:a2846 :a2846 :a2846. +:a2847 :a2847 :a2847. +:a2848 :a2848 :a2848. +:a2849 :a2849 :a2849. +:a2850 :a2850 :a2850. +:a2851 :a2851 :a2851. +:a2852 :a2852 :a2852. +:a2853 :a2853 :a2853. +:a2854 :a2854 :a2854. +:a2855 :a2855 :a2855. +:a2856 :a2856 :a2856. +:a2857 :a2857 :a2857. +:a2858 :a2858 :a2858. +:a2859 :a2859 :a2859. +:a2860 :a2860 :a2860. +:a2861 :a2861 :a2861. +:a2862 :a2862 :a2862. +:a2863 :a2863 :a2863. +:a2864 :a2864 :a2864. +:a2865 :a2865 :a2865. +:a2866 :a2866 :a2866. +:a2867 :a2867 :a2867. +:a2868 :a2868 :a2868. +:a2869 :a2869 :a2869. +:a2870 :a2870 :a2870. +:a2871 :a2871 :a2871. +:a2872 :a2872 :a2872. +:a2873 :a2873 :a2873. +:a2874 :a2874 :a2874. +:a2875 :a2875 :a2875. +:a2876 :a2876 :a2876. +:a2877 :a2877 :a2877. +:a2878 :a2878 :a2878. +:a2879 :a2879 :a2879. +:a2880 :a2880 :a2880. +:a2881 :a2881 :a2881. +:a2882 :a2882 :a2882. +:a2883 :a2883 :a2883. +:a2884 :a2884 :a2884. +:a2885 :a2885 :a2885. +:a2886 :a2886 :a2886. +:a2887 :a2887 :a2887. +:a2888 :a2888 :a2888. +:a2889 :a2889 :a2889. +:a2890 :a2890 :a2890. +:a2891 :a2891 :a2891. +:a2892 :a2892 :a2892. +:a2893 :a2893 :a2893. +:a2894 :a2894 :a2894. +:a2895 :a2895 :a2895. +:a2896 :a2896 :a2896. +:a2897 :a2897 :a2897. +:a2898 :a2898 :a2898. +:a2899 :a2899 :a2899. +:a2900 :a2900 :a2900. +:a2901 :a2901 :a2901. +:a2902 :a2902 :a2902. +:a2903 :a2903 :a2903. +:a2904 :a2904 :a2904. +:a2905 :a2905 :a2905. +:a2906 :a2906 :a2906. +:a2907 :a2907 :a2907. +:a2908 :a2908 :a2908. +:a2909 :a2909 :a2909. +:a2910 :a2910 :a2910. +:a2911 :a2911 :a2911. +:a2912 :a2912 :a2912. +:a2913 :a2913 :a2913. +:a2914 :a2914 :a2914. +:a2915 :a2915 :a2915. +:a2916 :a2916 :a2916. +:a2917 :a2917 :a2917. +:a2918 :a2918 :a2918. +:a2919 :a2919 :a2919. +:a2920 :a2920 :a2920. +:a2921 :a2921 :a2921. +:a2922 :a2922 :a2922. +:a2923 :a2923 :a2923. +:a2924 :a2924 :a2924. +:a2925 :a2925 :a2925. +:a2926 :a2926 :a2926. +:a2927 :a2927 :a2927. +:a2928 :a2928 :a2928. +:a2929 :a2929 :a2929. +:a2930 :a2930 :a2930. +:a2931 :a2931 :a2931. +:a2932 :a2932 :a2932. +:a2933 :a2933 :a2933. +:a2934 :a2934 :a2934. +:a2935 :a2935 :a2935. +:a2936 :a2936 :a2936. +:a2937 :a2937 :a2937. +:a2938 :a2938 :a2938. +:a2939 :a2939 :a2939. +:a2940 :a2940 :a2940. +:a2941 :a2941 :a2941. +:a2942 :a2942 :a2942. +:a2943 :a2943 :a2943. +:a2944 :a2944 :a2944. +:a2945 :a2945 :a2945. +:a2946 :a2946 :a2946. +:a2947 :a2947 :a2947. +:a2948 :a2948 :a2948. +:a2949 :a2949 :a2949. +:a2950 :a2950 :a2950. +:a2951 :a2951 :a2951. +:a2952 :a2952 :a2952. +:a2953 :a2953 :a2953. +:a2954 :a2954 :a2954. +:a2955 :a2955 :a2955. +:a2956 :a2956 :a2956. +:a2957 :a2957 :a2957. +:a2958 :a2958 :a2958. +:a2959 :a2959 :a2959. +:a2960 :a2960 :a2960. +:a2961 :a2961 :a2961. +:a2962 :a2962 :a2962. +:a2963 :a2963 :a2963. +:a2964 :a2964 :a2964. +:a2965 :a2965 :a2965. +:a2966 :a2966 :a2966. +:a2967 :a2967 :a2967. +:a2968 :a2968 :a2968. +:a2969 :a2969 :a2969. +:a2970 :a2970 :a2970. +:a2971 :a2971 :a2971. +:a2972 :a2972 :a2972. +:a2973 :a2973 :a2973. +:a2974 :a2974 :a2974. +:a2975 :a2975 :a2975. +:a2976 :a2976 :a2976. +:a2977 :a2977 :a2977. +:a2978 :a2978 :a2978. +:a2979 :a2979 :a2979. +:a2980 :a2980 :a2980. +:a2981 :a2981 :a2981. +:a2982 :a2982 :a2982. +:a2983 :a2983 :a2983. +:a2984 :a2984 :a2984. +:a2985 :a2985 :a2985. +:a2986 :a2986 :a2986. +:a2987 :a2987 :a2987. +:a2988 :a2988 :a2988. +:a2989 :a2989 :a2989. +:a2990 :a2990 :a2990. +:a2991 :a2991 :a2991. +:a2992 :a2992 :a2992. +:a2993 :a2993 :a2993. +:a2994 :a2994 :a2994. +:a2995 :a2995 :a2995. +:a2996 :a2996 :a2996. +:a2997 :a2997 :a2997. +:a2998 :a2998 :a2998. +:a2999 :a2999 :a2999. +:a3000 :a3000 :a3000. +:a3001 :a3001 :a3001. +:a3002 :a3002 :a3002. +:a3003 :a3003 :a3003. +:a3004 :a3004 :a3004. +:a3005 :a3005 :a3005. +:a3006 :a3006 :a3006. +:a3007 :a3007 :a3007. +:a3008 :a3008 :a3008. +:a3009 :a3009 :a3009. +:a3010 :a3010 :a3010. +:a3011 :a3011 :a3011. +:a3012 :a3012 :a3012. +:a3013 :a3013 :a3013. +:a3014 :a3014 :a3014. +:a3015 :a3015 :a3015. +:a3016 :a3016 :a3016. +:a3017 :a3017 :a3017. +:a3018 :a3018 :a3018. +:a3019 :a3019 :a3019. +:a3020 :a3020 :a3020. +:a3021 :a3021 :a3021. +:a3022 :a3022 :a3022. +:a3023 :a3023 :a3023. +:a3024 :a3024 :a3024. +:a3025 :a3025 :a3025. +:a3026 :a3026 :a3026. +:a3027 :a3027 :a3027. +:a3028 :a3028 :a3028. +:a3029 :a3029 :a3029. +:a3030 :a3030 :a3030. +:a3031 :a3031 :a3031. +:a3032 :a3032 :a3032. +:a3033 :a3033 :a3033. +:a3034 :a3034 :a3034. +:a3035 :a3035 :a3035. +:a3036 :a3036 :a3036. +:a3037 :a3037 :a3037. +:a3038 :a3038 :a3038. +:a3039 :a3039 :a3039. +:a3040 :a3040 :a3040. +:a3041 :a3041 :a3041. +:a3042 :a3042 :a3042. +:a3043 :a3043 :a3043. +:a3044 :a3044 :a3044. +:a3045 :a3045 :a3045. +:a3046 :a3046 :a3046. +:a3047 :a3047 :a3047. +:a3048 :a3048 :a3048. +:a3049 :a3049 :a3049. +:a3050 :a3050 :a3050. +:a3051 :a3051 :a3051. +:a3052 :a3052 :a3052. +:a3053 :a3053 :a3053. +:a3054 :a3054 :a3054. +:a3055 :a3055 :a3055. +:a3056 :a3056 :a3056. +:a3057 :a3057 :a3057. +:a3058 :a3058 :a3058. +:a3059 :a3059 :a3059. +:a3060 :a3060 :a3060. +:a3061 :a3061 :a3061. +:a3062 :a3062 :a3062. +:a3063 :a3063 :a3063. +:a3064 :a3064 :a3064. +:a3065 :a3065 :a3065. +:a3066 :a3066 :a3066. +:a3067 :a3067 :a3067. +:a3068 :a3068 :a3068. +:a3069 :a3069 :a3069. +:a3070 :a3070 :a3070. +:a3071 :a3071 :a3071. +:a3072 :a3072 :a3072. +:a3073 :a3073 :a3073. +:a3074 :a3074 :a3074. +:a3075 :a3075 :a3075. +:a3076 :a3076 :a3076. +:a3077 :a3077 :a3077. +:a3078 :a3078 :a3078. +:a3079 :a3079 :a3079. +:a3080 :a3080 :a3080. +:a3081 :a3081 :a3081. +:a3082 :a3082 :a3082. +:a3083 :a3083 :a3083. +:a3084 :a3084 :a3084. +:a3085 :a3085 :a3085. +:a3086 :a3086 :a3086. +:a3087 :a3087 :a3087. +:a3088 :a3088 :a3088. +:a3089 :a3089 :a3089. +:a3090 :a3090 :a3090. +:a3091 :a3091 :a3091. +:a3092 :a3092 :a3092. +:a3093 :a3093 :a3093. +:a3094 :a3094 :a3094. +:a3095 :a3095 :a3095. +:a3096 :a3096 :a3096. +:a3097 :a3097 :a3097. +:a3098 :a3098 :a3098. +:a3099 :a3099 :a3099. +:a3100 :a3100 :a3100. +:a3101 :a3101 :a3101. +:a3102 :a3102 :a3102. +:a3103 :a3103 :a3103. +:a3104 :a3104 :a3104. +:a3105 :a3105 :a3105. +:a3106 :a3106 :a3106. +:a3107 :a3107 :a3107. +:a3108 :a3108 :a3108. +:a3109 :a3109 :a3109. +:a3110 :a3110 :a3110. +:a3111 :a3111 :a3111. +:a3112 :a3112 :a3112. +:a3113 :a3113 :a3113. +:a3114 :a3114 :a3114. +:a3115 :a3115 :a3115. +:a3116 :a3116 :a3116. +:a3117 :a3117 :a3117. +:a3118 :a3118 :a3118. +:a3119 :a3119 :a3119. +:a3120 :a3120 :a3120. +:a3121 :a3121 :a3121. +:a3122 :a3122 :a3122. +:a3123 :a3123 :a3123. +:a3124 :a3124 :a3124. +:a3125 :a3125 :a3125. +:a3126 :a3126 :a3126. +:a3127 :a3127 :a3127. +:a3128 :a3128 :a3128. +:a3129 :a3129 :a3129. +:a3130 :a3130 :a3130. +:a3131 :a3131 :a3131. +:a3132 :a3132 :a3132. +:a3133 :a3133 :a3133. +:a3134 :a3134 :a3134. +:a3135 :a3135 :a3135. +:a3136 :a3136 :a3136. +:a3137 :a3137 :a3137. +:a3138 :a3138 :a3138. +:a3139 :a3139 :a3139. +:a3140 :a3140 :a3140. +:a3141 :a3141 :a3141. +:a3142 :a3142 :a3142. +:a3143 :a3143 :a3143. +:a3144 :a3144 :a3144. +:a3145 :a3145 :a3145. +:a3146 :a3146 :a3146. +:a3147 :a3147 :a3147. +:a3148 :a3148 :a3148. +:a3149 :a3149 :a3149. +:a3150 :a3150 :a3150. +:a3151 :a3151 :a3151. +:a3152 :a3152 :a3152. +:a3153 :a3153 :a3153. +:a3154 :a3154 :a3154. +:a3155 :a3155 :a3155. +:a3156 :a3156 :a3156. +:a3157 :a3157 :a3157. +:a3158 :a3158 :a3158. +:a3159 :a3159 :a3159. +:a3160 :a3160 :a3160. +:a3161 :a3161 :a3161. +:a3162 :a3162 :a3162. +:a3163 :a3163 :a3163. +:a3164 :a3164 :a3164. +:a3165 :a3165 :a3165. +:a3166 :a3166 :a3166. +:a3167 :a3167 :a3167. +:a3168 :a3168 :a3168. +:a3169 :a3169 :a3169. +:a3170 :a3170 :a3170. +:a3171 :a3171 :a3171. +:a3172 :a3172 :a3172. +:a3173 :a3173 :a3173. +:a3174 :a3174 :a3174. +:a3175 :a3175 :a3175. +:a3176 :a3176 :a3176. +:a3177 :a3177 :a3177. +:a3178 :a3178 :a3178. +:a3179 :a3179 :a3179. +:a3180 :a3180 :a3180. +:a3181 :a3181 :a3181. +:a3182 :a3182 :a3182. +:a3183 :a3183 :a3183. +:a3184 :a3184 :a3184. +:a3185 :a3185 :a3185. +:a3186 :a3186 :a3186. +:a3187 :a3187 :a3187. +:a3188 :a3188 :a3188. +:a3189 :a3189 :a3189. +:a3190 :a3190 :a3190. +:a3191 :a3191 :a3191. +:a3192 :a3192 :a3192. +:a3193 :a3193 :a3193. +:a3194 :a3194 :a3194. +:a3195 :a3195 :a3195. +:a3196 :a3196 :a3196. +:a3197 :a3197 :a3197. +:a3198 :a3198 :a3198. +:a3199 :a3199 :a3199. +:a3200 :a3200 :a3200. +:a3201 :a3201 :a3201. +:a3202 :a3202 :a3202. +:a3203 :a3203 :a3203. +:a3204 :a3204 :a3204. +:a3205 :a3205 :a3205. +:a3206 :a3206 :a3206. +:a3207 :a3207 :a3207. +:a3208 :a3208 :a3208. +:a3209 :a3209 :a3209. +:a3210 :a3210 :a3210. +:a3211 :a3211 :a3211. +:a3212 :a3212 :a3212. +:a3213 :a3213 :a3213. +:a3214 :a3214 :a3214. +:a3215 :a3215 :a3215. +:a3216 :a3216 :a3216. +:a3217 :a3217 :a3217. +:a3218 :a3218 :a3218. +:a3219 :a3219 :a3219. +:a3220 :a3220 :a3220. +:a3221 :a3221 :a3221. +:a3222 :a3222 :a3222. +:a3223 :a3223 :a3223. +:a3224 :a3224 :a3224. +:a3225 :a3225 :a3225. +:a3226 :a3226 :a3226. +:a3227 :a3227 :a3227. +:a3228 :a3228 :a3228. +:a3229 :a3229 :a3229. +:a3230 :a3230 :a3230. +:a3231 :a3231 :a3231. +:a3232 :a3232 :a3232. +:a3233 :a3233 :a3233. +:a3234 :a3234 :a3234. +:a3235 :a3235 :a3235. +:a3236 :a3236 :a3236. +:a3237 :a3237 :a3237. +:a3238 :a3238 :a3238. +:a3239 :a3239 :a3239. +:a3240 :a3240 :a3240. +:a3241 :a3241 :a3241. +:a3242 :a3242 :a3242. +:a3243 :a3243 :a3243. +:a3244 :a3244 :a3244. +:a3245 :a3245 :a3245. +:a3246 :a3246 :a3246. +:a3247 :a3247 :a3247. +:a3248 :a3248 :a3248. +:a3249 :a3249 :a3249. +:a3250 :a3250 :a3250. +:a3251 :a3251 :a3251. +:a3252 :a3252 :a3252. +:a3253 :a3253 :a3253. +:a3254 :a3254 :a3254. +:a3255 :a3255 :a3255. +:a3256 :a3256 :a3256. +:a3257 :a3257 :a3257. +:a3258 :a3258 :a3258. +:a3259 :a3259 :a3259. +:a3260 :a3260 :a3260. +:a3261 :a3261 :a3261. +:a3262 :a3262 :a3262. +:a3263 :a3263 :a3263. +:a3264 :a3264 :a3264. +:a3265 :a3265 :a3265. +:a3266 :a3266 :a3266. +:a3267 :a3267 :a3267. +:a3268 :a3268 :a3268. +:a3269 :a3269 :a3269. +:a3270 :a3270 :a3270. +:a3271 :a3271 :a3271. +:a3272 :a3272 :a3272. +:a3273 :a3273 :a3273. +:a3274 :a3274 :a3274. +:a3275 :a3275 :a3275. +:a3276 :a3276 :a3276. +:a3277 :a3277 :a3277. +:a3278 :a3278 :a3278. +:a3279 :a3279 :a3279. +:a3280 :a3280 :a3280. +:a3281 :a3281 :a3281. +:a3282 :a3282 :a3282. +:a3283 :a3283 :a3283. +:a3284 :a3284 :a3284. +:a3285 :a3285 :a3285. +:a3286 :a3286 :a3286. +:a3287 :a3287 :a3287. +:a3288 :a3288 :a3288. +:a3289 :a3289 :a3289. +:a3290 :a3290 :a3290. +:a3291 :a3291 :a3291. +:a3292 :a3292 :a3292. +:a3293 :a3293 :a3293. +:a3294 :a3294 :a3294. +:a3295 :a3295 :a3295. +:a3296 :a3296 :a3296. +:a3297 :a3297 :a3297. +:a3298 :a3298 :a3298. +:a3299 :a3299 :a3299. +:a3300 :a3300 :a3300. +:a3301 :a3301 :a3301. +:a3302 :a3302 :a3302. +:a3303 :a3303 :a3303. +:a3304 :a3304 :a3304. +:a3305 :a3305 :a3305. +:a3306 :a3306 :a3306. +:a3307 :a3307 :a3307. +:a3308 :a3308 :a3308. +:a3309 :a3309 :a3309. +:a3310 :a3310 :a3310. +:a3311 :a3311 :a3311. +:a3312 :a3312 :a3312. +:a3313 :a3313 :a3313. +:a3314 :a3314 :a3314. +:a3315 :a3315 :a3315. +:a3316 :a3316 :a3316. +:a3317 :a3317 :a3317. +:a3318 :a3318 :a3318. +:a3319 :a3319 :a3319. +:a3320 :a3320 :a3320. +:a3321 :a3321 :a3321. +:a3322 :a3322 :a3322. +:a3323 :a3323 :a3323. +:a3324 :a3324 :a3324. +:a3325 :a3325 :a3325. +:a3326 :a3326 :a3326. +:a3327 :a3327 :a3327. +:a3328 :a3328 :a3328. +:a3329 :a3329 :a3329. +:a3330 :a3330 :a3330. +:a3331 :a3331 :a3331. +:a3332 :a3332 :a3332. +:a3333 :a3333 :a3333. +:a3334 :a3334 :a3334. +:a3335 :a3335 :a3335. +:a3336 :a3336 :a3336. +:a3337 :a3337 :a3337. +:a3338 :a3338 :a3338. +:a3339 :a3339 :a3339. +:a3340 :a3340 :a3340. +:a3341 :a3341 :a3341. +:a3342 :a3342 :a3342. +:a3343 :a3343 :a3343. +:a3344 :a3344 :a3344. +:a3345 :a3345 :a3345. +:a3346 :a3346 :a3346. +:a3347 :a3347 :a3347. +:a3348 :a3348 :a3348. +:a3349 :a3349 :a3349. +:a3350 :a3350 :a3350. +:a3351 :a3351 :a3351. +:a3352 :a3352 :a3352. +:a3353 :a3353 :a3353. +:a3354 :a3354 :a3354. +:a3355 :a3355 :a3355. +:a3356 :a3356 :a3356. +:a3357 :a3357 :a3357. +:a3358 :a3358 :a3358. +:a3359 :a3359 :a3359. +:a3360 :a3360 :a3360. +:a3361 :a3361 :a3361. +:a3362 :a3362 :a3362. +:a3363 :a3363 :a3363. +:a3364 :a3364 :a3364. +:a3365 :a3365 :a3365. +:a3366 :a3366 :a3366. +:a3367 :a3367 :a3367. +:a3368 :a3368 :a3368. +:a3369 :a3369 :a3369. +:a3370 :a3370 :a3370. +:a3371 :a3371 :a3371. +:a3372 :a3372 :a3372. +:a3373 :a3373 :a3373. +:a3374 :a3374 :a3374. +:a3375 :a3375 :a3375. +:a3376 :a3376 :a3376. +:a3377 :a3377 :a3377. +:a3378 :a3378 :a3378. +:a3379 :a3379 :a3379. +:a3380 :a3380 :a3380. +:a3381 :a3381 :a3381. +:a3382 :a3382 :a3382. +:a3383 :a3383 :a3383. +:a3384 :a3384 :a3384. +:a3385 :a3385 :a3385. +:a3386 :a3386 :a3386. +:a3387 :a3387 :a3387. +:a3388 :a3388 :a3388. +:a3389 :a3389 :a3389. +:a3390 :a3390 :a3390. +:a3391 :a3391 :a3391. +:a3392 :a3392 :a3392. +:a3393 :a3393 :a3393. +:a3394 :a3394 :a3394. +:a3395 :a3395 :a3395. +:a3396 :a3396 :a3396. +:a3397 :a3397 :a3397. +:a3398 :a3398 :a3398. +:a3399 :a3399 :a3399. +:a3400 :a3400 :a3400. +:a3401 :a3401 :a3401. +:a3402 :a3402 :a3402. +:a3403 :a3403 :a3403. +:a3404 :a3404 :a3404. +:a3405 :a3405 :a3405. +:a3406 :a3406 :a3406. +:a3407 :a3407 :a3407. +:a3408 :a3408 :a3408. +:a3409 :a3409 :a3409. +:a3410 :a3410 :a3410. +:a3411 :a3411 :a3411. +:a3412 :a3412 :a3412. +:a3413 :a3413 :a3413. +:a3414 :a3414 :a3414. +:a3415 :a3415 :a3415. +:a3416 :a3416 :a3416. +:a3417 :a3417 :a3417. +:a3418 :a3418 :a3418. +:a3419 :a3419 :a3419. +:a3420 :a3420 :a3420. +:a3421 :a3421 :a3421. +:a3422 :a3422 :a3422. +:a3423 :a3423 :a3423. +:a3424 :a3424 :a3424. +:a3425 :a3425 :a3425. +:a3426 :a3426 :a3426. +:a3427 :a3427 :a3427. +:a3428 :a3428 :a3428. +:a3429 :a3429 :a3429. +:a3430 :a3430 :a3430. +:a3431 :a3431 :a3431. +:a3432 :a3432 :a3432. +:a3433 :a3433 :a3433. +:a3434 :a3434 :a3434. +:a3435 :a3435 :a3435. +:a3436 :a3436 :a3436. +:a3437 :a3437 :a3437. +:a3438 :a3438 :a3438. +:a3439 :a3439 :a3439. +:a3440 :a3440 :a3440. +:a3441 :a3441 :a3441. +:a3442 :a3442 :a3442. +:a3443 :a3443 :a3443. +:a3444 :a3444 :a3444. +:a3445 :a3445 :a3445. +:a3446 :a3446 :a3446. +:a3447 :a3447 :a3447. +:a3448 :a3448 :a3448. +:a3449 :a3449 :a3449. +:a3450 :a3450 :a3450. +:a3451 :a3451 :a3451. +:a3452 :a3452 :a3452. +:a3453 :a3453 :a3453. +:a3454 :a3454 :a3454. +:a3455 :a3455 :a3455. +:a3456 :a3456 :a3456. +:a3457 :a3457 :a3457. +:a3458 :a3458 :a3458. +:a3459 :a3459 :a3459. +:a3460 :a3460 :a3460. +:a3461 :a3461 :a3461. +:a3462 :a3462 :a3462. +:a3463 :a3463 :a3463. +:a3464 :a3464 :a3464. +:a3465 :a3465 :a3465. +:a3466 :a3466 :a3466. +:a3467 :a3467 :a3467. +:a3468 :a3468 :a3468. +:a3469 :a3469 :a3469. +:a3470 :a3470 :a3470. +:a3471 :a3471 :a3471. +:a3472 :a3472 :a3472. +:a3473 :a3473 :a3473. +:a3474 :a3474 :a3474. +:a3475 :a3475 :a3475. +:a3476 :a3476 :a3476. +:a3477 :a3477 :a3477. +:a3478 :a3478 :a3478. +:a3479 :a3479 :a3479. +:a3480 :a3480 :a3480. +:a3481 :a3481 :a3481. +:a3482 :a3482 :a3482. +:a3483 :a3483 :a3483. +:a3484 :a3484 :a3484. +:a3485 :a3485 :a3485. +:a3486 :a3486 :a3486. +:a3487 :a3487 :a3487. +:a3488 :a3488 :a3488. +:a3489 :a3489 :a3489. +:a3490 :a3490 :a3490. +:a3491 :a3491 :a3491. +:a3492 :a3492 :a3492. +:a3493 :a3493 :a3493. +:a3494 :a3494 :a3494. +:a3495 :a3495 :a3495. +:a3496 :a3496 :a3496. +:a3497 :a3497 :a3497. +:a3498 :a3498 :a3498. +:a3499 :a3499 :a3499. +:a3500 :a3500 :a3500. +:a3501 :a3501 :a3501. +:a3502 :a3502 :a3502. +:a3503 :a3503 :a3503. +:a3504 :a3504 :a3504. +:a3505 :a3505 :a3505. +:a3506 :a3506 :a3506. +:a3507 :a3507 :a3507. +:a3508 :a3508 :a3508. +:a3509 :a3509 :a3509. +:a3510 :a3510 :a3510. +:a3511 :a3511 :a3511. +:a3512 :a3512 :a3512. +:a3513 :a3513 :a3513. +:a3514 :a3514 :a3514. +:a3515 :a3515 :a3515. +:a3516 :a3516 :a3516. +:a3517 :a3517 :a3517. +:a3518 :a3518 :a3518. +:a3519 :a3519 :a3519. +:a3520 :a3520 :a3520. +:a3521 :a3521 :a3521. +:a3522 :a3522 :a3522. +:a3523 :a3523 :a3523. +:a3524 :a3524 :a3524. +:a3525 :a3525 :a3525. +:a3526 :a3526 :a3526. +:a3527 :a3527 :a3527. +:a3528 :a3528 :a3528. +:a3529 :a3529 :a3529. +:a3530 :a3530 :a3530. +:a3531 :a3531 :a3531. +:a3532 :a3532 :a3532. +:a3533 :a3533 :a3533. +:a3534 :a3534 :a3534. +:a3535 :a3535 :a3535. +:a3536 :a3536 :a3536. +:a3537 :a3537 :a3537. +:a3538 :a3538 :a3538. +:a3539 :a3539 :a3539. +:a3540 :a3540 :a3540. +:a3541 :a3541 :a3541. +:a3542 :a3542 :a3542. +:a3543 :a3543 :a3543. +:a3544 :a3544 :a3544. +:a3545 :a3545 :a3545. +:a3546 :a3546 :a3546. +:a3547 :a3547 :a3547. +:a3548 :a3548 :a3548. +:a3549 :a3549 :a3549. +:a3550 :a3550 :a3550. +:a3551 :a3551 :a3551. +:a3552 :a3552 :a3552. +:a3553 :a3553 :a3553. +:a3554 :a3554 :a3554. +:a3555 :a3555 :a3555. +:a3556 :a3556 :a3556. +:a3557 :a3557 :a3557. +:a3558 :a3558 :a3558. +:a3559 :a3559 :a3559. +:a3560 :a3560 :a3560. +:a3561 :a3561 :a3561. +:a3562 :a3562 :a3562. +:a3563 :a3563 :a3563. +:a3564 :a3564 :a3564. +:a3565 :a3565 :a3565. +:a3566 :a3566 :a3566. +:a3567 :a3567 :a3567. +:a3568 :a3568 :a3568. +:a3569 :a3569 :a3569. +:a3570 :a3570 :a3570. +:a3571 :a3571 :a3571. +:a3572 :a3572 :a3572. +:a3573 :a3573 :a3573. +:a3574 :a3574 :a3574. +:a3575 :a3575 :a3575. +:a3576 :a3576 :a3576. +:a3577 :a3577 :a3577. +:a3578 :a3578 :a3578. +:a3579 :a3579 :a3579. +:a3580 :a3580 :a3580. +:a3581 :a3581 :a3581. +:a3582 :a3582 :a3582. +:a3583 :a3583 :a3583. +:a3584 :a3584 :a3584. +:a3585 :a3585 :a3585. +:a3586 :a3586 :a3586. +:a3587 :a3587 :a3587. +:a3588 :a3588 :a3588. +:a3589 :a3589 :a3589. +:a3590 :a3590 :a3590. +:a3591 :a3591 :a3591. +:a3592 :a3592 :a3592. +:a3593 :a3593 :a3593. +:a3594 :a3594 :a3594. +:a3595 :a3595 :a3595. +:a3596 :a3596 :a3596. +:a3597 :a3597 :a3597. +:a3598 :a3598 :a3598. +:a3599 :a3599 :a3599. +:a3600 :a3600 :a3600. +:a3601 :a3601 :a3601. +:a3602 :a3602 :a3602. +:a3603 :a3603 :a3603. +:a3604 :a3604 :a3604. +:a3605 :a3605 :a3605. +:a3606 :a3606 :a3606. +:a3607 :a3607 :a3607. +:a3608 :a3608 :a3608. +:a3609 :a3609 :a3609. +:a3610 :a3610 :a3610. +:a3611 :a3611 :a3611. +:a3612 :a3612 :a3612. +:a3613 :a3613 :a3613. +:a3614 :a3614 :a3614. +:a3615 :a3615 :a3615. +:a3616 :a3616 :a3616. +:a3617 :a3617 :a3617. +:a3618 :a3618 :a3618. +:a3619 :a3619 :a3619. +:a3620 :a3620 :a3620. +:a3621 :a3621 :a3621. +:a3622 :a3622 :a3622. +:a3623 :a3623 :a3623. +:a3624 :a3624 :a3624. +:a3625 :a3625 :a3625. +:a3626 :a3626 :a3626. +:a3627 :a3627 :a3627. +:a3628 :a3628 :a3628. +:a3629 :a3629 :a3629. +:a3630 :a3630 :a3630. +:a3631 :a3631 :a3631. +:a3632 :a3632 :a3632. +:a3633 :a3633 :a3633. +:a3634 :a3634 :a3634. +:a3635 :a3635 :a3635. +:a3636 :a3636 :a3636. +:a3637 :a3637 :a3637. +:a3638 :a3638 :a3638. +:a3639 :a3639 :a3639. +:a3640 :a3640 :a3640. +:a3641 :a3641 :a3641. +:a3642 :a3642 :a3642. +:a3643 :a3643 :a3643. +:a3644 :a3644 :a3644. +:a3645 :a3645 :a3645. +:a3646 :a3646 :a3646. +:a3647 :a3647 :a3647. +:a3648 :a3648 :a3648. +:a3649 :a3649 :a3649. +:a3650 :a3650 :a3650. +:a3651 :a3651 :a3651. +:a3652 :a3652 :a3652. +:a3653 :a3653 :a3653. +:a3654 :a3654 :a3654. +:a3655 :a3655 :a3655. +:a3656 :a3656 :a3656. +:a3657 :a3657 :a3657. +:a3658 :a3658 :a3658. +:a3659 :a3659 :a3659. +:a3660 :a3660 :a3660. +:a3661 :a3661 :a3661. +:a3662 :a3662 :a3662. +:a3663 :a3663 :a3663. +:a3664 :a3664 :a3664. +:a3665 :a3665 :a3665. +:a3666 :a3666 :a3666. +:a3667 :a3667 :a3667. +:a3668 :a3668 :a3668. +:a3669 :a3669 :a3669. +:a3670 :a3670 :a3670. +:a3671 :a3671 :a3671. +:a3672 :a3672 :a3672. +:a3673 :a3673 :a3673. +:a3674 :a3674 :a3674. +:a3675 :a3675 :a3675. +:a3676 :a3676 :a3676. +:a3677 :a3677 :a3677. +:a3678 :a3678 :a3678. +:a3679 :a3679 :a3679. +:a3680 :a3680 :a3680. +:a3681 :a3681 :a3681. +:a3682 :a3682 :a3682. +:a3683 :a3683 :a3683. +:a3684 :a3684 :a3684. +:a3685 :a3685 :a3685. +:a3686 :a3686 :a3686. +:a3687 :a3687 :a3687. +:a3688 :a3688 :a3688. +:a3689 :a3689 :a3689. +:a3690 :a3690 :a3690. +:a3691 :a3691 :a3691. +:a3692 :a3692 :a3692. +:a3693 :a3693 :a3693. +:a3694 :a3694 :a3694. +:a3695 :a3695 :a3695. +:a3696 :a3696 :a3696. +:a3697 :a3697 :a3697. +:a3698 :a3698 :a3698. +:a3699 :a3699 :a3699. +:a3700 :a3700 :a3700. +:a3701 :a3701 :a3701. +:a3702 :a3702 :a3702. +:a3703 :a3703 :a3703. +:a3704 :a3704 :a3704. +:a3705 :a3705 :a3705. +:a3706 :a3706 :a3706. +:a3707 :a3707 :a3707. +:a3708 :a3708 :a3708. +:a3709 :a3709 :a3709. +:a3710 :a3710 :a3710. +:a3711 :a3711 :a3711. +:a3712 :a3712 :a3712. +:a3713 :a3713 :a3713. +:a3714 :a3714 :a3714. +:a3715 :a3715 :a3715. +:a3716 :a3716 :a3716. +:a3717 :a3717 :a3717. +:a3718 :a3718 :a3718. +:a3719 :a3719 :a3719. +:a3720 :a3720 :a3720. +:a3721 :a3721 :a3721. +:a3722 :a3722 :a3722. +:a3723 :a3723 :a3723. +:a3724 :a3724 :a3724. +:a3725 :a3725 :a3725. +:a3726 :a3726 :a3726. +:a3727 :a3727 :a3727. +:a3728 :a3728 :a3728. +:a3729 :a3729 :a3729. +:a3730 :a3730 :a3730. +:a3731 :a3731 :a3731. +:a3732 :a3732 :a3732. +:a3733 :a3733 :a3733. +:a3734 :a3734 :a3734. +:a3735 :a3735 :a3735. +:a3736 :a3736 :a3736. +:a3737 :a3737 :a3737. +:a3738 :a3738 :a3738. +:a3739 :a3739 :a3739. +:a3740 :a3740 :a3740. +:a3741 :a3741 :a3741. +:a3742 :a3742 :a3742. +:a3743 :a3743 :a3743. +:a3744 :a3744 :a3744. +:a3745 :a3745 :a3745. +:a3746 :a3746 :a3746. +:a3747 :a3747 :a3747. +:a3748 :a3748 :a3748. +:a3749 :a3749 :a3749. +:a3750 :a3750 :a3750. +:a3751 :a3751 :a3751. +:a3752 :a3752 :a3752. +:a3753 :a3753 :a3753. +:a3754 :a3754 :a3754. +:a3755 :a3755 :a3755. +:a3756 :a3756 :a3756. +:a3757 :a3757 :a3757. +:a3758 :a3758 :a3758. +:a3759 :a3759 :a3759. +:a3760 :a3760 :a3760. +:a3761 :a3761 :a3761. +:a3762 :a3762 :a3762. +:a3763 :a3763 :a3763. +:a3764 :a3764 :a3764. +:a3765 :a3765 :a3765. +:a3766 :a3766 :a3766. +:a3767 :a3767 :a3767. +:a3768 :a3768 :a3768. +:a3769 :a3769 :a3769. +:a3770 :a3770 :a3770. +:a3771 :a3771 :a3771. +:a3772 :a3772 :a3772. +:a3773 :a3773 :a3773. +:a3774 :a3774 :a3774. +:a3775 :a3775 :a3775. +:a3776 :a3776 :a3776. +:a3777 :a3777 :a3777. +:a3778 :a3778 :a3778. +:a3779 :a3779 :a3779. +:a3780 :a3780 :a3780. +:a3781 :a3781 :a3781. +:a3782 :a3782 :a3782. +:a3783 :a3783 :a3783. +:a3784 :a3784 :a3784. +:a3785 :a3785 :a3785. +:a3786 :a3786 :a3786. +:a3787 :a3787 :a3787. +:a3788 :a3788 :a3788. +:a3789 :a3789 :a3789. +:a3790 :a3790 :a3790. +:a3791 :a3791 :a3791. +:a3792 :a3792 :a3792. +:a3793 :a3793 :a3793. +:a3794 :a3794 :a3794. +:a3795 :a3795 :a3795. +:a3796 :a3796 :a3796. +:a3797 :a3797 :a3797. +:a3798 :a3798 :a3798. +:a3799 :a3799 :a3799. +:a3800 :a3800 :a3800. +:a3801 :a3801 :a3801. +:a3802 :a3802 :a3802. +:a3803 :a3803 :a3803. +:a3804 :a3804 :a3804. +:a3805 :a3805 :a3805. +:a3806 :a3806 :a3806. +:a3807 :a3807 :a3807. +:a3808 :a3808 :a3808. +:a3809 :a3809 :a3809. +:a3810 :a3810 :a3810. +:a3811 :a3811 :a3811. +:a3812 :a3812 :a3812. +:a3813 :a3813 :a3813. +:a3814 :a3814 :a3814. +:a3815 :a3815 :a3815. +:a3816 :a3816 :a3816. +:a3817 :a3817 :a3817. +:a3818 :a3818 :a3818. +:a3819 :a3819 :a3819. +:a3820 :a3820 :a3820. +:a3821 :a3821 :a3821. +:a3822 :a3822 :a3822. +:a3823 :a3823 :a3823. +:a3824 :a3824 :a3824. +:a3825 :a3825 :a3825. +:a3826 :a3826 :a3826. +:a3827 :a3827 :a3827. +:a3828 :a3828 :a3828. +:a3829 :a3829 :a3829. +:a3830 :a3830 :a3830. +:a3831 :a3831 :a3831. +:a3832 :a3832 :a3832. +:a3833 :a3833 :a3833. +:a3834 :a3834 :a3834. +:a3835 :a3835 :a3835. +:a3836 :a3836 :a3836. +:a3837 :a3837 :a3837. +:a3838 :a3838 :a3838. +:a3839 :a3839 :a3839. +:a3840 :a3840 :a3840. +:a3841 :a3841 :a3841. +:a3842 :a3842 :a3842. +:a3843 :a3843 :a3843. +:a3844 :a3844 :a3844. +:a3845 :a3845 :a3845. +:a3846 :a3846 :a3846. +:a3847 :a3847 :a3847. +:a3848 :a3848 :a3848. +:a3849 :a3849 :a3849. +:a3850 :a3850 :a3850. +:a3851 :a3851 :a3851. +:a3852 :a3852 :a3852. +:a3853 :a3853 :a3853. +:a3854 :a3854 :a3854. +:a3855 :a3855 :a3855. +:a3856 :a3856 :a3856. +:a3857 :a3857 :a3857. +:a3858 :a3858 :a3858. +:a3859 :a3859 :a3859. +:a3860 :a3860 :a3860. +:a3861 :a3861 :a3861. +:a3862 :a3862 :a3862. +:a3863 :a3863 :a3863. +:a3864 :a3864 :a3864. +:a3865 :a3865 :a3865. +:a3866 :a3866 :a3866. +:a3867 :a3867 :a3867. +:a3868 :a3868 :a3868. +:a3869 :a3869 :a3869. +:a3870 :a3870 :a3870. +:a3871 :a3871 :a3871. +:a3872 :a3872 :a3872. +:a3873 :a3873 :a3873. +:a3874 :a3874 :a3874. +:a3875 :a3875 :a3875. +:a3876 :a3876 :a3876. +:a3877 :a3877 :a3877. +:a3878 :a3878 :a3878. +:a3879 :a3879 :a3879. +:a3880 :a3880 :a3880. +:a3881 :a3881 :a3881. +:a3882 :a3882 :a3882. +:a3883 :a3883 :a3883. +:a3884 :a3884 :a3884. +:a3885 :a3885 :a3885. +:a3886 :a3886 :a3886. +:a3887 :a3887 :a3887. +:a3888 :a3888 :a3888. +:a3889 :a3889 :a3889. +:a3890 :a3890 :a3890. +:a3891 :a3891 :a3891. +:a3892 :a3892 :a3892. +:a3893 :a3893 :a3893. +:a3894 :a3894 :a3894. +:a3895 :a3895 :a3895. +:a3896 :a3896 :a3896. +:a3897 :a3897 :a3897. +:a3898 :a3898 :a3898. +:a3899 :a3899 :a3899. +:a3900 :a3900 :a3900. +:a3901 :a3901 :a3901. +:a3902 :a3902 :a3902. +:a3903 :a3903 :a3903. +:a3904 :a3904 :a3904. +:a3905 :a3905 :a3905. +:a3906 :a3906 :a3906. +:a3907 :a3907 :a3907. +:a3908 :a3908 :a3908. +:a3909 :a3909 :a3909. +:a3910 :a3910 :a3910. +:a3911 :a3911 :a3911. +:a3912 :a3912 :a3912. +:a3913 :a3913 :a3913. +:a3914 :a3914 :a3914. +:a3915 :a3915 :a3915. +:a3916 :a3916 :a3916. +:a3917 :a3917 :a3917. +:a3918 :a3918 :a3918. +:a3919 :a3919 :a3919. +:a3920 :a3920 :a3920. +:a3921 :a3921 :a3921. +:a3922 :a3922 :a3922. +:a3923 :a3923 :a3923. +:a3924 :a3924 :a3924. +:a3925 :a3925 :a3925. +:a3926 :a3926 :a3926. +:a3927 :a3927 :a3927. +:a3928 :a3928 :a3928. +:a3929 :a3929 :a3929. +:a3930 :a3930 :a3930. +:a3931 :a3931 :a3931. +:a3932 :a3932 :a3932. +:a3933 :a3933 :a3933. +:a3934 :a3934 :a3934. +:a3935 :a3935 :a3935. +:a3936 :a3936 :a3936. +:a3937 :a3937 :a3937. +:a3938 :a3938 :a3938. +:a3939 :a3939 :a3939. +:a3940 :a3940 :a3940. +:a3941 :a3941 :a3941. +:a3942 :a3942 :a3942. +:a3943 :a3943 :a3943. +:a3944 :a3944 :a3944. +:a3945 :a3945 :a3945. +:a3946 :a3946 :a3946. +:a3947 :a3947 :a3947. +:a3948 :a3948 :a3948. +:a3949 :a3949 :a3949. +:a3950 :a3950 :a3950. +:a3951 :a3951 :a3951. +:a3952 :a3952 :a3952. +:a3953 :a3953 :a3953. +:a3954 :a3954 :a3954. +:a3955 :a3955 :a3955. +:a3956 :a3956 :a3956. +:a3957 :a3957 :a3957. +:a3958 :a3958 :a3958. +:a3959 :a3959 :a3959. +:a3960 :a3960 :a3960. +:a3961 :a3961 :a3961. +:a3962 :a3962 :a3962. +:a3963 :a3963 :a3963. +:a3964 :a3964 :a3964. +:a3965 :a3965 :a3965. +:a3966 :a3966 :a3966. +:a3967 :a3967 :a3967. +:a3968 :a3968 :a3968. +:a3969 :a3969 :a3969. +:a3970 :a3970 :a3970. +:a3971 :a3971 :a3971. +:a3972 :a3972 :a3972. +:a3973 :a3973 :a3973. +:a3974 :a3974 :a3974. +:a3975 :a3975 :a3975. +:a3976 :a3976 :a3976. +:a3977 :a3977 :a3977. +:a3978 :a3978 :a3978. +:a3979 :a3979 :a3979. +:a3980 :a3980 :a3980. +:a3981 :a3981 :a3981. +:a3982 :a3982 :a3982. +:a3983 :a3983 :a3983. +:a3984 :a3984 :a3984. +:a3985 :a3985 :a3985. +:a3986 :a3986 :a3986. +:a3987 :a3987 :a3987. +:a3988 :a3988 :a3988. +:a3989 :a3989 :a3989. +:a3990 :a3990 :a3990. +:a3991 :a3991 :a3991. +:a3992 :a3992 :a3992. +:a3993 :a3993 :a3993. +:a3994 :a3994 :a3994. +:a3995 :a3995 :a3995. +:a3996 :a3996 :a3996. +:a3997 :a3997 :a3997. +:a3998 :a3998 :a3998. +:a3999 :a3999 :a3999. +:a4000 :a4000 :a4000. +:a4001 :a4001 :a4001. +:a4002 :a4002 :a4002. +:a4003 :a4003 :a4003. +:a4004 :a4004 :a4004. +:a4005 :a4005 :a4005. +:a4006 :a4006 :a4006. +:a4007 :a4007 :a4007. +:a4008 :a4008 :a4008. +:a4009 :a4009 :a4009. +:a4010 :a4010 :a4010. +:a4011 :a4011 :a4011. +:a4012 :a4012 :a4012. +:a4013 :a4013 :a4013. +:a4014 :a4014 :a4014. +:a4015 :a4015 :a4015. +:a4016 :a4016 :a4016. +:a4017 :a4017 :a4017. +:a4018 :a4018 :a4018. +:a4019 :a4019 :a4019. +:a4020 :a4020 :a4020. +:a4021 :a4021 :a4021. +:a4022 :a4022 :a4022. +:a4023 :a4023 :a4023. +:a4024 :a4024 :a4024. +:a4025 :a4025 :a4025. +:a4026 :a4026 :a4026. +:a4027 :a4027 :a4027. +:a4028 :a4028 :a4028. +:a4029 :a4029 :a4029. +:a4030 :a4030 :a4030. +:a4031 :a4031 :a4031. +:a4032 :a4032 :a4032. +:a4033 :a4033 :a4033. +:a4034 :a4034 :a4034. +:a4035 :a4035 :a4035. +:a4036 :a4036 :a4036. +:a4037 :a4037 :a4037. +:a4038 :a4038 :a4038. +:a4039 :a4039 :a4039. +:a4040 :a4040 :a4040. +:a4041 :a4041 :a4041. +:a4042 :a4042 :a4042. +:a4043 :a4043 :a4043. +:a4044 :a4044 :a4044. +:a4045 :a4045 :a4045. +:a4046 :a4046 :a4046. +:a4047 :a4047 :a4047. +:a4048 :a4048 :a4048. +:a4049 :a4049 :a4049. +:a4050 :a4050 :a4050. +:a4051 :a4051 :a4051. +:a4052 :a4052 :a4052. +:a4053 :a4053 :a4053. +:a4054 :a4054 :a4054. +:a4055 :a4055 :a4055. +:a4056 :a4056 :a4056. +:a4057 :a4057 :a4057. +:a4058 :a4058 :a4058. +:a4059 :a4059 :a4059. +:a4060 :a4060 :a4060. +:a4061 :a4061 :a4061. +:a4062 :a4062 :a4062. +:a4063 :a4063 :a4063. +:a4064 :a4064 :a4064. +:a4065 :a4065 :a4065. +:a4066 :a4066 :a4066. +:a4067 :a4067 :a4067. +:a4068 :a4068 :a4068. +:a4069 :a4069 :a4069. +:a4070 :a4070 :a4070. +:a4071 :a4071 :a4071. +:a4072 :a4072 :a4072. +:a4073 :a4073 :a4073. +:a4074 :a4074 :a4074. +:a4075 :a4075 :a4075. +:a4076 :a4076 :a4076. +:a4077 :a4077 :a4077. +:a4078 :a4078 :a4078. +:a4079 :a4079 :a4079. +:a4080 :a4080 :a4080. +:a4081 :a4081 :a4081. +:a4082 :a4082 :a4082. +:a4083 :a4083 :a4083. +:a4084 :a4084 :a4084. +:a4085 :a4085 :a4085. +:a4086 :a4086 :a4086. +:a4087 :a4087 :a4087. +:a4088 :a4088 :a4088. +:a4089 :a4089 :a4089. +:a4090 :a4090 :a4090. +:a4091 :a4091 :a4091. +:a4092 :a4092 :a4092. +:a4093 :a4093 :a4093. +:a4094 :a4094 :a4094. +:a4095 :a4095 :a4095. +:a4096 :a4096 :a4096. +:a4097 :a4097 :a4097. +:a4098 :a4098 :a4098. +:a4099 :a4099 :a4099. +:a4100 :a4100 :a4100. +:a4101 :a4101 :a4101. +:a4102 :a4102 :a4102. +:a4103 :a4103 :a4103. +:a4104 :a4104 :a4104. +:a4105 :a4105 :a4105. +:a4106 :a4106 :a4106. +:a4107 :a4107 :a4107. +:a4108 :a4108 :a4108. +:a4109 :a4109 :a4109. +:a4110 :a4110 :a4110. +:a4111 :a4111 :a4111. +:a4112 :a4112 :a4112. +:a4113 :a4113 :a4113. +:a4114 :a4114 :a4114. +:a4115 :a4115 :a4115. +:a4116 :a4116 :a4116. +:a4117 :a4117 :a4117. +:a4118 :a4118 :a4118. +:a4119 :a4119 :a4119. +:a4120 :a4120 :a4120. +:a4121 :a4121 :a4121. +:a4122 :a4122 :a4122. +:a4123 :a4123 :a4123. +:a4124 :a4124 :a4124. +:a4125 :a4125 :a4125. +:a4126 :a4126 :a4126. +:a4127 :a4127 :a4127. +:a4128 :a4128 :a4128. +:a4129 :a4129 :a4129. +:a4130 :a4130 :a4130. +:a4131 :a4131 :a4131. +:a4132 :a4132 :a4132. +:a4133 :a4133 :a4133. +:a4134 :a4134 :a4134. +:a4135 :a4135 :a4135. +:a4136 :a4136 :a4136. +:a4137 :a4137 :a4137. +:a4138 :a4138 :a4138. +:a4139 :a4139 :a4139. +:a4140 :a4140 :a4140. +:a4141 :a4141 :a4141. +:a4142 :a4142 :a4142. +:a4143 :a4143 :a4143. +:a4144 :a4144 :a4144. +:a4145 :a4145 :a4145. +:a4146 :a4146 :a4146. +:a4147 :a4147 :a4147. +:a4148 :a4148 :a4148. +:a4149 :a4149 :a4149. +:a4150 :a4150 :a4150. +:a4151 :a4151 :a4151. +:a4152 :a4152 :a4152. +:a4153 :a4153 :a4153. +:a4154 :a4154 :a4154. +:a4155 :a4155 :a4155. +:a4156 :a4156 :a4156. +:a4157 :a4157 :a4157. +:a4158 :a4158 :a4158. +:a4159 :a4159 :a4159. +:a4160 :a4160 :a4160. +:a4161 :a4161 :a4161. +:a4162 :a4162 :a4162. +:a4163 :a4163 :a4163. +:a4164 :a4164 :a4164. +:a4165 :a4165 :a4165. +:a4166 :a4166 :a4166. +:a4167 :a4167 :a4167. +:a4168 :a4168 :a4168. +:a4169 :a4169 :a4169. +:a4170 :a4170 :a4170. +:a4171 :a4171 :a4171. +:a4172 :a4172 :a4172. +:a4173 :a4173 :a4173. +:a4174 :a4174 :a4174. +:a4175 :a4175 :a4175. +:a4176 :a4176 :a4176. +:a4177 :a4177 :a4177. +:a4178 :a4178 :a4178. +:a4179 :a4179 :a4179. +:a4180 :a4180 :a4180. +:a4181 :a4181 :a4181. +:a4182 :a4182 :a4182. +:a4183 :a4183 :a4183. +:a4184 :a4184 :a4184. +:a4185 :a4185 :a4185. +:a4186 :a4186 :a4186. +:a4187 :a4187 :a4187. +:a4188 :a4188 :a4188. +:a4189 :a4189 :a4189. +:a4190 :a4190 :a4190. +:a4191 :a4191 :a4191. +:a4192 :a4192 :a4192. +:a4193 :a4193 :a4193. +:a4194 :a4194 :a4194. +:a4195 :a4195 :a4195. +:a4196 :a4196 :a4196. +:a4197 :a4197 :a4197. +:a4198 :a4198 :a4198. +:a4199 :a4199 :a4199. +:a4200 :a4200 :a4200. +:a4201 :a4201 :a4201. +:a4202 :a4202 :a4202. +:a4203 :a4203 :a4203. +:a4204 :a4204 :a4204. +:a4205 :a4205 :a4205. +:a4206 :a4206 :a4206. +:a4207 :a4207 :a4207. +:a4208 :a4208 :a4208. +:a4209 :a4209 :a4209. +:a4210 :a4210 :a4210. +:a4211 :a4211 :a4211. +:a4212 :a4212 :a4212. +:a4213 :a4213 :a4213. +:a4214 :a4214 :a4214. +:a4215 :a4215 :a4215. +:a4216 :a4216 :a4216. +:a4217 :a4217 :a4217. +:a4218 :a4218 :a4218. +:a4219 :a4219 :a4219. +:a4220 :a4220 :a4220. +:a4221 :a4221 :a4221. +:a4222 :a4222 :a4222. +:a4223 :a4223 :a4223. +:a4224 :a4224 :a4224. +:a4225 :a4225 :a4225. +:a4226 :a4226 :a4226. +:a4227 :a4227 :a4227. +:a4228 :a4228 :a4228. +:a4229 :a4229 :a4229. +:a4230 :a4230 :a4230. +:a4231 :a4231 :a4231. +:a4232 :a4232 :a4232. +:a4233 :a4233 :a4233. +:a4234 :a4234 :a4234. +:a4235 :a4235 :a4235. +:a4236 :a4236 :a4236. +:a4237 :a4237 :a4237. +:a4238 :a4238 :a4238. +:a4239 :a4239 :a4239. +:a4240 :a4240 :a4240. +:a4241 :a4241 :a4241. +:a4242 :a4242 :a4242. +:a4243 :a4243 :a4243. +:a4244 :a4244 :a4244. +:a4245 :a4245 :a4245. +:a4246 :a4246 :a4246. +:a4247 :a4247 :a4247. +:a4248 :a4248 :a4248. +:a4249 :a4249 :a4249. +:a4250 :a4250 :a4250. +:a4251 :a4251 :a4251. +:a4252 :a4252 :a4252. +:a4253 :a4253 :a4253. +:a4254 :a4254 :a4254. +:a4255 :a4255 :a4255. +:a4256 :a4256 :a4256. +:a4257 :a4257 :a4257. +:a4258 :a4258 :a4258. +:a4259 :a4259 :a4259. +:a4260 :a4260 :a4260. +:a4261 :a4261 :a4261. +:a4262 :a4262 :a4262. +:a4263 :a4263 :a4263. +:a4264 :a4264 :a4264. +:a4265 :a4265 :a4265. +:a4266 :a4266 :a4266. +:a4267 :a4267 :a4267. +:a4268 :a4268 :a4268. +:a4269 :a4269 :a4269. +:a4270 :a4270 :a4270. +:a4271 :a4271 :a4271. +:a4272 :a4272 :a4272. +:a4273 :a4273 :a4273. +:a4274 :a4274 :a4274. +:a4275 :a4275 :a4275. +:a4276 :a4276 :a4276. +:a4277 :a4277 :a4277. +:a4278 :a4278 :a4278. +:a4279 :a4279 :a4279. +:a4280 :a4280 :a4280. +:a4281 :a4281 :a4281. +:a4282 :a4282 :a4282. +:a4283 :a4283 :a4283. +:a4284 :a4284 :a4284. +:a4285 :a4285 :a4285. +:a4286 :a4286 :a4286. +:a4287 :a4287 :a4287. +:a4288 :a4288 :a4288. +:a4289 :a4289 :a4289. +:a4290 :a4290 :a4290. +:a4291 :a4291 :a4291. +:a4292 :a4292 :a4292. +:a4293 :a4293 :a4293. +:a4294 :a4294 :a4294. +:a4295 :a4295 :a4295. +:a4296 :a4296 :a4296. +:a4297 :a4297 :a4297. +:a4298 :a4298 :a4298. +:a4299 :a4299 :a4299. +:a4300 :a4300 :a4300. +:a4301 :a4301 :a4301. +:a4302 :a4302 :a4302. +:a4303 :a4303 :a4303. +:a4304 :a4304 :a4304. +:a4305 :a4305 :a4305. +:a4306 :a4306 :a4306. +:a4307 :a4307 :a4307. +:a4308 :a4308 :a4308. +:a4309 :a4309 :a4309. +:a4310 :a4310 :a4310. +:a4311 :a4311 :a4311. +:a4312 :a4312 :a4312. +:a4313 :a4313 :a4313. +:a4314 :a4314 :a4314. +:a4315 :a4315 :a4315. +:a4316 :a4316 :a4316. +:a4317 :a4317 :a4317. +:a4318 :a4318 :a4318. +:a4319 :a4319 :a4319. +:a4320 :a4320 :a4320. +:a4321 :a4321 :a4321. +:a4322 :a4322 :a4322. +:a4323 :a4323 :a4323. +:a4324 :a4324 :a4324. +:a4325 :a4325 :a4325. +:a4326 :a4326 :a4326. +:a4327 :a4327 :a4327. +:a4328 :a4328 :a4328. +:a4329 :a4329 :a4329. +:a4330 :a4330 :a4330. +:a4331 :a4331 :a4331. +:a4332 :a4332 :a4332. +:a4333 :a4333 :a4333. +:a4334 :a4334 :a4334. +:a4335 :a4335 :a4335. +:a4336 :a4336 :a4336. +:a4337 :a4337 :a4337. +:a4338 :a4338 :a4338. +:a4339 :a4339 :a4339. +:a4340 :a4340 :a4340. +:a4341 :a4341 :a4341. +:a4342 :a4342 :a4342. +:a4343 :a4343 :a4343. +:a4344 :a4344 :a4344. +:a4345 :a4345 :a4345. +:a4346 :a4346 :a4346. +:a4347 :a4347 :a4347. +:a4348 :a4348 :a4348. +:a4349 :a4349 :a4349. +:a4350 :a4350 :a4350. +:a4351 :a4351 :a4351. +:a4352 :a4352 :a4352. +:a4353 :a4353 :a4353. +:a4354 :a4354 :a4354. +:a4355 :a4355 :a4355. +:a4356 :a4356 :a4356. +:a4357 :a4357 :a4357. +:a4358 :a4358 :a4358. +:a4359 :a4359 :a4359. +:a4360 :a4360 :a4360. +:a4361 :a4361 :a4361. +:a4362 :a4362 :a4362. +:a4363 :a4363 :a4363. +:a4364 :a4364 :a4364. +:a4365 :a4365 :a4365. +:a4366 :a4366 :a4366. +:a4367 :a4367 :a4367. +:a4368 :a4368 :a4368. +:a4369 :a4369 :a4369. +:a4370 :a4370 :a4370. +:a4371 :a4371 :a4371. +:a4372 :a4372 :a4372. +:a4373 :a4373 :a4373. +:a4374 :a4374 :a4374. +:a4375 :a4375 :a4375. +:a4376 :a4376 :a4376. +:a4377 :a4377 :a4377. +:a4378 :a4378 :a4378. +:a4379 :a4379 :a4379. +:a4380 :a4380 :a4380. +:a4381 :a4381 :a4381. +:a4382 :a4382 :a4382. +:a4383 :a4383 :a4383. +:a4384 :a4384 :a4384. +:a4385 :a4385 :a4385. +:a4386 :a4386 :a4386. +:a4387 :a4387 :a4387. +:a4388 :a4388 :a4388. +:a4389 :a4389 :a4389. +:a4390 :a4390 :a4390. +:a4391 :a4391 :a4391. +:a4392 :a4392 :a4392. +:a4393 :a4393 :a4393. +:a4394 :a4394 :a4394. +:a4395 :a4395 :a4395. +:a4396 :a4396 :a4396. +:a4397 :a4397 :a4397. +:a4398 :a4398 :a4398. +:a4399 :a4399 :a4399. +:a4400 :a4400 :a4400. +:a4401 :a4401 :a4401. +:a4402 :a4402 :a4402. +:a4403 :a4403 :a4403. +:a4404 :a4404 :a4404. +:a4405 :a4405 :a4405. +:a4406 :a4406 :a4406. +:a4407 :a4407 :a4407. +:a4408 :a4408 :a4408. +:a4409 :a4409 :a4409. +:a4410 :a4410 :a4410. +:a4411 :a4411 :a4411. +:a4412 :a4412 :a4412. +:a4413 :a4413 :a4413. +:a4414 :a4414 :a4414. +:a4415 :a4415 :a4415. +:a4416 :a4416 :a4416. +:a4417 :a4417 :a4417. +:a4418 :a4418 :a4418. +:a4419 :a4419 :a4419. +:a4420 :a4420 :a4420. +:a4421 :a4421 :a4421. +:a4422 :a4422 :a4422. +:a4423 :a4423 :a4423. +:a4424 :a4424 :a4424. +:a4425 :a4425 :a4425. +:a4426 :a4426 :a4426. +:a4427 :a4427 :a4427. +:a4428 :a4428 :a4428. +:a4429 :a4429 :a4429. +:a4430 :a4430 :a4430. +:a4431 :a4431 :a4431. +:a4432 :a4432 :a4432. +:a4433 :a4433 :a4433. +:a4434 :a4434 :a4434. +:a4435 :a4435 :a4435. +:a4436 :a4436 :a4436. +:a4437 :a4437 :a4437. +:a4438 :a4438 :a4438. +:a4439 :a4439 :a4439. +:a4440 :a4440 :a4440. +:a4441 :a4441 :a4441. +:a4442 :a4442 :a4442. +:a4443 :a4443 :a4443. +:a4444 :a4444 :a4444. +:a4445 :a4445 :a4445. +:a4446 :a4446 :a4446. +:a4447 :a4447 :a4447. +:a4448 :a4448 :a4448. +:a4449 :a4449 :a4449. +:a4450 :a4450 :a4450. +:a4451 :a4451 :a4451. +:a4452 :a4452 :a4452. +:a4453 :a4453 :a4453. +:a4454 :a4454 :a4454. +:a4455 :a4455 :a4455. +:a4456 :a4456 :a4456. +:a4457 :a4457 :a4457. +:a4458 :a4458 :a4458. +:a4459 :a4459 :a4459. +:a4460 :a4460 :a4460. +:a4461 :a4461 :a4461. +:a4462 :a4462 :a4462. +:a4463 :a4463 :a4463. +:a4464 :a4464 :a4464. +:a4465 :a4465 :a4465. +:a4466 :a4466 :a4466. +:a4467 :a4467 :a4467. +:a4468 :a4468 :a4468. +:a4469 :a4469 :a4469. +:a4470 :a4470 :a4470. +:a4471 :a4471 :a4471. +:a4472 :a4472 :a4472. +:a4473 :a4473 :a4473. +:a4474 :a4474 :a4474. +:a4475 :a4475 :a4475. +:a4476 :a4476 :a4476. +:a4477 :a4477 :a4477. +:a4478 :a4478 :a4478. +:a4479 :a4479 :a4479. +:a4480 :a4480 :a4480. +:a4481 :a4481 :a4481. +:a4482 :a4482 :a4482. +:a4483 :a4483 :a4483. +:a4484 :a4484 :a4484. +:a4485 :a4485 :a4485. +:a4486 :a4486 :a4486. +:a4487 :a4487 :a4487. +:a4488 :a4488 :a4488. +:a4489 :a4489 :a4489. +:a4490 :a4490 :a4490. +:a4491 :a4491 :a4491. +:a4492 :a4492 :a4492. +:a4493 :a4493 :a4493. +:a4494 :a4494 :a4494. +:a4495 :a4495 :a4495. +:a4496 :a4496 :a4496. +:a4497 :a4497 :a4497. +:a4498 :a4498 :a4498. +:a4499 :a4499 :a4499. +:a4500 :a4500 :a4500. +:a4501 :a4501 :a4501. +:a4502 :a4502 :a4502. +:a4503 :a4503 :a4503. +:a4504 :a4504 :a4504. +:a4505 :a4505 :a4505. +:a4506 :a4506 :a4506. +:a4507 :a4507 :a4507. +:a4508 :a4508 :a4508. +:a4509 :a4509 :a4509. +:a4510 :a4510 :a4510. +:a4511 :a4511 :a4511. +:a4512 :a4512 :a4512. +:a4513 :a4513 :a4513. +:a4514 :a4514 :a4514. +:a4515 :a4515 :a4515. +:a4516 :a4516 :a4516. +:a4517 :a4517 :a4517. +:a4518 :a4518 :a4518. +:a4519 :a4519 :a4519. +:a4520 :a4520 :a4520. +:a4521 :a4521 :a4521. +:a4522 :a4522 :a4522. +:a4523 :a4523 :a4523. +:a4524 :a4524 :a4524. +:a4525 :a4525 :a4525. +:a4526 :a4526 :a4526. +:a4527 :a4527 :a4527. +:a4528 :a4528 :a4528. +:a4529 :a4529 :a4529. +:a4530 :a4530 :a4530. +:a4531 :a4531 :a4531. +:a4532 :a4532 :a4532. +:a4533 :a4533 :a4533. +:a4534 :a4534 :a4534. +:a4535 :a4535 :a4535. +:a4536 :a4536 :a4536. +:a4537 :a4537 :a4537. +:a4538 :a4538 :a4538. +:a4539 :a4539 :a4539. +:a4540 :a4540 :a4540. +:a4541 :a4541 :a4541. +:a4542 :a4542 :a4542. +:a4543 :a4543 :a4543. +:a4544 :a4544 :a4544. +:a4545 :a4545 :a4545. +:a4546 :a4546 :a4546. +:a4547 :a4547 :a4547. +:a4548 :a4548 :a4548. +:a4549 :a4549 :a4549. +:a4550 :a4550 :a4550. +:a4551 :a4551 :a4551. +:a4552 :a4552 :a4552. +:a4553 :a4553 :a4553. +:a4554 :a4554 :a4554. +:a4555 :a4555 :a4555. +:a4556 :a4556 :a4556. +:a4557 :a4557 :a4557. +:a4558 :a4558 :a4558. +:a4559 :a4559 :a4559. +:a4560 :a4560 :a4560. +:a4561 :a4561 :a4561. +:a4562 :a4562 :a4562. +:a4563 :a4563 :a4563. +:a4564 :a4564 :a4564. +:a4565 :a4565 :a4565. +:a4566 :a4566 :a4566. +:a4567 :a4567 :a4567. +:a4568 :a4568 :a4568. +:a4569 :a4569 :a4569. +:a4570 :a4570 :a4570. +:a4571 :a4571 :a4571. +:a4572 :a4572 :a4572. +:a4573 :a4573 :a4573. +:a4574 :a4574 :a4574. +:a4575 :a4575 :a4575. +:a4576 :a4576 :a4576. +:a4577 :a4577 :a4577. +:a4578 :a4578 :a4578. +:a4579 :a4579 :a4579. +:a4580 :a4580 :a4580. +:a4581 :a4581 :a4581. +:a4582 :a4582 :a4582. +:a4583 :a4583 :a4583. +:a4584 :a4584 :a4584. +:a4585 :a4585 :a4585. +:a4586 :a4586 :a4586. +:a4587 :a4587 :a4587. +:a4588 :a4588 :a4588. +:a4589 :a4589 :a4589. +:a4590 :a4590 :a4590. +:a4591 :a4591 :a4591. +:a4592 :a4592 :a4592. +:a4593 :a4593 :a4593. +:a4594 :a4594 :a4594. +:a4595 :a4595 :a4595. +:a4596 :a4596 :a4596. +:a4597 :a4597 :a4597. +:a4598 :a4598 :a4598. +:a4599 :a4599 :a4599. +:a4600 :a4600 :a4600. +:a4601 :a4601 :a4601. +:a4602 :a4602 :a4602. +:a4603 :a4603 :a4603. +:a4604 :a4604 :a4604. +:a4605 :a4605 :a4605. +:a4606 :a4606 :a4606. +:a4607 :a4607 :a4607. +:a4608 :a4608 :a4608. +:a4609 :a4609 :a4609. +:a4610 :a4610 :a4610. +:a4611 :a4611 :a4611. +:a4612 :a4612 :a4612. +:a4613 :a4613 :a4613. +:a4614 :a4614 :a4614. +:a4615 :a4615 :a4615. +:a4616 :a4616 :a4616. +:a4617 :a4617 :a4617. +:a4618 :a4618 :a4618. +:a4619 :a4619 :a4619. +:a4620 :a4620 :a4620. +:a4621 :a4621 :a4621. +:a4622 :a4622 :a4622. +:a4623 :a4623 :a4623. +:a4624 :a4624 :a4624. +:a4625 :a4625 :a4625. +:a4626 :a4626 :a4626. +:a4627 :a4627 :a4627. +:a4628 :a4628 :a4628. +:a4629 :a4629 :a4629. +:a4630 :a4630 :a4630. +:a4631 :a4631 :a4631. +:a4632 :a4632 :a4632. +:a4633 :a4633 :a4633. +:a4634 :a4634 :a4634. +:a4635 :a4635 :a4635. +:a4636 :a4636 :a4636. +:a4637 :a4637 :a4637. +:a4638 :a4638 :a4638. +:a4639 :a4639 :a4639. +:a4640 :a4640 :a4640. +:a4641 :a4641 :a4641. +:a4642 :a4642 :a4642. +:a4643 :a4643 :a4643. +:a4644 :a4644 :a4644. +:a4645 :a4645 :a4645. +:a4646 :a4646 :a4646. +:a4647 :a4647 :a4647. +:a4648 :a4648 :a4648. +:a4649 :a4649 :a4649. +:a4650 :a4650 :a4650. +:a4651 :a4651 :a4651. +:a4652 :a4652 :a4652. +:a4653 :a4653 :a4653. +:a4654 :a4654 :a4654. +:a4655 :a4655 :a4655. +:a4656 :a4656 :a4656. +:a4657 :a4657 :a4657. +:a4658 :a4658 :a4658. +:a4659 :a4659 :a4659. +:a4660 :a4660 :a4660. +:a4661 :a4661 :a4661. +:a4662 :a4662 :a4662. +:a4663 :a4663 :a4663. +:a4664 :a4664 :a4664. +:a4665 :a4665 :a4665. +:a4666 :a4666 :a4666. +:a4667 :a4667 :a4667. +:a4668 :a4668 :a4668. +:a4669 :a4669 :a4669. +:a4670 :a4670 :a4670. +:a4671 :a4671 :a4671. +:a4672 :a4672 :a4672. +:a4673 :a4673 :a4673. +:a4674 :a4674 :a4674. +:a4675 :a4675 :a4675. +:a4676 :a4676 :a4676. +:a4677 :a4677 :a4677. +:a4678 :a4678 :a4678. +:a4679 :a4679 :a4679. +:a4680 :a4680 :a4680. +:a4681 :a4681 :a4681. +:a4682 :a4682 :a4682. +:a4683 :a4683 :a4683. +:a4684 :a4684 :a4684. +:a4685 :a4685 :a4685. +:a4686 :a4686 :a4686. +:a4687 :a4687 :a4687. +:a4688 :a4688 :a4688. +:a4689 :a4689 :a4689. +:a4690 :a4690 :a4690. +:a4691 :a4691 :a4691. +:a4692 :a4692 :a4692. +:a4693 :a4693 :a4693. +:a4694 :a4694 :a4694. +:a4695 :a4695 :a4695. +:a4696 :a4696 :a4696. +:a4697 :a4697 :a4697. +:a4698 :a4698 :a4698. +:a4699 :a4699 :a4699. +:a4700 :a4700 :a4700. +:a4701 :a4701 :a4701. +:a4702 :a4702 :a4702. +:a4703 :a4703 :a4703. +:a4704 :a4704 :a4704. +:a4705 :a4705 :a4705. +:a4706 :a4706 :a4706. +:a4707 :a4707 :a4707. +:a4708 :a4708 :a4708. +:a4709 :a4709 :a4709. +:a4710 :a4710 :a4710. +:a4711 :a4711 :a4711. +:a4712 :a4712 :a4712. +:a4713 :a4713 :a4713. +:a4714 :a4714 :a4714. +:a4715 :a4715 :a4715. +:a4716 :a4716 :a4716. +:a4717 :a4717 :a4717. +:a4718 :a4718 :a4718. +:a4719 :a4719 :a4719. +:a4720 :a4720 :a4720. +:a4721 :a4721 :a4721. +:a4722 :a4722 :a4722. +:a4723 :a4723 :a4723. +:a4724 :a4724 :a4724. +:a4725 :a4725 :a4725. +:a4726 :a4726 :a4726. +:a4727 :a4727 :a4727. +:a4728 :a4728 :a4728. +:a4729 :a4729 :a4729. +:a4730 :a4730 :a4730. +:a4731 :a4731 :a4731. +:a4732 :a4732 :a4732. +:a4733 :a4733 :a4733. +:a4734 :a4734 :a4734. +:a4735 :a4735 :a4735. +:a4736 :a4736 :a4736. +:a4737 :a4737 :a4737. +:a4738 :a4738 :a4738. +:a4739 :a4739 :a4739. +:a4740 :a4740 :a4740. +:a4741 :a4741 :a4741. +:a4742 :a4742 :a4742. +:a4743 :a4743 :a4743. +:a4744 :a4744 :a4744. +:a4745 :a4745 :a4745. +:a4746 :a4746 :a4746. +:a4747 :a4747 :a4747. +:a4748 :a4748 :a4748. +:a4749 :a4749 :a4749. +:a4750 :a4750 :a4750. +:a4751 :a4751 :a4751. +:a4752 :a4752 :a4752. +:a4753 :a4753 :a4753. +:a4754 :a4754 :a4754. +:a4755 :a4755 :a4755. +:a4756 :a4756 :a4756. +:a4757 :a4757 :a4757. +:a4758 :a4758 :a4758. +:a4759 :a4759 :a4759. +:a4760 :a4760 :a4760. +:a4761 :a4761 :a4761. +:a4762 :a4762 :a4762. +:a4763 :a4763 :a4763. +:a4764 :a4764 :a4764. +:a4765 :a4765 :a4765. +:a4766 :a4766 :a4766. +:a4767 :a4767 :a4767. +:a4768 :a4768 :a4768. +:a4769 :a4769 :a4769. +:a4770 :a4770 :a4770. +:a4771 :a4771 :a4771. +:a4772 :a4772 :a4772. +:a4773 :a4773 :a4773. +:a4774 :a4774 :a4774. +:a4775 :a4775 :a4775. +:a4776 :a4776 :a4776. +:a4777 :a4777 :a4777. +:a4778 :a4778 :a4778. +:a4779 :a4779 :a4779. +:a4780 :a4780 :a4780. +:a4781 :a4781 :a4781. +:a4782 :a4782 :a4782. +:a4783 :a4783 :a4783. +:a4784 :a4784 :a4784. +:a4785 :a4785 :a4785. +:a4786 :a4786 :a4786. +:a4787 :a4787 :a4787. +:a4788 :a4788 :a4788. +:a4789 :a4789 :a4789. +:a4790 :a4790 :a4790. +:a4791 :a4791 :a4791. +:a4792 :a4792 :a4792. +:a4793 :a4793 :a4793. +:a4794 :a4794 :a4794. +:a4795 :a4795 :a4795. +:a4796 :a4796 :a4796. +:a4797 :a4797 :a4797. +:a4798 :a4798 :a4798. +:a4799 :a4799 :a4799. +:a4800 :a4800 :a4800. +:a4801 :a4801 :a4801. +:a4802 :a4802 :a4802. +:a4803 :a4803 :a4803. +:a4804 :a4804 :a4804. +:a4805 :a4805 :a4805. +:a4806 :a4806 :a4806. +:a4807 :a4807 :a4807. +:a4808 :a4808 :a4808. +:a4809 :a4809 :a4809. +:a4810 :a4810 :a4810. +:a4811 :a4811 :a4811. +:a4812 :a4812 :a4812. +:a4813 :a4813 :a4813. +:a4814 :a4814 :a4814. +:a4815 :a4815 :a4815. +:a4816 :a4816 :a4816. +:a4817 :a4817 :a4817. +:a4818 :a4818 :a4818. +:a4819 :a4819 :a4819. +:a4820 :a4820 :a4820. +:a4821 :a4821 :a4821. +:a4822 :a4822 :a4822. +:a4823 :a4823 :a4823. +:a4824 :a4824 :a4824. +:a4825 :a4825 :a4825. +:a4826 :a4826 :a4826. +:a4827 :a4827 :a4827. +:a4828 :a4828 :a4828. +:a4829 :a4829 :a4829. +:a4830 :a4830 :a4830. +:a4831 :a4831 :a4831. +:a4832 :a4832 :a4832. +:a4833 :a4833 :a4833. +:a4834 :a4834 :a4834. +:a4835 :a4835 :a4835. +:a4836 :a4836 :a4836. +:a4837 :a4837 :a4837. +:a4838 :a4838 :a4838. +:a4839 :a4839 :a4839. +:a4840 :a4840 :a4840. +:a4841 :a4841 :a4841. +:a4842 :a4842 :a4842. +:a4843 :a4843 :a4843. +:a4844 :a4844 :a4844. +:a4845 :a4845 :a4845. +:a4846 :a4846 :a4846. +:a4847 :a4847 :a4847. +:a4848 :a4848 :a4848. +:a4849 :a4849 :a4849. +:a4850 :a4850 :a4850. +:a4851 :a4851 :a4851. +:a4852 :a4852 :a4852. +:a4853 :a4853 :a4853. +:a4854 :a4854 :a4854. +:a4855 :a4855 :a4855. +:a4856 :a4856 :a4856. +:a4857 :a4857 :a4857. +:a4858 :a4858 :a4858. +:a4859 :a4859 :a4859. +:a4860 :a4860 :a4860. +:a4861 :a4861 :a4861. +:a4862 :a4862 :a4862. +:a4863 :a4863 :a4863. +:a4864 :a4864 :a4864. +:a4865 :a4865 :a4865. +:a4866 :a4866 :a4866. +:a4867 :a4867 :a4867. +:a4868 :a4868 :a4868. +:a4869 :a4869 :a4869. +:a4870 :a4870 :a4870. +:a4871 :a4871 :a4871. +:a4872 :a4872 :a4872. +:a4873 :a4873 :a4873. +:a4874 :a4874 :a4874. +:a4875 :a4875 :a4875. +:a4876 :a4876 :a4876. +:a4877 :a4877 :a4877. +:a4878 :a4878 :a4878. +:a4879 :a4879 :a4879. +:a4880 :a4880 :a4880. +:a4881 :a4881 :a4881. +:a4882 :a4882 :a4882. +:a4883 :a4883 :a4883. +:a4884 :a4884 :a4884. +:a4885 :a4885 :a4885. +:a4886 :a4886 :a4886. +:a4887 :a4887 :a4887. +:a4888 :a4888 :a4888. +:a4889 :a4889 :a4889. +:a4890 :a4890 :a4890. +:a4891 :a4891 :a4891. +:a4892 :a4892 :a4892. +:a4893 :a4893 :a4893. +:a4894 :a4894 :a4894. +:a4895 :a4895 :a4895. +:a4896 :a4896 :a4896. +:a4897 :a4897 :a4897. +:a4898 :a4898 :a4898. +:a4899 :a4899 :a4899. +:a4900 :a4900 :a4900. +:a4901 :a4901 :a4901. +:a4902 :a4902 :a4902. +:a4903 :a4903 :a4903. +:a4904 :a4904 :a4904. +:a4905 :a4905 :a4905. +:a4906 :a4906 :a4906. +:a4907 :a4907 :a4907. +:a4908 :a4908 :a4908. +:a4909 :a4909 :a4909. +:a4910 :a4910 :a4910. +:a4911 :a4911 :a4911. +:a4912 :a4912 :a4912. +:a4913 :a4913 :a4913. +:a4914 :a4914 :a4914. +:a4915 :a4915 :a4915. +:a4916 :a4916 :a4916. +:a4917 :a4917 :a4917. +:a4918 :a4918 :a4918. +:a4919 :a4919 :a4919. +:a4920 :a4920 :a4920. +:a4921 :a4921 :a4921. +:a4922 :a4922 :a4922. +:a4923 :a4923 :a4923. +:a4924 :a4924 :a4924. +:a4925 :a4925 :a4925. +:a4926 :a4926 :a4926. +:a4927 :a4927 :a4927. +:a4928 :a4928 :a4928. +:a4929 :a4929 :a4929. +:a4930 :a4930 :a4930. +:a4931 :a4931 :a4931. +:a4932 :a4932 :a4932. +:a4933 :a4933 :a4933. +:a4934 :a4934 :a4934. +:a4935 :a4935 :a4935. +:a4936 :a4936 :a4936. +:a4937 :a4937 :a4937. +:a4938 :a4938 :a4938. +:a4939 :a4939 :a4939. +:a4940 :a4940 :a4940. +:a4941 :a4941 :a4941. +:a4942 :a4942 :a4942. +:a4943 :a4943 :a4943. +:a4944 :a4944 :a4944. +:a4945 :a4945 :a4945. +:a4946 :a4946 :a4946. +:a4947 :a4947 :a4947. +:a4948 :a4948 :a4948. +:a4949 :a4949 :a4949. +:a4950 :a4950 :a4950. +:a4951 :a4951 :a4951. +:a4952 :a4952 :a4952. +:a4953 :a4953 :a4953. +:a4954 :a4954 :a4954. +:a4955 :a4955 :a4955. +:a4956 :a4956 :a4956. +:a4957 :a4957 :a4957. +:a4958 :a4958 :a4958. +:a4959 :a4959 :a4959. +:a4960 :a4960 :a4960. +:a4961 :a4961 :a4961. +:a4962 :a4962 :a4962. +:a4963 :a4963 :a4963. +:a4964 :a4964 :a4964. +:a4965 :a4965 :a4965. +:a4966 :a4966 :a4966. +:a4967 :a4967 :a4967. +:a4968 :a4968 :a4968. +:a4969 :a4969 :a4969. +:a4970 :a4970 :a4970. +:a4971 :a4971 :a4971. +:a4972 :a4972 :a4972. +:a4973 :a4973 :a4973. +:a4974 :a4974 :a4974. +:a4975 :a4975 :a4975. +:a4976 :a4976 :a4976. +:a4977 :a4977 :a4977. +:a4978 :a4978 :a4978. +:a4979 :a4979 :a4979. +:a4980 :a4980 :a4980. +:a4981 :a4981 :a4981. +:a4982 :a4982 :a4982. +:a4983 :a4983 :a4983. +:a4984 :a4984 :a4984. +:a4985 :a4985 :a4985. +:a4986 :a4986 :a4986. +:a4987 :a4987 :a4987. +:a4988 :a4988 :a4988. +:a4989 :a4989 :a4989. +:a4990 :a4990 :a4990. +:a4991 :a4991 :a4991. +:a4992 :a4992 :a4992. +:a4993 :a4993 :a4993. +:a4994 :a4994 :a4994. +:a4995 :a4995 :a4995. +:a4996 :a4996 :a4996. +:a4997 :a4997 :a4997. +:a4998 :a4998 :a4998. +:a4999 :a4999 :a4999. +:a5000 :a5000 :a5000. +:a5001 :a5001 :a5001. +:a5002 :a5002 :a5002. +:a5003 :a5003 :a5003. +:a5004 :a5004 :a5004. +:a5005 :a5005 :a5005. +:a5006 :a5006 :a5006. +:a5007 :a5007 :a5007. +:a5008 :a5008 :a5008. +:a5009 :a5009 :a5009. +:a5010 :a5010 :a5010. +:a5011 :a5011 :a5011. +:a5012 :a5012 :a5012. +:a5013 :a5013 :a5013. +:a5014 :a5014 :a5014. +:a5015 :a5015 :a5015. +:a5016 :a5016 :a5016. +:a5017 :a5017 :a5017. +:a5018 :a5018 :a5018. +:a5019 :a5019 :a5019. +:a5020 :a5020 :a5020. +:a5021 :a5021 :a5021. +:a5022 :a5022 :a5022. +:a5023 :a5023 :a5023. +:a5024 :a5024 :a5024. +:a5025 :a5025 :a5025. +:a5026 :a5026 :a5026. +:a5027 :a5027 :a5027. +:a5028 :a5028 :a5028. +:a5029 :a5029 :a5029. +:a5030 :a5030 :a5030. +:a5031 :a5031 :a5031. +:a5032 :a5032 :a5032. +:a5033 :a5033 :a5033. +:a5034 :a5034 :a5034. +:a5035 :a5035 :a5035. +:a5036 :a5036 :a5036. +:a5037 :a5037 :a5037. +:a5038 :a5038 :a5038. +:a5039 :a5039 :a5039. +:a5040 :a5040 :a5040. +:a5041 :a5041 :a5041. +:a5042 :a5042 :a5042. +:a5043 :a5043 :a5043. +:a5044 :a5044 :a5044. +:a5045 :a5045 :a5045. +:a5046 :a5046 :a5046. +:a5047 :a5047 :a5047. +:a5048 :a5048 :a5048. +:a5049 :a5049 :a5049. +:a5050 :a5050 :a5050. +:a5051 :a5051 :a5051. +:a5052 :a5052 :a5052. +:a5053 :a5053 :a5053. +:a5054 :a5054 :a5054. +:a5055 :a5055 :a5055. +:a5056 :a5056 :a5056. +:a5057 :a5057 :a5057. +:a5058 :a5058 :a5058. +:a5059 :a5059 :a5059. +:a5060 :a5060 :a5060. +:a5061 :a5061 :a5061. +:a5062 :a5062 :a5062. +:a5063 :a5063 :a5063. +:a5064 :a5064 :a5064. +:a5065 :a5065 :a5065. +:a5066 :a5066 :a5066. +:a5067 :a5067 :a5067. +:a5068 :a5068 :a5068. +:a5069 :a5069 :a5069. +:a5070 :a5070 :a5070. +:a5071 :a5071 :a5071. +:a5072 :a5072 :a5072. +:a5073 :a5073 :a5073. +:a5074 :a5074 :a5074. +:a5075 :a5075 :a5075. +:a5076 :a5076 :a5076. +:a5077 :a5077 :a5077. +:a5078 :a5078 :a5078. +:a5079 :a5079 :a5079. +:a5080 :a5080 :a5080. +:a5081 :a5081 :a5081. +:a5082 :a5082 :a5082. +:a5083 :a5083 :a5083. +:a5084 :a5084 :a5084. +:a5085 :a5085 :a5085. +:a5086 :a5086 :a5086. +:a5087 :a5087 :a5087. +:a5088 :a5088 :a5088. +:a5089 :a5089 :a5089. +:a5090 :a5090 :a5090. +:a5091 :a5091 :a5091. +:a5092 :a5092 :a5092. +:a5093 :a5093 :a5093. +:a5094 :a5094 :a5094. +:a5095 :a5095 :a5095. +:a5096 :a5096 :a5096. +:a5097 :a5097 :a5097. +:a5098 :a5098 :a5098. +:a5099 :a5099 :a5099. +:a5100 :a5100 :a5100. +:a5101 :a5101 :a5101. +:a5102 :a5102 :a5102. +:a5103 :a5103 :a5103. +:a5104 :a5104 :a5104. +:a5105 :a5105 :a5105. +:a5106 :a5106 :a5106. +:a5107 :a5107 :a5107. +:a5108 :a5108 :a5108. +:a5109 :a5109 :a5109. +:a5110 :a5110 :a5110. +:a5111 :a5111 :a5111. +:a5112 :a5112 :a5112. +:a5113 :a5113 :a5113. +:a5114 :a5114 :a5114. +:a5115 :a5115 :a5115. +:a5116 :a5116 :a5116. +:a5117 :a5117 :a5117. +:a5118 :a5118 :a5118. +:a5119 :a5119 :a5119. +:a5120 :a5120 :a5120. +:a5121 :a5121 :a5121. +:a5122 :a5122 :a5122. +:a5123 :a5123 :a5123. +:a5124 :a5124 :a5124. +:a5125 :a5125 :a5125. +:a5126 :a5126 :a5126. +:a5127 :a5127 :a5127. +:a5128 :a5128 :a5128. +:a5129 :a5129 :a5129. +:a5130 :a5130 :a5130. +:a5131 :a5131 :a5131. +:a5132 :a5132 :a5132. +:a5133 :a5133 :a5133. +:a5134 :a5134 :a5134. +:a5135 :a5135 :a5135. +:a5136 :a5136 :a5136. +:a5137 :a5137 :a5137. +:a5138 :a5138 :a5138. +:a5139 :a5139 :a5139. +:a5140 :a5140 :a5140. +:a5141 :a5141 :a5141. +:a5142 :a5142 :a5142. +:a5143 :a5143 :a5143. +:a5144 :a5144 :a5144. +:a5145 :a5145 :a5145. +:a5146 :a5146 :a5146. +:a5147 :a5147 :a5147. +:a5148 :a5148 :a5148. +:a5149 :a5149 :a5149. +:a5150 :a5150 :a5150. +:a5151 :a5151 :a5151. +:a5152 :a5152 :a5152. +:a5153 :a5153 :a5153. +:a5154 :a5154 :a5154. +:a5155 :a5155 :a5155. +:a5156 :a5156 :a5156. +:a5157 :a5157 :a5157. +:a5158 :a5158 :a5158. +:a5159 :a5159 :a5159. +:a5160 :a5160 :a5160. +:a5161 :a5161 :a5161. +:a5162 :a5162 :a5162. +:a5163 :a5163 :a5163. +:a5164 :a5164 :a5164. +:a5165 :a5165 :a5165. +:a5166 :a5166 :a5166. +:a5167 :a5167 :a5167. +:a5168 :a5168 :a5168. +:a5169 :a5169 :a5169. +:a5170 :a5170 :a5170. +:a5171 :a5171 :a5171. +:a5172 :a5172 :a5172. +:a5173 :a5173 :a5173. +:a5174 :a5174 :a5174. +:a5175 :a5175 :a5175. +:a5176 :a5176 :a5176. +:a5177 :a5177 :a5177. +:a5178 :a5178 :a5178. +:a5179 :a5179 :a5179. +:a5180 :a5180 :a5180. +:a5181 :a5181 :a5181. +:a5182 :a5182 :a5182. +:a5183 :a5183 :a5183. +:a5184 :a5184 :a5184. +:a5185 :a5185 :a5185. +:a5186 :a5186 :a5186. +:a5187 :a5187 :a5187. +:a5188 :a5188 :a5188. +:a5189 :a5189 :a5189. +:a5190 :a5190 :a5190. +:a5191 :a5191 :a5191. +:a5192 :a5192 :a5192. +:a5193 :a5193 :a5193. +:a5194 :a5194 :a5194. +:a5195 :a5195 :a5195. +:a5196 :a5196 :a5196. +:a5197 :a5197 :a5197. +:a5198 :a5198 :a5198. +:a5199 :a5199 :a5199. +:a5200 :a5200 :a5200. +:a5201 :a5201 :a5201. +:a5202 :a5202 :a5202. +:a5203 :a5203 :a5203. +:a5204 :a5204 :a5204. +:a5205 :a5205 :a5205. +:a5206 :a5206 :a5206. +:a5207 :a5207 :a5207. +:a5208 :a5208 :a5208. +:a5209 :a5209 :a5209. +:a5210 :a5210 :a5210. +:a5211 :a5211 :a5211. +:a5212 :a5212 :a5212. +:a5213 :a5213 :a5213. +:a5214 :a5214 :a5214. +:a5215 :a5215 :a5215. +:a5216 :a5216 :a5216. +:a5217 :a5217 :a5217. +:a5218 :a5218 :a5218. +:a5219 :a5219 :a5219. +:a5220 :a5220 :a5220. +:a5221 :a5221 :a5221. +:a5222 :a5222 :a5222. +:a5223 :a5223 :a5223. +:a5224 :a5224 :a5224. +:a5225 :a5225 :a5225. +:a5226 :a5226 :a5226. +:a5227 :a5227 :a5227. +:a5228 :a5228 :a5228. +:a5229 :a5229 :a5229. +:a5230 :a5230 :a5230. +:a5231 :a5231 :a5231. +:a5232 :a5232 :a5232. +:a5233 :a5233 :a5233. +:a5234 :a5234 :a5234. +:a5235 :a5235 :a5235. +:a5236 :a5236 :a5236. +:a5237 :a5237 :a5237. +:a5238 :a5238 :a5238. +:a5239 :a5239 :a5239. +:a5240 :a5240 :a5240. +:a5241 :a5241 :a5241. +:a5242 :a5242 :a5242. +:a5243 :a5243 :a5243. +:a5244 :a5244 :a5244. +:a5245 :a5245 :a5245. +:a5246 :a5246 :a5246. +:a5247 :a5247 :a5247. +:a5248 :a5248 :a5248. +:a5249 :a5249 :a5249. +:a5250 :a5250 :a5250. +:a5251 :a5251 :a5251. +:a5252 :a5252 :a5252. +:a5253 :a5253 :a5253. +:a5254 :a5254 :a5254. +:a5255 :a5255 :a5255. +:a5256 :a5256 :a5256. +:a5257 :a5257 :a5257. +:a5258 :a5258 :a5258. +:a5259 :a5259 :a5259. +:a5260 :a5260 :a5260. +:a5261 :a5261 :a5261. +:a5262 :a5262 :a5262. +:a5263 :a5263 :a5263. +:a5264 :a5264 :a5264. +:a5265 :a5265 :a5265. +:a5266 :a5266 :a5266. +:a5267 :a5267 :a5267. +:a5268 :a5268 :a5268. +:a5269 :a5269 :a5269. +:a5270 :a5270 :a5270. +:a5271 :a5271 :a5271. +:a5272 :a5272 :a5272. +:a5273 :a5273 :a5273. +:a5274 :a5274 :a5274. +:a5275 :a5275 :a5275. +:a5276 :a5276 :a5276. +:a5277 :a5277 :a5277. +:a5278 :a5278 :a5278. +:a5279 :a5279 :a5279. +:a5280 :a5280 :a5280. +:a5281 :a5281 :a5281. +:a5282 :a5282 :a5282. +:a5283 :a5283 :a5283. +:a5284 :a5284 :a5284. +:a5285 :a5285 :a5285. +:a5286 :a5286 :a5286. +:a5287 :a5287 :a5287. +:a5288 :a5288 :a5288. +:a5289 :a5289 :a5289. +:a5290 :a5290 :a5290. +:a5291 :a5291 :a5291. +:a5292 :a5292 :a5292. +:a5293 :a5293 :a5293. +:a5294 :a5294 :a5294. +:a5295 :a5295 :a5295. +:a5296 :a5296 :a5296. +:a5297 :a5297 :a5297. +:a5298 :a5298 :a5298. +:a5299 :a5299 :a5299. +:a5300 :a5300 :a5300. +:a5301 :a5301 :a5301. +:a5302 :a5302 :a5302. +:a5303 :a5303 :a5303. +:a5304 :a5304 :a5304. +:a5305 :a5305 :a5305. +:a5306 :a5306 :a5306. +:a5307 :a5307 :a5307. +:a5308 :a5308 :a5308. +:a5309 :a5309 :a5309. +:a5310 :a5310 :a5310. +:a5311 :a5311 :a5311. +:a5312 :a5312 :a5312. +:a5313 :a5313 :a5313. +:a5314 :a5314 :a5314. +:a5315 :a5315 :a5315. +:a5316 :a5316 :a5316. +:a5317 :a5317 :a5317. +:a5318 :a5318 :a5318. +:a5319 :a5319 :a5319. +:a5320 :a5320 :a5320. +:a5321 :a5321 :a5321. +:a5322 :a5322 :a5322. +:a5323 :a5323 :a5323. +:a5324 :a5324 :a5324. +:a5325 :a5325 :a5325. +:a5326 :a5326 :a5326. +:a5327 :a5327 :a5327. +:a5328 :a5328 :a5328. +:a5329 :a5329 :a5329. +:a5330 :a5330 :a5330. +:a5331 :a5331 :a5331. +:a5332 :a5332 :a5332. +:a5333 :a5333 :a5333. +:a5334 :a5334 :a5334. +:a5335 :a5335 :a5335. +:a5336 :a5336 :a5336. +:a5337 :a5337 :a5337. +:a5338 :a5338 :a5338. +:a5339 :a5339 :a5339. +:a5340 :a5340 :a5340. +:a5341 :a5341 :a5341. +:a5342 :a5342 :a5342. +:a5343 :a5343 :a5343. +:a5344 :a5344 :a5344. +:a5345 :a5345 :a5345. +:a5346 :a5346 :a5346. +:a5347 :a5347 :a5347. +:a5348 :a5348 :a5348. +:a5349 :a5349 :a5349. +:a5350 :a5350 :a5350. +:a5351 :a5351 :a5351. +:a5352 :a5352 :a5352. +:a5353 :a5353 :a5353. +:a5354 :a5354 :a5354. +:a5355 :a5355 :a5355. +:a5356 :a5356 :a5356. +:a5357 :a5357 :a5357. +:a5358 :a5358 :a5358. +:a5359 :a5359 :a5359. +:a5360 :a5360 :a5360. +:a5361 :a5361 :a5361. +:a5362 :a5362 :a5362. +:a5363 :a5363 :a5363. +:a5364 :a5364 :a5364. +:a5365 :a5365 :a5365. +:a5366 :a5366 :a5366. +:a5367 :a5367 :a5367. +:a5368 :a5368 :a5368. +:a5369 :a5369 :a5369. +:a5370 :a5370 :a5370. +:a5371 :a5371 :a5371. +:a5372 :a5372 :a5372. +:a5373 :a5373 :a5373. +:a5374 :a5374 :a5374. +:a5375 :a5375 :a5375. +:a5376 :a5376 :a5376. +:a5377 :a5377 :a5377. +:a5378 :a5378 :a5378. +:a5379 :a5379 :a5379. +:a5380 :a5380 :a5380. +:a5381 :a5381 :a5381. +:a5382 :a5382 :a5382. +:a5383 :a5383 :a5383. +:a5384 :a5384 :a5384. +:a5385 :a5385 :a5385. +:a5386 :a5386 :a5386. +:a5387 :a5387 :a5387. +:a5388 :a5388 :a5388. +:a5389 :a5389 :a5389. +:a5390 :a5390 :a5390. +:a5391 :a5391 :a5391. +:a5392 :a5392 :a5392. +:a5393 :a5393 :a5393. +:a5394 :a5394 :a5394. +:a5395 :a5395 :a5395. +:a5396 :a5396 :a5396. +:a5397 :a5397 :a5397. +:a5398 :a5398 :a5398. +:a5399 :a5399 :a5399. +:a5400 :a5400 :a5400. +:a5401 :a5401 :a5401. +:a5402 :a5402 :a5402. +:a5403 :a5403 :a5403. +:a5404 :a5404 :a5404. +:a5405 :a5405 :a5405. +:a5406 :a5406 :a5406. +:a5407 :a5407 :a5407. +:a5408 :a5408 :a5408. +:a5409 :a5409 :a5409. +:a5410 :a5410 :a5410. +:a5411 :a5411 :a5411. +:a5412 :a5412 :a5412. +:a5413 :a5413 :a5413. +:a5414 :a5414 :a5414. +:a5415 :a5415 :a5415. +:a5416 :a5416 :a5416. +:a5417 :a5417 :a5417. +:a5418 :a5418 :a5418. +:a5419 :a5419 :a5419. +:a5420 :a5420 :a5420. +:a5421 :a5421 :a5421. +:a5422 :a5422 :a5422. +:a5423 :a5423 :a5423. +:a5424 :a5424 :a5424. +:a5425 :a5425 :a5425. +:a5426 :a5426 :a5426. +:a5427 :a5427 :a5427. +:a5428 :a5428 :a5428. +:a5429 :a5429 :a5429. +:a5430 :a5430 :a5430. +:a5431 :a5431 :a5431. +:a5432 :a5432 :a5432. +:a5433 :a5433 :a5433. +:a5434 :a5434 :a5434. +:a5435 :a5435 :a5435. +:a5436 :a5436 :a5436. +:a5437 :a5437 :a5437. +:a5438 :a5438 :a5438. +:a5439 :a5439 :a5439. +:a5440 :a5440 :a5440. +:a5441 :a5441 :a5441. +:a5442 :a5442 :a5442. +:a5443 :a5443 :a5443. +:a5444 :a5444 :a5444. +:a5445 :a5445 :a5445. +:a5446 :a5446 :a5446. +:a5447 :a5447 :a5447. +:a5448 :a5448 :a5448. +:a5449 :a5449 :a5449. +:a5450 :a5450 :a5450. +:a5451 :a5451 :a5451. +:a5452 :a5452 :a5452. +:a5453 :a5453 :a5453. +:a5454 :a5454 :a5454. +:a5455 :a5455 :a5455. +:a5456 :a5456 :a5456. +:a5457 :a5457 :a5457. +:a5458 :a5458 :a5458. +:a5459 :a5459 :a5459. +:a5460 :a5460 :a5460. +:a5461 :a5461 :a5461. +:a5462 :a5462 :a5462. +:a5463 :a5463 :a5463. +:a5464 :a5464 :a5464. +:a5465 :a5465 :a5465. +:a5466 :a5466 :a5466. +:a5467 :a5467 :a5467. +:a5468 :a5468 :a5468. +:a5469 :a5469 :a5469. +:a5470 :a5470 :a5470. +:a5471 :a5471 :a5471. +:a5472 :a5472 :a5472. +:a5473 :a5473 :a5473. +:a5474 :a5474 :a5474. +:a5475 :a5475 :a5475. +:a5476 :a5476 :a5476. +:a5477 :a5477 :a5477. +:a5478 :a5478 :a5478. +:a5479 :a5479 :a5479. +:a5480 :a5480 :a5480. +:a5481 :a5481 :a5481. +:a5482 :a5482 :a5482. +:a5483 :a5483 :a5483. +:a5484 :a5484 :a5484. +:a5485 :a5485 :a5485. +:a5486 :a5486 :a5486. +:a5487 :a5487 :a5487. +:a5488 :a5488 :a5488. +:a5489 :a5489 :a5489. +:a5490 :a5490 :a5490. +:a5491 :a5491 :a5491. +:a5492 :a5492 :a5492. +:a5493 :a5493 :a5493. +:a5494 :a5494 :a5494. +:a5495 :a5495 :a5495. +:a5496 :a5496 :a5496. +:a5497 :a5497 :a5497. +:a5498 :a5498 :a5498. +:a5499 :a5499 :a5499. +:a5500 :a5500 :a5500. +:a5501 :a5501 :a5501. +:a5502 :a5502 :a5502. +:a5503 :a5503 :a5503. +:a5504 :a5504 :a5504. +:a5505 :a5505 :a5505. +:a5506 :a5506 :a5506. +:a5507 :a5507 :a5507. +:a5508 :a5508 :a5508. +:a5509 :a5509 :a5509. +:a5510 :a5510 :a5510. +:a5511 :a5511 :a5511. +:a5512 :a5512 :a5512. +:a5513 :a5513 :a5513. +:a5514 :a5514 :a5514. +:a5515 :a5515 :a5515. +:a5516 :a5516 :a5516. +:a5517 :a5517 :a5517. +:a5518 :a5518 :a5518. +:a5519 :a5519 :a5519. +:a5520 :a5520 :a5520. +:a5521 :a5521 :a5521. +:a5522 :a5522 :a5522. +:a5523 :a5523 :a5523. +:a5524 :a5524 :a5524. +:a5525 :a5525 :a5525. +:a5526 :a5526 :a5526. +:a5527 :a5527 :a5527. +:a5528 :a5528 :a5528. +:a5529 :a5529 :a5529. +:a5530 :a5530 :a5530. +:a5531 :a5531 :a5531. +:a5532 :a5532 :a5532. +:a5533 :a5533 :a5533. +:a5534 :a5534 :a5534. +:a5535 :a5535 :a5535. +:a5536 :a5536 :a5536. +:a5537 :a5537 :a5537. +:a5538 :a5538 :a5538. +:a5539 :a5539 :a5539. +:a5540 :a5540 :a5540. +:a5541 :a5541 :a5541. +:a5542 :a5542 :a5542. +:a5543 :a5543 :a5543. +:a5544 :a5544 :a5544. +:a5545 :a5545 :a5545. +:a5546 :a5546 :a5546. +:a5547 :a5547 :a5547. +:a5548 :a5548 :a5548. +:a5549 :a5549 :a5549. +:a5550 :a5550 :a5550. +:a5551 :a5551 :a5551. +:a5552 :a5552 :a5552. +:a5553 :a5553 :a5553. +:a5554 :a5554 :a5554. +:a5555 :a5555 :a5555. +:a5556 :a5556 :a5556. +:a5557 :a5557 :a5557. +:a5558 :a5558 :a5558. +:a5559 :a5559 :a5559. +:a5560 :a5560 :a5560. +:a5561 :a5561 :a5561. +:a5562 :a5562 :a5562. +:a5563 :a5563 :a5563. +:a5564 :a5564 :a5564. +:a5565 :a5565 :a5565. +:a5566 :a5566 :a5566. +:a5567 :a5567 :a5567. +:a5568 :a5568 :a5568. +:a5569 :a5569 :a5569. +:a5570 :a5570 :a5570. +:a5571 :a5571 :a5571. +:a5572 :a5572 :a5572. +:a5573 :a5573 :a5573. +:a5574 :a5574 :a5574. +:a5575 :a5575 :a5575. +:a5576 :a5576 :a5576. +:a5577 :a5577 :a5577. +:a5578 :a5578 :a5578. +:a5579 :a5579 :a5579. +:a5580 :a5580 :a5580. +:a5581 :a5581 :a5581. +:a5582 :a5582 :a5582. +:a5583 :a5583 :a5583. +:a5584 :a5584 :a5584. +:a5585 :a5585 :a5585. +:a5586 :a5586 :a5586. +:a5587 :a5587 :a5587. +:a5588 :a5588 :a5588. +:a5589 :a5589 :a5589. +:a5590 :a5590 :a5590. +:a5591 :a5591 :a5591. +:a5592 :a5592 :a5592. +:a5593 :a5593 :a5593. +:a5594 :a5594 :a5594. +:a5595 :a5595 :a5595. +:a5596 :a5596 :a5596. +:a5597 :a5597 :a5597. +:a5598 :a5598 :a5598. +:a5599 :a5599 :a5599. +:a5600 :a5600 :a5600. +:a5601 :a5601 :a5601. +:a5602 :a5602 :a5602. +:a5603 :a5603 :a5603. +:a5604 :a5604 :a5604. +:a5605 :a5605 :a5605. +:a5606 :a5606 :a5606. +:a5607 :a5607 :a5607. +:a5608 :a5608 :a5608. +:a5609 :a5609 :a5609. +:a5610 :a5610 :a5610. +:a5611 :a5611 :a5611. +:a5612 :a5612 :a5612. +:a5613 :a5613 :a5613. +:a5614 :a5614 :a5614. +:a5615 :a5615 :a5615. +:a5616 :a5616 :a5616. +:a5617 :a5617 :a5617. +:a5618 :a5618 :a5618. +:a5619 :a5619 :a5619. +:a5620 :a5620 :a5620. +:a5621 :a5621 :a5621. +:a5622 :a5622 :a5622. +:a5623 :a5623 :a5623. +:a5624 :a5624 :a5624. +:a5625 :a5625 :a5625. +:a5626 :a5626 :a5626. +:a5627 :a5627 :a5627. +:a5628 :a5628 :a5628. +:a5629 :a5629 :a5629. +:a5630 :a5630 :a5630. +:a5631 :a5631 :a5631. +:a5632 :a5632 :a5632. +:a5633 :a5633 :a5633. +:a5634 :a5634 :a5634. +:a5635 :a5635 :a5635. +:a5636 :a5636 :a5636. +:a5637 :a5637 :a5637. +:a5638 :a5638 :a5638. +:a5639 :a5639 :a5639. +:a5640 :a5640 :a5640. +:a5641 :a5641 :a5641. +:a5642 :a5642 :a5642. +:a5643 :a5643 :a5643. +:a5644 :a5644 :a5644. +:a5645 :a5645 :a5645. +:a5646 :a5646 :a5646. +:a5647 :a5647 :a5647. +:a5648 :a5648 :a5648. +:a5649 :a5649 :a5649. +:a5650 :a5650 :a5650. +:a5651 :a5651 :a5651. +:a5652 :a5652 :a5652. +:a5653 :a5653 :a5653. +:a5654 :a5654 :a5654. +:a5655 :a5655 :a5655. +:a5656 :a5656 :a5656. +:a5657 :a5657 :a5657. +:a5658 :a5658 :a5658. +:a5659 :a5659 :a5659. +:a5660 :a5660 :a5660. +:a5661 :a5661 :a5661. +:a5662 :a5662 :a5662. +:a5663 :a5663 :a5663. +:a5664 :a5664 :a5664. +:a5665 :a5665 :a5665. +:a5666 :a5666 :a5666. +:a5667 :a5667 :a5667. +:a5668 :a5668 :a5668. +:a5669 :a5669 :a5669. +:a5670 :a5670 :a5670. +:a5671 :a5671 :a5671. +:a5672 :a5672 :a5672. +:a5673 :a5673 :a5673. +:a5674 :a5674 :a5674. +:a5675 :a5675 :a5675. +:a5676 :a5676 :a5676. +:a5677 :a5677 :a5677. +:a5678 :a5678 :a5678. +:a5679 :a5679 :a5679. +:a5680 :a5680 :a5680. +:a5681 :a5681 :a5681. +:a5682 :a5682 :a5682. +:a5683 :a5683 :a5683. +:a5684 :a5684 :a5684. +:a5685 :a5685 :a5685. +:a5686 :a5686 :a5686. +:a5687 :a5687 :a5687. +:a5688 :a5688 :a5688. +:a5689 :a5689 :a5689. +:a5690 :a5690 :a5690. +:a5691 :a5691 :a5691. +:a5692 :a5692 :a5692. +:a5693 :a5693 :a5693. +:a5694 :a5694 :a5694. +:a5695 :a5695 :a5695. +:a5696 :a5696 :a5696. +:a5697 :a5697 :a5697. +:a5698 :a5698 :a5698. +:a5699 :a5699 :a5699. +:a5700 :a5700 :a5700. +:a5701 :a5701 :a5701. +:a5702 :a5702 :a5702. +:a5703 :a5703 :a5703. +:a5704 :a5704 :a5704. +:a5705 :a5705 :a5705. +:a5706 :a5706 :a5706. +:a5707 :a5707 :a5707. +:a5708 :a5708 :a5708. +:a5709 :a5709 :a5709. +:a5710 :a5710 :a5710. +:a5711 :a5711 :a5711. +:a5712 :a5712 :a5712. +:a5713 :a5713 :a5713. +:a5714 :a5714 :a5714. +:a5715 :a5715 :a5715. +:a5716 :a5716 :a5716. +:a5717 :a5717 :a5717. +:a5718 :a5718 :a5718. +:a5719 :a5719 :a5719. +:a5720 :a5720 :a5720. +:a5721 :a5721 :a5721. +:a5722 :a5722 :a5722. +:a5723 :a5723 :a5723. +:a5724 :a5724 :a5724. +:a5725 :a5725 :a5725. +:a5726 :a5726 :a5726. +:a5727 :a5727 :a5727. +:a5728 :a5728 :a5728. +:a5729 :a5729 :a5729. +:a5730 :a5730 :a5730. +:a5731 :a5731 :a5731. +:a5732 :a5732 :a5732. +:a5733 :a5733 :a5733. +:a5734 :a5734 :a5734. +:a5735 :a5735 :a5735. +:a5736 :a5736 :a5736. +:a5737 :a5737 :a5737. +:a5738 :a5738 :a5738. +:a5739 :a5739 :a5739. +:a5740 :a5740 :a5740. +:a5741 :a5741 :a5741. +:a5742 :a5742 :a5742. +:a5743 :a5743 :a5743. +:a5744 :a5744 :a5744. +:a5745 :a5745 :a5745. +:a5746 :a5746 :a5746. +:a5747 :a5747 :a5747. +:a5748 :a5748 :a5748. +:a5749 :a5749 :a5749. +:a5750 :a5750 :a5750. +:a5751 :a5751 :a5751. +:a5752 :a5752 :a5752. +:a5753 :a5753 :a5753. +:a5754 :a5754 :a5754. +:a5755 :a5755 :a5755. +:a5756 :a5756 :a5756. +:a5757 :a5757 :a5757. +:a5758 :a5758 :a5758. +:a5759 :a5759 :a5759. +:a5760 :a5760 :a5760. +:a5761 :a5761 :a5761. +:a5762 :a5762 :a5762. +:a5763 :a5763 :a5763. +:a5764 :a5764 :a5764. +:a5765 :a5765 :a5765. +:a5766 :a5766 :a5766. +:a5767 :a5767 :a5767. +:a5768 :a5768 :a5768. +:a5769 :a5769 :a5769. +:a5770 :a5770 :a5770. +:a5771 :a5771 :a5771. +:a5772 :a5772 :a5772. +:a5773 :a5773 :a5773. +:a5774 :a5774 :a5774. +:a5775 :a5775 :a5775. +:a5776 :a5776 :a5776. +:a5777 :a5777 :a5777. +:a5778 :a5778 :a5778. +:a5779 :a5779 :a5779. +:a5780 :a5780 :a5780. +:a5781 :a5781 :a5781. +:a5782 :a5782 :a5782. +:a5783 :a5783 :a5783. +:a5784 :a5784 :a5784. +:a5785 :a5785 :a5785. +:a5786 :a5786 :a5786. +:a5787 :a5787 :a5787. +:a5788 :a5788 :a5788. +:a5789 :a5789 :a5789. +:a5790 :a5790 :a5790. +:a5791 :a5791 :a5791. +:a5792 :a5792 :a5792. +:a5793 :a5793 :a5793. +:a5794 :a5794 :a5794. +:a5795 :a5795 :a5795. +:a5796 :a5796 :a5796. +:a5797 :a5797 :a5797. +:a5798 :a5798 :a5798. +:a5799 :a5799 :a5799. +:a5800 :a5800 :a5800. +:a5801 :a5801 :a5801. +:a5802 :a5802 :a5802. +:a5803 :a5803 :a5803. +:a5804 :a5804 :a5804. +:a5805 :a5805 :a5805. +:a5806 :a5806 :a5806. +:a5807 :a5807 :a5807. +:a5808 :a5808 :a5808. +:a5809 :a5809 :a5809. +:a5810 :a5810 :a5810. +:a5811 :a5811 :a5811. +:a5812 :a5812 :a5812. +:a5813 :a5813 :a5813. +:a5814 :a5814 :a5814. +:a5815 :a5815 :a5815. +:a5816 :a5816 :a5816. +:a5817 :a5817 :a5817. +:a5818 :a5818 :a5818. +:a5819 :a5819 :a5819. +:a5820 :a5820 :a5820. +:a5821 :a5821 :a5821. +:a5822 :a5822 :a5822. +:a5823 :a5823 :a5823. +:a5824 :a5824 :a5824. +:a5825 :a5825 :a5825. +:a5826 :a5826 :a5826. +:a5827 :a5827 :a5827. +:a5828 :a5828 :a5828. +:a5829 :a5829 :a5829. +:a5830 :a5830 :a5830. +:a5831 :a5831 :a5831. +:a5832 :a5832 :a5832. +:a5833 :a5833 :a5833. +:a5834 :a5834 :a5834. +:a5835 :a5835 :a5835. +:a5836 :a5836 :a5836. +:a5837 :a5837 :a5837. +:a5838 :a5838 :a5838. +:a5839 :a5839 :a5839. +:a5840 :a5840 :a5840. +:a5841 :a5841 :a5841. +:a5842 :a5842 :a5842. +:a5843 :a5843 :a5843. +:a5844 :a5844 :a5844. +:a5845 :a5845 :a5845. +:a5846 :a5846 :a5846. +:a5847 :a5847 :a5847. +:a5848 :a5848 :a5848. +:a5849 :a5849 :a5849. +:a5850 :a5850 :a5850. +:a5851 :a5851 :a5851. +:a5852 :a5852 :a5852. +:a5853 :a5853 :a5853. +:a5854 :a5854 :a5854. +:a5855 :a5855 :a5855. +:a5856 :a5856 :a5856. +:a5857 :a5857 :a5857. +:a5858 :a5858 :a5858. +:a5859 :a5859 :a5859. +:a5860 :a5860 :a5860. +:a5861 :a5861 :a5861. +:a5862 :a5862 :a5862. +:a5863 :a5863 :a5863. +:a5864 :a5864 :a5864. +:a5865 :a5865 :a5865. +:a5866 :a5866 :a5866. +:a5867 :a5867 :a5867. +:a5868 :a5868 :a5868. +:a5869 :a5869 :a5869. +:a5870 :a5870 :a5870. +:a5871 :a5871 :a5871. +:a5872 :a5872 :a5872. +:a5873 :a5873 :a5873. +:a5874 :a5874 :a5874. +:a5875 :a5875 :a5875. +:a5876 :a5876 :a5876. +:a5877 :a5877 :a5877. +:a5878 :a5878 :a5878. +:a5879 :a5879 :a5879. +:a5880 :a5880 :a5880. +:a5881 :a5881 :a5881. +:a5882 :a5882 :a5882. +:a5883 :a5883 :a5883. +:a5884 :a5884 :a5884. +:a5885 :a5885 :a5885. +:a5886 :a5886 :a5886. +:a5887 :a5887 :a5887. +:a5888 :a5888 :a5888. +:a5889 :a5889 :a5889. +:a5890 :a5890 :a5890. +:a5891 :a5891 :a5891. +:a5892 :a5892 :a5892. +:a5893 :a5893 :a5893. +:a5894 :a5894 :a5894. +:a5895 :a5895 :a5895. +:a5896 :a5896 :a5896. +:a5897 :a5897 :a5897. +:a5898 :a5898 :a5898. +:a5899 :a5899 :a5899. +:a5900 :a5900 :a5900. +:a5901 :a5901 :a5901. +:a5902 :a5902 :a5902. +:a5903 :a5903 :a5903. +:a5904 :a5904 :a5904. +:a5905 :a5905 :a5905. +:a5906 :a5906 :a5906. +:a5907 :a5907 :a5907. +:a5908 :a5908 :a5908. +:a5909 :a5909 :a5909. +:a5910 :a5910 :a5910. +:a5911 :a5911 :a5911. +:a5912 :a5912 :a5912. +:a5913 :a5913 :a5913. +:a5914 :a5914 :a5914. +:a5915 :a5915 :a5915. +:a5916 :a5916 :a5916. +:a5917 :a5917 :a5917. +:a5918 :a5918 :a5918. +:a5919 :a5919 :a5919. +:a5920 :a5920 :a5920. +:a5921 :a5921 :a5921. +:a5922 :a5922 :a5922. +:a5923 :a5923 :a5923. +:a5924 :a5924 :a5924. +:a5925 :a5925 :a5925. +:a5926 :a5926 :a5926. +:a5927 :a5927 :a5927. +:a5928 :a5928 :a5928. +:a5929 :a5929 :a5929. +:a5930 :a5930 :a5930. +:a5931 :a5931 :a5931. +:a5932 :a5932 :a5932. +:a5933 :a5933 :a5933. +:a5934 :a5934 :a5934. +:a5935 :a5935 :a5935. +:a5936 :a5936 :a5936. +:a5937 :a5937 :a5937. +:a5938 :a5938 :a5938. +:a5939 :a5939 :a5939. +:a5940 :a5940 :a5940. +:a5941 :a5941 :a5941. +:a5942 :a5942 :a5942. +:a5943 :a5943 :a5943. +:a5944 :a5944 :a5944. +:a5945 :a5945 :a5945. +:a5946 :a5946 :a5946. +:a5947 :a5947 :a5947. +:a5948 :a5948 :a5948. +:a5949 :a5949 :a5949. +:a5950 :a5950 :a5950. +:a5951 :a5951 :a5951. +:a5952 :a5952 :a5952. +:a5953 :a5953 :a5953. +:a5954 :a5954 :a5954. +:a5955 :a5955 :a5955. +:a5956 :a5956 :a5956. +:a5957 :a5957 :a5957. +:a5958 :a5958 :a5958. +:a5959 :a5959 :a5959. +:a5960 :a5960 :a5960. +:a5961 :a5961 :a5961. +:a5962 :a5962 :a5962. +:a5963 :a5963 :a5963. +:a5964 :a5964 :a5964. +:a5965 :a5965 :a5965. +:a5966 :a5966 :a5966. +:a5967 :a5967 :a5967. +:a5968 :a5968 :a5968. +:a5969 :a5969 :a5969. +:a5970 :a5970 :a5970. +:a5971 :a5971 :a5971. +:a5972 :a5972 :a5972. +:a5973 :a5973 :a5973. +:a5974 :a5974 :a5974. +:a5975 :a5975 :a5975. +:a5976 :a5976 :a5976. +:a5977 :a5977 :a5977. +:a5978 :a5978 :a5978. +:a5979 :a5979 :a5979. +:a5980 :a5980 :a5980. +:a5981 :a5981 :a5981. +:a5982 :a5982 :a5982. +:a5983 :a5983 :a5983. +:a5984 :a5984 :a5984. +:a5985 :a5985 :a5985. +:a5986 :a5986 :a5986. +:a5987 :a5987 :a5987. +:a5988 :a5988 :a5988. +:a5989 :a5989 :a5989. +:a5990 :a5990 :a5990. +:a5991 :a5991 :a5991. +:a5992 :a5992 :a5992. +:a5993 :a5993 :a5993. +:a5994 :a5994 :a5994. +:a5995 :a5995 :a5995. +:a5996 :a5996 :a5996. +:a5997 :a5997 :a5997. +:a5998 :a5998 :a5998. +:a5999 :a5999 :a5999. +:a6000 :a6000 :a6000. +:a6001 :a6001 :a6001. +:a6002 :a6002 :a6002. +:a6003 :a6003 :a6003. +:a6004 :a6004 :a6004. +:a6005 :a6005 :a6005. +:a6006 :a6006 :a6006. +:a6007 :a6007 :a6007. +:a6008 :a6008 :a6008. +:a6009 :a6009 :a6009. +:a6010 :a6010 :a6010. +:a6011 :a6011 :a6011. +:a6012 :a6012 :a6012. +:a6013 :a6013 :a6013. +:a6014 :a6014 :a6014. +:a6015 :a6015 :a6015. +:a6016 :a6016 :a6016. +:a6017 :a6017 :a6017. +:a6018 :a6018 :a6018. +:a6019 :a6019 :a6019. +:a6020 :a6020 :a6020. +:a6021 :a6021 :a6021. +:a6022 :a6022 :a6022. +:a6023 :a6023 :a6023. +:a6024 :a6024 :a6024. +:a6025 :a6025 :a6025. +:a6026 :a6026 :a6026. +:a6027 :a6027 :a6027. +:a6028 :a6028 :a6028. +:a6029 :a6029 :a6029. +:a6030 :a6030 :a6030. +:a6031 :a6031 :a6031. +:a6032 :a6032 :a6032. +:a6033 :a6033 :a6033. +:a6034 :a6034 :a6034. +:a6035 :a6035 :a6035. +:a6036 :a6036 :a6036. +:a6037 :a6037 :a6037. +:a6038 :a6038 :a6038. +:a6039 :a6039 :a6039. +:a6040 :a6040 :a6040. +:a6041 :a6041 :a6041. +:a6042 :a6042 :a6042. +:a6043 :a6043 :a6043. +:a6044 :a6044 :a6044. +:a6045 :a6045 :a6045. +:a6046 :a6046 :a6046. +:a6047 :a6047 :a6047. +:a6048 :a6048 :a6048. +:a6049 :a6049 :a6049. +:a6050 :a6050 :a6050. +:a6051 :a6051 :a6051. +:a6052 :a6052 :a6052. +:a6053 :a6053 :a6053. +:a6054 :a6054 :a6054. +:a6055 :a6055 :a6055. +:a6056 :a6056 :a6056. +:a6057 :a6057 :a6057. +:a6058 :a6058 :a6058. +:a6059 :a6059 :a6059. +:a6060 :a6060 :a6060. +:a6061 :a6061 :a6061. +:a6062 :a6062 :a6062. +:a6063 :a6063 :a6063. +:a6064 :a6064 :a6064. +:a6065 :a6065 :a6065. +:a6066 :a6066 :a6066. +:a6067 :a6067 :a6067. +:a6068 :a6068 :a6068. +:a6069 :a6069 :a6069. +:a6070 :a6070 :a6070. +:a6071 :a6071 :a6071. +:a6072 :a6072 :a6072. +:a6073 :a6073 :a6073. +:a6074 :a6074 :a6074. +:a6075 :a6075 :a6075. +:a6076 :a6076 :a6076. +:a6077 :a6077 :a6077. +:a6078 :a6078 :a6078. +:a6079 :a6079 :a6079. +:a6080 :a6080 :a6080. +:a6081 :a6081 :a6081. +:a6082 :a6082 :a6082. +:a6083 :a6083 :a6083. +:a6084 :a6084 :a6084. +:a6085 :a6085 :a6085. +:a6086 :a6086 :a6086. +:a6087 :a6087 :a6087. +:a6088 :a6088 :a6088. +:a6089 :a6089 :a6089. +:a6090 :a6090 :a6090. +:a6091 :a6091 :a6091. +:a6092 :a6092 :a6092. +:a6093 :a6093 :a6093. +:a6094 :a6094 :a6094. +:a6095 :a6095 :a6095. +:a6096 :a6096 :a6096. +:a6097 :a6097 :a6097. +:a6098 :a6098 :a6098. +:a6099 :a6099 :a6099. +:a6100 :a6100 :a6100. +:a6101 :a6101 :a6101. +:a6102 :a6102 :a6102. +:a6103 :a6103 :a6103. +:a6104 :a6104 :a6104. +:a6105 :a6105 :a6105. +:a6106 :a6106 :a6106. +:a6107 :a6107 :a6107. +:a6108 :a6108 :a6108. +:a6109 :a6109 :a6109. +:a6110 :a6110 :a6110. +:a6111 :a6111 :a6111. +:a6112 :a6112 :a6112. +:a6113 :a6113 :a6113. +:a6114 :a6114 :a6114. +:a6115 :a6115 :a6115. +:a6116 :a6116 :a6116. +:a6117 :a6117 :a6117. +:a6118 :a6118 :a6118. +:a6119 :a6119 :a6119. +:a6120 :a6120 :a6120. +:a6121 :a6121 :a6121. +:a6122 :a6122 :a6122. +:a6123 :a6123 :a6123. +:a6124 :a6124 :a6124. +:a6125 :a6125 :a6125. +:a6126 :a6126 :a6126. +:a6127 :a6127 :a6127. +:a6128 :a6128 :a6128. +:a6129 :a6129 :a6129. +:a6130 :a6130 :a6130. +:a6131 :a6131 :a6131. +:a6132 :a6132 :a6132. +:a6133 :a6133 :a6133. +:a6134 :a6134 :a6134. +:a6135 :a6135 :a6135. +:a6136 :a6136 :a6136. +:a6137 :a6137 :a6137. +:a6138 :a6138 :a6138. +:a6139 :a6139 :a6139. +:a6140 :a6140 :a6140. +:a6141 :a6141 :a6141. +:a6142 :a6142 :a6142. +:a6143 :a6143 :a6143. +:a6144 :a6144 :a6144. +:a6145 :a6145 :a6145. +:a6146 :a6146 :a6146. +:a6147 :a6147 :a6147. +:a6148 :a6148 :a6148. +:a6149 :a6149 :a6149. +:a6150 :a6150 :a6150. +:a6151 :a6151 :a6151. +:a6152 :a6152 :a6152. +:a6153 :a6153 :a6153. +:a6154 :a6154 :a6154. +:a6155 :a6155 :a6155. +:a6156 :a6156 :a6156. +:a6157 :a6157 :a6157. +:a6158 :a6158 :a6158. +:a6159 :a6159 :a6159. +:a6160 :a6160 :a6160. +:a6161 :a6161 :a6161. +:a6162 :a6162 :a6162. +:a6163 :a6163 :a6163. +:a6164 :a6164 :a6164. +:a6165 :a6165 :a6165. +:a6166 :a6166 :a6166. +:a6167 :a6167 :a6167. +:a6168 :a6168 :a6168. +:a6169 :a6169 :a6169. +:a6170 :a6170 :a6170. +:a6171 :a6171 :a6171. +:a6172 :a6172 :a6172. +:a6173 :a6173 :a6173. +:a6174 :a6174 :a6174. +:a6175 :a6175 :a6175. +:a6176 :a6176 :a6176. +:a6177 :a6177 :a6177. +:a6178 :a6178 :a6178. +:a6179 :a6179 :a6179. +:a6180 :a6180 :a6180. +:a6181 :a6181 :a6181. +:a6182 :a6182 :a6182. +:a6183 :a6183 :a6183. +:a6184 :a6184 :a6184. +:a6185 :a6185 :a6185. +:a6186 :a6186 :a6186. +:a6187 :a6187 :a6187. +:a6188 :a6188 :a6188. +:a6189 :a6189 :a6189. +:a6190 :a6190 :a6190. +:a6191 :a6191 :a6191. +:a6192 :a6192 :a6192. +:a6193 :a6193 :a6193. +:a6194 :a6194 :a6194. +:a6195 :a6195 :a6195. +:a6196 :a6196 :a6196. +:a6197 :a6197 :a6197. +:a6198 :a6198 :a6198. +:a6199 :a6199 :a6199. +:a6200 :a6200 :a6200. +:a6201 :a6201 :a6201. +:a6202 :a6202 :a6202. +:a6203 :a6203 :a6203. +:a6204 :a6204 :a6204. +:a6205 :a6205 :a6205. +:a6206 :a6206 :a6206. +:a6207 :a6207 :a6207. +:a6208 :a6208 :a6208. +:a6209 :a6209 :a6209. +:a6210 :a6210 :a6210. +:a6211 :a6211 :a6211. +:a6212 :a6212 :a6212. +:a6213 :a6213 :a6213. +:a6214 :a6214 :a6214. +:a6215 :a6215 :a6215. +:a6216 :a6216 :a6216. +:a6217 :a6217 :a6217. +:a6218 :a6218 :a6218. +:a6219 :a6219 :a6219. +:a6220 :a6220 :a6220. +:a6221 :a6221 :a6221. +:a6222 :a6222 :a6222. +:a6223 :a6223 :a6223. +:a6224 :a6224 :a6224. +:a6225 :a6225 :a6225. +:a6226 :a6226 :a6226. +:a6227 :a6227 :a6227. +:a6228 :a6228 :a6228. +:a6229 :a6229 :a6229. +:a6230 :a6230 :a6230. +:a6231 :a6231 :a6231. +:a6232 :a6232 :a6232. +:a6233 :a6233 :a6233. +:a6234 :a6234 :a6234. +:a6235 :a6235 :a6235. +:a6236 :a6236 :a6236. +:a6237 :a6237 :a6237. +:a6238 :a6238 :a6238. +:a6239 :a6239 :a6239. +:a6240 :a6240 :a6240. +:a6241 :a6241 :a6241. +:a6242 :a6242 :a6242. +:a6243 :a6243 :a6243. +:a6244 :a6244 :a6244. +:a6245 :a6245 :a6245. +:a6246 :a6246 :a6246. +:a6247 :a6247 :a6247. +:a6248 :a6248 :a6248. +:a6249 :a6249 :a6249. +:a6250 :a6250 :a6250. +:a6251 :a6251 :a6251. +:a6252 :a6252 :a6252. +:a6253 :a6253 :a6253. +:a6254 :a6254 :a6254. +:a6255 :a6255 :a6255. +:a6256 :a6256 :a6256. +:a6257 :a6257 :a6257. +:a6258 :a6258 :a6258. +:a6259 :a6259 :a6259. +:a6260 :a6260 :a6260. +:a6261 :a6261 :a6261. +:a6262 :a6262 :a6262. +:a6263 :a6263 :a6263. +:a6264 :a6264 :a6264. +:a6265 :a6265 :a6265. +:a6266 :a6266 :a6266. +:a6267 :a6267 :a6267. +:a6268 :a6268 :a6268. +:a6269 :a6269 :a6269. +:a6270 :a6270 :a6270. +:a6271 :a6271 :a6271. +:a6272 :a6272 :a6272. +:a6273 :a6273 :a6273. +:a6274 :a6274 :a6274. +:a6275 :a6275 :a6275. +:a6276 :a6276 :a6276. +:a6277 :a6277 :a6277. +:a6278 :a6278 :a6278. +:a6279 :a6279 :a6279. +:a6280 :a6280 :a6280. +:a6281 :a6281 :a6281. +:a6282 :a6282 :a6282. +:a6283 :a6283 :a6283. +:a6284 :a6284 :a6284. +:a6285 :a6285 :a6285. +:a6286 :a6286 :a6286. +:a6287 :a6287 :a6287. +:a6288 :a6288 :a6288. +:a6289 :a6289 :a6289. +:a6290 :a6290 :a6290. +:a6291 :a6291 :a6291. +:a6292 :a6292 :a6292. +:a6293 :a6293 :a6293. +:a6294 :a6294 :a6294. +:a6295 :a6295 :a6295. +:a6296 :a6296 :a6296. +:a6297 :a6297 :a6297. +:a6298 :a6298 :a6298. +:a6299 :a6299 :a6299. +:a6300 :a6300 :a6300. +:a6301 :a6301 :a6301. +:a6302 :a6302 :a6302. +:a6303 :a6303 :a6303. +:a6304 :a6304 :a6304. +:a6305 :a6305 :a6305. +:a6306 :a6306 :a6306. +:a6307 :a6307 :a6307. +:a6308 :a6308 :a6308. +:a6309 :a6309 :a6309. +:a6310 :a6310 :a6310. +:a6311 :a6311 :a6311. +:a6312 :a6312 :a6312. +:a6313 :a6313 :a6313. +:a6314 :a6314 :a6314. +:a6315 :a6315 :a6315. +:a6316 :a6316 :a6316. +:a6317 :a6317 :a6317. +:a6318 :a6318 :a6318. +:a6319 :a6319 :a6319. +:a6320 :a6320 :a6320. +:a6321 :a6321 :a6321. +:a6322 :a6322 :a6322. +:a6323 :a6323 :a6323. +:a6324 :a6324 :a6324. +:a6325 :a6325 :a6325. +:a6326 :a6326 :a6326. +:a6327 :a6327 :a6327. +:a6328 :a6328 :a6328. +:a6329 :a6329 :a6329. +:a6330 :a6330 :a6330. +:a6331 :a6331 :a6331. +:a6332 :a6332 :a6332. +:a6333 :a6333 :a6333. +:a6334 :a6334 :a6334. +:a6335 :a6335 :a6335. +:a6336 :a6336 :a6336. +:a6337 :a6337 :a6337. +:a6338 :a6338 :a6338. +:a6339 :a6339 :a6339. +:a6340 :a6340 :a6340. +:a6341 :a6341 :a6341. +:a6342 :a6342 :a6342. +:a6343 :a6343 :a6343. +:a6344 :a6344 :a6344. +:a6345 :a6345 :a6345. +:a6346 :a6346 :a6346. +:a6347 :a6347 :a6347. +:a6348 :a6348 :a6348. +:a6349 :a6349 :a6349. +:a6350 :a6350 :a6350. +:a6351 :a6351 :a6351. +:a6352 :a6352 :a6352. +:a6353 :a6353 :a6353. +:a6354 :a6354 :a6354. +:a6355 :a6355 :a6355. +:a6356 :a6356 :a6356. +:a6357 :a6357 :a6357. +:a6358 :a6358 :a6358. +:a6359 :a6359 :a6359. +:a6360 :a6360 :a6360. +:a6361 :a6361 :a6361. +:a6362 :a6362 :a6362. +:a6363 :a6363 :a6363. +:a6364 :a6364 :a6364. +:a6365 :a6365 :a6365. +:a6366 :a6366 :a6366. +:a6367 :a6367 :a6367. +:a6368 :a6368 :a6368. +:a6369 :a6369 :a6369. +:a6370 :a6370 :a6370. +:a6371 :a6371 :a6371. +:a6372 :a6372 :a6372. +:a6373 :a6373 :a6373. +:a6374 :a6374 :a6374. +:a6375 :a6375 :a6375. +:a6376 :a6376 :a6376. +:a6377 :a6377 :a6377. +:a6378 :a6378 :a6378. +:a6379 :a6379 :a6379. +:a6380 :a6380 :a6380. +:a6381 :a6381 :a6381. +:a6382 :a6382 :a6382. +:a6383 :a6383 :a6383. +:a6384 :a6384 :a6384. +:a6385 :a6385 :a6385. +:a6386 :a6386 :a6386. +:a6387 :a6387 :a6387. +:a6388 :a6388 :a6388. +:a6389 :a6389 :a6389. +:a6390 :a6390 :a6390. +:a6391 :a6391 :a6391. +:a6392 :a6392 :a6392. +:a6393 :a6393 :a6393. +:a6394 :a6394 :a6394. +:a6395 :a6395 :a6395. +:a6396 :a6396 :a6396. +:a6397 :a6397 :a6397. +:a6398 :a6398 :a6398. +:a6399 :a6399 :a6399. +:a6400 :a6400 :a6400. +:a6401 :a6401 :a6401. +:a6402 :a6402 :a6402. +:a6403 :a6403 :a6403. +:a6404 :a6404 :a6404. +:a6405 :a6405 :a6405. +:a6406 :a6406 :a6406. +:a6407 :a6407 :a6407. +:a6408 :a6408 :a6408. +:a6409 :a6409 :a6409. +:a6410 :a6410 :a6410. +:a6411 :a6411 :a6411. +:a6412 :a6412 :a6412. +:a6413 :a6413 :a6413. +:a6414 :a6414 :a6414. +:a6415 :a6415 :a6415. +:a6416 :a6416 :a6416. +:a6417 :a6417 :a6417. +:a6418 :a6418 :a6418. +:a6419 :a6419 :a6419. +:a6420 :a6420 :a6420. +:a6421 :a6421 :a6421. +:a6422 :a6422 :a6422. +:a6423 :a6423 :a6423. +:a6424 :a6424 :a6424. +:a6425 :a6425 :a6425. +:a6426 :a6426 :a6426. +:a6427 :a6427 :a6427. +:a6428 :a6428 :a6428. +:a6429 :a6429 :a6429. +:a6430 :a6430 :a6430. +:a6431 :a6431 :a6431. +:a6432 :a6432 :a6432. +:a6433 :a6433 :a6433. +:a6434 :a6434 :a6434. +:a6435 :a6435 :a6435. +:a6436 :a6436 :a6436. +:a6437 :a6437 :a6437. +:a6438 :a6438 :a6438. +:a6439 :a6439 :a6439. +:a6440 :a6440 :a6440. +:a6441 :a6441 :a6441. +:a6442 :a6442 :a6442. +:a6443 :a6443 :a6443. +:a6444 :a6444 :a6444. +:a6445 :a6445 :a6445. +:a6446 :a6446 :a6446. +:a6447 :a6447 :a6447. +:a6448 :a6448 :a6448. +:a6449 :a6449 :a6449. +:a6450 :a6450 :a6450. +:a6451 :a6451 :a6451. +:a6452 :a6452 :a6452. +:a6453 :a6453 :a6453. +:a6454 :a6454 :a6454. +:a6455 :a6455 :a6455. +:a6456 :a6456 :a6456. +:a6457 :a6457 :a6457. +:a6458 :a6458 :a6458. +:a6459 :a6459 :a6459. +:a6460 :a6460 :a6460. +:a6461 :a6461 :a6461. +:a6462 :a6462 :a6462. +:a6463 :a6463 :a6463. +:a6464 :a6464 :a6464. +:a6465 :a6465 :a6465. +:a6466 :a6466 :a6466. +:a6467 :a6467 :a6467. +:a6468 :a6468 :a6468. +:a6469 :a6469 :a6469. +:a6470 :a6470 :a6470. +:a6471 :a6471 :a6471. +:a6472 :a6472 :a6472. +:a6473 :a6473 :a6473. +:a6474 :a6474 :a6474. +:a6475 :a6475 :a6475. +:a6476 :a6476 :a6476. +:a6477 :a6477 :a6477. +:a6478 :a6478 :a6478. +:a6479 :a6479 :a6479. +:a6480 :a6480 :a6480. +:a6481 :a6481 :a6481. +:a6482 :a6482 :a6482. +:a6483 :a6483 :a6483. +:a6484 :a6484 :a6484. +:a6485 :a6485 :a6485. +:a6486 :a6486 :a6486. +:a6487 :a6487 :a6487. +:a6488 :a6488 :a6488. +:a6489 :a6489 :a6489. +:a6490 :a6490 :a6490. +:a6491 :a6491 :a6491. +:a6492 :a6492 :a6492. +:a6493 :a6493 :a6493. +:a6494 :a6494 :a6494. +:a6495 :a6495 :a6495. +:a6496 :a6496 :a6496. +:a6497 :a6497 :a6497. +:a6498 :a6498 :a6498. +:a6499 :a6499 :a6499. +:a6500 :a6500 :a6500. +:a6501 :a6501 :a6501. +:a6502 :a6502 :a6502. +:a6503 :a6503 :a6503. +:a6504 :a6504 :a6504. +:a6505 :a6505 :a6505. +:a6506 :a6506 :a6506. +:a6507 :a6507 :a6507. +:a6508 :a6508 :a6508. +:a6509 :a6509 :a6509. +:a6510 :a6510 :a6510. +:a6511 :a6511 :a6511. +:a6512 :a6512 :a6512. +:a6513 :a6513 :a6513. +:a6514 :a6514 :a6514. +:a6515 :a6515 :a6515. +:a6516 :a6516 :a6516. +:a6517 :a6517 :a6517. +:a6518 :a6518 :a6518. +:a6519 :a6519 :a6519. +:a6520 :a6520 :a6520. +:a6521 :a6521 :a6521. +:a6522 :a6522 :a6522. +:a6523 :a6523 :a6523. +:a6524 :a6524 :a6524. +:a6525 :a6525 :a6525. +:a6526 :a6526 :a6526. +:a6527 :a6527 :a6527. +:a6528 :a6528 :a6528. +:a6529 :a6529 :a6529. +:a6530 :a6530 :a6530. +:a6531 :a6531 :a6531. +:a6532 :a6532 :a6532. +:a6533 :a6533 :a6533. +:a6534 :a6534 :a6534. +:a6535 :a6535 :a6535. +:a6536 :a6536 :a6536. +:a6537 :a6537 :a6537. +:a6538 :a6538 :a6538. +:a6539 :a6539 :a6539. +:a6540 :a6540 :a6540. +:a6541 :a6541 :a6541. +:a6542 :a6542 :a6542. +:a6543 :a6543 :a6543. +:a6544 :a6544 :a6544. +:a6545 :a6545 :a6545. +:a6546 :a6546 :a6546. +:a6547 :a6547 :a6547. +:a6548 :a6548 :a6548. +:a6549 :a6549 :a6549. +:a6550 :a6550 :a6550. +:a6551 :a6551 :a6551. +:a6552 :a6552 :a6552. +:a6553 :a6553 :a6553. +:a6554 :a6554 :a6554. +:a6555 :a6555 :a6555. +:a6556 :a6556 :a6556. +:a6557 :a6557 :a6557. +:a6558 :a6558 :a6558. +:a6559 :a6559 :a6559. +:a6560 :a6560 :a6560. +:a6561 :a6561 :a6561. +:a6562 :a6562 :a6562. +:a6563 :a6563 :a6563. +:a6564 :a6564 :a6564. +:a6565 :a6565 :a6565. +:a6566 :a6566 :a6566. +:a6567 :a6567 :a6567. +:a6568 :a6568 :a6568. +:a6569 :a6569 :a6569. +:a6570 :a6570 :a6570. +:a6571 :a6571 :a6571. +:a6572 :a6572 :a6572. +:a6573 :a6573 :a6573. +:a6574 :a6574 :a6574. +:a6575 :a6575 :a6575. +:a6576 :a6576 :a6576. +:a6577 :a6577 :a6577. +:a6578 :a6578 :a6578. +:a6579 :a6579 :a6579. +:a6580 :a6580 :a6580. +:a6581 :a6581 :a6581. +:a6582 :a6582 :a6582. +:a6583 :a6583 :a6583. +:a6584 :a6584 :a6584. +:a6585 :a6585 :a6585. +:a6586 :a6586 :a6586. +:a6587 :a6587 :a6587. +:a6588 :a6588 :a6588. +:a6589 :a6589 :a6589. +:a6590 :a6590 :a6590. +:a6591 :a6591 :a6591. +:a6592 :a6592 :a6592. +:a6593 :a6593 :a6593. +:a6594 :a6594 :a6594. +:a6595 :a6595 :a6595. +:a6596 :a6596 :a6596. +:a6597 :a6597 :a6597. +:a6598 :a6598 :a6598. +:a6599 :a6599 :a6599. +:a6600 :a6600 :a6600. +:a6601 :a6601 :a6601. +:a6602 :a6602 :a6602. +:a6603 :a6603 :a6603. +:a6604 :a6604 :a6604. +:a6605 :a6605 :a6605. +:a6606 :a6606 :a6606. +:a6607 :a6607 :a6607. +:a6608 :a6608 :a6608. +:a6609 :a6609 :a6609. +:a6610 :a6610 :a6610. +:a6611 :a6611 :a6611. +:a6612 :a6612 :a6612. +:a6613 :a6613 :a6613. +:a6614 :a6614 :a6614. +:a6615 :a6615 :a6615. +:a6616 :a6616 :a6616. +:a6617 :a6617 :a6617. +:a6618 :a6618 :a6618. +:a6619 :a6619 :a6619. +:a6620 :a6620 :a6620. +:a6621 :a6621 :a6621. +:a6622 :a6622 :a6622. +:a6623 :a6623 :a6623. +:a6624 :a6624 :a6624. +:a6625 :a6625 :a6625. +:a6626 :a6626 :a6626. +:a6627 :a6627 :a6627. +:a6628 :a6628 :a6628. +:a6629 :a6629 :a6629. +:a6630 :a6630 :a6630. +:a6631 :a6631 :a6631. +:a6632 :a6632 :a6632. +:a6633 :a6633 :a6633. +:a6634 :a6634 :a6634. +:a6635 :a6635 :a6635. +:a6636 :a6636 :a6636. +:a6637 :a6637 :a6637. +:a6638 :a6638 :a6638. +:a6639 :a6639 :a6639. +:a6640 :a6640 :a6640. +:a6641 :a6641 :a6641. +:a6642 :a6642 :a6642. +:a6643 :a6643 :a6643. +:a6644 :a6644 :a6644. +:a6645 :a6645 :a6645. +:a6646 :a6646 :a6646. +:a6647 :a6647 :a6647. +:a6648 :a6648 :a6648. +:a6649 :a6649 :a6649. +:a6650 :a6650 :a6650. +:a6651 :a6651 :a6651. +:a6652 :a6652 :a6652. +:a6653 :a6653 :a6653. +:a6654 :a6654 :a6654. +:a6655 :a6655 :a6655. +:a6656 :a6656 :a6656. +:a6657 :a6657 :a6657. +:a6658 :a6658 :a6658. +:a6659 :a6659 :a6659. +:a6660 :a6660 :a6660. +:a6661 :a6661 :a6661. +:a6662 :a6662 :a6662. +:a6663 :a6663 :a6663. +:a6664 :a6664 :a6664. +:a6665 :a6665 :a6665. +:a6666 :a6666 :a6666. +:a6667 :a6667 :a6667. +:a6668 :a6668 :a6668. +:a6669 :a6669 :a6669. +:a6670 :a6670 :a6670. +:a6671 :a6671 :a6671. +:a6672 :a6672 :a6672. +:a6673 :a6673 :a6673. +:a6674 :a6674 :a6674. +:a6675 :a6675 :a6675. +:a6676 :a6676 :a6676. +:a6677 :a6677 :a6677. +:a6678 :a6678 :a6678. +:a6679 :a6679 :a6679. +:a6680 :a6680 :a6680. +:a6681 :a6681 :a6681. +:a6682 :a6682 :a6682. +:a6683 :a6683 :a6683. +:a6684 :a6684 :a6684. +:a6685 :a6685 :a6685. +:a6686 :a6686 :a6686. +:a6687 :a6687 :a6687. +:a6688 :a6688 :a6688. +:a6689 :a6689 :a6689. +:a6690 :a6690 :a6690. +:a6691 :a6691 :a6691. +:a6692 :a6692 :a6692. +:a6693 :a6693 :a6693. +:a6694 :a6694 :a6694. +:a6695 :a6695 :a6695. +:a6696 :a6696 :a6696. +:a6697 :a6697 :a6697. +:a6698 :a6698 :a6698. +:a6699 :a6699 :a6699. +:a6700 :a6700 :a6700. +:a6701 :a6701 :a6701. +:a6702 :a6702 :a6702. +:a6703 :a6703 :a6703. +:a6704 :a6704 :a6704. +:a6705 :a6705 :a6705. +:a6706 :a6706 :a6706. +:a6707 :a6707 :a6707. +:a6708 :a6708 :a6708. +:a6709 :a6709 :a6709. +:a6710 :a6710 :a6710. +:a6711 :a6711 :a6711. +:a6712 :a6712 :a6712. +:a6713 :a6713 :a6713. +:a6714 :a6714 :a6714. +:a6715 :a6715 :a6715. +:a6716 :a6716 :a6716. +:a6717 :a6717 :a6717. +:a6718 :a6718 :a6718. +:a6719 :a6719 :a6719. +:a6720 :a6720 :a6720. +:a6721 :a6721 :a6721. +:a6722 :a6722 :a6722. +:a6723 :a6723 :a6723. +:a6724 :a6724 :a6724. +:a6725 :a6725 :a6725. +:a6726 :a6726 :a6726. +:a6727 :a6727 :a6727. +:a6728 :a6728 :a6728. +:a6729 :a6729 :a6729. +:a6730 :a6730 :a6730. +:a6731 :a6731 :a6731. +:a6732 :a6732 :a6732. +:a6733 :a6733 :a6733. +:a6734 :a6734 :a6734. +:a6735 :a6735 :a6735. +:a6736 :a6736 :a6736. +:a6737 :a6737 :a6737. +:a6738 :a6738 :a6738. +:a6739 :a6739 :a6739. +:a6740 :a6740 :a6740. +:a6741 :a6741 :a6741. +:a6742 :a6742 :a6742. +:a6743 :a6743 :a6743. +:a6744 :a6744 :a6744. +:a6745 :a6745 :a6745. +:a6746 :a6746 :a6746. +:a6747 :a6747 :a6747. +:a6748 :a6748 :a6748. +:a6749 :a6749 :a6749. +:a6750 :a6750 :a6750. +:a6751 :a6751 :a6751. +:a6752 :a6752 :a6752. +:a6753 :a6753 :a6753. +:a6754 :a6754 :a6754. +:a6755 :a6755 :a6755. +:a6756 :a6756 :a6756. +:a6757 :a6757 :a6757. +:a6758 :a6758 :a6758. +:a6759 :a6759 :a6759. +:a6760 :a6760 :a6760. +:a6761 :a6761 :a6761. +:a6762 :a6762 :a6762. +:a6763 :a6763 :a6763. +:a6764 :a6764 :a6764. +:a6765 :a6765 :a6765. +:a6766 :a6766 :a6766. +:a6767 :a6767 :a6767. +:a6768 :a6768 :a6768. +:a6769 :a6769 :a6769. +:a6770 :a6770 :a6770. +:a6771 :a6771 :a6771. +:a6772 :a6772 :a6772. +:a6773 :a6773 :a6773. +:a6774 :a6774 :a6774. +:a6775 :a6775 :a6775. +:a6776 :a6776 :a6776. +:a6777 :a6777 :a6777. +:a6778 :a6778 :a6778. +:a6779 :a6779 :a6779. +:a6780 :a6780 :a6780. +:a6781 :a6781 :a6781. +:a6782 :a6782 :a6782. +:a6783 :a6783 :a6783. +:a6784 :a6784 :a6784. +:a6785 :a6785 :a6785. +:a6786 :a6786 :a6786. +:a6787 :a6787 :a6787. +:a6788 :a6788 :a6788. +:a6789 :a6789 :a6789. +:a6790 :a6790 :a6790. +:a6791 :a6791 :a6791. +:a6792 :a6792 :a6792. +:a6793 :a6793 :a6793. +:a6794 :a6794 :a6794. +:a6795 :a6795 :a6795. +:a6796 :a6796 :a6796. +:a6797 :a6797 :a6797. +:a6798 :a6798 :a6798. +:a6799 :a6799 :a6799. +:a6800 :a6800 :a6800. +:a6801 :a6801 :a6801. +:a6802 :a6802 :a6802. +:a6803 :a6803 :a6803. +:a6804 :a6804 :a6804. +:a6805 :a6805 :a6805. +:a6806 :a6806 :a6806. +:a6807 :a6807 :a6807. +:a6808 :a6808 :a6808. +:a6809 :a6809 :a6809. +:a6810 :a6810 :a6810. +:a6811 :a6811 :a6811. +:a6812 :a6812 :a6812. +:a6813 :a6813 :a6813. +:a6814 :a6814 :a6814. +:a6815 :a6815 :a6815. +:a6816 :a6816 :a6816. +:a6817 :a6817 :a6817. +:a6818 :a6818 :a6818. +:a6819 :a6819 :a6819. +:a6820 :a6820 :a6820. +:a6821 :a6821 :a6821. +:a6822 :a6822 :a6822. +:a6823 :a6823 :a6823. +:a6824 :a6824 :a6824. +:a6825 :a6825 :a6825. +:a6826 :a6826 :a6826. +:a6827 :a6827 :a6827. +:a6828 :a6828 :a6828. +:a6829 :a6829 :a6829. +:a6830 :a6830 :a6830. +:a6831 :a6831 :a6831. +:a6832 :a6832 :a6832. +:a6833 :a6833 :a6833. +:a6834 :a6834 :a6834. +:a6835 :a6835 :a6835. +:a6836 :a6836 :a6836. +:a6837 :a6837 :a6837. +:a6838 :a6838 :a6838. +:a6839 :a6839 :a6839. +:a6840 :a6840 :a6840. +:a6841 :a6841 :a6841. +:a6842 :a6842 :a6842. +:a6843 :a6843 :a6843. +:a6844 :a6844 :a6844. +:a6845 :a6845 :a6845. +:a6846 :a6846 :a6846. +:a6847 :a6847 :a6847. +:a6848 :a6848 :a6848. +:a6849 :a6849 :a6849. +:a6850 :a6850 :a6850. +:a6851 :a6851 :a6851. +:a6852 :a6852 :a6852. +:a6853 :a6853 :a6853. +:a6854 :a6854 :a6854. +:a6855 :a6855 :a6855. +:a6856 :a6856 :a6856. +:a6857 :a6857 :a6857. +:a6858 :a6858 :a6858. +:a6859 :a6859 :a6859. +:a6860 :a6860 :a6860. +:a6861 :a6861 :a6861. +:a6862 :a6862 :a6862. +:a6863 :a6863 :a6863. +:a6864 :a6864 :a6864. +:a6865 :a6865 :a6865. +:a6866 :a6866 :a6866. +:a6867 :a6867 :a6867. +:a6868 :a6868 :a6868. +:a6869 :a6869 :a6869. +:a6870 :a6870 :a6870. +:a6871 :a6871 :a6871. +:a6872 :a6872 :a6872. +:a6873 :a6873 :a6873. +:a6874 :a6874 :a6874. +:a6875 :a6875 :a6875. +:a6876 :a6876 :a6876. +:a6877 :a6877 :a6877. +:a6878 :a6878 :a6878. +:a6879 :a6879 :a6879. +:a6880 :a6880 :a6880. +:a6881 :a6881 :a6881. +:a6882 :a6882 :a6882. +:a6883 :a6883 :a6883. +:a6884 :a6884 :a6884. +:a6885 :a6885 :a6885. +:a6886 :a6886 :a6886. +:a6887 :a6887 :a6887. +:a6888 :a6888 :a6888. +:a6889 :a6889 :a6889. +:a6890 :a6890 :a6890. +:a6891 :a6891 :a6891. +:a6892 :a6892 :a6892. +:a6893 :a6893 :a6893. +:a6894 :a6894 :a6894. +:a6895 :a6895 :a6895. +:a6896 :a6896 :a6896. +:a6897 :a6897 :a6897. +:a6898 :a6898 :a6898. +:a6899 :a6899 :a6899. +:a6900 :a6900 :a6900. +:a6901 :a6901 :a6901. +:a6902 :a6902 :a6902. +:a6903 :a6903 :a6903. +:a6904 :a6904 :a6904. +:a6905 :a6905 :a6905. +:a6906 :a6906 :a6906. +:a6907 :a6907 :a6907. +:a6908 :a6908 :a6908. +:a6909 :a6909 :a6909. +:a6910 :a6910 :a6910. +:a6911 :a6911 :a6911. +:a6912 :a6912 :a6912. +:a6913 :a6913 :a6913. +:a6914 :a6914 :a6914. +:a6915 :a6915 :a6915. +:a6916 :a6916 :a6916. +:a6917 :a6917 :a6917. +:a6918 :a6918 :a6918. +:a6919 :a6919 :a6919. +:a6920 :a6920 :a6920. +:a6921 :a6921 :a6921. +:a6922 :a6922 :a6922. +:a6923 :a6923 :a6923. +:a6924 :a6924 :a6924. +:a6925 :a6925 :a6925. +:a6926 :a6926 :a6926. +:a6927 :a6927 :a6927. +:a6928 :a6928 :a6928. +:a6929 :a6929 :a6929. +:a6930 :a6930 :a6930. +:a6931 :a6931 :a6931. +:a6932 :a6932 :a6932. +:a6933 :a6933 :a6933. +:a6934 :a6934 :a6934. +:a6935 :a6935 :a6935. +:a6936 :a6936 :a6936. +:a6937 :a6937 :a6937. +:a6938 :a6938 :a6938. +:a6939 :a6939 :a6939. +:a6940 :a6940 :a6940. +:a6941 :a6941 :a6941. +:a6942 :a6942 :a6942. +:a6943 :a6943 :a6943. +:a6944 :a6944 :a6944. +:a6945 :a6945 :a6945. +:a6946 :a6946 :a6946. +:a6947 :a6947 :a6947. +:a6948 :a6948 :a6948. +:a6949 :a6949 :a6949. +:a6950 :a6950 :a6950. +:a6951 :a6951 :a6951. +:a6952 :a6952 :a6952. +:a6953 :a6953 :a6953. +:a6954 :a6954 :a6954. +:a6955 :a6955 :a6955. +:a6956 :a6956 :a6956. +:a6957 :a6957 :a6957. +:a6958 :a6958 :a6958. +:a6959 :a6959 :a6959. +:a6960 :a6960 :a6960. +:a6961 :a6961 :a6961. +:a6962 :a6962 :a6962. +:a6963 :a6963 :a6963. +:a6964 :a6964 :a6964. +:a6965 :a6965 :a6965. +:a6966 :a6966 :a6966. +:a6967 :a6967 :a6967. +:a6968 :a6968 :a6968. +:a6969 :a6969 :a6969. +:a6970 :a6970 :a6970. +:a6971 :a6971 :a6971. +:a6972 :a6972 :a6972. +:a6973 :a6973 :a6973. +:a6974 :a6974 :a6974. +:a6975 :a6975 :a6975. +:a6976 :a6976 :a6976. +:a6977 :a6977 :a6977. +:a6978 :a6978 :a6978. +:a6979 :a6979 :a6979. +:a6980 :a6980 :a6980. +:a6981 :a6981 :a6981. +:a6982 :a6982 :a6982. +:a6983 :a6983 :a6983. +:a6984 :a6984 :a6984. +:a6985 :a6985 :a6985. +:a6986 :a6986 :a6986. +:a6987 :a6987 :a6987. +:a6988 :a6988 :a6988. +:a6989 :a6989 :a6989. +:a6990 :a6990 :a6990. +:a6991 :a6991 :a6991. +:a6992 :a6992 :a6992. +:a6993 :a6993 :a6993. +:a6994 :a6994 :a6994. +:a6995 :a6995 :a6995. +:a6996 :a6996 :a6996. +:a6997 :a6997 :a6997. +:a6998 :a6998 :a6998. +:a6999 :a6999 :a6999. +:a7000 :a7000 :a7000. +:a7001 :a7001 :a7001. +:a7002 :a7002 :a7002. +:a7003 :a7003 :a7003. +:a7004 :a7004 :a7004. +:a7005 :a7005 :a7005. +:a7006 :a7006 :a7006. +:a7007 :a7007 :a7007. +:a7008 :a7008 :a7008. +:a7009 :a7009 :a7009. +:a7010 :a7010 :a7010. +:a7011 :a7011 :a7011. +:a7012 :a7012 :a7012. +:a7013 :a7013 :a7013. +:a7014 :a7014 :a7014. +:a7015 :a7015 :a7015. +:a7016 :a7016 :a7016. +:a7017 :a7017 :a7017. +:a7018 :a7018 :a7018. +:a7019 :a7019 :a7019. +:a7020 :a7020 :a7020. +:a7021 :a7021 :a7021. +:a7022 :a7022 :a7022. +:a7023 :a7023 :a7023. +:a7024 :a7024 :a7024. +:a7025 :a7025 :a7025. +:a7026 :a7026 :a7026. +:a7027 :a7027 :a7027. +:a7028 :a7028 :a7028. +:a7029 :a7029 :a7029. +:a7030 :a7030 :a7030. +:a7031 :a7031 :a7031. +:a7032 :a7032 :a7032. +:a7033 :a7033 :a7033. +:a7034 :a7034 :a7034. +:a7035 :a7035 :a7035. +:a7036 :a7036 :a7036. +:a7037 :a7037 :a7037. +:a7038 :a7038 :a7038. +:a7039 :a7039 :a7039. +:a7040 :a7040 :a7040. +:a7041 :a7041 :a7041. +:a7042 :a7042 :a7042. +:a7043 :a7043 :a7043. +:a7044 :a7044 :a7044. +:a7045 :a7045 :a7045. +:a7046 :a7046 :a7046. +:a7047 :a7047 :a7047. +:a7048 :a7048 :a7048. +:a7049 :a7049 :a7049. +:a7050 :a7050 :a7050. +:a7051 :a7051 :a7051. +:a7052 :a7052 :a7052. +:a7053 :a7053 :a7053. +:a7054 :a7054 :a7054. +:a7055 :a7055 :a7055. +:a7056 :a7056 :a7056. +:a7057 :a7057 :a7057. +:a7058 :a7058 :a7058. +:a7059 :a7059 :a7059. +:a7060 :a7060 :a7060. +:a7061 :a7061 :a7061. +:a7062 :a7062 :a7062. +:a7063 :a7063 :a7063. +:a7064 :a7064 :a7064. +:a7065 :a7065 :a7065. +:a7066 :a7066 :a7066. +:a7067 :a7067 :a7067. +:a7068 :a7068 :a7068. +:a7069 :a7069 :a7069. +:a7070 :a7070 :a7070. +:a7071 :a7071 :a7071. +:a7072 :a7072 :a7072. +:a7073 :a7073 :a7073. +:a7074 :a7074 :a7074. +:a7075 :a7075 :a7075. +:a7076 :a7076 :a7076. +:a7077 :a7077 :a7077. +:a7078 :a7078 :a7078. +:a7079 :a7079 :a7079. +:a7080 :a7080 :a7080. +:a7081 :a7081 :a7081. +:a7082 :a7082 :a7082. +:a7083 :a7083 :a7083. +:a7084 :a7084 :a7084. +:a7085 :a7085 :a7085. +:a7086 :a7086 :a7086. +:a7087 :a7087 :a7087. +:a7088 :a7088 :a7088. +:a7089 :a7089 :a7089. +:a7090 :a7090 :a7090. +:a7091 :a7091 :a7091. +:a7092 :a7092 :a7092. +:a7093 :a7093 :a7093. +:a7094 :a7094 :a7094. +:a7095 :a7095 :a7095. +:a7096 :a7096 :a7096. +:a7097 :a7097 :a7097. +:a7098 :a7098 :a7098. +:a7099 :a7099 :a7099. +:a7100 :a7100 :a7100. +:a7101 :a7101 :a7101. +:a7102 :a7102 :a7102. +:a7103 :a7103 :a7103. +:a7104 :a7104 :a7104. +:a7105 :a7105 :a7105. +:a7106 :a7106 :a7106. +:a7107 :a7107 :a7107. +:a7108 :a7108 :a7108. +:a7109 :a7109 :a7109. +:a7110 :a7110 :a7110. +:a7111 :a7111 :a7111. +:a7112 :a7112 :a7112. +:a7113 :a7113 :a7113. +:a7114 :a7114 :a7114. +:a7115 :a7115 :a7115. +:a7116 :a7116 :a7116. +:a7117 :a7117 :a7117. +:a7118 :a7118 :a7118. +:a7119 :a7119 :a7119. +:a7120 :a7120 :a7120. +:a7121 :a7121 :a7121. +:a7122 :a7122 :a7122. +:a7123 :a7123 :a7123. +:a7124 :a7124 :a7124. +:a7125 :a7125 :a7125. +:a7126 :a7126 :a7126. +:a7127 :a7127 :a7127. +:a7128 :a7128 :a7128. +:a7129 :a7129 :a7129. +:a7130 :a7130 :a7130. +:a7131 :a7131 :a7131. +:a7132 :a7132 :a7132. +:a7133 :a7133 :a7133. +:a7134 :a7134 :a7134. +:a7135 :a7135 :a7135. +:a7136 :a7136 :a7136. +:a7137 :a7137 :a7137. +:a7138 :a7138 :a7138. +:a7139 :a7139 :a7139. +:a7140 :a7140 :a7140. +:a7141 :a7141 :a7141. +:a7142 :a7142 :a7142. +:a7143 :a7143 :a7143. +:a7144 :a7144 :a7144. +:a7145 :a7145 :a7145. +:a7146 :a7146 :a7146. +:a7147 :a7147 :a7147. +:a7148 :a7148 :a7148. +:a7149 :a7149 :a7149. +:a7150 :a7150 :a7150. +:a7151 :a7151 :a7151. +:a7152 :a7152 :a7152. +:a7153 :a7153 :a7153. +:a7154 :a7154 :a7154. +:a7155 :a7155 :a7155. +:a7156 :a7156 :a7156. +:a7157 :a7157 :a7157. +:a7158 :a7158 :a7158. +:a7159 :a7159 :a7159. +:a7160 :a7160 :a7160. +:a7161 :a7161 :a7161. +:a7162 :a7162 :a7162. +:a7163 :a7163 :a7163. +:a7164 :a7164 :a7164. +:a7165 :a7165 :a7165. +:a7166 :a7166 :a7166. +:a7167 :a7167 :a7167. +:a7168 :a7168 :a7168. +:a7169 :a7169 :a7169. +:a7170 :a7170 :a7170. +:a7171 :a7171 :a7171. +:a7172 :a7172 :a7172. +:a7173 :a7173 :a7173. +:a7174 :a7174 :a7174. +:a7175 :a7175 :a7175. +:a7176 :a7176 :a7176. +:a7177 :a7177 :a7177. +:a7178 :a7178 :a7178. +:a7179 :a7179 :a7179. +:a7180 :a7180 :a7180. +:a7181 :a7181 :a7181. +:a7182 :a7182 :a7182. +:a7183 :a7183 :a7183. +:a7184 :a7184 :a7184. +:a7185 :a7185 :a7185. +:a7186 :a7186 :a7186. +:a7187 :a7187 :a7187. +:a7188 :a7188 :a7188. +:a7189 :a7189 :a7189. +:a7190 :a7190 :a7190. +:a7191 :a7191 :a7191. +:a7192 :a7192 :a7192. +:a7193 :a7193 :a7193. +:a7194 :a7194 :a7194. +:a7195 :a7195 :a7195. +:a7196 :a7196 :a7196. +:a7197 :a7197 :a7197. +:a7198 :a7198 :a7198. +:a7199 :a7199 :a7199. +:a7200 :a7200 :a7200. +:a7201 :a7201 :a7201. +:a7202 :a7202 :a7202. +:a7203 :a7203 :a7203. +:a7204 :a7204 :a7204. +:a7205 :a7205 :a7205. +:a7206 :a7206 :a7206. +:a7207 :a7207 :a7207. +:a7208 :a7208 :a7208. +:a7209 :a7209 :a7209. +:a7210 :a7210 :a7210. +:a7211 :a7211 :a7211. +:a7212 :a7212 :a7212. +:a7213 :a7213 :a7213. +:a7214 :a7214 :a7214. +:a7215 :a7215 :a7215. +:a7216 :a7216 :a7216. +:a7217 :a7217 :a7217. +:a7218 :a7218 :a7218. +:a7219 :a7219 :a7219. +:a7220 :a7220 :a7220. +:a7221 :a7221 :a7221. +:a7222 :a7222 :a7222. +:a7223 :a7223 :a7223. +:a7224 :a7224 :a7224. +:a7225 :a7225 :a7225. +:a7226 :a7226 :a7226. +:a7227 :a7227 :a7227. +:a7228 :a7228 :a7228. +:a7229 :a7229 :a7229. +:a7230 :a7230 :a7230. +:a7231 :a7231 :a7231. +:a7232 :a7232 :a7232. +:a7233 :a7233 :a7233. +:a7234 :a7234 :a7234. +:a7235 :a7235 :a7235. +:a7236 :a7236 :a7236. +:a7237 :a7237 :a7237. +:a7238 :a7238 :a7238. +:a7239 :a7239 :a7239. +:a7240 :a7240 :a7240. +:a7241 :a7241 :a7241. +:a7242 :a7242 :a7242. +:a7243 :a7243 :a7243. +:a7244 :a7244 :a7244. +:a7245 :a7245 :a7245. +:a7246 :a7246 :a7246. +:a7247 :a7247 :a7247. +:a7248 :a7248 :a7248. +:a7249 :a7249 :a7249. +:a7250 :a7250 :a7250. +:a7251 :a7251 :a7251. +:a7252 :a7252 :a7252. +:a7253 :a7253 :a7253. +:a7254 :a7254 :a7254. +:a7255 :a7255 :a7255. +:a7256 :a7256 :a7256. +:a7257 :a7257 :a7257. +:a7258 :a7258 :a7258. +:a7259 :a7259 :a7259. +:a7260 :a7260 :a7260. +:a7261 :a7261 :a7261. +:a7262 :a7262 :a7262. +:a7263 :a7263 :a7263. +:a7264 :a7264 :a7264. +:a7265 :a7265 :a7265. +:a7266 :a7266 :a7266. +:a7267 :a7267 :a7267. +:a7268 :a7268 :a7268. +:a7269 :a7269 :a7269. +:a7270 :a7270 :a7270. +:a7271 :a7271 :a7271. +:a7272 :a7272 :a7272. +:a7273 :a7273 :a7273. +:a7274 :a7274 :a7274. +:a7275 :a7275 :a7275. +:a7276 :a7276 :a7276. +:a7277 :a7277 :a7277. +:a7278 :a7278 :a7278. +:a7279 :a7279 :a7279. +:a7280 :a7280 :a7280. +:a7281 :a7281 :a7281. +:a7282 :a7282 :a7282. +:a7283 :a7283 :a7283. +:a7284 :a7284 :a7284. +:a7285 :a7285 :a7285. +:a7286 :a7286 :a7286. +:a7287 :a7287 :a7287. +:a7288 :a7288 :a7288. +:a7289 :a7289 :a7289. +:a7290 :a7290 :a7290. +:a7291 :a7291 :a7291. +:a7292 :a7292 :a7292. +:a7293 :a7293 :a7293. +:a7294 :a7294 :a7294. +:a7295 :a7295 :a7295. +:a7296 :a7296 :a7296. +:a7297 :a7297 :a7297. +:a7298 :a7298 :a7298. +:a7299 :a7299 :a7299. +:a7300 :a7300 :a7300. +:a7301 :a7301 :a7301. +:a7302 :a7302 :a7302. +:a7303 :a7303 :a7303. +:a7304 :a7304 :a7304. +:a7305 :a7305 :a7305. +:a7306 :a7306 :a7306. +:a7307 :a7307 :a7307. +:a7308 :a7308 :a7308. +:a7309 :a7309 :a7309. +:a7310 :a7310 :a7310. +:a7311 :a7311 :a7311. +:a7312 :a7312 :a7312. +:a7313 :a7313 :a7313. +:a7314 :a7314 :a7314. +:a7315 :a7315 :a7315. +:a7316 :a7316 :a7316. +:a7317 :a7317 :a7317. +:a7318 :a7318 :a7318. +:a7319 :a7319 :a7319. +:a7320 :a7320 :a7320. +:a7321 :a7321 :a7321. +:a7322 :a7322 :a7322. +:a7323 :a7323 :a7323. +:a7324 :a7324 :a7324. +:a7325 :a7325 :a7325. +:a7326 :a7326 :a7326. +:a7327 :a7327 :a7327. +:a7328 :a7328 :a7328. +:a7329 :a7329 :a7329. +:a7330 :a7330 :a7330. +:a7331 :a7331 :a7331. +:a7332 :a7332 :a7332. +:a7333 :a7333 :a7333. +:a7334 :a7334 :a7334. +:a7335 :a7335 :a7335. +:a7336 :a7336 :a7336. +:a7337 :a7337 :a7337. +:a7338 :a7338 :a7338. +:a7339 :a7339 :a7339. +:a7340 :a7340 :a7340. +:a7341 :a7341 :a7341. +:a7342 :a7342 :a7342. +:a7343 :a7343 :a7343. +:a7344 :a7344 :a7344. +:a7345 :a7345 :a7345. +:a7346 :a7346 :a7346. +:a7347 :a7347 :a7347. +:a7348 :a7348 :a7348. +:a7349 :a7349 :a7349. +:a7350 :a7350 :a7350. +:a7351 :a7351 :a7351. +:a7352 :a7352 :a7352. +:a7353 :a7353 :a7353. +:a7354 :a7354 :a7354. +:a7355 :a7355 :a7355. +:a7356 :a7356 :a7356. +:a7357 :a7357 :a7357. +:a7358 :a7358 :a7358. +:a7359 :a7359 :a7359. +:a7360 :a7360 :a7360. +:a7361 :a7361 :a7361. +:a7362 :a7362 :a7362. +:a7363 :a7363 :a7363. +:a7364 :a7364 :a7364. +:a7365 :a7365 :a7365. +:a7366 :a7366 :a7366. +:a7367 :a7367 :a7367. +:a7368 :a7368 :a7368. +:a7369 :a7369 :a7369. +:a7370 :a7370 :a7370. +:a7371 :a7371 :a7371. +:a7372 :a7372 :a7372. +:a7373 :a7373 :a7373. +:a7374 :a7374 :a7374. +:a7375 :a7375 :a7375. +:a7376 :a7376 :a7376. +:a7377 :a7377 :a7377. +:a7378 :a7378 :a7378. +:a7379 :a7379 :a7379. +:a7380 :a7380 :a7380. +:a7381 :a7381 :a7381. +:a7382 :a7382 :a7382. +:a7383 :a7383 :a7383. +:a7384 :a7384 :a7384. +:a7385 :a7385 :a7385. +:a7386 :a7386 :a7386. +:a7387 :a7387 :a7387. +:a7388 :a7388 :a7388. +:a7389 :a7389 :a7389. +:a7390 :a7390 :a7390. +:a7391 :a7391 :a7391. +:a7392 :a7392 :a7392. +:a7393 :a7393 :a7393. +:a7394 :a7394 :a7394. +:a7395 :a7395 :a7395. +:a7396 :a7396 :a7396. +:a7397 :a7397 :a7397. +:a7398 :a7398 :a7398. +:a7399 :a7399 :a7399. +:a7400 :a7400 :a7400. +:a7401 :a7401 :a7401. +:a7402 :a7402 :a7402. +:a7403 :a7403 :a7403. +:a7404 :a7404 :a7404. +:a7405 :a7405 :a7405. +:a7406 :a7406 :a7406. +:a7407 :a7407 :a7407. +:a7408 :a7408 :a7408. +:a7409 :a7409 :a7409. +:a7410 :a7410 :a7410. +:a7411 :a7411 :a7411. +:a7412 :a7412 :a7412. +:a7413 :a7413 :a7413. +:a7414 :a7414 :a7414. +:a7415 :a7415 :a7415. +:a7416 :a7416 :a7416. +:a7417 :a7417 :a7417. +:a7418 :a7418 :a7418. +:a7419 :a7419 :a7419. +:a7420 :a7420 :a7420. +:a7421 :a7421 :a7421. +:a7422 :a7422 :a7422. +:a7423 :a7423 :a7423. +:a7424 :a7424 :a7424. +:a7425 :a7425 :a7425. +:a7426 :a7426 :a7426. +:a7427 :a7427 :a7427. +:a7428 :a7428 :a7428. +:a7429 :a7429 :a7429. +:a7430 :a7430 :a7430. +:a7431 :a7431 :a7431. +:a7432 :a7432 :a7432. +:a7433 :a7433 :a7433. +:a7434 :a7434 :a7434. +:a7435 :a7435 :a7435. +:a7436 :a7436 :a7436. +:a7437 :a7437 :a7437. +:a7438 :a7438 :a7438. +:a7439 :a7439 :a7439. +:a7440 :a7440 :a7440. +:a7441 :a7441 :a7441. +:a7442 :a7442 :a7442. +:a7443 :a7443 :a7443. +:a7444 :a7444 :a7444. +:a7445 :a7445 :a7445. +:a7446 :a7446 :a7446. +:a7447 :a7447 :a7447. +:a7448 :a7448 :a7448. +:a7449 :a7449 :a7449. +:a7450 :a7450 :a7450. +:a7451 :a7451 :a7451. +:a7452 :a7452 :a7452. +:a7453 :a7453 :a7453. +:a7454 :a7454 :a7454. +:a7455 :a7455 :a7455. +:a7456 :a7456 :a7456. +:a7457 :a7457 :a7457. +:a7458 :a7458 :a7458. +:a7459 :a7459 :a7459. +:a7460 :a7460 :a7460. +:a7461 :a7461 :a7461. +:a7462 :a7462 :a7462. +:a7463 :a7463 :a7463. +:a7464 :a7464 :a7464. +:a7465 :a7465 :a7465. +:a7466 :a7466 :a7466. +:a7467 :a7467 :a7467. +:a7468 :a7468 :a7468. +:a7469 :a7469 :a7469. +:a7470 :a7470 :a7470. +:a7471 :a7471 :a7471. +:a7472 :a7472 :a7472. +:a7473 :a7473 :a7473. +:a7474 :a7474 :a7474. +:a7475 :a7475 :a7475. +:a7476 :a7476 :a7476. +:a7477 :a7477 :a7477. +:a7478 :a7478 :a7478. +:a7479 :a7479 :a7479. +:a7480 :a7480 :a7480. +:a7481 :a7481 :a7481. +:a7482 :a7482 :a7482. +:a7483 :a7483 :a7483. +:a7484 :a7484 :a7484. +:a7485 :a7485 :a7485. +:a7486 :a7486 :a7486. +:a7487 :a7487 :a7487. +:a7488 :a7488 :a7488. +:a7489 :a7489 :a7489. +:a7490 :a7490 :a7490. +:a7491 :a7491 :a7491. +:a7492 :a7492 :a7492. +:a7493 :a7493 :a7493. +:a7494 :a7494 :a7494. +:a7495 :a7495 :a7495. +:a7496 :a7496 :a7496. +:a7497 :a7497 :a7497. +:a7498 :a7498 :a7498. +:a7499 :a7499 :a7499. +:a7500 :a7500 :a7500. +:a7501 :a7501 :a7501. +:a7502 :a7502 :a7502. +:a7503 :a7503 :a7503. +:a7504 :a7504 :a7504. +:a7505 :a7505 :a7505. +:a7506 :a7506 :a7506. +:a7507 :a7507 :a7507. +:a7508 :a7508 :a7508. +:a7509 :a7509 :a7509. +:a7510 :a7510 :a7510. +:a7511 :a7511 :a7511. +:a7512 :a7512 :a7512. +:a7513 :a7513 :a7513. +:a7514 :a7514 :a7514. +:a7515 :a7515 :a7515. +:a7516 :a7516 :a7516. +:a7517 :a7517 :a7517. +:a7518 :a7518 :a7518. +:a7519 :a7519 :a7519. +:a7520 :a7520 :a7520. +:a7521 :a7521 :a7521. +:a7522 :a7522 :a7522. +:a7523 :a7523 :a7523. +:a7524 :a7524 :a7524. +:a7525 :a7525 :a7525. +:a7526 :a7526 :a7526. +:a7527 :a7527 :a7527. +:a7528 :a7528 :a7528. +:a7529 :a7529 :a7529. +:a7530 :a7530 :a7530. +:a7531 :a7531 :a7531. +:a7532 :a7532 :a7532. +:a7533 :a7533 :a7533. +:a7534 :a7534 :a7534. +:a7535 :a7535 :a7535. +:a7536 :a7536 :a7536. +:a7537 :a7537 :a7537. +:a7538 :a7538 :a7538. +:a7539 :a7539 :a7539. +:a7540 :a7540 :a7540. +:a7541 :a7541 :a7541. +:a7542 :a7542 :a7542. +:a7543 :a7543 :a7543. +:a7544 :a7544 :a7544. +:a7545 :a7545 :a7545. +:a7546 :a7546 :a7546. +:a7547 :a7547 :a7547. +:a7548 :a7548 :a7548. +:a7549 :a7549 :a7549. +:a7550 :a7550 :a7550. +:a7551 :a7551 :a7551. +:a7552 :a7552 :a7552. +:a7553 :a7553 :a7553. +:a7554 :a7554 :a7554. +:a7555 :a7555 :a7555. +:a7556 :a7556 :a7556. +:a7557 :a7557 :a7557. +:a7558 :a7558 :a7558. +:a7559 :a7559 :a7559. +:a7560 :a7560 :a7560. +:a7561 :a7561 :a7561. +:a7562 :a7562 :a7562. +:a7563 :a7563 :a7563. +:a7564 :a7564 :a7564. +:a7565 :a7565 :a7565. +:a7566 :a7566 :a7566. +:a7567 :a7567 :a7567. +:a7568 :a7568 :a7568. +:a7569 :a7569 :a7569. +:a7570 :a7570 :a7570. +:a7571 :a7571 :a7571. +:a7572 :a7572 :a7572. +:a7573 :a7573 :a7573. +:a7574 :a7574 :a7574. +:a7575 :a7575 :a7575. +:a7576 :a7576 :a7576. +:a7577 :a7577 :a7577. +:a7578 :a7578 :a7578. +:a7579 :a7579 :a7579. +:a7580 :a7580 :a7580. +:a7581 :a7581 :a7581. +:a7582 :a7582 :a7582. +:a7583 :a7583 :a7583. +:a7584 :a7584 :a7584. +:a7585 :a7585 :a7585. +:a7586 :a7586 :a7586. +:a7587 :a7587 :a7587. +:a7588 :a7588 :a7588. +:a7589 :a7589 :a7589. +:a7590 :a7590 :a7590. +:a7591 :a7591 :a7591. +:a7592 :a7592 :a7592. +:a7593 :a7593 :a7593. +:a7594 :a7594 :a7594. +:a7595 :a7595 :a7595. +:a7596 :a7596 :a7596. +:a7597 :a7597 :a7597. +:a7598 :a7598 :a7598. +:a7599 :a7599 :a7599. +:a7600 :a7600 :a7600. +:a7601 :a7601 :a7601. +:a7602 :a7602 :a7602. +:a7603 :a7603 :a7603. +:a7604 :a7604 :a7604. +:a7605 :a7605 :a7605. +:a7606 :a7606 :a7606. +:a7607 :a7607 :a7607. +:a7608 :a7608 :a7608. +:a7609 :a7609 :a7609. +:a7610 :a7610 :a7610. +:a7611 :a7611 :a7611. +:a7612 :a7612 :a7612. +:a7613 :a7613 :a7613. +:a7614 :a7614 :a7614. +:a7615 :a7615 :a7615. +:a7616 :a7616 :a7616. +:a7617 :a7617 :a7617. +:a7618 :a7618 :a7618. +:a7619 :a7619 :a7619. +:a7620 :a7620 :a7620. +:a7621 :a7621 :a7621. +:a7622 :a7622 :a7622. +:a7623 :a7623 :a7623. +:a7624 :a7624 :a7624. +:a7625 :a7625 :a7625. +:a7626 :a7626 :a7626. +:a7627 :a7627 :a7627. +:a7628 :a7628 :a7628. +:a7629 :a7629 :a7629. +:a7630 :a7630 :a7630. +:a7631 :a7631 :a7631. +:a7632 :a7632 :a7632. +:a7633 :a7633 :a7633. +:a7634 :a7634 :a7634. +:a7635 :a7635 :a7635. +:a7636 :a7636 :a7636. +:a7637 :a7637 :a7637. +:a7638 :a7638 :a7638. +:a7639 :a7639 :a7639. +:a7640 :a7640 :a7640. +:a7641 :a7641 :a7641. +:a7642 :a7642 :a7642. +:a7643 :a7643 :a7643. +:a7644 :a7644 :a7644. +:a7645 :a7645 :a7645. +:a7646 :a7646 :a7646. +:a7647 :a7647 :a7647. +:a7648 :a7648 :a7648. +:a7649 :a7649 :a7649. +:a7650 :a7650 :a7650. +:a7651 :a7651 :a7651. +:a7652 :a7652 :a7652. +:a7653 :a7653 :a7653. +:a7654 :a7654 :a7654. +:a7655 :a7655 :a7655. +:a7656 :a7656 :a7656. +:a7657 :a7657 :a7657. +:a7658 :a7658 :a7658. +:a7659 :a7659 :a7659. +:a7660 :a7660 :a7660. +:a7661 :a7661 :a7661. +:a7662 :a7662 :a7662. +:a7663 :a7663 :a7663. +:a7664 :a7664 :a7664. +:a7665 :a7665 :a7665. +:a7666 :a7666 :a7666. +:a7667 :a7667 :a7667. +:a7668 :a7668 :a7668. +:a7669 :a7669 :a7669. +:a7670 :a7670 :a7670. +:a7671 :a7671 :a7671. +:a7672 :a7672 :a7672. +:a7673 :a7673 :a7673. +:a7674 :a7674 :a7674. +:a7675 :a7675 :a7675. +:a7676 :a7676 :a7676. +:a7677 :a7677 :a7677. +:a7678 :a7678 :a7678. +:a7679 :a7679 :a7679. +:a7680 :a7680 :a7680. +:a7681 :a7681 :a7681. +:a7682 :a7682 :a7682. +:a7683 :a7683 :a7683. +:a7684 :a7684 :a7684. +:a7685 :a7685 :a7685. +:a7686 :a7686 :a7686. +:a7687 :a7687 :a7687. +:a7688 :a7688 :a7688. +:a7689 :a7689 :a7689. +:a7690 :a7690 :a7690. +:a7691 :a7691 :a7691. +:a7692 :a7692 :a7692. +:a7693 :a7693 :a7693. +:a7694 :a7694 :a7694. +:a7695 :a7695 :a7695. +:a7696 :a7696 :a7696. +:a7697 :a7697 :a7697. +:a7698 :a7698 :a7698. +:a7699 :a7699 :a7699. +:a7700 :a7700 :a7700. +:a7701 :a7701 :a7701. +:a7702 :a7702 :a7702. +:a7703 :a7703 :a7703. +:a7704 :a7704 :a7704. +:a7705 :a7705 :a7705. +:a7706 :a7706 :a7706. +:a7707 :a7707 :a7707. +:a7708 :a7708 :a7708. +:a7709 :a7709 :a7709. +:a7710 :a7710 :a7710. +:a7711 :a7711 :a7711. +:a7712 :a7712 :a7712. +:a7713 :a7713 :a7713. +:a7714 :a7714 :a7714. +:a7715 :a7715 :a7715. +:a7716 :a7716 :a7716. +:a7717 :a7717 :a7717. +:a7718 :a7718 :a7718. +:a7719 :a7719 :a7719. +:a7720 :a7720 :a7720. +:a7721 :a7721 :a7721. +:a7722 :a7722 :a7722. +:a7723 :a7723 :a7723. +:a7724 :a7724 :a7724. +:a7725 :a7725 :a7725. +:a7726 :a7726 :a7726. +:a7727 :a7727 :a7727. +:a7728 :a7728 :a7728. +:a7729 :a7729 :a7729. +:a7730 :a7730 :a7730. +:a7731 :a7731 :a7731. +:a7732 :a7732 :a7732. +:a7733 :a7733 :a7733. +:a7734 :a7734 :a7734. +:a7735 :a7735 :a7735. +:a7736 :a7736 :a7736. +:a7737 :a7737 :a7737. +:a7738 :a7738 :a7738. +:a7739 :a7739 :a7739. +:a7740 :a7740 :a7740. +:a7741 :a7741 :a7741. +:a7742 :a7742 :a7742. +:a7743 :a7743 :a7743. +:a7744 :a7744 :a7744. +:a7745 :a7745 :a7745. +:a7746 :a7746 :a7746. +:a7747 :a7747 :a7747. +:a7748 :a7748 :a7748. +:a7749 :a7749 :a7749. +:a7750 :a7750 :a7750. +:a7751 :a7751 :a7751. +:a7752 :a7752 :a7752. +:a7753 :a7753 :a7753. +:a7754 :a7754 :a7754. +:a7755 :a7755 :a7755. +:a7756 :a7756 :a7756. +:a7757 :a7757 :a7757. +:a7758 :a7758 :a7758. +:a7759 :a7759 :a7759. +:a7760 :a7760 :a7760. +:a7761 :a7761 :a7761. +:a7762 :a7762 :a7762. +:a7763 :a7763 :a7763. +:a7764 :a7764 :a7764. +:a7765 :a7765 :a7765. +:a7766 :a7766 :a7766. +:a7767 :a7767 :a7767. +:a7768 :a7768 :a7768. +:a7769 :a7769 :a7769. +:a7770 :a7770 :a7770. +:a7771 :a7771 :a7771. +:a7772 :a7772 :a7772. +:a7773 :a7773 :a7773. +:a7774 :a7774 :a7774. +:a7775 :a7775 :a7775. +:a7776 :a7776 :a7776. +:a7777 :a7777 :a7777. +:a7778 :a7778 :a7778. +:a7779 :a7779 :a7779. +:a7780 :a7780 :a7780. +:a7781 :a7781 :a7781. +:a7782 :a7782 :a7782. +:a7783 :a7783 :a7783. +:a7784 :a7784 :a7784. +:a7785 :a7785 :a7785. +:a7786 :a7786 :a7786. +:a7787 :a7787 :a7787. +:a7788 :a7788 :a7788. +:a7789 :a7789 :a7789. +:a7790 :a7790 :a7790. +:a7791 :a7791 :a7791. +:a7792 :a7792 :a7792. +:a7793 :a7793 :a7793. +:a7794 :a7794 :a7794. +:a7795 :a7795 :a7795. +:a7796 :a7796 :a7796. +:a7797 :a7797 :a7797. +:a7798 :a7798 :a7798. +:a7799 :a7799 :a7799. +:a7800 :a7800 :a7800. +:a7801 :a7801 :a7801. +:a7802 :a7802 :a7802. +:a7803 :a7803 :a7803. +:a7804 :a7804 :a7804. +:a7805 :a7805 :a7805. +:a7806 :a7806 :a7806. +:a7807 :a7807 :a7807. +:a7808 :a7808 :a7808. +:a7809 :a7809 :a7809. +:a7810 :a7810 :a7810. +:a7811 :a7811 :a7811. +:a7812 :a7812 :a7812. +:a7813 :a7813 :a7813. +:a7814 :a7814 :a7814. +:a7815 :a7815 :a7815. +:a7816 :a7816 :a7816. +:a7817 :a7817 :a7817. +:a7818 :a7818 :a7818. +:a7819 :a7819 :a7819. +:a7820 :a7820 :a7820. +:a7821 :a7821 :a7821. +:a7822 :a7822 :a7822. +:a7823 :a7823 :a7823. +:a7824 :a7824 :a7824. +:a7825 :a7825 :a7825. +:a7826 :a7826 :a7826. +:a7827 :a7827 :a7827. +:a7828 :a7828 :a7828. +:a7829 :a7829 :a7829. +:a7830 :a7830 :a7830. +:a7831 :a7831 :a7831. +:a7832 :a7832 :a7832. +:a7833 :a7833 :a7833. +:a7834 :a7834 :a7834. +:a7835 :a7835 :a7835. +:a7836 :a7836 :a7836. +:a7837 :a7837 :a7837. +:a7838 :a7838 :a7838. +:a7839 :a7839 :a7839. +:a7840 :a7840 :a7840. +:a7841 :a7841 :a7841. +:a7842 :a7842 :a7842. +:a7843 :a7843 :a7843. +:a7844 :a7844 :a7844. +:a7845 :a7845 :a7845. +:a7846 :a7846 :a7846. +:a7847 :a7847 :a7847. +:a7848 :a7848 :a7848. +:a7849 :a7849 :a7849. +:a7850 :a7850 :a7850. +:a7851 :a7851 :a7851. +:a7852 :a7852 :a7852. +:a7853 :a7853 :a7853. +:a7854 :a7854 :a7854. +:a7855 :a7855 :a7855. +:a7856 :a7856 :a7856. +:a7857 :a7857 :a7857. +:a7858 :a7858 :a7858. +:a7859 :a7859 :a7859. +:a7860 :a7860 :a7860. +:a7861 :a7861 :a7861. +:a7862 :a7862 :a7862. +:a7863 :a7863 :a7863. +:a7864 :a7864 :a7864. +:a7865 :a7865 :a7865. +:a7866 :a7866 :a7866. +:a7867 :a7867 :a7867. +:a7868 :a7868 :a7868. +:a7869 :a7869 :a7869. +:a7870 :a7870 :a7870. +:a7871 :a7871 :a7871. +:a7872 :a7872 :a7872. +:a7873 :a7873 :a7873. +:a7874 :a7874 :a7874. +:a7875 :a7875 :a7875. +:a7876 :a7876 :a7876. +:a7877 :a7877 :a7877. +:a7878 :a7878 :a7878. +:a7879 :a7879 :a7879. +:a7880 :a7880 :a7880. +:a7881 :a7881 :a7881. +:a7882 :a7882 :a7882. +:a7883 :a7883 :a7883. +:a7884 :a7884 :a7884. +:a7885 :a7885 :a7885. +:a7886 :a7886 :a7886. +:a7887 :a7887 :a7887. +:a7888 :a7888 :a7888. +:a7889 :a7889 :a7889. +:a7890 :a7890 :a7890. +:a7891 :a7891 :a7891. +:a7892 :a7892 :a7892. +:a7893 :a7893 :a7893. +:a7894 :a7894 :a7894. +:a7895 :a7895 :a7895. +:a7896 :a7896 :a7896. +:a7897 :a7897 :a7897. +:a7898 :a7898 :a7898. +:a7899 :a7899 :a7899. +:a7900 :a7900 :a7900. +:a7901 :a7901 :a7901. +:a7902 :a7902 :a7902. +:a7903 :a7903 :a7903. +:a7904 :a7904 :a7904. +:a7905 :a7905 :a7905. +:a7906 :a7906 :a7906. +:a7907 :a7907 :a7907. +:a7908 :a7908 :a7908. +:a7909 :a7909 :a7909. +:a7910 :a7910 :a7910. +:a7911 :a7911 :a7911. +:a7912 :a7912 :a7912. +:a7913 :a7913 :a7913. +:a7914 :a7914 :a7914. +:a7915 :a7915 :a7915. +:a7916 :a7916 :a7916. +:a7917 :a7917 :a7917. +:a7918 :a7918 :a7918. +:a7919 :a7919 :a7919. +:a7920 :a7920 :a7920. +:a7921 :a7921 :a7921. +:a7922 :a7922 :a7922. +:a7923 :a7923 :a7923. +:a7924 :a7924 :a7924. +:a7925 :a7925 :a7925. +:a7926 :a7926 :a7926. +:a7927 :a7927 :a7927. +:a7928 :a7928 :a7928. +:a7929 :a7929 :a7929. +:a7930 :a7930 :a7930. +:a7931 :a7931 :a7931. +:a7932 :a7932 :a7932. +:a7933 :a7933 :a7933. +:a7934 :a7934 :a7934. +:a7935 :a7935 :a7935. +:a7936 :a7936 :a7936. +:a7937 :a7937 :a7937. +:a7938 :a7938 :a7938. +:a7939 :a7939 :a7939. +:a7940 :a7940 :a7940. +:a7941 :a7941 :a7941. +:a7942 :a7942 :a7942. +:a7943 :a7943 :a7943. +:a7944 :a7944 :a7944. +:a7945 :a7945 :a7945. +:a7946 :a7946 :a7946. +:a7947 :a7947 :a7947. +:a7948 :a7948 :a7948. +:a7949 :a7949 :a7949. +:a7950 :a7950 :a7950. +:a7951 :a7951 :a7951. +:a7952 :a7952 :a7952. +:a7953 :a7953 :a7953. +:a7954 :a7954 :a7954. +:a7955 :a7955 :a7955. +:a7956 :a7956 :a7956. +:a7957 :a7957 :a7957. +:a7958 :a7958 :a7958. +:a7959 :a7959 :a7959. +:a7960 :a7960 :a7960. +:a7961 :a7961 :a7961. +:a7962 :a7962 :a7962. +:a7963 :a7963 :a7963. +:a7964 :a7964 :a7964. +:a7965 :a7965 :a7965. +:a7966 :a7966 :a7966. +:a7967 :a7967 :a7967. +:a7968 :a7968 :a7968. +:a7969 :a7969 :a7969. +:a7970 :a7970 :a7970. +:a7971 :a7971 :a7971. +:a7972 :a7972 :a7972. +:a7973 :a7973 :a7973. +:a7974 :a7974 :a7974. +:a7975 :a7975 :a7975. +:a7976 :a7976 :a7976. +:a7977 :a7977 :a7977. +:a7978 :a7978 :a7978. +:a7979 :a7979 :a7979. +:a7980 :a7980 :a7980. +:a7981 :a7981 :a7981. +:a7982 :a7982 :a7982. +:a7983 :a7983 :a7983. +:a7984 :a7984 :a7984. +:a7985 :a7985 :a7985. +:a7986 :a7986 :a7986. +:a7987 :a7987 :a7987. +:a7988 :a7988 :a7988. +:a7989 :a7989 :a7989. +:a7990 :a7990 :a7990. +:a7991 :a7991 :a7991. +:a7992 :a7992 :a7992. +:a7993 :a7993 :a7993. +:a7994 :a7994 :a7994. +:a7995 :a7995 :a7995. +:a7996 :a7996 :a7996. +:a7997 :a7997 :a7997. +:a7998 :a7998 :a7998. +:a7999 :a7999 :a7999. +:a8000 :a8000 :a8000. +:a8001 :a8001 :a8001. +:a8002 :a8002 :a8002. +:a8003 :a8003 :a8003. +:a8004 :a8004 :a8004. +:a8005 :a8005 :a8005. +:a8006 :a8006 :a8006. +:a8007 :a8007 :a8007. +:a8008 :a8008 :a8008. +:a8009 :a8009 :a8009. +:a8010 :a8010 :a8010. +:a8011 :a8011 :a8011. +:a8012 :a8012 :a8012. +:a8013 :a8013 :a8013. +:a8014 :a8014 :a8014. +:a8015 :a8015 :a8015. +:a8016 :a8016 :a8016. +:a8017 :a8017 :a8017. +:a8018 :a8018 :a8018. +:a8019 :a8019 :a8019. +:a8020 :a8020 :a8020. +:a8021 :a8021 :a8021. +:a8022 :a8022 :a8022. +:a8023 :a8023 :a8023. +:a8024 :a8024 :a8024. +:a8025 :a8025 :a8025. +:a8026 :a8026 :a8026. +:a8027 :a8027 :a8027. +:a8028 :a8028 :a8028. +:a8029 :a8029 :a8029. +:a8030 :a8030 :a8030. +:a8031 :a8031 :a8031. +:a8032 :a8032 :a8032. +:a8033 :a8033 :a8033. +:a8034 :a8034 :a8034. +:a8035 :a8035 :a8035. +:a8036 :a8036 :a8036. +:a8037 :a8037 :a8037. +:a8038 :a8038 :a8038. +:a8039 :a8039 :a8039. +:a8040 :a8040 :a8040. +:a8041 :a8041 :a8041. +:a8042 :a8042 :a8042. +:a8043 :a8043 :a8043. +:a8044 :a8044 :a8044. +:a8045 :a8045 :a8045. +:a8046 :a8046 :a8046. +:a8047 :a8047 :a8047. +:a8048 :a8048 :a8048. +:a8049 :a8049 :a8049. +:a8050 :a8050 :a8050. +:a8051 :a8051 :a8051. +:a8052 :a8052 :a8052. +:a8053 :a8053 :a8053. +:a8054 :a8054 :a8054. +:a8055 :a8055 :a8055. +:a8056 :a8056 :a8056. +:a8057 :a8057 :a8057. +:a8058 :a8058 :a8058. +:a8059 :a8059 :a8059. +:a8060 :a8060 :a8060. +:a8061 :a8061 :a8061. +:a8062 :a8062 :a8062. +:a8063 :a8063 :a8063. +:a8064 :a8064 :a8064. +:a8065 :a8065 :a8065. +:a8066 :a8066 :a8066. +:a8067 :a8067 :a8067. +:a8068 :a8068 :a8068. +:a8069 :a8069 :a8069. +:a8070 :a8070 :a8070. +:a8071 :a8071 :a8071. +:a8072 :a8072 :a8072. +:a8073 :a8073 :a8073. +:a8074 :a8074 :a8074. +:a8075 :a8075 :a8075. +:a8076 :a8076 :a8076. +:a8077 :a8077 :a8077. +:a8078 :a8078 :a8078. +:a8079 :a8079 :a8079. +:a8080 :a8080 :a8080. +:a8081 :a8081 :a8081. +:a8082 :a8082 :a8082. +:a8083 :a8083 :a8083. +:a8084 :a8084 :a8084. +:a8085 :a8085 :a8085. +:a8086 :a8086 :a8086. +:a8087 :a8087 :a8087. +:a8088 :a8088 :a8088. +:a8089 :a8089 :a8089. +:a8090 :a8090 :a8090. +:a8091 :a8091 :a8091. +:a8092 :a8092 :a8092. +:a8093 :a8093 :a8093. +:a8094 :a8094 :a8094. +:a8095 :a8095 :a8095. +:a8096 :a8096 :a8096. +:a8097 :a8097 :a8097. +:a8098 :a8098 :a8098. +:a8099 :a8099 :a8099. +:a8100 :a8100 :a8100. +:a8101 :a8101 :a8101. +:a8102 :a8102 :a8102. +:a8103 :a8103 :a8103. +:a8104 :a8104 :a8104. +:a8105 :a8105 :a8105. +:a8106 :a8106 :a8106. +:a8107 :a8107 :a8107. +:a8108 :a8108 :a8108. +:a8109 :a8109 :a8109. +:a8110 :a8110 :a8110. +:a8111 :a8111 :a8111. +:a8112 :a8112 :a8112. +:a8113 :a8113 :a8113. +:a8114 :a8114 :a8114. +:a8115 :a8115 :a8115. +:a8116 :a8116 :a8116. +:a8117 :a8117 :a8117. +:a8118 :a8118 :a8118. +:a8119 :a8119 :a8119. +:a8120 :a8120 :a8120. +:a8121 :a8121 :a8121. +:a8122 :a8122 :a8122. +:a8123 :a8123 :a8123. +:a8124 :a8124 :a8124. +:a8125 :a8125 :a8125. +:a8126 :a8126 :a8126. +:a8127 :a8127 :a8127. +:a8128 :a8128 :a8128. +:a8129 :a8129 :a8129. +:a8130 :a8130 :a8130. +:a8131 :a8131 :a8131. +:a8132 :a8132 :a8132. +:a8133 :a8133 :a8133. +:a8134 :a8134 :a8134. +:a8135 :a8135 :a8135. +:a8136 :a8136 :a8136. +:a8137 :a8137 :a8137. +:a8138 :a8138 :a8138. +:a8139 :a8139 :a8139. +:a8140 :a8140 :a8140. +:a8141 :a8141 :a8141. +:a8142 :a8142 :a8142. +:a8143 :a8143 :a8143. +:a8144 :a8144 :a8144. +:a8145 :a8145 :a8145. +:a8146 :a8146 :a8146. +:a8147 :a8147 :a8147. +:a8148 :a8148 :a8148. +:a8149 :a8149 :a8149. +:a8150 :a8150 :a8150. +:a8151 :a8151 :a8151. +:a8152 :a8152 :a8152. +:a8153 :a8153 :a8153. +:a8154 :a8154 :a8154. +:a8155 :a8155 :a8155. +:a8156 :a8156 :a8156. +:a8157 :a8157 :a8157. +:a8158 :a8158 :a8158. +:a8159 :a8159 :a8159. +:a8160 :a8160 :a8160. +:a8161 :a8161 :a8161. +:a8162 :a8162 :a8162. +:a8163 :a8163 :a8163. +:a8164 :a8164 :a8164. +:a8165 :a8165 :a8165. +:a8166 :a8166 :a8166. +:a8167 :a8167 :a8167. +:a8168 :a8168 :a8168. +:a8169 :a8169 :a8169. +:a8170 :a8170 :a8170. +:a8171 :a8171 :a8171. +:a8172 :a8172 :a8172. +:a8173 :a8173 :a8173. +:a8174 :a8174 :a8174. +:a8175 :a8175 :a8175. +:a8176 :a8176 :a8176. +:a8177 :a8177 :a8177. +:a8178 :a8178 :a8178. +:a8179 :a8179 :a8179. +:a8180 :a8180 :a8180. +:a8181 :a8181 :a8181. +:a8182 :a8182 :a8182. +:a8183 :a8183 :a8183. +:a8184 :a8184 :a8184. +:a8185 :a8185 :a8185. +:a8186 :a8186 :a8186. +:a8187 :a8187 :a8187. +:a8188 :a8188 :a8188. +:a8189 :a8189 :a8189. +:a8190 :a8190 :a8190. +:a8191 :a8191 :a8191. +:a8192 :a8192 :a8192. +:a8193 :a8193 :a8193. +:a8194 :a8194 :a8194. +:a8195 :a8195 :a8195. +:a8196 :a8196 :a8196. +:a8197 :a8197 :a8197. +:a8198 :a8198 :a8198. +:a8199 :a8199 :a8199. +:a8200 :a8200 :a8200. +:a8201 :a8201 :a8201. +:a8202 :a8202 :a8202. +:a8203 :a8203 :a8203. +:a8204 :a8204 :a8204. +:a8205 :a8205 :a8205. +:a8206 :a8206 :a8206. +:a8207 :a8207 :a8207. +:a8208 :a8208 :a8208. +:a8209 :a8209 :a8209. +:a8210 :a8210 :a8210. +:a8211 :a8211 :a8211. +:a8212 :a8212 :a8212. +:a8213 :a8213 :a8213. +:a8214 :a8214 :a8214. +:a8215 :a8215 :a8215. +:a8216 :a8216 :a8216. +:a8217 :a8217 :a8217. +:a8218 :a8218 :a8218. +:a8219 :a8219 :a8219. +:a8220 :a8220 :a8220. +:a8221 :a8221 :a8221. +:a8222 :a8222 :a8222. +:a8223 :a8223 :a8223. +:a8224 :a8224 :a8224. +:a8225 :a8225 :a8225. +:a8226 :a8226 :a8226. +:a8227 :a8227 :a8227. +:a8228 :a8228 :a8228. +:a8229 :a8229 :a8229. +:a8230 :a8230 :a8230. +:a8231 :a8231 :a8231. +:a8232 :a8232 :a8232. +:a8233 :a8233 :a8233. +:a8234 :a8234 :a8234. +:a8235 :a8235 :a8235. +:a8236 :a8236 :a8236. +:a8237 :a8237 :a8237. +:a8238 :a8238 :a8238. +:a8239 :a8239 :a8239. +:a8240 :a8240 :a8240. +:a8241 :a8241 :a8241. +:a8242 :a8242 :a8242. +:a8243 :a8243 :a8243. +:a8244 :a8244 :a8244. +:a8245 :a8245 :a8245. +:a8246 :a8246 :a8246. +:a8247 :a8247 :a8247. +:a8248 :a8248 :a8248. +:a8249 :a8249 :a8249. +:a8250 :a8250 :a8250. +:a8251 :a8251 :a8251. +:a8252 :a8252 :a8252. +:a8253 :a8253 :a8253. +:a8254 :a8254 :a8254. +:a8255 :a8255 :a8255. +:a8256 :a8256 :a8256. +:a8257 :a8257 :a8257. +:a8258 :a8258 :a8258. +:a8259 :a8259 :a8259. +:a8260 :a8260 :a8260. +:a8261 :a8261 :a8261. +:a8262 :a8262 :a8262. +:a8263 :a8263 :a8263. +:a8264 :a8264 :a8264. +:a8265 :a8265 :a8265. +:a8266 :a8266 :a8266. +:a8267 :a8267 :a8267. +:a8268 :a8268 :a8268. +:a8269 :a8269 :a8269. +:a8270 :a8270 :a8270. +:a8271 :a8271 :a8271. +:a8272 :a8272 :a8272. +:a8273 :a8273 :a8273. +:a8274 :a8274 :a8274. +:a8275 :a8275 :a8275. +:a8276 :a8276 :a8276. +:a8277 :a8277 :a8277. +:a8278 :a8278 :a8278. +:a8279 :a8279 :a8279. +:a8280 :a8280 :a8280. +:a8281 :a8281 :a8281. +:a8282 :a8282 :a8282. +:a8283 :a8283 :a8283. +:a8284 :a8284 :a8284. +:a8285 :a8285 :a8285. +:a8286 :a8286 :a8286. +:a8287 :a8287 :a8287. +:a8288 :a8288 :a8288. +:a8289 :a8289 :a8289. +:a8290 :a8290 :a8290. +:a8291 :a8291 :a8291. +:a8292 :a8292 :a8292. +:a8293 :a8293 :a8293. +:a8294 :a8294 :a8294. +:a8295 :a8295 :a8295. +:a8296 :a8296 :a8296. +:a8297 :a8297 :a8297. +:a8298 :a8298 :a8298. +:a8299 :a8299 :a8299. +:a8300 :a8300 :a8300. +:a8301 :a8301 :a8301. +:a8302 :a8302 :a8302. +:a8303 :a8303 :a8303. +:a8304 :a8304 :a8304. +:a8305 :a8305 :a8305. +:a8306 :a8306 :a8306. +:a8307 :a8307 :a8307. +:a8308 :a8308 :a8308. +:a8309 :a8309 :a8309. +:a8310 :a8310 :a8310. +:a8311 :a8311 :a8311. +:a8312 :a8312 :a8312. +:a8313 :a8313 :a8313. +:a8314 :a8314 :a8314. +:a8315 :a8315 :a8315. +:a8316 :a8316 :a8316. +:a8317 :a8317 :a8317. +:a8318 :a8318 :a8318. +:a8319 :a8319 :a8319. +:a8320 :a8320 :a8320. +:a8321 :a8321 :a8321. +:a8322 :a8322 :a8322. +:a8323 :a8323 :a8323. +:a8324 :a8324 :a8324. +:a8325 :a8325 :a8325. +:a8326 :a8326 :a8326. +:a8327 :a8327 :a8327. +:a8328 :a8328 :a8328. +:a8329 :a8329 :a8329. +:a8330 :a8330 :a8330. +:a8331 :a8331 :a8331. +:a8332 :a8332 :a8332. +:a8333 :a8333 :a8333. +:a8334 :a8334 :a8334. +:a8335 :a8335 :a8335. +:a8336 :a8336 :a8336. +:a8337 :a8337 :a8337. +:a8338 :a8338 :a8338. +:a8339 :a8339 :a8339. +:a8340 :a8340 :a8340. +:a8341 :a8341 :a8341. +:a8342 :a8342 :a8342. +:a8343 :a8343 :a8343. +:a8344 :a8344 :a8344. +:a8345 :a8345 :a8345. +:a8346 :a8346 :a8346. +:a8347 :a8347 :a8347. +:a8348 :a8348 :a8348. +:a8349 :a8349 :a8349. +:a8350 :a8350 :a8350. +:a8351 :a8351 :a8351. +:a8352 :a8352 :a8352. +:a8353 :a8353 :a8353. +:a8354 :a8354 :a8354. +:a8355 :a8355 :a8355. +:a8356 :a8356 :a8356. +:a8357 :a8357 :a8357. +:a8358 :a8358 :a8358. +:a8359 :a8359 :a8359. +:a8360 :a8360 :a8360. +:a8361 :a8361 :a8361. +:a8362 :a8362 :a8362. +:a8363 :a8363 :a8363. +:a8364 :a8364 :a8364. +:a8365 :a8365 :a8365. +:a8366 :a8366 :a8366. +:a8367 :a8367 :a8367. +:a8368 :a8368 :a8368. +:a8369 :a8369 :a8369. +:a8370 :a8370 :a8370. +:a8371 :a8371 :a8371. +:a8372 :a8372 :a8372. +:a8373 :a8373 :a8373. +:a8374 :a8374 :a8374. +:a8375 :a8375 :a8375. +:a8376 :a8376 :a8376. +:a8377 :a8377 :a8377. +:a8378 :a8378 :a8378. +:a8379 :a8379 :a8379. +:a8380 :a8380 :a8380. +:a8381 :a8381 :a8381. +:a8382 :a8382 :a8382. +:a8383 :a8383 :a8383. +:a8384 :a8384 :a8384. +:a8385 :a8385 :a8385. +:a8386 :a8386 :a8386. +:a8387 :a8387 :a8387. +:a8388 :a8388 :a8388. +:a8389 :a8389 :a8389. +:a8390 :a8390 :a8390. +:a8391 :a8391 :a8391. +:a8392 :a8392 :a8392. +:a8393 :a8393 :a8393. +:a8394 :a8394 :a8394. +:a8395 :a8395 :a8395. +:a8396 :a8396 :a8396. +:a8397 :a8397 :a8397. +:a8398 :a8398 :a8398. +:a8399 :a8399 :a8399. +:a8400 :a8400 :a8400. +:a8401 :a8401 :a8401. +:a8402 :a8402 :a8402. +:a8403 :a8403 :a8403. +:a8404 :a8404 :a8404. +:a8405 :a8405 :a8405. +:a8406 :a8406 :a8406. +:a8407 :a8407 :a8407. +:a8408 :a8408 :a8408. +:a8409 :a8409 :a8409. +:a8410 :a8410 :a8410. +:a8411 :a8411 :a8411. +:a8412 :a8412 :a8412. +:a8413 :a8413 :a8413. +:a8414 :a8414 :a8414. +:a8415 :a8415 :a8415. +:a8416 :a8416 :a8416. +:a8417 :a8417 :a8417. +:a8418 :a8418 :a8418. +:a8419 :a8419 :a8419. +:a8420 :a8420 :a8420. +:a8421 :a8421 :a8421. +:a8422 :a8422 :a8422. +:a8423 :a8423 :a8423. +:a8424 :a8424 :a8424. +:a8425 :a8425 :a8425. +:a8426 :a8426 :a8426. +:a8427 :a8427 :a8427. +:a8428 :a8428 :a8428. +:a8429 :a8429 :a8429. +:a8430 :a8430 :a8430. +:a8431 :a8431 :a8431. +:a8432 :a8432 :a8432. +:a8433 :a8433 :a8433. +:a8434 :a8434 :a8434. +:a8435 :a8435 :a8435. +:a8436 :a8436 :a8436. +:a8437 :a8437 :a8437. +:a8438 :a8438 :a8438. +:a8439 :a8439 :a8439. +:a8440 :a8440 :a8440. +:a8441 :a8441 :a8441. +:a8442 :a8442 :a8442. +:a8443 :a8443 :a8443. +:a8444 :a8444 :a8444. +:a8445 :a8445 :a8445. +:a8446 :a8446 :a8446. +:a8447 :a8447 :a8447. +:a8448 :a8448 :a8448. +:a8449 :a8449 :a8449. +:a8450 :a8450 :a8450. +:a8451 :a8451 :a8451. +:a8452 :a8452 :a8452. +:a8453 :a8453 :a8453. +:a8454 :a8454 :a8454. +:a8455 :a8455 :a8455. +:a8456 :a8456 :a8456. +:a8457 :a8457 :a8457. +:a8458 :a8458 :a8458. +:a8459 :a8459 :a8459. +:a8460 :a8460 :a8460. +:a8461 :a8461 :a8461. +:a8462 :a8462 :a8462. +:a8463 :a8463 :a8463. +:a8464 :a8464 :a8464. +:a8465 :a8465 :a8465. +:a8466 :a8466 :a8466. +:a8467 :a8467 :a8467. +:a8468 :a8468 :a8468. +:a8469 :a8469 :a8469. +:a8470 :a8470 :a8470. +:a8471 :a8471 :a8471. +:a8472 :a8472 :a8472. +:a8473 :a8473 :a8473. +:a8474 :a8474 :a8474. +:a8475 :a8475 :a8475. +:a8476 :a8476 :a8476. +:a8477 :a8477 :a8477. +:a8478 :a8478 :a8478. +:a8479 :a8479 :a8479. +:a8480 :a8480 :a8480. +:a8481 :a8481 :a8481. +:a8482 :a8482 :a8482. +:a8483 :a8483 :a8483. +:a8484 :a8484 :a8484. +:a8485 :a8485 :a8485. +:a8486 :a8486 :a8486. +:a8487 :a8487 :a8487. +:a8488 :a8488 :a8488. +:a8489 :a8489 :a8489. +:a8490 :a8490 :a8490. +:a8491 :a8491 :a8491. +:a8492 :a8492 :a8492. +:a8493 :a8493 :a8493. +:a8494 :a8494 :a8494. +:a8495 :a8495 :a8495. +:a8496 :a8496 :a8496. +:a8497 :a8497 :a8497. +:a8498 :a8498 :a8498. +:a8499 :a8499 :a8499. +:a8500 :a8500 :a8500. +:a8501 :a8501 :a8501. +:a8502 :a8502 :a8502. +:a8503 :a8503 :a8503. +:a8504 :a8504 :a8504. +:a8505 :a8505 :a8505. +:a8506 :a8506 :a8506. +:a8507 :a8507 :a8507. +:a8508 :a8508 :a8508. +:a8509 :a8509 :a8509. +:a8510 :a8510 :a8510. +:a8511 :a8511 :a8511. +:a8512 :a8512 :a8512. +:a8513 :a8513 :a8513. +:a8514 :a8514 :a8514. +:a8515 :a8515 :a8515. +:a8516 :a8516 :a8516. +:a8517 :a8517 :a8517. +:a8518 :a8518 :a8518. +:a8519 :a8519 :a8519. +:a8520 :a8520 :a8520. +:a8521 :a8521 :a8521. +:a8522 :a8522 :a8522. +:a8523 :a8523 :a8523. +:a8524 :a8524 :a8524. +:a8525 :a8525 :a8525. +:a8526 :a8526 :a8526. +:a8527 :a8527 :a8527. +:a8528 :a8528 :a8528. +:a8529 :a8529 :a8529. +:a8530 :a8530 :a8530. +:a8531 :a8531 :a8531. +:a8532 :a8532 :a8532. +:a8533 :a8533 :a8533. +:a8534 :a8534 :a8534. +:a8535 :a8535 :a8535. +:a8536 :a8536 :a8536. +:a8537 :a8537 :a8537. +:a8538 :a8538 :a8538. +:a8539 :a8539 :a8539. +:a8540 :a8540 :a8540. +:a8541 :a8541 :a8541. +:a8542 :a8542 :a8542. +:a8543 :a8543 :a8543. +:a8544 :a8544 :a8544. +:a8545 :a8545 :a8545. +:a8546 :a8546 :a8546. +:a8547 :a8547 :a8547. +:a8548 :a8548 :a8548. +:a8549 :a8549 :a8549. +:a8550 :a8550 :a8550. +:a8551 :a8551 :a8551. +:a8552 :a8552 :a8552. +:a8553 :a8553 :a8553. +:a8554 :a8554 :a8554. +:a8555 :a8555 :a8555. +:a8556 :a8556 :a8556. +:a8557 :a8557 :a8557. +:a8558 :a8558 :a8558. +:a8559 :a8559 :a8559. +:a8560 :a8560 :a8560. +:a8561 :a8561 :a8561. +:a8562 :a8562 :a8562. +:a8563 :a8563 :a8563. +:a8564 :a8564 :a8564. +:a8565 :a8565 :a8565. +:a8566 :a8566 :a8566. +:a8567 :a8567 :a8567. +:a8568 :a8568 :a8568. +:a8569 :a8569 :a8569. +:a8570 :a8570 :a8570. +:a8571 :a8571 :a8571. +:a8572 :a8572 :a8572. +:a8573 :a8573 :a8573. +:a8574 :a8574 :a8574. +:a8575 :a8575 :a8575. +:a8576 :a8576 :a8576. +:a8577 :a8577 :a8577. +:a8578 :a8578 :a8578. +:a8579 :a8579 :a8579. +:a8580 :a8580 :a8580. +:a8581 :a8581 :a8581. +:a8582 :a8582 :a8582. +:a8583 :a8583 :a8583. +:a8584 :a8584 :a8584. +:a8585 :a8585 :a8585. +:a8586 :a8586 :a8586. +:a8587 :a8587 :a8587. +:a8588 :a8588 :a8588. +:a8589 :a8589 :a8589. +:a8590 :a8590 :a8590. +:a8591 :a8591 :a8591. +:a8592 :a8592 :a8592. +:a8593 :a8593 :a8593. +:a8594 :a8594 :a8594. +:a8595 :a8595 :a8595. +:a8596 :a8596 :a8596. +:a8597 :a8597 :a8597. +:a8598 :a8598 :a8598. +:a8599 :a8599 :a8599. +:a8600 :a8600 :a8600. +:a8601 :a8601 :a8601. +:a8602 :a8602 :a8602. +:a8603 :a8603 :a8603. +:a8604 :a8604 :a8604. +:a8605 :a8605 :a8605. +:a8606 :a8606 :a8606. +:a8607 :a8607 :a8607. +:a8608 :a8608 :a8608. +:a8609 :a8609 :a8609. +:a8610 :a8610 :a8610. +:a8611 :a8611 :a8611. +:a8612 :a8612 :a8612. +:a8613 :a8613 :a8613. +:a8614 :a8614 :a8614. +:a8615 :a8615 :a8615. +:a8616 :a8616 :a8616. +:a8617 :a8617 :a8617. +:a8618 :a8618 :a8618. +:a8619 :a8619 :a8619. +:a8620 :a8620 :a8620. +:a8621 :a8621 :a8621. +:a8622 :a8622 :a8622. +:a8623 :a8623 :a8623. +:a8624 :a8624 :a8624. +:a8625 :a8625 :a8625. +:a8626 :a8626 :a8626. +:a8627 :a8627 :a8627. +:a8628 :a8628 :a8628. +:a8629 :a8629 :a8629. +:a8630 :a8630 :a8630. +:a8631 :a8631 :a8631. +:a8632 :a8632 :a8632. +:a8633 :a8633 :a8633. +:a8634 :a8634 :a8634. +:a8635 :a8635 :a8635. +:a8636 :a8636 :a8636. +:a8637 :a8637 :a8637. +:a8638 :a8638 :a8638. +:a8639 :a8639 :a8639. +:a8640 :a8640 :a8640. +:a8641 :a8641 :a8641. +:a8642 :a8642 :a8642. +:a8643 :a8643 :a8643. +:a8644 :a8644 :a8644. +:a8645 :a8645 :a8645. +:a8646 :a8646 :a8646. +:a8647 :a8647 :a8647. +:a8648 :a8648 :a8648. +:a8649 :a8649 :a8649. +:a8650 :a8650 :a8650. +:a8651 :a8651 :a8651. +:a8652 :a8652 :a8652. +:a8653 :a8653 :a8653. +:a8654 :a8654 :a8654. +:a8655 :a8655 :a8655. +:a8656 :a8656 :a8656. +:a8657 :a8657 :a8657. +:a8658 :a8658 :a8658. +:a8659 :a8659 :a8659. +:a8660 :a8660 :a8660. +:a8661 :a8661 :a8661. +:a8662 :a8662 :a8662. +:a8663 :a8663 :a8663. +:a8664 :a8664 :a8664. +:a8665 :a8665 :a8665. +:a8666 :a8666 :a8666. +:a8667 :a8667 :a8667. +:a8668 :a8668 :a8668. +:a8669 :a8669 :a8669. +:a8670 :a8670 :a8670. +:a8671 :a8671 :a8671. +:a8672 :a8672 :a8672. +:a8673 :a8673 :a8673. +:a8674 :a8674 :a8674. +:a8675 :a8675 :a8675. +:a8676 :a8676 :a8676. +:a8677 :a8677 :a8677. +:a8678 :a8678 :a8678. +:a8679 :a8679 :a8679. +:a8680 :a8680 :a8680. +:a8681 :a8681 :a8681. +:a8682 :a8682 :a8682. +:a8683 :a8683 :a8683. +:a8684 :a8684 :a8684. +:a8685 :a8685 :a8685. +:a8686 :a8686 :a8686. +:a8687 :a8687 :a8687. +:a8688 :a8688 :a8688. +:a8689 :a8689 :a8689. +:a8690 :a8690 :a8690. +:a8691 :a8691 :a8691. +:a8692 :a8692 :a8692. +:a8693 :a8693 :a8693. +:a8694 :a8694 :a8694. +:a8695 :a8695 :a8695. +:a8696 :a8696 :a8696. +:a8697 :a8697 :a8697. +:a8698 :a8698 :a8698. +:a8699 :a8699 :a8699. +:a8700 :a8700 :a8700. +:a8701 :a8701 :a8701. +:a8702 :a8702 :a8702. +:a8703 :a8703 :a8703. +:a8704 :a8704 :a8704. +:a8705 :a8705 :a8705. +:a8706 :a8706 :a8706. +:a8707 :a8707 :a8707. +:a8708 :a8708 :a8708. +:a8709 :a8709 :a8709. +:a8710 :a8710 :a8710. +:a8711 :a8711 :a8711. +:a8712 :a8712 :a8712. +:a8713 :a8713 :a8713. +:a8714 :a8714 :a8714. +:a8715 :a8715 :a8715. +:a8716 :a8716 :a8716. +:a8717 :a8717 :a8717. +:a8718 :a8718 :a8718. +:a8719 :a8719 :a8719. +:a8720 :a8720 :a8720. +:a8721 :a8721 :a8721. +:a8722 :a8722 :a8722. +:a8723 :a8723 :a8723. +:a8724 :a8724 :a8724. +:a8725 :a8725 :a8725. +:a8726 :a8726 :a8726. +:a8727 :a8727 :a8727. +:a8728 :a8728 :a8728. +:a8729 :a8729 :a8729. +:a8730 :a8730 :a8730. +:a8731 :a8731 :a8731. +:a8732 :a8732 :a8732. +:a8733 :a8733 :a8733. +:a8734 :a8734 :a8734. +:a8735 :a8735 :a8735. +:a8736 :a8736 :a8736. +:a8737 :a8737 :a8737. +:a8738 :a8738 :a8738. +:a8739 :a8739 :a8739. +:a8740 :a8740 :a8740. +:a8741 :a8741 :a8741. +:a8742 :a8742 :a8742. +:a8743 :a8743 :a8743. +:a8744 :a8744 :a8744. +:a8745 :a8745 :a8745. +:a8746 :a8746 :a8746. +:a8747 :a8747 :a8747. +:a8748 :a8748 :a8748. +:a8749 :a8749 :a8749. +:a8750 :a8750 :a8750. +:a8751 :a8751 :a8751. +:a8752 :a8752 :a8752. +:a8753 :a8753 :a8753. +:a8754 :a8754 :a8754. +:a8755 :a8755 :a8755. +:a8756 :a8756 :a8756. +:a8757 :a8757 :a8757. +:a8758 :a8758 :a8758. +:a8759 :a8759 :a8759. +:a8760 :a8760 :a8760. +:a8761 :a8761 :a8761. +:a8762 :a8762 :a8762. +:a8763 :a8763 :a8763. +:a8764 :a8764 :a8764. +:a8765 :a8765 :a8765. +:a8766 :a8766 :a8766. +:a8767 :a8767 :a8767. +:a8768 :a8768 :a8768. +:a8769 :a8769 :a8769. +:a8770 :a8770 :a8770. +:a8771 :a8771 :a8771. +:a8772 :a8772 :a8772. +:a8773 :a8773 :a8773. +:a8774 :a8774 :a8774. +:a8775 :a8775 :a8775. +:a8776 :a8776 :a8776. +:a8777 :a8777 :a8777. +:a8778 :a8778 :a8778. +:a8779 :a8779 :a8779. +:a8780 :a8780 :a8780. +:a8781 :a8781 :a8781. +:a8782 :a8782 :a8782. +:a8783 :a8783 :a8783. +:a8784 :a8784 :a8784. +:a8785 :a8785 :a8785. +:a8786 :a8786 :a8786. +:a8787 :a8787 :a8787. +:a8788 :a8788 :a8788. +:a8789 :a8789 :a8789. +:a8790 :a8790 :a8790. +:a8791 :a8791 :a8791. +:a8792 :a8792 :a8792. +:a8793 :a8793 :a8793. +:a8794 :a8794 :a8794. +:a8795 :a8795 :a8795. +:a8796 :a8796 :a8796. +:a8797 :a8797 :a8797. +:a8798 :a8798 :a8798. +:a8799 :a8799 :a8799. +:a8800 :a8800 :a8800. +:a8801 :a8801 :a8801. +:a8802 :a8802 :a8802. +:a8803 :a8803 :a8803. +:a8804 :a8804 :a8804. +:a8805 :a8805 :a8805. +:a8806 :a8806 :a8806. +:a8807 :a8807 :a8807. +:a8808 :a8808 :a8808. +:a8809 :a8809 :a8809. +:a8810 :a8810 :a8810. +:a8811 :a8811 :a8811. +:a8812 :a8812 :a8812. +:a8813 :a8813 :a8813. +:a8814 :a8814 :a8814. +:a8815 :a8815 :a8815. +:a8816 :a8816 :a8816. +:a8817 :a8817 :a8817. +:a8818 :a8818 :a8818. +:a8819 :a8819 :a8819. +:a8820 :a8820 :a8820. +:a8821 :a8821 :a8821. +:a8822 :a8822 :a8822. +:a8823 :a8823 :a8823. +:a8824 :a8824 :a8824. +:a8825 :a8825 :a8825. +:a8826 :a8826 :a8826. +:a8827 :a8827 :a8827. +:a8828 :a8828 :a8828. +:a8829 :a8829 :a8829. +:a8830 :a8830 :a8830. +:a8831 :a8831 :a8831. +:a8832 :a8832 :a8832. +:a8833 :a8833 :a8833. +:a8834 :a8834 :a8834. +:a8835 :a8835 :a8835. +:a8836 :a8836 :a8836. +:a8837 :a8837 :a8837. +:a8838 :a8838 :a8838. +:a8839 :a8839 :a8839. +:a8840 :a8840 :a8840. +:a8841 :a8841 :a8841. +:a8842 :a8842 :a8842. +:a8843 :a8843 :a8843. +:a8844 :a8844 :a8844. +:a8845 :a8845 :a8845. +:a8846 :a8846 :a8846. +:a8847 :a8847 :a8847. +:a8848 :a8848 :a8848. +:a8849 :a8849 :a8849. +:a8850 :a8850 :a8850. +:a8851 :a8851 :a8851. +:a8852 :a8852 :a8852. +:a8853 :a8853 :a8853. +:a8854 :a8854 :a8854. +:a8855 :a8855 :a8855. +:a8856 :a8856 :a8856. +:a8857 :a8857 :a8857. +:a8858 :a8858 :a8858. +:a8859 :a8859 :a8859. +:a8860 :a8860 :a8860. +:a8861 :a8861 :a8861. +:a8862 :a8862 :a8862. +:a8863 :a8863 :a8863. +:a8864 :a8864 :a8864. +:a8865 :a8865 :a8865. +:a8866 :a8866 :a8866. +:a8867 :a8867 :a8867. +:a8868 :a8868 :a8868. +:a8869 :a8869 :a8869. +:a8870 :a8870 :a8870. +:a8871 :a8871 :a8871. +:a8872 :a8872 :a8872. +:a8873 :a8873 :a8873. +:a8874 :a8874 :a8874. +:a8875 :a8875 :a8875. +:a8876 :a8876 :a8876. +:a8877 :a8877 :a8877. +:a8878 :a8878 :a8878. +:a8879 :a8879 :a8879. +:a8880 :a8880 :a8880. +:a8881 :a8881 :a8881. +:a8882 :a8882 :a8882. +:a8883 :a8883 :a8883. +:a8884 :a8884 :a8884. +:a8885 :a8885 :a8885. +:a8886 :a8886 :a8886. +:a8887 :a8887 :a8887. +:a8888 :a8888 :a8888. +:a8889 :a8889 :a8889. +:a8890 :a8890 :a8890. +:a8891 :a8891 :a8891. +:a8892 :a8892 :a8892. +:a8893 :a8893 :a8893. +:a8894 :a8894 :a8894. +:a8895 :a8895 :a8895. +:a8896 :a8896 :a8896. +:a8897 :a8897 :a8897. +:a8898 :a8898 :a8898. +:a8899 :a8899 :a8899. +:a8900 :a8900 :a8900. +:a8901 :a8901 :a8901. +:a8902 :a8902 :a8902. +:a8903 :a8903 :a8903. +:a8904 :a8904 :a8904. +:a8905 :a8905 :a8905. +:a8906 :a8906 :a8906. +:a8907 :a8907 :a8907. +:a8908 :a8908 :a8908. +:a8909 :a8909 :a8909. +:a8910 :a8910 :a8910. +:a8911 :a8911 :a8911. +:a8912 :a8912 :a8912. +:a8913 :a8913 :a8913. +:a8914 :a8914 :a8914. +:a8915 :a8915 :a8915. +:a8916 :a8916 :a8916. +:a8917 :a8917 :a8917. +:a8918 :a8918 :a8918. +:a8919 :a8919 :a8919. +:a8920 :a8920 :a8920. +:a8921 :a8921 :a8921. +:a8922 :a8922 :a8922. +:a8923 :a8923 :a8923. +:a8924 :a8924 :a8924. +:a8925 :a8925 :a8925. +:a8926 :a8926 :a8926. +:a8927 :a8927 :a8927. +:a8928 :a8928 :a8928. +:a8929 :a8929 :a8929. +:a8930 :a8930 :a8930. +:a8931 :a8931 :a8931. +:a8932 :a8932 :a8932. +:a8933 :a8933 :a8933. +:a8934 :a8934 :a8934. +:a8935 :a8935 :a8935. +:a8936 :a8936 :a8936. +:a8937 :a8937 :a8937. +:a8938 :a8938 :a8938. +:a8939 :a8939 :a8939. +:a8940 :a8940 :a8940. +:a8941 :a8941 :a8941. +:a8942 :a8942 :a8942. +:a8943 :a8943 :a8943. +:a8944 :a8944 :a8944. +:a8945 :a8945 :a8945. +:a8946 :a8946 :a8946. +:a8947 :a8947 :a8947. +:a8948 :a8948 :a8948. +:a8949 :a8949 :a8949. +:a8950 :a8950 :a8950. +:a8951 :a8951 :a8951. +:a8952 :a8952 :a8952. +:a8953 :a8953 :a8953. +:a8954 :a8954 :a8954. +:a8955 :a8955 :a8955. +:a8956 :a8956 :a8956. +:a8957 :a8957 :a8957. +:a8958 :a8958 :a8958. +:a8959 :a8959 :a8959. +:a8960 :a8960 :a8960. +:a8961 :a8961 :a8961. +:a8962 :a8962 :a8962. +:a8963 :a8963 :a8963. +:a8964 :a8964 :a8964. +:a8965 :a8965 :a8965. +:a8966 :a8966 :a8966. +:a8967 :a8967 :a8967. +:a8968 :a8968 :a8968. +:a8969 :a8969 :a8969. +:a8970 :a8970 :a8970. +:a8971 :a8971 :a8971. +:a8972 :a8972 :a8972. +:a8973 :a8973 :a8973. +:a8974 :a8974 :a8974. +:a8975 :a8975 :a8975. +:a8976 :a8976 :a8976. +:a8977 :a8977 :a8977. +:a8978 :a8978 :a8978. +:a8979 :a8979 :a8979. +:a8980 :a8980 :a8980. +:a8981 :a8981 :a8981. +:a8982 :a8982 :a8982. +:a8983 :a8983 :a8983. +:a8984 :a8984 :a8984. +:a8985 :a8985 :a8985. +:a8986 :a8986 :a8986. +:a8987 :a8987 :a8987. +:a8988 :a8988 :a8988. +:a8989 :a8989 :a8989. +:a8990 :a8990 :a8990. +:a8991 :a8991 :a8991. +:a8992 :a8992 :a8992. +:a8993 :a8993 :a8993. +:a8994 :a8994 :a8994. +:a8995 :a8995 :a8995. +:a8996 :a8996 :a8996. +:a8997 :a8997 :a8997. +:a8998 :a8998 :a8998. +:a8999 :a8999 :a8999. +:a9000 :a9000 :a9000. +:a9001 :a9001 :a9001. +:a9002 :a9002 :a9002. +:a9003 :a9003 :a9003. +:a9004 :a9004 :a9004. +:a9005 :a9005 :a9005. +:a9006 :a9006 :a9006. +:a9007 :a9007 :a9007. +:a9008 :a9008 :a9008. +:a9009 :a9009 :a9009. +:a9010 :a9010 :a9010. +:a9011 :a9011 :a9011. +:a9012 :a9012 :a9012. +:a9013 :a9013 :a9013. +:a9014 :a9014 :a9014. +:a9015 :a9015 :a9015. +:a9016 :a9016 :a9016. +:a9017 :a9017 :a9017. +:a9018 :a9018 :a9018. +:a9019 :a9019 :a9019. +:a9020 :a9020 :a9020. +:a9021 :a9021 :a9021. +:a9022 :a9022 :a9022. +:a9023 :a9023 :a9023. +:a9024 :a9024 :a9024. +:a9025 :a9025 :a9025. +:a9026 :a9026 :a9026. +:a9027 :a9027 :a9027. +:a9028 :a9028 :a9028. +:a9029 :a9029 :a9029. +:a9030 :a9030 :a9030. +:a9031 :a9031 :a9031. +:a9032 :a9032 :a9032. +:a9033 :a9033 :a9033. +:a9034 :a9034 :a9034. +:a9035 :a9035 :a9035. +:a9036 :a9036 :a9036. +:a9037 :a9037 :a9037. +:a9038 :a9038 :a9038. +:a9039 :a9039 :a9039. +:a9040 :a9040 :a9040. +:a9041 :a9041 :a9041. +:a9042 :a9042 :a9042. +:a9043 :a9043 :a9043. +:a9044 :a9044 :a9044. +:a9045 :a9045 :a9045. +:a9046 :a9046 :a9046. +:a9047 :a9047 :a9047. +:a9048 :a9048 :a9048. +:a9049 :a9049 :a9049. +:a9050 :a9050 :a9050. +:a9051 :a9051 :a9051. +:a9052 :a9052 :a9052. +:a9053 :a9053 :a9053. +:a9054 :a9054 :a9054. +:a9055 :a9055 :a9055. +:a9056 :a9056 :a9056. +:a9057 :a9057 :a9057. +:a9058 :a9058 :a9058. +:a9059 :a9059 :a9059. +:a9060 :a9060 :a9060. +:a9061 :a9061 :a9061. +:a9062 :a9062 :a9062. +:a9063 :a9063 :a9063. +:a9064 :a9064 :a9064. +:a9065 :a9065 :a9065. +:a9066 :a9066 :a9066. +:a9067 :a9067 :a9067. +:a9068 :a9068 :a9068. +:a9069 :a9069 :a9069. +:a9070 :a9070 :a9070. +:a9071 :a9071 :a9071. +:a9072 :a9072 :a9072. +:a9073 :a9073 :a9073. +:a9074 :a9074 :a9074. +:a9075 :a9075 :a9075. +:a9076 :a9076 :a9076. +:a9077 :a9077 :a9077. +:a9078 :a9078 :a9078. +:a9079 :a9079 :a9079. +:a9080 :a9080 :a9080. +:a9081 :a9081 :a9081. +:a9082 :a9082 :a9082. +:a9083 :a9083 :a9083. +:a9084 :a9084 :a9084. +:a9085 :a9085 :a9085. +:a9086 :a9086 :a9086. +:a9087 :a9087 :a9087. +:a9088 :a9088 :a9088. +:a9089 :a9089 :a9089. +:a9090 :a9090 :a9090. +:a9091 :a9091 :a9091. +:a9092 :a9092 :a9092. +:a9093 :a9093 :a9093. +:a9094 :a9094 :a9094. +:a9095 :a9095 :a9095. +:a9096 :a9096 :a9096. +:a9097 :a9097 :a9097. +:a9098 :a9098 :a9098. +:a9099 :a9099 :a9099. +:a9100 :a9100 :a9100. +:a9101 :a9101 :a9101. +:a9102 :a9102 :a9102. +:a9103 :a9103 :a9103. +:a9104 :a9104 :a9104. +:a9105 :a9105 :a9105. +:a9106 :a9106 :a9106. +:a9107 :a9107 :a9107. +:a9108 :a9108 :a9108. +:a9109 :a9109 :a9109. +:a9110 :a9110 :a9110. +:a9111 :a9111 :a9111. +:a9112 :a9112 :a9112. +:a9113 :a9113 :a9113. +:a9114 :a9114 :a9114. +:a9115 :a9115 :a9115. +:a9116 :a9116 :a9116. +:a9117 :a9117 :a9117. +:a9118 :a9118 :a9118. +:a9119 :a9119 :a9119. +:a9120 :a9120 :a9120. +:a9121 :a9121 :a9121. +:a9122 :a9122 :a9122. +:a9123 :a9123 :a9123. +:a9124 :a9124 :a9124. +:a9125 :a9125 :a9125. +:a9126 :a9126 :a9126. +:a9127 :a9127 :a9127. +:a9128 :a9128 :a9128. +:a9129 :a9129 :a9129. +:a9130 :a9130 :a9130. +:a9131 :a9131 :a9131. +:a9132 :a9132 :a9132. +:a9133 :a9133 :a9133. +:a9134 :a9134 :a9134. +:a9135 :a9135 :a9135. +:a9136 :a9136 :a9136. +:a9137 :a9137 :a9137. +:a9138 :a9138 :a9138. +:a9139 :a9139 :a9139. +:a9140 :a9140 :a9140. +:a9141 :a9141 :a9141. +:a9142 :a9142 :a9142. +:a9143 :a9143 :a9143. +:a9144 :a9144 :a9144. +:a9145 :a9145 :a9145. +:a9146 :a9146 :a9146. +:a9147 :a9147 :a9147. +:a9148 :a9148 :a9148. +:a9149 :a9149 :a9149. +:a9150 :a9150 :a9150. +:a9151 :a9151 :a9151. +:a9152 :a9152 :a9152. +:a9153 :a9153 :a9153. +:a9154 :a9154 :a9154. +:a9155 :a9155 :a9155. +:a9156 :a9156 :a9156. +:a9157 :a9157 :a9157. +:a9158 :a9158 :a9158. +:a9159 :a9159 :a9159. +:a9160 :a9160 :a9160. +:a9161 :a9161 :a9161. +:a9162 :a9162 :a9162. +:a9163 :a9163 :a9163. +:a9164 :a9164 :a9164. +:a9165 :a9165 :a9165. +:a9166 :a9166 :a9166. +:a9167 :a9167 :a9167. +:a9168 :a9168 :a9168. +:a9169 :a9169 :a9169. +:a9170 :a9170 :a9170. +:a9171 :a9171 :a9171. +:a9172 :a9172 :a9172. +:a9173 :a9173 :a9173. +:a9174 :a9174 :a9174. +:a9175 :a9175 :a9175. +:a9176 :a9176 :a9176. +:a9177 :a9177 :a9177. +:a9178 :a9178 :a9178. +:a9179 :a9179 :a9179. +:a9180 :a9180 :a9180. +:a9181 :a9181 :a9181. +:a9182 :a9182 :a9182. +:a9183 :a9183 :a9183. +:a9184 :a9184 :a9184. +:a9185 :a9185 :a9185. +:a9186 :a9186 :a9186. +:a9187 :a9187 :a9187. +:a9188 :a9188 :a9188. +:a9189 :a9189 :a9189. +:a9190 :a9190 :a9190. +:a9191 :a9191 :a9191. +:a9192 :a9192 :a9192. +:a9193 :a9193 :a9193. +:a9194 :a9194 :a9194. +:a9195 :a9195 :a9195. +:a9196 :a9196 :a9196. +:a9197 :a9197 :a9197. +:a9198 :a9198 :a9198. +:a9199 :a9199 :a9199. +:a9200 :a9200 :a9200. +:a9201 :a9201 :a9201. +:a9202 :a9202 :a9202. +:a9203 :a9203 :a9203. +:a9204 :a9204 :a9204. +:a9205 :a9205 :a9205. +:a9206 :a9206 :a9206. +:a9207 :a9207 :a9207. +:a9208 :a9208 :a9208. +:a9209 :a9209 :a9209. +:a9210 :a9210 :a9210. +:a9211 :a9211 :a9211. +:a9212 :a9212 :a9212. +:a9213 :a9213 :a9213. +:a9214 :a9214 :a9214. +:a9215 :a9215 :a9215. +:a9216 :a9216 :a9216. +:a9217 :a9217 :a9217. +:a9218 :a9218 :a9218. +:a9219 :a9219 :a9219. +:a9220 :a9220 :a9220. +:a9221 :a9221 :a9221. +:a9222 :a9222 :a9222. +:a9223 :a9223 :a9223. +:a9224 :a9224 :a9224. +:a9225 :a9225 :a9225. +:a9226 :a9226 :a9226. +:a9227 :a9227 :a9227. +:a9228 :a9228 :a9228. +:a9229 :a9229 :a9229. +:a9230 :a9230 :a9230. +:a9231 :a9231 :a9231. +:a9232 :a9232 :a9232. +:a9233 :a9233 :a9233. +:a9234 :a9234 :a9234. +:a9235 :a9235 :a9235. +:a9236 :a9236 :a9236. +:a9237 :a9237 :a9237. +:a9238 :a9238 :a9238. +:a9239 :a9239 :a9239. +:a9240 :a9240 :a9240. +:a9241 :a9241 :a9241. +:a9242 :a9242 :a9242. +:a9243 :a9243 :a9243. +:a9244 :a9244 :a9244. +:a9245 :a9245 :a9245. +:a9246 :a9246 :a9246. +:a9247 :a9247 :a9247. +:a9248 :a9248 :a9248. +:a9249 :a9249 :a9249. +:a9250 :a9250 :a9250. +:a9251 :a9251 :a9251. +:a9252 :a9252 :a9252. +:a9253 :a9253 :a9253. +:a9254 :a9254 :a9254. +:a9255 :a9255 :a9255. +:a9256 :a9256 :a9256. +:a9257 :a9257 :a9257. +:a9258 :a9258 :a9258. +:a9259 :a9259 :a9259. +:a9260 :a9260 :a9260. +:a9261 :a9261 :a9261. +:a9262 :a9262 :a9262. +:a9263 :a9263 :a9263. +:a9264 :a9264 :a9264. +:a9265 :a9265 :a9265. +:a9266 :a9266 :a9266. +:a9267 :a9267 :a9267. +:a9268 :a9268 :a9268. +:a9269 :a9269 :a9269. +:a9270 :a9270 :a9270. +:a9271 :a9271 :a9271. +:a9272 :a9272 :a9272. +:a9273 :a9273 :a9273. +:a9274 :a9274 :a9274. +:a9275 :a9275 :a9275. +:a9276 :a9276 :a9276. +:a9277 :a9277 :a9277. +:a9278 :a9278 :a9278. +:a9279 :a9279 :a9279. +:a9280 :a9280 :a9280. +:a9281 :a9281 :a9281. +:a9282 :a9282 :a9282. +:a9283 :a9283 :a9283. +:a9284 :a9284 :a9284. +:a9285 :a9285 :a9285. +:a9286 :a9286 :a9286. +:a9287 :a9287 :a9287. +:a9288 :a9288 :a9288. +:a9289 :a9289 :a9289. +:a9290 :a9290 :a9290. +:a9291 :a9291 :a9291. +:a9292 :a9292 :a9292. +:a9293 :a9293 :a9293. +:a9294 :a9294 :a9294. +:a9295 :a9295 :a9295. +:a9296 :a9296 :a9296. +:a9297 :a9297 :a9297. +:a9298 :a9298 :a9298. +:a9299 :a9299 :a9299. +:a9300 :a9300 :a9300. +:a9301 :a9301 :a9301. +:a9302 :a9302 :a9302. +:a9303 :a9303 :a9303. +:a9304 :a9304 :a9304. +:a9305 :a9305 :a9305. +:a9306 :a9306 :a9306. +:a9307 :a9307 :a9307. +:a9308 :a9308 :a9308. +:a9309 :a9309 :a9309. +:a9310 :a9310 :a9310. +:a9311 :a9311 :a9311. +:a9312 :a9312 :a9312. +:a9313 :a9313 :a9313. +:a9314 :a9314 :a9314. +:a9315 :a9315 :a9315. +:a9316 :a9316 :a9316. +:a9317 :a9317 :a9317. +:a9318 :a9318 :a9318. +:a9319 :a9319 :a9319. +:a9320 :a9320 :a9320. +:a9321 :a9321 :a9321. +:a9322 :a9322 :a9322. +:a9323 :a9323 :a9323. +:a9324 :a9324 :a9324. +:a9325 :a9325 :a9325. +:a9326 :a9326 :a9326. +:a9327 :a9327 :a9327. +:a9328 :a9328 :a9328. +:a9329 :a9329 :a9329. +:a9330 :a9330 :a9330. +:a9331 :a9331 :a9331. +:a9332 :a9332 :a9332. +:a9333 :a9333 :a9333. +:a9334 :a9334 :a9334. +:a9335 :a9335 :a9335. +:a9336 :a9336 :a9336. +:a9337 :a9337 :a9337. +:a9338 :a9338 :a9338. +:a9339 :a9339 :a9339. +:a9340 :a9340 :a9340. +:a9341 :a9341 :a9341. +:a9342 :a9342 :a9342. +:a9343 :a9343 :a9343. +:a9344 :a9344 :a9344. +:a9345 :a9345 :a9345. +:a9346 :a9346 :a9346. +:a9347 :a9347 :a9347. +:a9348 :a9348 :a9348. +:a9349 :a9349 :a9349. +:a9350 :a9350 :a9350. +:a9351 :a9351 :a9351. +:a9352 :a9352 :a9352. +:a9353 :a9353 :a9353. +:a9354 :a9354 :a9354. +:a9355 :a9355 :a9355. +:a9356 :a9356 :a9356. +:a9357 :a9357 :a9357. +:a9358 :a9358 :a9358. +:a9359 :a9359 :a9359. +:a9360 :a9360 :a9360. +:a9361 :a9361 :a9361. +:a9362 :a9362 :a9362. +:a9363 :a9363 :a9363. +:a9364 :a9364 :a9364. +:a9365 :a9365 :a9365. +:a9366 :a9366 :a9366. +:a9367 :a9367 :a9367. +:a9368 :a9368 :a9368. +:a9369 :a9369 :a9369. +:a9370 :a9370 :a9370. +:a9371 :a9371 :a9371. +:a9372 :a9372 :a9372. +:a9373 :a9373 :a9373. +:a9374 :a9374 :a9374. +:a9375 :a9375 :a9375. +:a9376 :a9376 :a9376. +:a9377 :a9377 :a9377. +:a9378 :a9378 :a9378. +:a9379 :a9379 :a9379. +:a9380 :a9380 :a9380. +:a9381 :a9381 :a9381. +:a9382 :a9382 :a9382. +:a9383 :a9383 :a9383. +:a9384 :a9384 :a9384. +:a9385 :a9385 :a9385. +:a9386 :a9386 :a9386. +:a9387 :a9387 :a9387. +:a9388 :a9388 :a9388. +:a9389 :a9389 :a9389. +:a9390 :a9390 :a9390. +:a9391 :a9391 :a9391. +:a9392 :a9392 :a9392. +:a9393 :a9393 :a9393. +:a9394 :a9394 :a9394. +:a9395 :a9395 :a9395. +:a9396 :a9396 :a9396. +:a9397 :a9397 :a9397. +:a9398 :a9398 :a9398. +:a9399 :a9399 :a9399. +:a9400 :a9400 :a9400. +:a9401 :a9401 :a9401. +:a9402 :a9402 :a9402. +:a9403 :a9403 :a9403. +:a9404 :a9404 :a9404. +:a9405 :a9405 :a9405. +:a9406 :a9406 :a9406. +:a9407 :a9407 :a9407. +:a9408 :a9408 :a9408. +:a9409 :a9409 :a9409. +:a9410 :a9410 :a9410. +:a9411 :a9411 :a9411. +:a9412 :a9412 :a9412. +:a9413 :a9413 :a9413. +:a9414 :a9414 :a9414. +:a9415 :a9415 :a9415. +:a9416 :a9416 :a9416. +:a9417 :a9417 :a9417. +:a9418 :a9418 :a9418. +:a9419 :a9419 :a9419. +:a9420 :a9420 :a9420. +:a9421 :a9421 :a9421. +:a9422 :a9422 :a9422. +:a9423 :a9423 :a9423. +:a9424 :a9424 :a9424. +:a9425 :a9425 :a9425. +:a9426 :a9426 :a9426. +:a9427 :a9427 :a9427. +:a9428 :a9428 :a9428. +:a9429 :a9429 :a9429. +:a9430 :a9430 :a9430. +:a9431 :a9431 :a9431. +:a9432 :a9432 :a9432. +:a9433 :a9433 :a9433. +:a9434 :a9434 :a9434. +:a9435 :a9435 :a9435. +:a9436 :a9436 :a9436. +:a9437 :a9437 :a9437. +:a9438 :a9438 :a9438. +:a9439 :a9439 :a9439. +:a9440 :a9440 :a9440. +:a9441 :a9441 :a9441. +:a9442 :a9442 :a9442. +:a9443 :a9443 :a9443. +:a9444 :a9444 :a9444. +:a9445 :a9445 :a9445. +:a9446 :a9446 :a9446. +:a9447 :a9447 :a9447. +:a9448 :a9448 :a9448. +:a9449 :a9449 :a9449. +:a9450 :a9450 :a9450. +:a9451 :a9451 :a9451. +:a9452 :a9452 :a9452. +:a9453 :a9453 :a9453. +:a9454 :a9454 :a9454. +:a9455 :a9455 :a9455. +:a9456 :a9456 :a9456. +:a9457 :a9457 :a9457. +:a9458 :a9458 :a9458. +:a9459 :a9459 :a9459. +:a9460 :a9460 :a9460. +:a9461 :a9461 :a9461. +:a9462 :a9462 :a9462. +:a9463 :a9463 :a9463. +:a9464 :a9464 :a9464. +:a9465 :a9465 :a9465. +:a9466 :a9466 :a9466. +:a9467 :a9467 :a9467. +:a9468 :a9468 :a9468. +:a9469 :a9469 :a9469. +:a9470 :a9470 :a9470. +:a9471 :a9471 :a9471. +:a9472 :a9472 :a9472. +:a9473 :a9473 :a9473. +:a9474 :a9474 :a9474. +:a9475 :a9475 :a9475. +:a9476 :a9476 :a9476. +:a9477 :a9477 :a9477. +:a9478 :a9478 :a9478. +:a9479 :a9479 :a9479. +:a9480 :a9480 :a9480. +:a9481 :a9481 :a9481. +:a9482 :a9482 :a9482. +:a9483 :a9483 :a9483. +:a9484 :a9484 :a9484. +:a9485 :a9485 :a9485. +:a9486 :a9486 :a9486. +:a9487 :a9487 :a9487. +:a9488 :a9488 :a9488. +:a9489 :a9489 :a9489. +:a9490 :a9490 :a9490. +:a9491 :a9491 :a9491. +:a9492 :a9492 :a9492. +:a9493 :a9493 :a9493. +:a9494 :a9494 :a9494. +:a9495 :a9495 :a9495. +:a9496 :a9496 :a9496. +:a9497 :a9497 :a9497. +:a9498 :a9498 :a9498. +:a9499 :a9499 :a9499. +:a9500 :a9500 :a9500. +:a9501 :a9501 :a9501. +:a9502 :a9502 :a9502. +:a9503 :a9503 :a9503. +:a9504 :a9504 :a9504. +:a9505 :a9505 :a9505. +:a9506 :a9506 :a9506. +:a9507 :a9507 :a9507. +:a9508 :a9508 :a9508. +:a9509 :a9509 :a9509. +:a9510 :a9510 :a9510. +:a9511 :a9511 :a9511. +:a9512 :a9512 :a9512. +:a9513 :a9513 :a9513. +:a9514 :a9514 :a9514. +:a9515 :a9515 :a9515. +:a9516 :a9516 :a9516. +:a9517 :a9517 :a9517. +:a9518 :a9518 :a9518. +:a9519 :a9519 :a9519. +:a9520 :a9520 :a9520. +:a9521 :a9521 :a9521. +:a9522 :a9522 :a9522. +:a9523 :a9523 :a9523. +:a9524 :a9524 :a9524. +:a9525 :a9525 :a9525. +:a9526 :a9526 :a9526. +:a9527 :a9527 :a9527. +:a9528 :a9528 :a9528. +:a9529 :a9529 :a9529. +:a9530 :a9530 :a9530. +:a9531 :a9531 :a9531. +:a9532 :a9532 :a9532. +:a9533 :a9533 :a9533. +:a9534 :a9534 :a9534. +:a9535 :a9535 :a9535. +:a9536 :a9536 :a9536. +:a9537 :a9537 :a9537. +:a9538 :a9538 :a9538. +:a9539 :a9539 :a9539. +:a9540 :a9540 :a9540. +:a9541 :a9541 :a9541. +:a9542 :a9542 :a9542. +:a9543 :a9543 :a9543. +:a9544 :a9544 :a9544. +:a9545 :a9545 :a9545. +:a9546 :a9546 :a9546. +:a9547 :a9547 :a9547. +:a9548 :a9548 :a9548. +:a9549 :a9549 :a9549. +:a9550 :a9550 :a9550. +:a9551 :a9551 :a9551. +:a9552 :a9552 :a9552. +:a9553 :a9553 :a9553. +:a9554 :a9554 :a9554. +:a9555 :a9555 :a9555. +:a9556 :a9556 :a9556. +:a9557 :a9557 :a9557. +:a9558 :a9558 :a9558. +:a9559 :a9559 :a9559. +:a9560 :a9560 :a9560. +:a9561 :a9561 :a9561. +:a9562 :a9562 :a9562. +:a9563 :a9563 :a9563. +:a9564 :a9564 :a9564. +:a9565 :a9565 :a9565. +:a9566 :a9566 :a9566. +:a9567 :a9567 :a9567. +:a9568 :a9568 :a9568. +:a9569 :a9569 :a9569. +:a9570 :a9570 :a9570. +:a9571 :a9571 :a9571. +:a9572 :a9572 :a9572. +:a9573 :a9573 :a9573. +:a9574 :a9574 :a9574. +:a9575 :a9575 :a9575. +:a9576 :a9576 :a9576. +:a9577 :a9577 :a9577. +:a9578 :a9578 :a9578. +:a9579 :a9579 :a9579. +:a9580 :a9580 :a9580. +:a9581 :a9581 :a9581. +:a9582 :a9582 :a9582. +:a9583 :a9583 :a9583. +:a9584 :a9584 :a9584. +:a9585 :a9585 :a9585. +:a9586 :a9586 :a9586. +:a9587 :a9587 :a9587. +:a9588 :a9588 :a9588. +:a9589 :a9589 :a9589. +:a9590 :a9590 :a9590. +:a9591 :a9591 :a9591. +:a9592 :a9592 :a9592. +:a9593 :a9593 :a9593. +:a9594 :a9594 :a9594. +:a9595 :a9595 :a9595. +:a9596 :a9596 :a9596. +:a9597 :a9597 :a9597. +:a9598 :a9598 :a9598. +:a9599 :a9599 :a9599. +:a9600 :a9600 :a9600. +:a9601 :a9601 :a9601. +:a9602 :a9602 :a9602. +:a9603 :a9603 :a9603. +:a9604 :a9604 :a9604. +:a9605 :a9605 :a9605. +:a9606 :a9606 :a9606. +:a9607 :a9607 :a9607. +:a9608 :a9608 :a9608. +:a9609 :a9609 :a9609. +:a9610 :a9610 :a9610. +:a9611 :a9611 :a9611. +:a9612 :a9612 :a9612. +:a9613 :a9613 :a9613. +:a9614 :a9614 :a9614. +:a9615 :a9615 :a9615. +:a9616 :a9616 :a9616. +:a9617 :a9617 :a9617. +:a9618 :a9618 :a9618. +:a9619 :a9619 :a9619. +:a9620 :a9620 :a9620. +:a9621 :a9621 :a9621. +:a9622 :a9622 :a9622. +:a9623 :a9623 :a9623. +:a9624 :a9624 :a9624. +:a9625 :a9625 :a9625. +:a9626 :a9626 :a9626. +:a9627 :a9627 :a9627. +:a9628 :a9628 :a9628. +:a9629 :a9629 :a9629. +:a9630 :a9630 :a9630. +:a9631 :a9631 :a9631. +:a9632 :a9632 :a9632. +:a9633 :a9633 :a9633. +:a9634 :a9634 :a9634. +:a9635 :a9635 :a9635. +:a9636 :a9636 :a9636. +:a9637 :a9637 :a9637. +:a9638 :a9638 :a9638. +:a9639 :a9639 :a9639. +:a9640 :a9640 :a9640. +:a9641 :a9641 :a9641. +:a9642 :a9642 :a9642. +:a9643 :a9643 :a9643. +:a9644 :a9644 :a9644. +:a9645 :a9645 :a9645. +:a9646 :a9646 :a9646. +:a9647 :a9647 :a9647. +:a9648 :a9648 :a9648. +:a9649 :a9649 :a9649. +:a9650 :a9650 :a9650. +:a9651 :a9651 :a9651. +:a9652 :a9652 :a9652. +:a9653 :a9653 :a9653. +:a9654 :a9654 :a9654. +:a9655 :a9655 :a9655. +:a9656 :a9656 :a9656. +:a9657 :a9657 :a9657. +:a9658 :a9658 :a9658. +:a9659 :a9659 :a9659. +:a9660 :a9660 :a9660. +:a9661 :a9661 :a9661. +:a9662 :a9662 :a9662. +:a9663 :a9663 :a9663. +:a9664 :a9664 :a9664. +:a9665 :a9665 :a9665. +:a9666 :a9666 :a9666. +:a9667 :a9667 :a9667. +:a9668 :a9668 :a9668. +:a9669 :a9669 :a9669. +:a9670 :a9670 :a9670. +:a9671 :a9671 :a9671. +:a9672 :a9672 :a9672. +:a9673 :a9673 :a9673. +:a9674 :a9674 :a9674. +:a9675 :a9675 :a9675. +:a9676 :a9676 :a9676. +:a9677 :a9677 :a9677. +:a9678 :a9678 :a9678. +:a9679 :a9679 :a9679. +:a9680 :a9680 :a9680. +:a9681 :a9681 :a9681. +:a9682 :a9682 :a9682. +:a9683 :a9683 :a9683. +:a9684 :a9684 :a9684. +:a9685 :a9685 :a9685. +:a9686 :a9686 :a9686. +:a9687 :a9687 :a9687. +:a9688 :a9688 :a9688. +:a9689 :a9689 :a9689. +:a9690 :a9690 :a9690. +:a9691 :a9691 :a9691. +:a9692 :a9692 :a9692. +:a9693 :a9693 :a9693. +:a9694 :a9694 :a9694. +:a9695 :a9695 :a9695. +:a9696 :a9696 :a9696. +:a9697 :a9697 :a9697. +:a9698 :a9698 :a9698. +:a9699 :a9699 :a9699. +:a9700 :a9700 :a9700. +:a9701 :a9701 :a9701. +:a9702 :a9702 :a9702. +:a9703 :a9703 :a9703. +:a9704 :a9704 :a9704. +:a9705 :a9705 :a9705. +:a9706 :a9706 :a9706. +:a9707 :a9707 :a9707. +:a9708 :a9708 :a9708. +:a9709 :a9709 :a9709. +:a9710 :a9710 :a9710. +:a9711 :a9711 :a9711. +:a9712 :a9712 :a9712. +:a9713 :a9713 :a9713. +:a9714 :a9714 :a9714. +:a9715 :a9715 :a9715. +:a9716 :a9716 :a9716. +:a9717 :a9717 :a9717. +:a9718 :a9718 :a9718. +:a9719 :a9719 :a9719. +:a9720 :a9720 :a9720. +:a9721 :a9721 :a9721. +:a9722 :a9722 :a9722. +:a9723 :a9723 :a9723. +:a9724 :a9724 :a9724. +:a9725 :a9725 :a9725. +:a9726 :a9726 :a9726. +:a9727 :a9727 :a9727. +:a9728 :a9728 :a9728. +:a9729 :a9729 :a9729. +:a9730 :a9730 :a9730. +:a9731 :a9731 :a9731. +:a9732 :a9732 :a9732. +:a9733 :a9733 :a9733. +:a9734 :a9734 :a9734. +:a9735 :a9735 :a9735. +:a9736 :a9736 :a9736. +:a9737 :a9737 :a9737. +:a9738 :a9738 :a9738. +:a9739 :a9739 :a9739. +:a9740 :a9740 :a9740. +:a9741 :a9741 :a9741. +:a9742 :a9742 :a9742. +:a9743 :a9743 :a9743. +:a9744 :a9744 :a9744. +:a9745 :a9745 :a9745. +:a9746 :a9746 :a9746. +:a9747 :a9747 :a9747. +:a9748 :a9748 :a9748. +:a9749 :a9749 :a9749. +:a9750 :a9750 :a9750. +:a9751 :a9751 :a9751. +:a9752 :a9752 :a9752. +:a9753 :a9753 :a9753. +:a9754 :a9754 :a9754. +:a9755 :a9755 :a9755. +:a9756 :a9756 :a9756. +:a9757 :a9757 :a9757. +:a9758 :a9758 :a9758. +:a9759 :a9759 :a9759. +:a9760 :a9760 :a9760. +:a9761 :a9761 :a9761. +:a9762 :a9762 :a9762. +:a9763 :a9763 :a9763. +:a9764 :a9764 :a9764. +:a9765 :a9765 :a9765. +:a9766 :a9766 :a9766. +:a9767 :a9767 :a9767. +:a9768 :a9768 :a9768. +:a9769 :a9769 :a9769. +:a9770 :a9770 :a9770. +:a9771 :a9771 :a9771. +:a9772 :a9772 :a9772. +:a9773 :a9773 :a9773. +:a9774 :a9774 :a9774. +:a9775 :a9775 :a9775. +:a9776 :a9776 :a9776. +:a9777 :a9777 :a9777. +:a9778 :a9778 :a9778. +:a9779 :a9779 :a9779. +:a9780 :a9780 :a9780. +:a9781 :a9781 :a9781. +:a9782 :a9782 :a9782. +:a9783 :a9783 :a9783. +:a9784 :a9784 :a9784. +:a9785 :a9785 :a9785. +:a9786 :a9786 :a9786. +:a9787 :a9787 :a9787. +:a9788 :a9788 :a9788. +:a9789 :a9789 :a9789. +:a9790 :a9790 :a9790. +:a9791 :a9791 :a9791. +:a9792 :a9792 :a9792. +:a9793 :a9793 :a9793. +:a9794 :a9794 :a9794. +:a9795 :a9795 :a9795. +:a9796 :a9796 :a9796. +:a9797 :a9797 :a9797. +:a9798 :a9798 :a9798. +:a9799 :a9799 :a9799. +:a9800 :a9800 :a9800. +:a9801 :a9801 :a9801. +:a9802 :a9802 :a9802. +:a9803 :a9803 :a9803. +:a9804 :a9804 :a9804. +:a9805 :a9805 :a9805. +:a9806 :a9806 :a9806. +:a9807 :a9807 :a9807. +:a9808 :a9808 :a9808. +:a9809 :a9809 :a9809. +:a9810 :a9810 :a9810. +:a9811 :a9811 :a9811. +:a9812 :a9812 :a9812. +:a9813 :a9813 :a9813. +:a9814 :a9814 :a9814. +:a9815 :a9815 :a9815. +:a9816 :a9816 :a9816. +:a9817 :a9817 :a9817. +:a9818 :a9818 :a9818. +:a9819 :a9819 :a9819. +:a9820 :a9820 :a9820. +:a9821 :a9821 :a9821. +:a9822 :a9822 :a9822. +:a9823 :a9823 :a9823. +:a9824 :a9824 :a9824. +:a9825 :a9825 :a9825. +:a9826 :a9826 :a9826. +:a9827 :a9827 :a9827. +:a9828 :a9828 :a9828. +:a9829 :a9829 :a9829. +:a9830 :a9830 :a9830. +:a9831 :a9831 :a9831. +:a9832 :a9832 :a9832. +:a9833 :a9833 :a9833. +:a9834 :a9834 :a9834. +:a9835 :a9835 :a9835. +:a9836 :a9836 :a9836. +:a9837 :a9837 :a9837. +:a9838 :a9838 :a9838. +:a9839 :a9839 :a9839. +:a9840 :a9840 :a9840. +:a9841 :a9841 :a9841. +:a9842 :a9842 :a9842. +:a9843 :a9843 :a9843. +:a9844 :a9844 :a9844. +:a9845 :a9845 :a9845. +:a9846 :a9846 :a9846. +:a9847 :a9847 :a9847. +:a9848 :a9848 :a9848. +:a9849 :a9849 :a9849. +:a9850 :a9850 :a9850. +:a9851 :a9851 :a9851. +:a9852 :a9852 :a9852. +:a9853 :a9853 :a9853. +:a9854 :a9854 :a9854. +:a9855 :a9855 :a9855. +:a9856 :a9856 :a9856. +:a9857 :a9857 :a9857. +:a9858 :a9858 :a9858. +:a9859 :a9859 :a9859. +:a9860 :a9860 :a9860. +:a9861 :a9861 :a9861. +:a9862 :a9862 :a9862. +:a9863 :a9863 :a9863. +:a9864 :a9864 :a9864. +:a9865 :a9865 :a9865. +:a9866 :a9866 :a9866. +:a9867 :a9867 :a9867. +:a9868 :a9868 :a9868. +:a9869 :a9869 :a9869. +:a9870 :a9870 :a9870. +:a9871 :a9871 :a9871. +:a9872 :a9872 :a9872. +:a9873 :a9873 :a9873. +:a9874 :a9874 :a9874. +:a9875 :a9875 :a9875. +:a9876 :a9876 :a9876. +:a9877 :a9877 :a9877. +:a9878 :a9878 :a9878. +:a9879 :a9879 :a9879. +:a9880 :a9880 :a9880. +:a9881 :a9881 :a9881. +:a9882 :a9882 :a9882. +:a9883 :a9883 :a9883. +:a9884 :a9884 :a9884. +:a9885 :a9885 :a9885. +:a9886 :a9886 :a9886. +:a9887 :a9887 :a9887. +:a9888 :a9888 :a9888. +:a9889 :a9889 :a9889. +:a9890 :a9890 :a9890. +:a9891 :a9891 :a9891. +:a9892 :a9892 :a9892. +:a9893 :a9893 :a9893. +:a9894 :a9894 :a9894. +:a9895 :a9895 :a9895. +:a9896 :a9896 :a9896. +:a9897 :a9897 :a9897. +:a9898 :a9898 :a9898. +:a9899 :a9899 :a9899. +:a9900 :a9900 :a9900. +:a9901 :a9901 :a9901. +:a9902 :a9902 :a9902. +:a9903 :a9903 :a9903. +:a9904 :a9904 :a9904. +:a9905 :a9905 :a9905. +:a9906 :a9906 :a9906. +:a9907 :a9907 :a9907. +:a9908 :a9908 :a9908. +:a9909 :a9909 :a9909. +:a9910 :a9910 :a9910. +:a9911 :a9911 :a9911. +:a9912 :a9912 :a9912. +:a9913 :a9913 :a9913. +:a9914 :a9914 :a9914. +:a9915 :a9915 :a9915. +:a9916 :a9916 :a9916. +:a9917 :a9917 :a9917. +:a9918 :a9918 :a9918. +:a9919 :a9919 :a9919. +:a9920 :a9920 :a9920. +:a9921 :a9921 :a9921. +:a9922 :a9922 :a9922. +:a9923 :a9923 :a9923. +:a9924 :a9924 :a9924. +:a9925 :a9925 :a9925. +:a9926 :a9926 :a9926. +:a9927 :a9927 :a9927. +:a9928 :a9928 :a9928. +:a9929 :a9929 :a9929. +:a9930 :a9930 :a9930. +:a9931 :a9931 :a9931. +:a9932 :a9932 :a9932. +:a9933 :a9933 :a9933. +:a9934 :a9934 :a9934. +:a9935 :a9935 :a9935. +:a9936 :a9936 :a9936. +:a9937 :a9937 :a9937. +:a9938 :a9938 :a9938. +:a9939 :a9939 :a9939. +:a9940 :a9940 :a9940. +:a9941 :a9941 :a9941. +:a9942 :a9942 :a9942. +:a9943 :a9943 :a9943. +:a9944 :a9944 :a9944. +:a9945 :a9945 :a9945. +:a9946 :a9946 :a9946. +:a9947 :a9947 :a9947. +:a9948 :a9948 :a9948. +:a9949 :a9949 :a9949. +:a9950 :a9950 :a9950. +:a9951 :a9951 :a9951. +:a9952 :a9952 :a9952. +:a9953 :a9953 :a9953. +:a9954 :a9954 :a9954. +:a9955 :a9955 :a9955. +:a9956 :a9956 :a9956. +:a9957 :a9957 :a9957. +:a9958 :a9958 :a9958. +:a9959 :a9959 :a9959. +:a9960 :a9960 :a9960. +:a9961 :a9961 :a9961. +:a9962 :a9962 :a9962. +:a9963 :a9963 :a9963. +:a9964 :a9964 :a9964. +:a9965 :a9965 :a9965. +:a9966 :a9966 :a9966. +:a9967 :a9967 :a9967. +:a9968 :a9968 :a9968. +:a9969 :a9969 :a9969. +:a9970 :a9970 :a9970. +:a9971 :a9971 :a9971. +:a9972 :a9972 :a9972. +:a9973 :a9973 :a9973. +:a9974 :a9974 :a9974. +:a9975 :a9975 :a9975. +:a9976 :a9976 :a9976. +:a9977 :a9977 :a9977. +:a9978 :a9978 :a9978. +:a9979 :a9979 :a9979. +:a9980 :a9980 :a9980. +:a9981 :a9981 :a9981. +:a9982 :a9982 :a9982. +:a9983 :a9983 :a9983. +:a9984 :a9984 :a9984. +:a9985 :a9985 :a9985. +:a9986 :a9986 :a9986. +:a9987 :a9987 :a9987. +:a9988 :a9988 :a9988. +:a9989 :a9989 :a9989. +:a9990 :a9990 :a9990. +:a9991 :a9991 :a9991. +:a9992 :a9992 :a9992. +:a9993 :a9993 :a9993. +:a9994 :a9994 :a9994. +:a9995 :a9995 :a9995. +:a9996 :a9996 :a9996. +:a9997 :a9997 :a9997. +:a9998 :a9998 :a9998. +:a9999 :a9999 :a9999. +:a10000 :a10000 :a10000. diff --git a/testsuite/serd-tests/good/test-15.nt b/testsuite/serd-tests/good/test-15.nt new file mode 100644 index 00000000..c0604b3b --- /dev/null +++ b/testsuite/serd-tests/good/test-15.nt @@ -0,0 +1,10000 @@ +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c10> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c11> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c12> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c13> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c14> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c15> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c16> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c17> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c18> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c19> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c20> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c21> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c22> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c23> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c24> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c25> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c26> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c27> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c28> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c29> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c30> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c31> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c32> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c33> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c34> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c35> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c36> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c37> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c38> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c39> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c40> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c41> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c42> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c43> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c44> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c45> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c46> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c47> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c48> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c49> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c50> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c51> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c52> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c53> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c54> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c55> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c56> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c57> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c58> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c59> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c60> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c61> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c62> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c63> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c64> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c65> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c66> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c67> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c68> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c69> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c70> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c71> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c72> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c73> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c74> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c75> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c76> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c77> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c78> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c79> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c80> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c81> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c82> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c83> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c84> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c85> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c86> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c87> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c88> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c89> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c90> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c91> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c92> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c93> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c94> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c95> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c96> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c97> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c98> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c99> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c10000> . diff --git a/testsuite/serd-tests/good/test-15.ttl b/testsuite/serd-tests/good/test-15.ttl new file mode 100644 index 00000000..10df17df --- /dev/null +++ b/testsuite/serd-tests/good/test-15.ttl @@ -0,0 +1,3 @@ +# 10000 triple objects (10000 triples) more than the default Bison stack size +@prefix : <http://example.org/ns#> . +:a :b :c1, :c2, :c3, :c4, :c5, :c6, :c7, :c8, :c9, :c10, :c11, :c12, :c13, :c14, :c15, :c16, :c17, :c18, :c19, :c20, :c21, :c22, :c23, :c24, :c25, :c26, :c27, :c28, :c29, :c30, :c31, :c32, :c33, :c34, :c35, :c36, :c37, :c38, :c39, :c40, :c41, :c42, :c43, :c44, :c45, :c46, :c47, :c48, :c49, :c50, :c51, :c52, :c53, :c54, :c55, :c56, :c57, :c58, :c59, :c60, :c61, :c62, :c63, :c64, :c65, :c66, :c67, :c68, :c69, :c70, :c71, :c72, :c73, :c74, :c75, :c76, :c77, :c78, :c79, :c80, :c81, :c82, :c83, :c84, :c85, :c86, :c87, :c88, :c89, :c90, :c91, :c92, :c93, :c94, :c95, :c96, :c97, :c98, :c99, :c100, :c101, :c102, :c103, :c104, :c105, :c106, :c107, :c108, :c109, :c110, :c111, :c112, :c113, :c114, :c115, :c116, :c117, :c118, :c119, :c120, :c121, :c122, :c123, :c124, :c125, :c126, :c127, :c128, :c129, :c130, :c131, :c132, :c133, :c134, :c135, :c136, :c137, :c138, :c139, :c140, :c141, :c142, :c143, :c144, :c145, :c146, :c147, :c148, :c149, :c150, :c151, :c152, :c153, :c154, :c155, :c156, :c157, :c158, :c159, :c160, :c161, :c162, :c163, :c164, :c165, :c166, :c167, :c168, :c169, :c170, :c171, :c172, :c173, :c174, :c175, :c176, :c177, :c178, :c179, :c180, :c181, :c182, :c183, :c184, :c185, :c186, :c187, :c188, :c189, :c190, :c191, :c192, :c193, :c194, :c195, :c196, :c197, :c198, :c199, :c200, :c201, :c202, :c203, :c204, :c205, :c206, :c207, :c208, :c209, :c210, :c211, :c212, :c213, :c214, :c215, :c216, :c217, :c218, :c219, :c220, :c221, :c222, :c223, :c224, :c225, :c226, :c227, :c228, :c229, :c230, :c231, :c232, :c233, :c234, :c235, :c236, :c237, :c238, :c239, :c240, :c241, :c242, :c243, :c244, :c245, :c246, :c247, :c248, :c249, :c250, :c251, :c252, :c253, :c254, :c255, :c256, :c257, :c258, :c259, :c260, :c261, :c262, :c263, :c264, :c265, :c266, :c267, :c268, :c269, :c270, :c271, :c272, :c273, :c274, :c275, :c276, :c277, :c278, :c279, :c280, :c281, :c282, :c283, :c284, :c285, :c286, :c287, :c288, :c289, :c290, :c291, :c292, :c293, :c294, :c295, :c296, :c297, :c298, :c299, :c300, :c301, :c302, :c303, :c304, :c305, :c306, :c307, :c308, :c309, :c310, :c311, :c312, :c313, :c314, :c315, :c316, :c317, :c318, :c319, :c320, :c321, :c322, :c323, :c324, :c325, :c326, :c327, :c328, :c329, :c330, :c331, :c332, :c333, :c334, :c335, :c336, :c337, :c338, :c339, :c340, :c341, :c342, :c343, :c344, :c345, :c346, :c347, :c348, :c349, :c350, :c351, :c352, :c353, :c354, :c355, :c356, :c357, :c358, :c359, :c360, :c361, :c362, :c363, :c364, :c365, :c366, :c367, :c368, :c369, :c370, :c371, :c372, :c373, :c374, :c375, :c376, :c377, :c378, :c379, :c380, :c381, :c382, :c383, :c384, :c385, :c386, :c387, :c388, :c389, :c390, :c391, :c392, :c393, :c394, :c395, :c396, :c397, :c398, :c399, :c400, :c401, :c402, :c403, :c404, :c405, :c406, :c407, :c408, :c409, :c410, :c411, :c412, :c413, :c414, :c415, :c416, :c417, :c418, :c419, :c420, :c421, :c422, :c423, :c424, :c425, :c426, :c427, :c428, :c429, :c430, :c431, :c432, :c433, :c434, :c435, :c436, :c437, :c438, :c439, :c440, :c441, :c442, :c443, :c444, :c445, :c446, :c447, :c448, :c449, :c450, :c451, :c452, :c453, :c454, :c455, :c456, :c457, :c458, :c459, :c460, :c461, :c462, :c463, :c464, :c465, :c466, :c467, :c468, :c469, :c470, :c471, :c472, :c473, :c474, :c475, :c476, :c477, :c478, :c479, :c480, :c481, :c482, :c483, :c484, :c485, :c486, :c487, :c488, :c489, :c490, :c491, :c492, :c493, :c494, :c495, :c496, :c497, :c498, :c499, :c500, :c501, :c502, :c503, :c504, :c505, :c506, :c507, :c508, :c509, :c510, :c511, :c512, :c513, :c514, :c515, :c516, :c517, :c518, :c519, :c520, :c521, :c522, :c523, :c524, :c525, :c526, :c527, :c528, :c529, :c530, :c531, :c532, :c533, :c534, :c535, :c536, :c537, :c538, :c539, :c540, :c541, :c542, :c543, :c544, :c545, :c546, :c547, :c548, :c549, :c550, :c551, :c552, :c553, :c554, :c555, :c556, :c557, :c558, :c559, :c560, :c561, :c562, :c563, :c564, :c565, :c566, :c567, :c568, :c569, :c570, :c571, :c572, :c573, :c574, :c575, :c576, :c577, :c578, :c579, :c580, :c581, :c582, :c583, :c584, :c585, :c586, :c587, :c588, :c589, :c590, :c591, :c592, :c593, :c594, :c595, :c596, :c597, :c598, :c599, :c600, :c601, :c602, :c603, :c604, :c605, :c606, :c607, :c608, :c609, :c610, :c611, :c612, :c613, :c614, :c615, :c616, :c617, :c618, :c619, :c620, :c621, :c622, :c623, :c624, :c625, :c626, :c627, :c628, :c629, :c630, :c631, :c632, :c633, :c634, :c635, :c636, :c637, :c638, :c639, :c640, :c641, :c642, :c643, :c644, :c645, :c646, :c647, :c648, :c649, :c650, :c651, :c652, :c653, :c654, :c655, :c656, :c657, :c658, :c659, :c660, :c661, :c662, :c663, :c664, :c665, :c666, :c667, :c668, :c669, :c670, :c671, :c672, :c673, :c674, :c675, :c676, :c677, :c678, :c679, :c680, :c681, :c682, :c683, :c684, :c685, :c686, :c687, :c688, :c689, :c690, :c691, :c692, :c693, :c694, :c695, :c696, :c697, :c698, :c699, :c700, :c701, :c702, :c703, :c704, :c705, :c706, :c707, :c708, :c709, :c710, :c711, :c712, :c713, :c714, :c715, :c716, :c717, :c718, :c719, :c720, :c721, :c722, :c723, :c724, :c725, :c726, :c727, :c728, :c729, :c730, :c731, :c732, :c733, :c734, :c735, :c736, :c737, :c738, :c739, :c740, :c741, :c742, :c743, :c744, :c745, :c746, :c747, :c748, :c749, :c750, :c751, :c752, :c753, :c754, :c755, :c756, :c757, :c758, :c759, :c760, :c761, :c762, :c763, :c764, :c765, :c766, :c767, :c768, :c769, :c770, :c771, :c772, :c773, :c774, :c775, :c776, :c777, :c778, :c779, :c780, :c781, :c782, :c783, :c784, :c785, :c786, :c787, :c788, :c789, :c790, :c791, :c792, :c793, :c794, :c795, :c796, :c797, :c798, :c799, :c800, :c801, :c802, :c803, :c804, :c805, :c806, :c807, :c808, :c809, :c810, :c811, :c812, :c813, :c814, :c815, :c816, :c817, :c818, :c819, :c820, :c821, :c822, :c823, :c824, :c825, :c826, :c827, :c828, :c829, :c830, :c831, :c832, :c833, :c834, :c835, :c836, :c837, :c838, :c839, :c840, :c841, :c842, :c843, :c844, :c845, :c846, :c847, :c848, :c849, :c850, :c851, :c852, :c853, :c854, :c855, :c856, :c857, :c858, :c859, :c860, :c861, :c862, :c863, :c864, :c865, :c866, :c867, :c868, :c869, :c870, :c871, :c872, :c873, :c874, :c875, :c876, :c877, :c878, :c879, :c880, :c881, :c882, :c883, :c884, :c885, :c886, :c887, :c888, :c889, :c890, :c891, :c892, :c893, :c894, :c895, :c896, :c897, :c898, :c899, :c900, :c901, :c902, :c903, :c904, :c905, :c906, :c907, :c908, :c909, :c910, :c911, :c912, :c913, :c914, :c915, :c916, :c917, :c918, :c919, :c920, :c921, :c922, :c923, :c924, :c925, :c926, :c927, :c928, :c929, :c930, :c931, :c932, :c933, :c934, :c935, :c936, :c937, :c938, :c939, :c940, :c941, :c942, :c943, :c944, :c945, :c946, :c947, :c948, :c949, :c950, :c951, :c952, :c953, :c954, :c955, :c956, :c957, :c958, :c959, :c960, :c961, :c962, :c963, :c964, :c965, :c966, :c967, :c968, :c969, :c970, :c971, :c972, :c973, :c974, :c975, :c976, :c977, :c978, :c979, :c980, :c981, :c982, :c983, :c984, :c985, :c986, :c987, :c988, :c989, :c990, :c991, :c992, :c993, :c994, :c995, :c996, :c997, :c998, :c999, :c1000, :c1001, :c1002, :c1003, :c1004, :c1005, :c1006, :c1007, :c1008, :c1009, :c1010, :c1011, :c1012, :c1013, :c1014, :c1015, :c1016, :c1017, :c1018, :c1019, :c1020, :c1021, :c1022, :c1023, :c1024, :c1025, :c1026, :c1027, :c1028, :c1029, :c1030, :c1031, :c1032, :c1033, :c1034, :c1035, :c1036, :c1037, :c1038, :c1039, :c1040, :c1041, :c1042, :c1043, :c1044, :c1045, :c1046, :c1047, :c1048, :c1049, :c1050, :c1051, :c1052, :c1053, :c1054, :c1055, :c1056, :c1057, :c1058, :c1059, :c1060, :c1061, :c1062, :c1063, :c1064, :c1065, :c1066, :c1067, :c1068, :c1069, :c1070, :c1071, :c1072, :c1073, :c1074, :c1075, :c1076, :c1077, :c1078, :c1079, :c1080, :c1081, :c1082, :c1083, :c1084, :c1085, :c1086, :c1087, :c1088, :c1089, :c1090, :c1091, :c1092, :c1093, :c1094, :c1095, :c1096, :c1097, :c1098, :c1099, :c1100, :c1101, :c1102, :c1103, :c1104, :c1105, :c1106, :c1107, :c1108, :c1109, :c1110, :c1111, :c1112, :c1113, :c1114, :c1115, :c1116, :c1117, :c1118, :c1119, :c1120, :c1121, :c1122, :c1123, :c1124, :c1125, :c1126, :c1127, :c1128, :c1129, :c1130, :c1131, :c1132, :c1133, :c1134, :c1135, :c1136, :c1137, :c1138, :c1139, :c1140, :c1141, :c1142, :c1143, :c1144, :c1145, :c1146, :c1147, :c1148, :c1149, :c1150, :c1151, :c1152, :c1153, :c1154, :c1155, :c1156, :c1157, :c1158, :c1159, :c1160, :c1161, :c1162, :c1163, :c1164, :c1165, :c1166, :c1167, :c1168, :c1169, :c1170, :c1171, :c1172, :c1173, :c1174, :c1175, :c1176, :c1177, :c1178, :c1179, :c1180, :c1181, :c1182, :c1183, :c1184, :c1185, :c1186, :c1187, :c1188, :c1189, :c1190, :c1191, :c1192, :c1193, :c1194, :c1195, :c1196, :c1197, :c1198, :c1199, :c1200, :c1201, :c1202, :c1203, :c1204, :c1205, :c1206, :c1207, :c1208, :c1209, :c1210, :c1211, :c1212, :c1213, :c1214, :c1215, :c1216, :c1217, :c1218, :c1219, :c1220, :c1221, :c1222, :c1223, :c1224, :c1225, :c1226, :c1227, :c1228, :c1229, :c1230, :c1231, :c1232, :c1233, :c1234, :c1235, :c1236, :c1237, :c1238, :c1239, :c1240, :c1241, :c1242, :c1243, :c1244, :c1245, :c1246, :c1247, :c1248, :c1249, :c1250, :c1251, :c1252, :c1253, :c1254, :c1255, :c1256, :c1257, :c1258, :c1259, :c1260, :c1261, :c1262, :c1263, :c1264, :c1265, :c1266, :c1267, :c1268, :c1269, :c1270, :c1271, :c1272, :c1273, :c1274, :c1275, :c1276, :c1277, :c1278, :c1279, :c1280, :c1281, :c1282, :c1283, :c1284, :c1285, :c1286, :c1287, :c1288, :c1289, :c1290, :c1291, :c1292, :c1293, :c1294, :c1295, :c1296, :c1297, :c1298, :c1299, :c1300, :c1301, :c1302, :c1303, :c1304, :c1305, :c1306, :c1307, :c1308, :c1309, :c1310, :c1311, :c1312, :c1313, :c1314, :c1315, :c1316, :c1317, :c1318, :c1319, :c1320, :c1321, :c1322, :c1323, :c1324, :c1325, :c1326, :c1327, :c1328, :c1329, :c1330, :c1331, :c1332, :c1333, :c1334, :c1335, :c1336, :c1337, :c1338, :c1339, :c1340, :c1341, :c1342, :c1343, :c1344, :c1345, :c1346, :c1347, :c1348, :c1349, :c1350, :c1351, :c1352, :c1353, :c1354, :c1355, :c1356, :c1357, :c1358, :c1359, :c1360, :c1361, :c1362, :c1363, :c1364, :c1365, :c1366, :c1367, :c1368, :c1369, :c1370, :c1371, :c1372, :c1373, :c1374, :c1375, :c1376, :c1377, :c1378, :c1379, :c1380, :c1381, :c1382, :c1383, :c1384, :c1385, :c1386, :c1387, :c1388, :c1389, :c1390, :c1391, :c1392, :c1393, :c1394, :c1395, :c1396, :c1397, :c1398, :c1399, :c1400, :c1401, :c1402, :c1403, :c1404, :c1405, :c1406, :c1407, :c1408, :c1409, :c1410, :c1411, :c1412, :c1413, :c1414, :c1415, :c1416, :c1417, :c1418, :c1419, :c1420, :c1421, :c1422, :c1423, :c1424, :c1425, :c1426, :c1427, :c1428, :c1429, :c1430, :c1431, :c1432, :c1433, :c1434, :c1435, :c1436, :c1437, :c1438, :c1439, :c1440, :c1441, :c1442, :c1443, :c1444, :c1445, :c1446, :c1447, :c1448, :c1449, :c1450, :c1451, :c1452, :c1453, :c1454, :c1455, :c1456, :c1457, :c1458, :c1459, :c1460, :c1461, :c1462, :c1463, :c1464, :c1465, :c1466, :c1467, :c1468, :c1469, :c1470, :c1471, :c1472, :c1473, :c1474, :c1475, :c1476, :c1477, :c1478, :c1479, :c1480, :c1481, :c1482, :c1483, :c1484, :c1485, :c1486, :c1487, :c1488, :c1489, :c1490, :c1491, :c1492, :c1493, :c1494, :c1495, :c1496, :c1497, :c1498, :c1499, :c1500, :c1501, :c1502, :c1503, :c1504, :c1505, :c1506, :c1507, :c1508, :c1509, :c1510, :c1511, :c1512, :c1513, :c1514, :c1515, :c1516, :c1517, :c1518, :c1519, :c1520, :c1521, :c1522, :c1523, :c1524, :c1525, :c1526, :c1527, :c1528, :c1529, :c1530, :c1531, :c1532, :c1533, :c1534, :c1535, :c1536, :c1537, :c1538, :c1539, :c1540, :c1541, :c1542, :c1543, :c1544, :c1545, :c1546, :c1547, :c1548, :c1549, :c1550, :c1551, :c1552, :c1553, :c1554, :c1555, :c1556, :c1557, :c1558, :c1559, :c1560, :c1561, :c1562, :c1563, :c1564, :c1565, :c1566, :c1567, :c1568, :c1569, :c1570, :c1571, :c1572, :c1573, :c1574, :c1575, :c1576, :c1577, :c1578, :c1579, :c1580, :c1581, :c1582, :c1583, :c1584, :c1585, :c1586, :c1587, :c1588, :c1589, :c1590, :c1591, :c1592, :c1593, :c1594, :c1595, :c1596, :c1597, :c1598, :c1599, :c1600, :c1601, :c1602, :c1603, :c1604, :c1605, :c1606, :c1607, :c1608, :c1609, :c1610, :c1611, :c1612, :c1613, :c1614, :c1615, :c1616, :c1617, :c1618, :c1619, :c1620, :c1621, :c1622, :c1623, :c1624, :c1625, :c1626, :c1627, :c1628, :c1629, :c1630, :c1631, :c1632, :c1633, :c1634, :c1635, :c1636, :c1637, :c1638, :c1639, :c1640, :c1641, :c1642, :c1643, :c1644, :c1645, :c1646, :c1647, :c1648, :c1649, :c1650, :c1651, :c1652, :c1653, :c1654, :c1655, :c1656, :c1657, :c1658, :c1659, :c1660, :c1661, :c1662, :c1663, :c1664, :c1665, :c1666, :c1667, :c1668, :c1669, :c1670, :c1671, :c1672, :c1673, :c1674, :c1675, :c1676, :c1677, :c1678, :c1679, :c1680, :c1681, :c1682, :c1683, :c1684, :c1685, :c1686, :c1687, :c1688, :c1689, :c1690, :c1691, :c1692, :c1693, :c1694, :c1695, :c1696, :c1697, :c1698, :c1699, :c1700, :c1701, :c1702, :c1703, :c1704, :c1705, :c1706, :c1707, :c1708, :c1709, :c1710, :c1711, :c1712, :c1713, :c1714, :c1715, :c1716, :c1717, :c1718, :c1719, :c1720, :c1721, :c1722, :c1723, :c1724, :c1725, :c1726, :c1727, :c1728, :c1729, :c1730, :c1731, :c1732, :c1733, :c1734, :c1735, :c1736, :c1737, :c1738, :c1739, :c1740, :c1741, :c1742, :c1743, :c1744, :c1745, :c1746, :c1747, :c1748, :c1749, :c1750, :c1751, :c1752, :c1753, :c1754, :c1755, :c1756, :c1757, :c1758, :c1759, :c1760, :c1761, :c1762, :c1763, :c1764, :c1765, :c1766, :c1767, :c1768, :c1769, :c1770, :c1771, :c1772, :c1773, :c1774, :c1775, :c1776, :c1777, :c1778, :c1779, :c1780, :c1781, :c1782, :c1783, :c1784, :c1785, :c1786, :c1787, :c1788, :c1789, :c1790, :c1791, :c1792, :c1793, :c1794, :c1795, :c1796, :c1797, :c1798, :c1799, :c1800, :c1801, :c1802, :c1803, :c1804, :c1805, :c1806, :c1807, :c1808, :c1809, :c1810, :c1811, :c1812, :c1813, :c1814, :c1815, :c1816, :c1817, :c1818, :c1819, :c1820, :c1821, :c1822, :c1823, :c1824, :c1825, :c1826, :c1827, :c1828, :c1829, :c1830, :c1831, :c1832, :c1833, :c1834, :c1835, :c1836, :c1837, :c1838, :c1839, :c1840, :c1841, :c1842, :c1843, :c1844, :c1845, :c1846, :c1847, :c1848, :c1849, :c1850, :c1851, :c1852, :c1853, :c1854, :c1855, :c1856, :c1857, :c1858, :c1859, :c1860, :c1861, :c1862, :c1863, :c1864, :c1865, :c1866, :c1867, :c1868, :c1869, :c1870, :c1871, :c1872, :c1873, :c1874, :c1875, :c1876, :c1877, :c1878, :c1879, :c1880, :c1881, :c1882, :c1883, :c1884, :c1885, :c1886, :c1887, :c1888, :c1889, :c1890, :c1891, :c1892, :c1893, :c1894, :c1895, :c1896, :c1897, :c1898, :c1899, :c1900, :c1901, :c1902, :c1903, :c1904, :c1905, :c1906, :c1907, :c1908, :c1909, :c1910, :c1911, :c1912, :c1913, :c1914, :c1915, :c1916, :c1917, :c1918, :c1919, :c1920, :c1921, :c1922, :c1923, :c1924, :c1925, :c1926, :c1927, :c1928, :c1929, :c1930, :c1931, :c1932, :c1933, :c1934, :c1935, :c1936, :c1937, :c1938, :c1939, :c1940, :c1941, :c1942, :c1943, :c1944, :c1945, :c1946, :c1947, :c1948, :c1949, :c1950, :c1951, :c1952, :c1953, :c1954, :c1955, :c1956, :c1957, :c1958, :c1959, :c1960, :c1961, :c1962, :c1963, :c1964, :c1965, :c1966, :c1967, :c1968, :c1969, :c1970, :c1971, :c1972, :c1973, :c1974, :c1975, :c1976, :c1977, :c1978, :c1979, :c1980, :c1981, :c1982, :c1983, :c1984, :c1985, :c1986, :c1987, :c1988, :c1989, :c1990, :c1991, :c1992, :c1993, :c1994, :c1995, :c1996, :c1997, :c1998, :c1999, :c2000, :c2001, :c2002, :c2003, :c2004, :c2005, :c2006, :c2007, :c2008, :c2009, :c2010, :c2011, :c2012, :c2013, :c2014, :c2015, :c2016, :c2017, :c2018, :c2019, :c2020, :c2021, :c2022, :c2023, :c2024, :c2025, :c2026, :c2027, :c2028, :c2029, :c2030, :c2031, :c2032, :c2033, :c2034, :c2035, :c2036, :c2037, :c2038, :c2039, :c2040, :c2041, :c2042, :c2043, :c2044, :c2045, :c2046, :c2047, :c2048, :c2049, :c2050, :c2051, :c2052, :c2053, :c2054, :c2055, :c2056, :c2057, :c2058, :c2059, :c2060, :c2061, :c2062, :c2063, :c2064, :c2065, :c2066, :c2067, :c2068, :c2069, :c2070, :c2071, :c2072, :c2073, :c2074, :c2075, :c2076, :c2077, :c2078, :c2079, :c2080, :c2081, :c2082, :c2083, :c2084, :c2085, :c2086, :c2087, :c2088, :c2089, :c2090, :c2091, :c2092, :c2093, :c2094, :c2095, :c2096, :c2097, :c2098, :c2099, :c2100, :c2101, :c2102, :c2103, :c2104, :c2105, :c2106, :c2107, :c2108, :c2109, :c2110, :c2111, :c2112, :c2113, :c2114, :c2115, :c2116, :c2117, :c2118, :c2119, :c2120, :c2121, :c2122, :c2123, :c2124, :c2125, :c2126, :c2127, :c2128, :c2129, :c2130, :c2131, :c2132, :c2133, :c2134, :c2135, :c2136, :c2137, :c2138, :c2139, :c2140, :c2141, :c2142, :c2143, :c2144, :c2145, :c2146, :c2147, :c2148, :c2149, :c2150, :c2151, :c2152, :c2153, :c2154, :c2155, :c2156, :c2157, :c2158, :c2159, :c2160, :c2161, :c2162, :c2163, :c2164, :c2165, :c2166, :c2167, :c2168, :c2169, :c2170, :c2171, :c2172, :c2173, :c2174, :c2175, :c2176, :c2177, :c2178, :c2179, :c2180, :c2181, :c2182, :c2183, :c2184, :c2185, :c2186, :c2187, :c2188, :c2189, :c2190, :c2191, :c2192, :c2193, :c2194, :c2195, :c2196, :c2197, :c2198, :c2199, :c2200, :c2201, :c2202, :c2203, :c2204, :c2205, :c2206, :c2207, :c2208, :c2209, :c2210, :c2211, :c2212, :c2213, :c2214, :c2215, :c2216, :c2217, :c2218, :c2219, :c2220, :c2221, :c2222, :c2223, :c2224, :c2225, :c2226, :c2227, :c2228, :c2229, :c2230, :c2231, :c2232, :c2233, :c2234, :c2235, :c2236, :c2237, :c2238, :c2239, :c2240, :c2241, :c2242, :c2243, :c2244, :c2245, :c2246, :c2247, :c2248, :c2249, :c2250, :c2251, :c2252, :c2253, :c2254, :c2255, :c2256, :c2257, :c2258, :c2259, :c2260, :c2261, :c2262, :c2263, :c2264, :c2265, :c2266, :c2267, :c2268, :c2269, :c2270, :c2271, :c2272, :c2273, :c2274, :c2275, :c2276, :c2277, :c2278, :c2279, :c2280, :c2281, :c2282, :c2283, :c2284, :c2285, :c2286, :c2287, :c2288, :c2289, :c2290, :c2291, :c2292, :c2293, :c2294, :c2295, :c2296, :c2297, :c2298, :c2299, :c2300, :c2301, :c2302, :c2303, :c2304, :c2305, :c2306, :c2307, :c2308, :c2309, :c2310, :c2311, :c2312, :c2313, :c2314, :c2315, :c2316, :c2317, :c2318, :c2319, :c2320, :c2321, :c2322, :c2323, :c2324, :c2325, :c2326, :c2327, :c2328, :c2329, :c2330, :c2331, :c2332, :c2333, :c2334, :c2335, :c2336, :c2337, :c2338, :c2339, :c2340, :c2341, :c2342, :c2343, :c2344, :c2345, :c2346, :c2347, :c2348, :c2349, :c2350, :c2351, :c2352, :c2353, :c2354, :c2355, :c2356, :c2357, :c2358, :c2359, :c2360, :c2361, :c2362, :c2363, :c2364, :c2365, :c2366, :c2367, :c2368, :c2369, :c2370, :c2371, :c2372, :c2373, :c2374, :c2375, :c2376, :c2377, :c2378, :c2379, :c2380, :c2381, :c2382, :c2383, :c2384, :c2385, :c2386, :c2387, :c2388, :c2389, :c2390, :c2391, :c2392, :c2393, :c2394, :c2395, :c2396, :c2397, :c2398, :c2399, :c2400, :c2401, :c2402, :c2403, :c2404, :c2405, :c2406, :c2407, :c2408, :c2409, :c2410, :c2411, :c2412, :c2413, :c2414, :c2415, :c2416, :c2417, :c2418, :c2419, :c2420, :c2421, :c2422, :c2423, :c2424, :c2425, :c2426, :c2427, :c2428, :c2429, :c2430, :c2431, :c2432, :c2433, :c2434, :c2435, :c2436, :c2437, :c2438, :c2439, :c2440, :c2441, :c2442, :c2443, :c2444, :c2445, :c2446, :c2447, :c2448, :c2449, :c2450, :c2451, :c2452, :c2453, :c2454, :c2455, :c2456, :c2457, :c2458, :c2459, :c2460, :c2461, :c2462, :c2463, :c2464, :c2465, :c2466, :c2467, :c2468, :c2469, :c2470, :c2471, :c2472, :c2473, :c2474, :c2475, :c2476, :c2477, :c2478, :c2479, :c2480, :c2481, :c2482, :c2483, :c2484, :c2485, :c2486, :c2487, :c2488, :c2489, :c2490, :c2491, :c2492, :c2493, :c2494, :c2495, :c2496, :c2497, :c2498, :c2499, :c2500, :c2501, :c2502, :c2503, :c2504, :c2505, :c2506, :c2507, :c2508, :c2509, :c2510, :c2511, :c2512, :c2513, :c2514, :c2515, :c2516, :c2517, :c2518, :c2519, :c2520, :c2521, :c2522, :c2523, :c2524, :c2525, :c2526, :c2527, :c2528, :c2529, :c2530, :c2531, :c2532, :c2533, :c2534, :c2535, :c2536, :c2537, :c2538, :c2539, :c2540, :c2541, :c2542, :c2543, :c2544, :c2545, :c2546, :c2547, :c2548, :c2549, :c2550, :c2551, :c2552, :c2553, :c2554, :c2555, :c2556, :c2557, :c2558, :c2559, :c2560, :c2561, :c2562, :c2563, :c2564, :c2565, :c2566, :c2567, :c2568, :c2569, :c2570, :c2571, :c2572, :c2573, :c2574, :c2575, :c2576, :c2577, :c2578, :c2579, :c2580, :c2581, :c2582, :c2583, :c2584, :c2585, :c2586, :c2587, :c2588, :c2589, :c2590, :c2591, :c2592, :c2593, :c2594, :c2595, :c2596, :c2597, :c2598, :c2599, :c2600, :c2601, :c2602, :c2603, :c2604, :c2605, :c2606, :c2607, :c2608, :c2609, :c2610, :c2611, :c2612, :c2613, :c2614, :c2615, :c2616, :c2617, :c2618, :c2619, :c2620, :c2621, :c2622, :c2623, :c2624, :c2625, :c2626, :c2627, :c2628, :c2629, :c2630, :c2631, :c2632, :c2633, :c2634, :c2635, :c2636, :c2637, :c2638, :c2639, :c2640, :c2641, :c2642, :c2643, :c2644, :c2645, :c2646, :c2647, :c2648, :c2649, :c2650, :c2651, :c2652, :c2653, :c2654, :c2655, :c2656, :c2657, :c2658, :c2659, :c2660, :c2661, :c2662, :c2663, :c2664, :c2665, :c2666, :c2667, :c2668, :c2669, :c2670, :c2671, :c2672, :c2673, :c2674, :c2675, :c2676, :c2677, :c2678, :c2679, :c2680, :c2681, :c2682, :c2683, :c2684, :c2685, :c2686, :c2687, :c2688, :c2689, :c2690, :c2691, :c2692, :c2693, :c2694, :c2695, :c2696, :c2697, :c2698, :c2699, :c2700, :c2701, :c2702, :c2703, :c2704, :c2705, :c2706, :c2707, :c2708, :c2709, :c2710, :c2711, :c2712, :c2713, :c2714, :c2715, :c2716, :c2717, :c2718, :c2719, :c2720, :c2721, :c2722, :c2723, :c2724, :c2725, :c2726, :c2727, :c2728, :c2729, :c2730, :c2731, :c2732, :c2733, :c2734, :c2735, :c2736, :c2737, :c2738, :c2739, :c2740, :c2741, :c2742, :c2743, :c2744, :c2745, :c2746, :c2747, :c2748, :c2749, :c2750, :c2751, :c2752, :c2753, :c2754, :c2755, :c2756, :c2757, :c2758, :c2759, :c2760, :c2761, :c2762, :c2763, :c2764, :c2765, :c2766, :c2767, :c2768, :c2769, :c2770, :c2771, :c2772, :c2773, :c2774, :c2775, :c2776, :c2777, :c2778, :c2779, :c2780, :c2781, :c2782, :c2783, :c2784, :c2785, :c2786, :c2787, :c2788, :c2789, :c2790, :c2791, :c2792, :c2793, :c2794, :c2795, :c2796, :c2797, :c2798, :c2799, :c2800, :c2801, :c2802, :c2803, :c2804, :c2805, :c2806, :c2807, :c2808, :c2809, :c2810, :c2811, :c2812, :c2813, :c2814, :c2815, :c2816, :c2817, :c2818, :c2819, :c2820, :c2821, :c2822, :c2823, :c2824, :c2825, :c2826, :c2827, :c2828, :c2829, :c2830, :c2831, :c2832, :c2833, :c2834, :c2835, :c2836, :c2837, :c2838, :c2839, :c2840, :c2841, :c2842, :c2843, :c2844, :c2845, :c2846, :c2847, :c2848, :c2849, :c2850, :c2851, :c2852, :c2853, :c2854, :c2855, :c2856, :c2857, :c2858, :c2859, :c2860, :c2861, :c2862, :c2863, :c2864, :c2865, :c2866, :c2867, :c2868, :c2869, :c2870, :c2871, :c2872, :c2873, :c2874, :c2875, :c2876, :c2877, :c2878, :c2879, :c2880, :c2881, :c2882, :c2883, :c2884, :c2885, :c2886, :c2887, :c2888, :c2889, :c2890, :c2891, :c2892, :c2893, :c2894, :c2895, :c2896, :c2897, :c2898, :c2899, :c2900, :c2901, :c2902, :c2903, :c2904, :c2905, :c2906, :c2907, :c2908, :c2909, :c2910, :c2911, :c2912, :c2913, :c2914, :c2915, :c2916, :c2917, :c2918, :c2919, :c2920, :c2921, :c2922, :c2923, :c2924, :c2925, :c2926, :c2927, :c2928, :c2929, :c2930, :c2931, :c2932, :c2933, :c2934, :c2935, :c2936, :c2937, :c2938, :c2939, :c2940, :c2941, :c2942, :c2943, :c2944, :c2945, :c2946, :c2947, :c2948, :c2949, :c2950, :c2951, :c2952, :c2953, :c2954, :c2955, :c2956, :c2957, :c2958, :c2959, :c2960, :c2961, :c2962, :c2963, :c2964, :c2965, :c2966, :c2967, :c2968, :c2969, :c2970, :c2971, :c2972, :c2973, :c2974, :c2975, :c2976, :c2977, :c2978, :c2979, :c2980, :c2981, :c2982, :c2983, :c2984, :c2985, :c2986, :c2987, :c2988, :c2989, :c2990, :c2991, :c2992, :c2993, :c2994, :c2995, :c2996, :c2997, :c2998, :c2999, :c3000, :c3001, :c3002, :c3003, :c3004, :c3005, :c3006, :c3007, :c3008, :c3009, :c3010, :c3011, :c3012, :c3013, :c3014, :c3015, :c3016, :c3017, :c3018, :c3019, :c3020, :c3021, :c3022, :c3023, :c3024, :c3025, :c3026, :c3027, :c3028, :c3029, :c3030, :c3031, :c3032, :c3033, :c3034, :c3035, :c3036, :c3037, :c3038, :c3039, :c3040, :c3041, :c3042, :c3043, :c3044, :c3045, :c3046, :c3047, :c3048, :c3049, :c3050, :c3051, :c3052, :c3053, :c3054, :c3055, :c3056, :c3057, :c3058, :c3059, :c3060, :c3061, :c3062, :c3063, :c3064, :c3065, :c3066, :c3067, :c3068, :c3069, :c3070, :c3071, :c3072, :c3073, :c3074, :c3075, :c3076, :c3077, :c3078, :c3079, :c3080, :c3081, :c3082, :c3083, :c3084, :c3085, :c3086, :c3087, :c3088, :c3089, :c3090, :c3091, :c3092, :c3093, :c3094, :c3095, :c3096, :c3097, :c3098, :c3099, :c3100, :c3101, :c3102, :c3103, :c3104, :c3105, :c3106, :c3107, :c3108, :c3109, :c3110, :c3111, :c3112, :c3113, :c3114, :c3115, :c3116, :c3117, :c3118, :c3119, :c3120, :c3121, :c3122, :c3123, :c3124, :c3125, :c3126, :c3127, :c3128, :c3129, :c3130, :c3131, :c3132, :c3133, :c3134, :c3135, :c3136, :c3137, :c3138, :c3139, :c3140, :c3141, :c3142, :c3143, :c3144, :c3145, :c3146, :c3147, :c3148, :c3149, :c3150, :c3151, :c3152, :c3153, :c3154, :c3155, :c3156, :c3157, :c3158, :c3159, :c3160, :c3161, :c3162, :c3163, :c3164, :c3165, :c3166, :c3167, :c3168, :c3169, :c3170, :c3171, :c3172, :c3173, :c3174, :c3175, :c3176, :c3177, :c3178, :c3179, :c3180, :c3181, :c3182, :c3183, :c3184, :c3185, :c3186, :c3187, :c3188, :c3189, :c3190, :c3191, :c3192, :c3193, :c3194, :c3195, :c3196, :c3197, :c3198, :c3199, :c3200, :c3201, :c3202, :c3203, :c3204, :c3205, :c3206, :c3207, :c3208, :c3209, :c3210, :c3211, :c3212, :c3213, :c3214, :c3215, :c3216, :c3217, :c3218, :c3219, :c3220, :c3221, :c3222, :c3223, :c3224, :c3225, :c3226, :c3227, :c3228, :c3229, :c3230, :c3231, :c3232, :c3233, :c3234, :c3235, :c3236, :c3237, :c3238, :c3239, :c3240, :c3241, :c3242, :c3243, :c3244, :c3245, :c3246, :c3247, :c3248, :c3249, :c3250, :c3251, :c3252, :c3253, :c3254, :c3255, :c3256, :c3257, :c3258, :c3259, :c3260, :c3261, :c3262, :c3263, :c3264, :c3265, :c3266, :c3267, :c3268, :c3269, :c3270, :c3271, :c3272, :c3273, :c3274, :c3275, :c3276, :c3277, :c3278, :c3279, :c3280, :c3281, :c3282, :c3283, :c3284, :c3285, :c3286, :c3287, :c3288, :c3289, :c3290, :c3291, :c3292, :c3293, :c3294, :c3295, :c3296, :c3297, :c3298, :c3299, :c3300, :c3301, :c3302, :c3303, :c3304, :c3305, :c3306, :c3307, :c3308, :c3309, :c3310, :c3311, :c3312, :c3313, :c3314, :c3315, :c3316, :c3317, :c3318, :c3319, :c3320, :c3321, :c3322, :c3323, :c3324, :c3325, :c3326, :c3327, :c3328, :c3329, :c3330, :c3331, :c3332, :c3333, :c3334, :c3335, :c3336, :c3337, :c3338, :c3339, :c3340, :c3341, :c3342, :c3343, :c3344, :c3345, :c3346, :c3347, :c3348, :c3349, :c3350, :c3351, :c3352, :c3353, :c3354, :c3355, :c3356, :c3357, :c3358, :c3359, :c3360, :c3361, :c3362, :c3363, :c3364, :c3365, :c3366, :c3367, :c3368, :c3369, :c3370, :c3371, :c3372, :c3373, :c3374, :c3375, :c3376, :c3377, :c3378, :c3379, :c3380, :c3381, :c3382, :c3383, :c3384, :c3385, :c3386, :c3387, :c3388, :c3389, :c3390, :c3391, :c3392, :c3393, :c3394, :c3395, :c3396, :c3397, :c3398, :c3399, :c3400, :c3401, :c3402, :c3403, :c3404, :c3405, :c3406, :c3407, :c3408, :c3409, :c3410, :c3411, :c3412, :c3413, :c3414, :c3415, :c3416, :c3417, :c3418, :c3419, :c3420, :c3421, :c3422, :c3423, :c3424, :c3425, :c3426, :c3427, :c3428, :c3429, :c3430, :c3431, :c3432, :c3433, :c3434, :c3435, :c3436, :c3437, :c3438, :c3439, :c3440, :c3441, :c3442, :c3443, :c3444, :c3445, :c3446, :c3447, :c3448, :c3449, :c3450, :c3451, :c3452, :c3453, :c3454, :c3455, :c3456, :c3457, :c3458, :c3459, :c3460, :c3461, :c3462, :c3463, :c3464, :c3465, :c3466, :c3467, :c3468, :c3469, :c3470, :c3471, :c3472, :c3473, :c3474, :c3475, :c3476, :c3477, :c3478, :c3479, :c3480, :c3481, :c3482, :c3483, :c3484, :c3485, :c3486, :c3487, :c3488, :c3489, :c3490, :c3491, :c3492, :c3493, :c3494, :c3495, :c3496, :c3497, :c3498, :c3499, :c3500, :c3501, :c3502, :c3503, :c3504, :c3505, :c3506, :c3507, :c3508, :c3509, :c3510, :c3511, :c3512, :c3513, :c3514, :c3515, :c3516, :c3517, :c3518, :c3519, :c3520, :c3521, :c3522, :c3523, :c3524, :c3525, :c3526, :c3527, :c3528, :c3529, :c3530, :c3531, :c3532, :c3533, :c3534, :c3535, :c3536, :c3537, :c3538, :c3539, :c3540, :c3541, :c3542, :c3543, :c3544, :c3545, :c3546, :c3547, :c3548, :c3549, :c3550, :c3551, :c3552, :c3553, :c3554, :c3555, :c3556, :c3557, :c3558, :c3559, :c3560, :c3561, :c3562, :c3563, :c3564, :c3565, :c3566, :c3567, :c3568, :c3569, :c3570, :c3571, :c3572, :c3573, :c3574, :c3575, :c3576, :c3577, :c3578, :c3579, :c3580, :c3581, :c3582, :c3583, :c3584, :c3585, :c3586, :c3587, :c3588, :c3589, :c3590, :c3591, :c3592, :c3593, :c3594, :c3595, :c3596, :c3597, :c3598, :c3599, :c3600, :c3601, :c3602, :c3603, :c3604, :c3605, :c3606, :c3607, :c3608, :c3609, :c3610, :c3611, :c3612, :c3613, :c3614, :c3615, :c3616, :c3617, :c3618, :c3619, :c3620, :c3621, :c3622, :c3623, :c3624, :c3625, :c3626, :c3627, :c3628, :c3629, :c3630, :c3631, :c3632, :c3633, :c3634, :c3635, :c3636, :c3637, :c3638, :c3639, :c3640, :c3641, :c3642, :c3643, :c3644, :c3645, :c3646, :c3647, :c3648, :c3649, :c3650, :c3651, :c3652, :c3653, :c3654, :c3655, :c3656, :c3657, :c3658, :c3659, :c3660, :c3661, :c3662, :c3663, :c3664, :c3665, :c3666, :c3667, :c3668, :c3669, :c3670, :c3671, :c3672, :c3673, :c3674, :c3675, :c3676, :c3677, :c3678, :c3679, :c3680, :c3681, :c3682, :c3683, :c3684, :c3685, :c3686, :c3687, :c3688, :c3689, :c3690, :c3691, :c3692, :c3693, :c3694, :c3695, :c3696, :c3697, :c3698, :c3699, :c3700, :c3701, :c3702, :c3703, :c3704, :c3705, :c3706, :c3707, :c3708, :c3709, :c3710, :c3711, :c3712, :c3713, :c3714, :c3715, :c3716, :c3717, :c3718, :c3719, :c3720, :c3721, :c3722, :c3723, :c3724, :c3725, :c3726, :c3727, :c3728, :c3729, :c3730, :c3731, :c3732, :c3733, :c3734, :c3735, :c3736, :c3737, :c3738, :c3739, :c3740, :c3741, :c3742, :c3743, :c3744, :c3745, :c3746, :c3747, :c3748, :c3749, :c3750, :c3751, :c3752, :c3753, :c3754, :c3755, :c3756, :c3757, :c3758, :c3759, :c3760, :c3761, :c3762, :c3763, :c3764, :c3765, :c3766, :c3767, :c3768, :c3769, :c3770, :c3771, :c3772, :c3773, :c3774, :c3775, :c3776, :c3777, :c3778, :c3779, :c3780, :c3781, :c3782, :c3783, :c3784, :c3785, :c3786, :c3787, :c3788, :c3789, :c3790, :c3791, :c3792, :c3793, :c3794, :c3795, :c3796, :c3797, :c3798, :c3799, :c3800, :c3801, :c3802, :c3803, :c3804, :c3805, :c3806, :c3807, :c3808, :c3809, :c3810, :c3811, :c3812, :c3813, :c3814, :c3815, :c3816, :c3817, :c3818, :c3819, :c3820, :c3821, :c3822, :c3823, :c3824, :c3825, :c3826, :c3827, :c3828, :c3829, :c3830, :c3831, :c3832, :c3833, :c3834, :c3835, :c3836, :c3837, :c3838, :c3839, :c3840, :c3841, :c3842, :c3843, :c3844, :c3845, :c3846, :c3847, :c3848, :c3849, :c3850, :c3851, :c3852, :c3853, :c3854, :c3855, :c3856, :c3857, :c3858, :c3859, :c3860, :c3861, :c3862, :c3863, :c3864, :c3865, :c3866, :c3867, :c3868, :c3869, :c3870, :c3871, :c3872, :c3873, :c3874, :c3875, :c3876, :c3877, :c3878, :c3879, :c3880, :c3881, :c3882, :c3883, :c3884, :c3885, :c3886, :c3887, :c3888, :c3889, :c3890, :c3891, :c3892, :c3893, :c3894, :c3895, :c3896, :c3897, :c3898, :c3899, :c3900, :c3901, :c3902, :c3903, :c3904, :c3905, :c3906, :c3907, :c3908, :c3909, :c3910, :c3911, :c3912, :c3913, :c3914, :c3915, :c3916, :c3917, :c3918, :c3919, :c3920, :c3921, :c3922, :c3923, :c3924, :c3925, :c3926, :c3927, :c3928, :c3929, :c3930, :c3931, :c3932, :c3933, :c3934, :c3935, :c3936, :c3937, :c3938, :c3939, :c3940, :c3941, :c3942, :c3943, :c3944, :c3945, :c3946, :c3947, :c3948, :c3949, :c3950, :c3951, :c3952, :c3953, :c3954, :c3955, :c3956, :c3957, :c3958, :c3959, :c3960, :c3961, :c3962, :c3963, :c3964, :c3965, :c3966, :c3967, :c3968, :c3969, :c3970, :c3971, :c3972, :c3973, :c3974, :c3975, :c3976, :c3977, :c3978, :c3979, :c3980, :c3981, :c3982, :c3983, :c3984, :c3985, :c3986, :c3987, :c3988, :c3989, :c3990, :c3991, :c3992, :c3993, :c3994, :c3995, :c3996, :c3997, :c3998, :c3999, :c4000, :c4001, :c4002, :c4003, :c4004, :c4005, :c4006, :c4007, :c4008, :c4009, :c4010, :c4011, :c4012, :c4013, :c4014, :c4015, :c4016, :c4017, :c4018, :c4019, :c4020, :c4021, :c4022, :c4023, :c4024, :c4025, :c4026, :c4027, :c4028, :c4029, :c4030, :c4031, :c4032, :c4033, :c4034, :c4035, :c4036, :c4037, :c4038, :c4039, :c4040, :c4041, :c4042, :c4043, :c4044, :c4045, :c4046, :c4047, :c4048, :c4049, :c4050, :c4051, :c4052, :c4053, :c4054, :c4055, :c4056, :c4057, :c4058, :c4059, :c4060, :c4061, :c4062, :c4063, :c4064, :c4065, :c4066, :c4067, :c4068, :c4069, :c4070, :c4071, :c4072, :c4073, :c4074, :c4075, :c4076, :c4077, :c4078, :c4079, :c4080, :c4081, :c4082, :c4083, :c4084, :c4085, :c4086, :c4087, :c4088, :c4089, :c4090, :c4091, :c4092, :c4093, :c4094, :c4095, :c4096, :c4097, :c4098, :c4099, :c4100, :c4101, :c4102, :c4103, :c4104, :c4105, :c4106, :c4107, :c4108, :c4109, :c4110, :c4111, :c4112, :c4113, :c4114, :c4115, :c4116, :c4117, :c4118, :c4119, :c4120, :c4121, :c4122, :c4123, :c4124, :c4125, :c4126, :c4127, :c4128, :c4129, :c4130, :c4131, :c4132, :c4133, :c4134, :c4135, :c4136, :c4137, :c4138, :c4139, :c4140, :c4141, :c4142, :c4143, :c4144, :c4145, :c4146, :c4147, :c4148, :c4149, :c4150, :c4151, :c4152, :c4153, :c4154, :c4155, :c4156, :c4157, :c4158, :c4159, :c4160, :c4161, :c4162, :c4163, :c4164, :c4165, :c4166, :c4167, :c4168, :c4169, :c4170, :c4171, :c4172, :c4173, :c4174, :c4175, :c4176, :c4177, :c4178, :c4179, :c4180, :c4181, :c4182, :c4183, :c4184, :c4185, :c4186, :c4187, :c4188, :c4189, :c4190, :c4191, :c4192, :c4193, :c4194, :c4195, :c4196, :c4197, :c4198, :c4199, :c4200, :c4201, :c4202, :c4203, :c4204, :c4205, :c4206, :c4207, :c4208, :c4209, :c4210, :c4211, :c4212, :c4213, :c4214, :c4215, :c4216, :c4217, :c4218, :c4219, :c4220, :c4221, :c4222, :c4223, :c4224, :c4225, :c4226, :c4227, :c4228, :c4229, :c4230, :c4231, :c4232, :c4233, :c4234, :c4235, :c4236, :c4237, :c4238, :c4239, :c4240, :c4241, :c4242, :c4243, :c4244, :c4245, :c4246, :c4247, :c4248, :c4249, :c4250, :c4251, :c4252, :c4253, :c4254, :c4255, :c4256, :c4257, :c4258, :c4259, :c4260, :c4261, :c4262, :c4263, :c4264, :c4265, :c4266, :c4267, :c4268, :c4269, :c4270, :c4271, :c4272, :c4273, :c4274, :c4275, :c4276, :c4277, :c4278, :c4279, :c4280, :c4281, :c4282, :c4283, :c4284, :c4285, :c4286, :c4287, :c4288, :c4289, :c4290, :c4291, :c4292, :c4293, :c4294, :c4295, :c4296, :c4297, :c4298, :c4299, :c4300, :c4301, :c4302, :c4303, :c4304, :c4305, :c4306, :c4307, :c4308, :c4309, :c4310, :c4311, :c4312, :c4313, :c4314, :c4315, :c4316, :c4317, :c4318, :c4319, :c4320, :c4321, :c4322, :c4323, :c4324, :c4325, :c4326, :c4327, :c4328, :c4329, :c4330, :c4331, :c4332, :c4333, :c4334, :c4335, :c4336, :c4337, :c4338, :c4339, :c4340, :c4341, :c4342, :c4343, :c4344, :c4345, :c4346, :c4347, :c4348, :c4349, :c4350, :c4351, :c4352, :c4353, :c4354, :c4355, :c4356, :c4357, :c4358, :c4359, :c4360, :c4361, :c4362, :c4363, :c4364, :c4365, :c4366, :c4367, :c4368, :c4369, :c4370, :c4371, :c4372, :c4373, :c4374, :c4375, :c4376, :c4377, :c4378, :c4379, :c4380, :c4381, :c4382, :c4383, :c4384, :c4385, :c4386, :c4387, :c4388, :c4389, :c4390, :c4391, :c4392, :c4393, :c4394, :c4395, :c4396, :c4397, :c4398, :c4399, :c4400, :c4401, :c4402, :c4403, :c4404, :c4405, :c4406, :c4407, :c4408, :c4409, :c4410, :c4411, :c4412, :c4413, :c4414, :c4415, :c4416, :c4417, :c4418, :c4419, :c4420, :c4421, :c4422, :c4423, :c4424, :c4425, :c4426, :c4427, :c4428, :c4429, :c4430, :c4431, :c4432, :c4433, :c4434, :c4435, :c4436, :c4437, :c4438, :c4439, :c4440, :c4441, :c4442, :c4443, :c4444, :c4445, :c4446, :c4447, :c4448, :c4449, :c4450, :c4451, :c4452, :c4453, :c4454, :c4455, :c4456, :c4457, :c4458, :c4459, :c4460, :c4461, :c4462, :c4463, :c4464, :c4465, :c4466, :c4467, :c4468, :c4469, :c4470, :c4471, :c4472, :c4473, :c4474, :c4475, :c4476, :c4477, :c4478, :c4479, :c4480, :c4481, :c4482, :c4483, :c4484, :c4485, :c4486, :c4487, :c4488, :c4489, :c4490, :c4491, :c4492, :c4493, :c4494, :c4495, :c4496, :c4497, :c4498, :c4499, :c4500, :c4501, :c4502, :c4503, :c4504, :c4505, :c4506, :c4507, :c4508, :c4509, :c4510, :c4511, :c4512, :c4513, :c4514, :c4515, :c4516, :c4517, :c4518, :c4519, :c4520, :c4521, :c4522, :c4523, :c4524, :c4525, :c4526, :c4527, :c4528, :c4529, :c4530, :c4531, :c4532, :c4533, :c4534, :c4535, :c4536, :c4537, :c4538, :c4539, :c4540, :c4541, :c4542, :c4543, :c4544, :c4545, :c4546, :c4547, :c4548, :c4549, :c4550, :c4551, :c4552, :c4553, :c4554, :c4555, :c4556, :c4557, :c4558, :c4559, :c4560, :c4561, :c4562, :c4563, :c4564, :c4565, :c4566, :c4567, :c4568, :c4569, :c4570, :c4571, :c4572, :c4573, :c4574, :c4575, :c4576, :c4577, :c4578, :c4579, :c4580, :c4581, :c4582, :c4583, :c4584, :c4585, :c4586, :c4587, :c4588, :c4589, :c4590, :c4591, :c4592, :c4593, :c4594, :c4595, :c4596, :c4597, :c4598, :c4599, :c4600, :c4601, :c4602, :c4603, :c4604, :c4605, :c4606, :c4607, :c4608, :c4609, :c4610, :c4611, :c4612, :c4613, :c4614, :c4615, :c4616, :c4617, :c4618, :c4619, :c4620, :c4621, :c4622, :c4623, :c4624, :c4625, :c4626, :c4627, :c4628, :c4629, :c4630, :c4631, :c4632, :c4633, :c4634, :c4635, :c4636, :c4637, :c4638, :c4639, :c4640, :c4641, :c4642, :c4643, :c4644, :c4645, :c4646, :c4647, :c4648, :c4649, :c4650, :c4651, :c4652, :c4653, :c4654, :c4655, :c4656, :c4657, :c4658, :c4659, :c4660, :c4661, :c4662, :c4663, :c4664, :c4665, :c4666, :c4667, :c4668, :c4669, :c4670, :c4671, :c4672, :c4673, :c4674, :c4675, :c4676, :c4677, :c4678, :c4679, :c4680, :c4681, :c4682, :c4683, :c4684, :c4685, :c4686, :c4687, :c4688, :c4689, :c4690, :c4691, :c4692, :c4693, :c4694, :c4695, :c4696, :c4697, :c4698, :c4699, :c4700, :c4701, :c4702, :c4703, :c4704, :c4705, :c4706, :c4707, :c4708, :c4709, :c4710, :c4711, :c4712, :c4713, :c4714, :c4715, :c4716, :c4717, :c4718, :c4719, :c4720, :c4721, :c4722, :c4723, :c4724, :c4725, :c4726, :c4727, :c4728, :c4729, :c4730, :c4731, :c4732, :c4733, :c4734, :c4735, :c4736, :c4737, :c4738, :c4739, :c4740, :c4741, :c4742, :c4743, :c4744, :c4745, :c4746, :c4747, :c4748, :c4749, :c4750, :c4751, :c4752, :c4753, :c4754, :c4755, :c4756, :c4757, :c4758, :c4759, :c4760, :c4761, :c4762, :c4763, :c4764, :c4765, :c4766, :c4767, :c4768, :c4769, :c4770, :c4771, :c4772, :c4773, :c4774, :c4775, :c4776, :c4777, :c4778, :c4779, :c4780, :c4781, :c4782, :c4783, :c4784, :c4785, :c4786, :c4787, :c4788, :c4789, :c4790, :c4791, :c4792, :c4793, :c4794, :c4795, :c4796, :c4797, :c4798, :c4799, :c4800, :c4801, :c4802, :c4803, :c4804, :c4805, :c4806, :c4807, :c4808, :c4809, :c4810, :c4811, :c4812, :c4813, :c4814, :c4815, :c4816, :c4817, :c4818, :c4819, :c4820, :c4821, :c4822, :c4823, :c4824, :c4825, :c4826, :c4827, :c4828, :c4829, :c4830, :c4831, :c4832, :c4833, :c4834, :c4835, :c4836, :c4837, :c4838, :c4839, :c4840, :c4841, :c4842, :c4843, :c4844, :c4845, :c4846, :c4847, :c4848, :c4849, :c4850, :c4851, :c4852, :c4853, :c4854, :c4855, :c4856, :c4857, :c4858, :c4859, :c4860, :c4861, :c4862, :c4863, :c4864, :c4865, :c4866, :c4867, :c4868, :c4869, :c4870, :c4871, :c4872, :c4873, :c4874, :c4875, :c4876, :c4877, :c4878, :c4879, :c4880, :c4881, :c4882, :c4883, :c4884, :c4885, :c4886, :c4887, :c4888, :c4889, :c4890, :c4891, :c4892, :c4893, :c4894, :c4895, :c4896, :c4897, :c4898, :c4899, :c4900, :c4901, :c4902, :c4903, :c4904, :c4905, :c4906, :c4907, :c4908, :c4909, :c4910, :c4911, :c4912, :c4913, :c4914, :c4915, :c4916, :c4917, :c4918, :c4919, :c4920, :c4921, :c4922, :c4923, :c4924, :c4925, :c4926, :c4927, :c4928, :c4929, :c4930, :c4931, :c4932, :c4933, :c4934, :c4935, :c4936, :c4937, :c4938, :c4939, :c4940, :c4941, :c4942, :c4943, :c4944, :c4945, :c4946, :c4947, :c4948, :c4949, :c4950, :c4951, :c4952, :c4953, :c4954, :c4955, :c4956, :c4957, :c4958, :c4959, :c4960, :c4961, :c4962, :c4963, :c4964, :c4965, :c4966, :c4967, :c4968, :c4969, :c4970, :c4971, :c4972, :c4973, :c4974, :c4975, :c4976, :c4977, :c4978, :c4979, :c4980, :c4981, :c4982, :c4983, :c4984, :c4985, :c4986, :c4987, :c4988, :c4989, :c4990, :c4991, :c4992, :c4993, :c4994, :c4995, :c4996, :c4997, :c4998, :c4999, :c5000, :c5001, :c5002, :c5003, :c5004, :c5005, :c5006, :c5007, :c5008, :c5009, :c5010, :c5011, :c5012, :c5013, :c5014, :c5015, :c5016, :c5017, :c5018, :c5019, :c5020, :c5021, :c5022, :c5023, :c5024, :c5025, :c5026, :c5027, :c5028, :c5029, :c5030, :c5031, :c5032, :c5033, :c5034, :c5035, :c5036, :c5037, :c5038, :c5039, :c5040, :c5041, :c5042, :c5043, :c5044, :c5045, :c5046, :c5047, :c5048, :c5049, :c5050, :c5051, :c5052, :c5053, :c5054, :c5055, :c5056, :c5057, :c5058, :c5059, :c5060, :c5061, :c5062, :c5063, :c5064, :c5065, :c5066, :c5067, :c5068, :c5069, :c5070, :c5071, :c5072, :c5073, :c5074, :c5075, :c5076, :c5077, :c5078, :c5079, :c5080, :c5081, :c5082, :c5083, :c5084, :c5085, :c5086, :c5087, :c5088, :c5089, :c5090, :c5091, :c5092, :c5093, :c5094, :c5095, :c5096, :c5097, :c5098, :c5099, :c5100, :c5101, :c5102, :c5103, :c5104, :c5105, :c5106, :c5107, :c5108, :c5109, :c5110, :c5111, :c5112, :c5113, :c5114, :c5115, :c5116, :c5117, :c5118, :c5119, :c5120, :c5121, :c5122, :c5123, :c5124, :c5125, :c5126, :c5127, :c5128, :c5129, :c5130, :c5131, :c5132, :c5133, :c5134, :c5135, :c5136, :c5137, :c5138, :c5139, :c5140, :c5141, :c5142, :c5143, :c5144, :c5145, :c5146, :c5147, :c5148, :c5149, :c5150, :c5151, :c5152, :c5153, :c5154, :c5155, :c5156, :c5157, :c5158, :c5159, :c5160, :c5161, :c5162, :c5163, :c5164, :c5165, :c5166, :c5167, :c5168, :c5169, :c5170, :c5171, :c5172, :c5173, :c5174, :c5175, :c5176, :c5177, :c5178, :c5179, :c5180, :c5181, :c5182, :c5183, :c5184, :c5185, :c5186, :c5187, :c5188, :c5189, :c5190, :c5191, :c5192, :c5193, :c5194, :c5195, :c5196, :c5197, :c5198, :c5199, :c5200, :c5201, :c5202, :c5203, :c5204, :c5205, :c5206, :c5207, :c5208, :c5209, :c5210, :c5211, :c5212, :c5213, :c5214, :c5215, :c5216, :c5217, :c5218, :c5219, :c5220, :c5221, :c5222, :c5223, :c5224, :c5225, :c5226, :c5227, :c5228, :c5229, :c5230, :c5231, :c5232, :c5233, :c5234, :c5235, :c5236, :c5237, :c5238, :c5239, :c5240, :c5241, :c5242, :c5243, :c5244, :c5245, :c5246, :c5247, :c5248, :c5249, :c5250, :c5251, :c5252, :c5253, :c5254, :c5255, :c5256, :c5257, :c5258, :c5259, :c5260, :c5261, :c5262, :c5263, :c5264, :c5265, :c5266, :c5267, :c5268, :c5269, :c5270, :c5271, :c5272, :c5273, :c5274, :c5275, :c5276, :c5277, :c5278, :c5279, :c5280, :c5281, :c5282, :c5283, :c5284, :c5285, :c5286, :c5287, :c5288, :c5289, :c5290, :c5291, :c5292, :c5293, :c5294, :c5295, :c5296, :c5297, :c5298, :c5299, :c5300, :c5301, :c5302, :c5303, :c5304, :c5305, :c5306, :c5307, :c5308, :c5309, :c5310, :c5311, :c5312, :c5313, :c5314, :c5315, :c5316, :c5317, :c5318, :c5319, :c5320, :c5321, :c5322, :c5323, :c5324, :c5325, :c5326, :c5327, :c5328, :c5329, :c5330, :c5331, :c5332, :c5333, :c5334, :c5335, :c5336, :c5337, :c5338, :c5339, :c5340, :c5341, :c5342, :c5343, :c5344, :c5345, :c5346, :c5347, :c5348, :c5349, :c5350, :c5351, :c5352, :c5353, :c5354, :c5355, :c5356, :c5357, :c5358, :c5359, :c5360, :c5361, :c5362, :c5363, :c5364, :c5365, :c5366, :c5367, :c5368, :c5369, :c5370, :c5371, :c5372, :c5373, :c5374, :c5375, :c5376, :c5377, :c5378, :c5379, :c5380, :c5381, :c5382, :c5383, :c5384, :c5385, :c5386, :c5387, :c5388, :c5389, :c5390, :c5391, :c5392, :c5393, :c5394, :c5395, :c5396, :c5397, :c5398, :c5399, :c5400, :c5401, :c5402, :c5403, :c5404, :c5405, :c5406, :c5407, :c5408, :c5409, :c5410, :c5411, :c5412, :c5413, :c5414, :c5415, :c5416, :c5417, :c5418, :c5419, :c5420, :c5421, :c5422, :c5423, :c5424, :c5425, :c5426, :c5427, :c5428, :c5429, :c5430, :c5431, :c5432, :c5433, :c5434, :c5435, :c5436, :c5437, :c5438, :c5439, :c5440, :c5441, :c5442, :c5443, :c5444, :c5445, :c5446, :c5447, :c5448, :c5449, :c5450, :c5451, :c5452, :c5453, :c5454, :c5455, :c5456, :c5457, :c5458, :c5459, :c5460, :c5461, :c5462, :c5463, :c5464, :c5465, :c5466, :c5467, :c5468, :c5469, :c5470, :c5471, :c5472, :c5473, :c5474, :c5475, :c5476, :c5477, :c5478, :c5479, :c5480, :c5481, :c5482, :c5483, :c5484, :c5485, :c5486, :c5487, :c5488, :c5489, :c5490, :c5491, :c5492, :c5493, :c5494, :c5495, :c5496, :c5497, :c5498, :c5499, :c5500, :c5501, :c5502, :c5503, :c5504, :c5505, :c5506, :c5507, :c5508, :c5509, :c5510, :c5511, :c5512, :c5513, :c5514, :c5515, :c5516, :c5517, :c5518, :c5519, :c5520, :c5521, :c5522, :c5523, :c5524, :c5525, :c5526, :c5527, :c5528, :c5529, :c5530, :c5531, :c5532, :c5533, :c5534, :c5535, :c5536, :c5537, :c5538, :c5539, :c5540, :c5541, :c5542, :c5543, :c5544, :c5545, :c5546, :c5547, :c5548, :c5549, :c5550, :c5551, :c5552, :c5553, :c5554, :c5555, :c5556, :c5557, :c5558, :c5559, :c5560, :c5561, :c5562, :c5563, :c5564, :c5565, :c5566, :c5567, :c5568, :c5569, :c5570, :c5571, :c5572, :c5573, :c5574, :c5575, :c5576, :c5577, :c5578, :c5579, :c5580, :c5581, :c5582, :c5583, :c5584, :c5585, :c5586, :c5587, :c5588, :c5589, :c5590, :c5591, :c5592, :c5593, :c5594, :c5595, :c5596, :c5597, :c5598, :c5599, :c5600, :c5601, :c5602, :c5603, :c5604, :c5605, :c5606, :c5607, :c5608, :c5609, :c5610, :c5611, :c5612, :c5613, :c5614, :c5615, :c5616, :c5617, :c5618, :c5619, :c5620, :c5621, :c5622, :c5623, :c5624, :c5625, :c5626, :c5627, :c5628, :c5629, :c5630, :c5631, :c5632, :c5633, :c5634, :c5635, :c5636, :c5637, :c5638, :c5639, :c5640, :c5641, :c5642, :c5643, :c5644, :c5645, :c5646, :c5647, :c5648, :c5649, :c5650, :c5651, :c5652, :c5653, :c5654, :c5655, :c5656, :c5657, :c5658, :c5659, :c5660, :c5661, :c5662, :c5663, :c5664, :c5665, :c5666, :c5667, :c5668, :c5669, :c5670, :c5671, :c5672, :c5673, :c5674, :c5675, :c5676, :c5677, :c5678, :c5679, :c5680, :c5681, :c5682, :c5683, :c5684, :c5685, :c5686, :c5687, :c5688, :c5689, :c5690, :c5691, :c5692, :c5693, :c5694, :c5695, :c5696, :c5697, :c5698, :c5699, :c5700, :c5701, :c5702, :c5703, :c5704, :c5705, :c5706, :c5707, :c5708, :c5709, :c5710, :c5711, :c5712, :c5713, :c5714, :c5715, :c5716, :c5717, :c5718, :c5719, :c5720, :c5721, :c5722, :c5723, :c5724, :c5725, :c5726, :c5727, :c5728, :c5729, :c5730, :c5731, :c5732, :c5733, :c5734, :c5735, :c5736, :c5737, :c5738, :c5739, :c5740, :c5741, :c5742, :c5743, :c5744, :c5745, :c5746, :c5747, :c5748, :c5749, :c5750, :c5751, :c5752, :c5753, :c5754, :c5755, :c5756, :c5757, :c5758, :c5759, :c5760, :c5761, :c5762, :c5763, :c5764, :c5765, :c5766, :c5767, :c5768, :c5769, :c5770, :c5771, :c5772, :c5773, :c5774, :c5775, :c5776, :c5777, :c5778, :c5779, :c5780, :c5781, :c5782, :c5783, :c5784, :c5785, :c5786, :c5787, :c5788, :c5789, :c5790, :c5791, :c5792, :c5793, :c5794, :c5795, :c5796, :c5797, :c5798, :c5799, :c5800, :c5801, :c5802, :c5803, :c5804, :c5805, :c5806, :c5807, :c5808, :c5809, :c5810, :c5811, :c5812, :c5813, :c5814, :c5815, :c5816, :c5817, :c5818, :c5819, :c5820, :c5821, :c5822, :c5823, :c5824, :c5825, :c5826, :c5827, :c5828, :c5829, :c5830, :c5831, :c5832, :c5833, :c5834, :c5835, :c5836, :c5837, :c5838, :c5839, :c5840, :c5841, :c5842, :c5843, :c5844, :c5845, :c5846, :c5847, :c5848, :c5849, :c5850, :c5851, :c5852, :c5853, :c5854, :c5855, :c5856, :c5857, :c5858, :c5859, :c5860, :c5861, :c5862, :c5863, :c5864, :c5865, :c5866, :c5867, :c5868, :c5869, :c5870, :c5871, :c5872, :c5873, :c5874, :c5875, :c5876, :c5877, :c5878, :c5879, :c5880, :c5881, :c5882, :c5883, :c5884, :c5885, :c5886, :c5887, :c5888, :c5889, :c5890, :c5891, :c5892, :c5893, :c5894, :c5895, :c5896, :c5897, :c5898, :c5899, :c5900, :c5901, :c5902, :c5903, :c5904, :c5905, :c5906, :c5907, :c5908, :c5909, :c5910, :c5911, :c5912, :c5913, :c5914, :c5915, :c5916, :c5917, :c5918, :c5919, :c5920, :c5921, :c5922, :c5923, :c5924, :c5925, :c5926, :c5927, :c5928, :c5929, :c5930, :c5931, :c5932, :c5933, :c5934, :c5935, :c5936, :c5937, :c5938, :c5939, :c5940, :c5941, :c5942, :c5943, :c5944, :c5945, :c5946, :c5947, :c5948, :c5949, :c5950, :c5951, :c5952, :c5953, :c5954, :c5955, :c5956, :c5957, :c5958, :c5959, :c5960, :c5961, :c5962, :c5963, :c5964, :c5965, :c5966, :c5967, :c5968, :c5969, :c5970, :c5971, :c5972, :c5973, :c5974, :c5975, :c5976, :c5977, :c5978, :c5979, :c5980, :c5981, :c5982, :c5983, :c5984, :c5985, :c5986, :c5987, :c5988, :c5989, :c5990, :c5991, :c5992, :c5993, :c5994, :c5995, :c5996, :c5997, :c5998, :c5999, :c6000, :c6001, :c6002, :c6003, :c6004, :c6005, :c6006, :c6007, :c6008, :c6009, :c6010, :c6011, :c6012, :c6013, :c6014, :c6015, :c6016, :c6017, :c6018, :c6019, :c6020, :c6021, :c6022, :c6023, :c6024, :c6025, :c6026, :c6027, :c6028, :c6029, :c6030, :c6031, :c6032, :c6033, :c6034, :c6035, :c6036, :c6037, :c6038, :c6039, :c6040, :c6041, :c6042, :c6043, :c6044, :c6045, :c6046, :c6047, :c6048, :c6049, :c6050, :c6051, :c6052, :c6053, :c6054, :c6055, :c6056, :c6057, :c6058, :c6059, :c6060, :c6061, :c6062, :c6063, :c6064, :c6065, :c6066, :c6067, :c6068, :c6069, :c6070, :c6071, :c6072, :c6073, :c6074, :c6075, :c6076, :c6077, :c6078, :c6079, :c6080, :c6081, :c6082, :c6083, :c6084, :c6085, :c6086, :c6087, :c6088, :c6089, :c6090, :c6091, :c6092, :c6093, :c6094, :c6095, :c6096, :c6097, :c6098, :c6099, :c6100, :c6101, :c6102, :c6103, :c6104, :c6105, :c6106, :c6107, :c6108, :c6109, :c6110, :c6111, :c6112, :c6113, :c6114, :c6115, :c6116, :c6117, :c6118, :c6119, :c6120, :c6121, :c6122, :c6123, :c6124, :c6125, :c6126, :c6127, :c6128, :c6129, :c6130, :c6131, :c6132, :c6133, :c6134, :c6135, :c6136, :c6137, :c6138, :c6139, :c6140, :c6141, :c6142, :c6143, :c6144, :c6145, :c6146, :c6147, :c6148, :c6149, :c6150, :c6151, :c6152, :c6153, :c6154, :c6155, :c6156, :c6157, :c6158, :c6159, :c6160, :c6161, :c6162, :c6163, :c6164, :c6165, :c6166, :c6167, :c6168, :c6169, :c6170, :c6171, :c6172, :c6173, :c6174, :c6175, :c6176, :c6177, :c6178, :c6179, :c6180, :c6181, :c6182, :c6183, :c6184, :c6185, :c6186, :c6187, :c6188, :c6189, :c6190, :c6191, :c6192, :c6193, :c6194, :c6195, :c6196, :c6197, :c6198, :c6199, :c6200, :c6201, :c6202, :c6203, :c6204, :c6205, :c6206, :c6207, :c6208, :c6209, :c6210, :c6211, :c6212, :c6213, :c6214, :c6215, :c6216, :c6217, :c6218, :c6219, :c6220, :c6221, :c6222, :c6223, :c6224, :c6225, :c6226, :c6227, :c6228, :c6229, :c6230, :c6231, :c6232, :c6233, :c6234, :c6235, :c6236, :c6237, :c6238, :c6239, :c6240, :c6241, :c6242, :c6243, :c6244, :c6245, :c6246, :c6247, :c6248, :c6249, :c6250, :c6251, :c6252, :c6253, :c6254, :c6255, :c6256, :c6257, :c6258, :c6259, :c6260, :c6261, :c6262, :c6263, :c6264, :c6265, :c6266, :c6267, :c6268, :c6269, :c6270, :c6271, :c6272, :c6273, :c6274, :c6275, :c6276, :c6277, :c6278, :c6279, :c6280, :c6281, :c6282, :c6283, :c6284, :c6285, :c6286, :c6287, :c6288, :c6289, :c6290, :c6291, :c6292, :c6293, :c6294, :c6295, :c6296, :c6297, :c6298, :c6299, :c6300, :c6301, :c6302, :c6303, :c6304, :c6305, :c6306, :c6307, :c6308, :c6309, :c6310, :c6311, :c6312, :c6313, :c6314, :c6315, :c6316, :c6317, :c6318, :c6319, :c6320, :c6321, :c6322, :c6323, :c6324, :c6325, :c6326, :c6327, :c6328, :c6329, :c6330, :c6331, :c6332, :c6333, :c6334, :c6335, :c6336, :c6337, :c6338, :c6339, :c6340, :c6341, :c6342, :c6343, :c6344, :c6345, :c6346, :c6347, :c6348, :c6349, :c6350, :c6351, :c6352, :c6353, :c6354, :c6355, :c6356, :c6357, :c6358, :c6359, :c6360, :c6361, :c6362, :c6363, :c6364, :c6365, :c6366, :c6367, :c6368, :c6369, :c6370, :c6371, :c6372, :c6373, :c6374, :c6375, :c6376, :c6377, :c6378, :c6379, :c6380, :c6381, :c6382, :c6383, :c6384, :c6385, :c6386, :c6387, :c6388, :c6389, :c6390, :c6391, :c6392, :c6393, :c6394, :c6395, :c6396, :c6397, :c6398, :c6399, :c6400, :c6401, :c6402, :c6403, :c6404, :c6405, :c6406, :c6407, :c6408, :c6409, :c6410, :c6411, :c6412, :c6413, :c6414, :c6415, :c6416, :c6417, :c6418, :c6419, :c6420, :c6421, :c6422, :c6423, :c6424, :c6425, :c6426, :c6427, :c6428, :c6429, :c6430, :c6431, :c6432, :c6433, :c6434, :c6435, :c6436, :c6437, :c6438, :c6439, :c6440, :c6441, :c6442, :c6443, :c6444, :c6445, :c6446, :c6447, :c6448, :c6449, :c6450, :c6451, :c6452, :c6453, :c6454, :c6455, :c6456, :c6457, :c6458, :c6459, :c6460, :c6461, :c6462, :c6463, :c6464, :c6465, :c6466, :c6467, :c6468, :c6469, :c6470, :c6471, :c6472, :c6473, :c6474, :c6475, :c6476, :c6477, :c6478, :c6479, :c6480, :c6481, :c6482, :c6483, :c6484, :c6485, :c6486, :c6487, :c6488, :c6489, :c6490, :c6491, :c6492, :c6493, :c6494, :c6495, :c6496, :c6497, :c6498, :c6499, :c6500, :c6501, :c6502, :c6503, :c6504, :c6505, :c6506, :c6507, :c6508, :c6509, :c6510, :c6511, :c6512, :c6513, :c6514, :c6515, :c6516, :c6517, :c6518, :c6519, :c6520, :c6521, :c6522, :c6523, :c6524, :c6525, :c6526, :c6527, :c6528, :c6529, :c6530, :c6531, :c6532, :c6533, :c6534, :c6535, :c6536, :c6537, :c6538, :c6539, :c6540, :c6541, :c6542, :c6543, :c6544, :c6545, :c6546, :c6547, :c6548, :c6549, :c6550, :c6551, :c6552, :c6553, :c6554, :c6555, :c6556, :c6557, :c6558, :c6559, :c6560, :c6561, :c6562, :c6563, :c6564, :c6565, :c6566, :c6567, :c6568, :c6569, :c6570, :c6571, :c6572, :c6573, :c6574, :c6575, :c6576, :c6577, :c6578, :c6579, :c6580, :c6581, :c6582, :c6583, :c6584, :c6585, :c6586, :c6587, :c6588, :c6589, :c6590, :c6591, :c6592, :c6593, :c6594, :c6595, :c6596, :c6597, :c6598, :c6599, :c6600, :c6601, :c6602, :c6603, :c6604, :c6605, :c6606, :c6607, :c6608, :c6609, :c6610, :c6611, :c6612, :c6613, :c6614, :c6615, :c6616, :c6617, :c6618, :c6619, :c6620, :c6621, :c6622, :c6623, :c6624, :c6625, :c6626, :c6627, :c6628, :c6629, :c6630, :c6631, :c6632, :c6633, :c6634, :c6635, :c6636, :c6637, :c6638, :c6639, :c6640, :c6641, :c6642, :c6643, :c6644, :c6645, :c6646, :c6647, :c6648, :c6649, :c6650, :c6651, :c6652, :c6653, :c6654, :c6655, :c6656, :c6657, :c6658, :c6659, :c6660, :c6661, :c6662, :c6663, :c6664, :c6665, :c6666, :c6667, :c6668, :c6669, :c6670, :c6671, :c6672, :c6673, :c6674, :c6675, :c6676, :c6677, :c6678, :c6679, :c6680, :c6681, :c6682, :c6683, :c6684, :c6685, :c6686, :c6687, :c6688, :c6689, :c6690, :c6691, :c6692, :c6693, :c6694, :c6695, :c6696, :c6697, :c6698, :c6699, :c6700, :c6701, :c6702, :c6703, :c6704, :c6705, :c6706, :c6707, :c6708, :c6709, :c6710, :c6711, :c6712, :c6713, :c6714, :c6715, :c6716, :c6717, :c6718, :c6719, :c6720, :c6721, :c6722, :c6723, :c6724, :c6725, :c6726, :c6727, :c6728, :c6729, :c6730, :c6731, :c6732, :c6733, :c6734, :c6735, :c6736, :c6737, :c6738, :c6739, :c6740, :c6741, :c6742, :c6743, :c6744, :c6745, :c6746, :c6747, :c6748, :c6749, :c6750, :c6751, :c6752, :c6753, :c6754, :c6755, :c6756, :c6757, :c6758, :c6759, :c6760, :c6761, :c6762, :c6763, :c6764, :c6765, :c6766, :c6767, :c6768, :c6769, :c6770, :c6771, :c6772, :c6773, :c6774, :c6775, :c6776, :c6777, :c6778, :c6779, :c6780, :c6781, :c6782, :c6783, :c6784, :c6785, :c6786, :c6787, :c6788, :c6789, :c6790, :c6791, :c6792, :c6793, :c6794, :c6795, :c6796, :c6797, :c6798, :c6799, :c6800, :c6801, :c6802, :c6803, :c6804, :c6805, :c6806, :c6807, :c6808, :c6809, :c6810, :c6811, :c6812, :c6813, :c6814, :c6815, :c6816, :c6817, :c6818, :c6819, :c6820, :c6821, :c6822, :c6823, :c6824, :c6825, :c6826, :c6827, :c6828, :c6829, :c6830, :c6831, :c6832, :c6833, :c6834, :c6835, :c6836, :c6837, :c6838, :c6839, :c6840, :c6841, :c6842, :c6843, :c6844, :c6845, :c6846, :c6847, :c6848, :c6849, :c6850, :c6851, :c6852, :c6853, :c6854, :c6855, :c6856, :c6857, :c6858, :c6859, :c6860, :c6861, :c6862, :c6863, :c6864, :c6865, :c6866, :c6867, :c6868, :c6869, :c6870, :c6871, :c6872, :c6873, :c6874, :c6875, :c6876, :c6877, :c6878, :c6879, :c6880, :c6881, :c6882, :c6883, :c6884, :c6885, :c6886, :c6887, :c6888, :c6889, :c6890, :c6891, :c6892, :c6893, :c6894, :c6895, :c6896, :c6897, :c6898, :c6899, :c6900, :c6901, :c6902, :c6903, :c6904, :c6905, :c6906, :c6907, :c6908, :c6909, :c6910, :c6911, :c6912, :c6913, :c6914, :c6915, :c6916, :c6917, :c6918, :c6919, :c6920, :c6921, :c6922, :c6923, :c6924, :c6925, :c6926, :c6927, :c6928, :c6929, :c6930, :c6931, :c6932, :c6933, :c6934, :c6935, :c6936, :c6937, :c6938, :c6939, :c6940, :c6941, :c6942, :c6943, :c6944, :c6945, :c6946, :c6947, :c6948, :c6949, :c6950, :c6951, :c6952, :c6953, :c6954, :c6955, :c6956, :c6957, :c6958, :c6959, :c6960, :c6961, :c6962, :c6963, :c6964, :c6965, :c6966, :c6967, :c6968, :c6969, :c6970, :c6971, :c6972, :c6973, :c6974, :c6975, :c6976, :c6977, :c6978, :c6979, :c6980, :c6981, :c6982, :c6983, :c6984, :c6985, :c6986, :c6987, :c6988, :c6989, :c6990, :c6991, :c6992, :c6993, :c6994, :c6995, :c6996, :c6997, :c6998, :c6999, :c7000, :c7001, :c7002, :c7003, :c7004, :c7005, :c7006, :c7007, :c7008, :c7009, :c7010, :c7011, :c7012, :c7013, :c7014, :c7015, :c7016, :c7017, :c7018, :c7019, :c7020, :c7021, :c7022, :c7023, :c7024, :c7025, :c7026, :c7027, :c7028, :c7029, :c7030, :c7031, :c7032, :c7033, :c7034, :c7035, :c7036, :c7037, :c7038, :c7039, :c7040, :c7041, :c7042, :c7043, :c7044, :c7045, :c7046, :c7047, :c7048, :c7049, :c7050, :c7051, :c7052, :c7053, :c7054, :c7055, :c7056, :c7057, :c7058, :c7059, :c7060, :c7061, :c7062, :c7063, :c7064, :c7065, :c7066, :c7067, :c7068, :c7069, :c7070, :c7071, :c7072, :c7073, :c7074, :c7075, :c7076, :c7077, :c7078, :c7079, :c7080, :c7081, :c7082, :c7083, :c7084, :c7085, :c7086, :c7087, :c7088, :c7089, :c7090, :c7091, :c7092, :c7093, :c7094, :c7095, :c7096, :c7097, :c7098, :c7099, :c7100, :c7101, :c7102, :c7103, :c7104, :c7105, :c7106, :c7107, :c7108, :c7109, :c7110, :c7111, :c7112, :c7113, :c7114, :c7115, :c7116, :c7117, :c7118, :c7119, :c7120, :c7121, :c7122, :c7123, :c7124, :c7125, :c7126, :c7127, :c7128, :c7129, :c7130, :c7131, :c7132, :c7133, :c7134, :c7135, :c7136, :c7137, :c7138, :c7139, :c7140, :c7141, :c7142, :c7143, :c7144, :c7145, :c7146, :c7147, :c7148, :c7149, :c7150, :c7151, :c7152, :c7153, :c7154, :c7155, :c7156, :c7157, :c7158, :c7159, :c7160, :c7161, :c7162, :c7163, :c7164, :c7165, :c7166, :c7167, :c7168, :c7169, :c7170, :c7171, :c7172, :c7173, :c7174, :c7175, :c7176, :c7177, :c7178, :c7179, :c7180, :c7181, :c7182, :c7183, :c7184, :c7185, :c7186, :c7187, :c7188, :c7189, :c7190, :c7191, :c7192, :c7193, :c7194, :c7195, :c7196, :c7197, :c7198, :c7199, :c7200, :c7201, :c7202, :c7203, :c7204, :c7205, :c7206, :c7207, :c7208, :c7209, :c7210, :c7211, :c7212, :c7213, :c7214, :c7215, :c7216, :c7217, :c7218, :c7219, :c7220, :c7221, :c7222, :c7223, :c7224, :c7225, :c7226, :c7227, :c7228, :c7229, :c7230, :c7231, :c7232, :c7233, :c7234, :c7235, :c7236, :c7237, :c7238, :c7239, :c7240, :c7241, :c7242, :c7243, :c7244, :c7245, :c7246, :c7247, :c7248, :c7249, :c7250, :c7251, :c7252, :c7253, :c7254, :c7255, :c7256, :c7257, :c7258, :c7259, :c7260, :c7261, :c7262, :c7263, :c7264, :c7265, :c7266, :c7267, :c7268, :c7269, :c7270, :c7271, :c7272, :c7273, :c7274, :c7275, :c7276, :c7277, :c7278, :c7279, :c7280, :c7281, :c7282, :c7283, :c7284, :c7285, :c7286, :c7287, :c7288, :c7289, :c7290, :c7291, :c7292, :c7293, :c7294, :c7295, :c7296, :c7297, :c7298, :c7299, :c7300, :c7301, :c7302, :c7303, :c7304, :c7305, :c7306, :c7307, :c7308, :c7309, :c7310, :c7311, :c7312, :c7313, :c7314, :c7315, :c7316, :c7317, :c7318, :c7319, :c7320, :c7321, :c7322, :c7323, :c7324, :c7325, :c7326, :c7327, :c7328, :c7329, :c7330, :c7331, :c7332, :c7333, :c7334, :c7335, :c7336, :c7337, :c7338, :c7339, :c7340, :c7341, :c7342, :c7343, :c7344, :c7345, :c7346, :c7347, :c7348, :c7349, :c7350, :c7351, :c7352, :c7353, :c7354, :c7355, :c7356, :c7357, :c7358, :c7359, :c7360, :c7361, :c7362, :c7363, :c7364, :c7365, :c7366, :c7367, :c7368, :c7369, :c7370, :c7371, :c7372, :c7373, :c7374, :c7375, :c7376, :c7377, :c7378, :c7379, :c7380, :c7381, :c7382, :c7383, :c7384, :c7385, :c7386, :c7387, :c7388, :c7389, :c7390, :c7391, :c7392, :c7393, :c7394, :c7395, :c7396, :c7397, :c7398, :c7399, :c7400, :c7401, :c7402, :c7403, :c7404, :c7405, :c7406, :c7407, :c7408, :c7409, :c7410, :c7411, :c7412, :c7413, :c7414, :c7415, :c7416, :c7417, :c7418, :c7419, :c7420, :c7421, :c7422, :c7423, :c7424, :c7425, :c7426, :c7427, :c7428, :c7429, :c7430, :c7431, :c7432, :c7433, :c7434, :c7435, :c7436, :c7437, :c7438, :c7439, :c7440, :c7441, :c7442, :c7443, :c7444, :c7445, :c7446, :c7447, :c7448, :c7449, :c7450, :c7451, :c7452, :c7453, :c7454, :c7455, :c7456, :c7457, :c7458, :c7459, :c7460, :c7461, :c7462, :c7463, :c7464, :c7465, :c7466, :c7467, :c7468, :c7469, :c7470, :c7471, :c7472, :c7473, :c7474, :c7475, :c7476, :c7477, :c7478, :c7479, :c7480, :c7481, :c7482, :c7483, :c7484, :c7485, :c7486, :c7487, :c7488, :c7489, :c7490, :c7491, :c7492, :c7493, :c7494, :c7495, :c7496, :c7497, :c7498, :c7499, :c7500, :c7501, :c7502, :c7503, :c7504, :c7505, :c7506, :c7507, :c7508, :c7509, :c7510, :c7511, :c7512, :c7513, :c7514, :c7515, :c7516, :c7517, :c7518, :c7519, :c7520, :c7521, :c7522, :c7523, :c7524, :c7525, :c7526, :c7527, :c7528, :c7529, :c7530, :c7531, :c7532, :c7533, :c7534, :c7535, :c7536, :c7537, :c7538, :c7539, :c7540, :c7541, :c7542, :c7543, :c7544, :c7545, :c7546, :c7547, :c7548, :c7549, :c7550, :c7551, :c7552, :c7553, :c7554, :c7555, :c7556, :c7557, :c7558, :c7559, :c7560, :c7561, :c7562, :c7563, :c7564, :c7565, :c7566, :c7567, :c7568, :c7569, :c7570, :c7571, :c7572, :c7573, :c7574, :c7575, :c7576, :c7577, :c7578, :c7579, :c7580, :c7581, :c7582, :c7583, :c7584, :c7585, :c7586, :c7587, :c7588, :c7589, :c7590, :c7591, :c7592, :c7593, :c7594, :c7595, :c7596, :c7597, :c7598, :c7599, :c7600, :c7601, :c7602, :c7603, :c7604, :c7605, :c7606, :c7607, :c7608, :c7609, :c7610, :c7611, :c7612, :c7613, :c7614, :c7615, :c7616, :c7617, :c7618, :c7619, :c7620, :c7621, :c7622, :c7623, :c7624, :c7625, :c7626, :c7627, :c7628, :c7629, :c7630, :c7631, :c7632, :c7633, :c7634, :c7635, :c7636, :c7637, :c7638, :c7639, :c7640, :c7641, :c7642, :c7643, :c7644, :c7645, :c7646, :c7647, :c7648, :c7649, :c7650, :c7651, :c7652, :c7653, :c7654, :c7655, :c7656, :c7657, :c7658, :c7659, :c7660, :c7661, :c7662, :c7663, :c7664, :c7665, :c7666, :c7667, :c7668, :c7669, :c7670, :c7671, :c7672, :c7673, :c7674, :c7675, :c7676, :c7677, :c7678, :c7679, :c7680, :c7681, :c7682, :c7683, :c7684, :c7685, :c7686, :c7687, :c7688, :c7689, :c7690, :c7691, :c7692, :c7693, :c7694, :c7695, :c7696, :c7697, :c7698, :c7699, :c7700, :c7701, :c7702, :c7703, :c7704, :c7705, :c7706, :c7707, :c7708, :c7709, :c7710, :c7711, :c7712, :c7713, :c7714, :c7715, :c7716, :c7717, :c7718, :c7719, :c7720, :c7721, :c7722, :c7723, :c7724, :c7725, :c7726, :c7727, :c7728, :c7729, :c7730, :c7731, :c7732, :c7733, :c7734, :c7735, :c7736, :c7737, :c7738, :c7739, :c7740, :c7741, :c7742, :c7743, :c7744, :c7745, :c7746, :c7747, :c7748, :c7749, :c7750, :c7751, :c7752, :c7753, :c7754, :c7755, :c7756, :c7757, :c7758, :c7759, :c7760, :c7761, :c7762, :c7763, :c7764, :c7765, :c7766, :c7767, :c7768, :c7769, :c7770, :c7771, :c7772, :c7773, :c7774, :c7775, :c7776, :c7777, :c7778, :c7779, :c7780, :c7781, :c7782, :c7783, :c7784, :c7785, :c7786, :c7787, :c7788, :c7789, :c7790, :c7791, :c7792, :c7793, :c7794, :c7795, :c7796, :c7797, :c7798, :c7799, :c7800, :c7801, :c7802, :c7803, :c7804, :c7805, :c7806, :c7807, :c7808, :c7809, :c7810, :c7811, :c7812, :c7813, :c7814, :c7815, :c7816, :c7817, :c7818, :c7819, :c7820, :c7821, :c7822, :c7823, :c7824, :c7825, :c7826, :c7827, :c7828, :c7829, :c7830, :c7831, :c7832, :c7833, :c7834, :c7835, :c7836, :c7837, :c7838, :c7839, :c7840, :c7841, :c7842, :c7843, :c7844, :c7845, :c7846, :c7847, :c7848, :c7849, :c7850, :c7851, :c7852, :c7853, :c7854, :c7855, :c7856, :c7857, :c7858, :c7859, :c7860, :c7861, :c7862, :c7863, :c7864, :c7865, :c7866, :c7867, :c7868, :c7869, :c7870, :c7871, :c7872, :c7873, :c7874, :c7875, :c7876, :c7877, :c7878, :c7879, :c7880, :c7881, :c7882, :c7883, :c7884, :c7885, :c7886, :c7887, :c7888, :c7889, :c7890, :c7891, :c7892, :c7893, :c7894, :c7895, :c7896, :c7897, :c7898, :c7899, :c7900, :c7901, :c7902, :c7903, :c7904, :c7905, :c7906, :c7907, :c7908, :c7909, :c7910, :c7911, :c7912, :c7913, :c7914, :c7915, :c7916, :c7917, :c7918, :c7919, :c7920, :c7921, :c7922, :c7923, :c7924, :c7925, :c7926, :c7927, :c7928, :c7929, :c7930, :c7931, :c7932, :c7933, :c7934, :c7935, :c7936, :c7937, :c7938, :c7939, :c7940, :c7941, :c7942, :c7943, :c7944, :c7945, :c7946, :c7947, :c7948, :c7949, :c7950, :c7951, :c7952, :c7953, :c7954, :c7955, :c7956, :c7957, :c7958, :c7959, :c7960, :c7961, :c7962, :c7963, :c7964, :c7965, :c7966, :c7967, :c7968, :c7969, :c7970, :c7971, :c7972, :c7973, :c7974, :c7975, :c7976, :c7977, :c7978, :c7979, :c7980, :c7981, :c7982, :c7983, :c7984, :c7985, :c7986, :c7987, :c7988, :c7989, :c7990, :c7991, :c7992, :c7993, :c7994, :c7995, :c7996, :c7997, :c7998, :c7999, :c8000, :c8001, :c8002, :c8003, :c8004, :c8005, :c8006, :c8007, :c8008, :c8009, :c8010, :c8011, :c8012, :c8013, :c8014, :c8015, :c8016, :c8017, :c8018, :c8019, :c8020, :c8021, :c8022, :c8023, :c8024, :c8025, :c8026, :c8027, :c8028, :c8029, :c8030, :c8031, :c8032, :c8033, :c8034, :c8035, :c8036, :c8037, :c8038, :c8039, :c8040, :c8041, :c8042, :c8043, :c8044, :c8045, :c8046, :c8047, :c8048, :c8049, :c8050, :c8051, :c8052, :c8053, :c8054, :c8055, :c8056, :c8057, :c8058, :c8059, :c8060, :c8061, :c8062, :c8063, :c8064, :c8065, :c8066, :c8067, :c8068, :c8069, :c8070, :c8071, :c8072, :c8073, :c8074, :c8075, :c8076, :c8077, :c8078, :c8079, :c8080, :c8081, :c8082, :c8083, :c8084, :c8085, :c8086, :c8087, :c8088, :c8089, :c8090, :c8091, :c8092, :c8093, :c8094, :c8095, :c8096, :c8097, :c8098, :c8099, :c8100, :c8101, :c8102, :c8103, :c8104, :c8105, :c8106, :c8107, :c8108, :c8109, :c8110, :c8111, :c8112, :c8113, :c8114, :c8115, :c8116, :c8117, :c8118, :c8119, :c8120, :c8121, :c8122, :c8123, :c8124, :c8125, :c8126, :c8127, :c8128, :c8129, :c8130, :c8131, :c8132, :c8133, :c8134, :c8135, :c8136, :c8137, :c8138, :c8139, :c8140, :c8141, :c8142, :c8143, :c8144, :c8145, :c8146, :c8147, :c8148, :c8149, :c8150, :c8151, :c8152, :c8153, :c8154, :c8155, :c8156, :c8157, :c8158, :c8159, :c8160, :c8161, :c8162, :c8163, :c8164, :c8165, :c8166, :c8167, :c8168, :c8169, :c8170, :c8171, :c8172, :c8173, :c8174, :c8175, :c8176, :c8177, :c8178, :c8179, :c8180, :c8181, :c8182, :c8183, :c8184, :c8185, :c8186, :c8187, :c8188, :c8189, :c8190, :c8191, :c8192, :c8193, :c8194, :c8195, :c8196, :c8197, :c8198, :c8199, :c8200, :c8201, :c8202, :c8203, :c8204, :c8205, :c8206, :c8207, :c8208, :c8209, :c8210, :c8211, :c8212, :c8213, :c8214, :c8215, :c8216, :c8217, :c8218, :c8219, :c8220, :c8221, :c8222, :c8223, :c8224, :c8225, :c8226, :c8227, :c8228, :c8229, :c8230, :c8231, :c8232, :c8233, :c8234, :c8235, :c8236, :c8237, :c8238, :c8239, :c8240, :c8241, :c8242, :c8243, :c8244, :c8245, :c8246, :c8247, :c8248, :c8249, :c8250, :c8251, :c8252, :c8253, :c8254, :c8255, :c8256, :c8257, :c8258, :c8259, :c8260, :c8261, :c8262, :c8263, :c8264, :c8265, :c8266, :c8267, :c8268, :c8269, :c8270, :c8271, :c8272, :c8273, :c8274, :c8275, :c8276, :c8277, :c8278, :c8279, :c8280, :c8281, :c8282, :c8283, :c8284, :c8285, :c8286, :c8287, :c8288, :c8289, :c8290, :c8291, :c8292, :c8293, :c8294, :c8295, :c8296, :c8297, :c8298, :c8299, :c8300, :c8301, :c8302, :c8303, :c8304, :c8305, :c8306, :c8307, :c8308, :c8309, :c8310, :c8311, :c8312, :c8313, :c8314, :c8315, :c8316, :c8317, :c8318, :c8319, :c8320, :c8321, :c8322, :c8323, :c8324, :c8325, :c8326, :c8327, :c8328, :c8329, :c8330, :c8331, :c8332, :c8333, :c8334, :c8335, :c8336, :c8337, :c8338, :c8339, :c8340, :c8341, :c8342, :c8343, :c8344, :c8345, :c8346, :c8347, :c8348, :c8349, :c8350, :c8351, :c8352, :c8353, :c8354, :c8355, :c8356, :c8357, :c8358, :c8359, :c8360, :c8361, :c8362, :c8363, :c8364, :c8365, :c8366, :c8367, :c8368, :c8369, :c8370, :c8371, :c8372, :c8373, :c8374, :c8375, :c8376, :c8377, :c8378, :c8379, :c8380, :c8381, :c8382, :c8383, :c8384, :c8385, :c8386, :c8387, :c8388, :c8389, :c8390, :c8391, :c8392, :c8393, :c8394, :c8395, :c8396, :c8397, :c8398, :c8399, :c8400, :c8401, :c8402, :c8403, :c8404, :c8405, :c8406, :c8407, :c8408, :c8409, :c8410, :c8411, :c8412, :c8413, :c8414, :c8415, :c8416, :c8417, :c8418, :c8419, :c8420, :c8421, :c8422, :c8423, :c8424, :c8425, :c8426, :c8427, :c8428, :c8429, :c8430, :c8431, :c8432, :c8433, :c8434, :c8435, :c8436, :c8437, :c8438, :c8439, :c8440, :c8441, :c8442, :c8443, :c8444, :c8445, :c8446, :c8447, :c8448, :c8449, :c8450, :c8451, :c8452, :c8453, :c8454, :c8455, :c8456, :c8457, :c8458, :c8459, :c8460, :c8461, :c8462, :c8463, :c8464, :c8465, :c8466, :c8467, :c8468, :c8469, :c8470, :c8471, :c8472, :c8473, :c8474, :c8475, :c8476, :c8477, :c8478, :c8479, :c8480, :c8481, :c8482, :c8483, :c8484, :c8485, :c8486, :c8487, :c8488, :c8489, :c8490, :c8491, :c8492, :c8493, :c8494, :c8495, :c8496, :c8497, :c8498, :c8499, :c8500, :c8501, :c8502, :c8503, :c8504, :c8505, :c8506, :c8507, :c8508, :c8509, :c8510, :c8511, :c8512, :c8513, :c8514, :c8515, :c8516, :c8517, :c8518, :c8519, :c8520, :c8521, :c8522, :c8523, :c8524, :c8525, :c8526, :c8527, :c8528, :c8529, :c8530, :c8531, :c8532, :c8533, :c8534, :c8535, :c8536, :c8537, :c8538, :c8539, :c8540, :c8541, :c8542, :c8543, :c8544, :c8545, :c8546, :c8547, :c8548, :c8549, :c8550, :c8551, :c8552, :c8553, :c8554, :c8555, :c8556, :c8557, :c8558, :c8559, :c8560, :c8561, :c8562, :c8563, :c8564, :c8565, :c8566, :c8567, :c8568, :c8569, :c8570, :c8571, :c8572, :c8573, :c8574, :c8575, :c8576, :c8577, :c8578, :c8579, :c8580, :c8581, :c8582, :c8583, :c8584, :c8585, :c8586, :c8587, :c8588, :c8589, :c8590, :c8591, :c8592, :c8593, :c8594, :c8595, :c8596, :c8597, :c8598, :c8599, :c8600, :c8601, :c8602, :c8603, :c8604, :c8605, :c8606, :c8607, :c8608, :c8609, :c8610, :c8611, :c8612, :c8613, :c8614, :c8615, :c8616, :c8617, :c8618, :c8619, :c8620, :c8621, :c8622, :c8623, :c8624, :c8625, :c8626, :c8627, :c8628, :c8629, :c8630, :c8631, :c8632, :c8633, :c8634, :c8635, :c8636, :c8637, :c8638, :c8639, :c8640, :c8641, :c8642, :c8643, :c8644, :c8645, :c8646, :c8647, :c8648, :c8649, :c8650, :c8651, :c8652, :c8653, :c8654, :c8655, :c8656, :c8657, :c8658, :c8659, :c8660, :c8661, :c8662, :c8663, :c8664, :c8665, :c8666, :c8667, :c8668, :c8669, :c8670, :c8671, :c8672, :c8673, :c8674, :c8675, :c8676, :c8677, :c8678, :c8679, :c8680, :c8681, :c8682, :c8683, :c8684, :c8685, :c8686, :c8687, :c8688, :c8689, :c8690, :c8691, :c8692, :c8693, :c8694, :c8695, :c8696, :c8697, :c8698, :c8699, :c8700, :c8701, :c8702, :c8703, :c8704, :c8705, :c8706, :c8707, :c8708, :c8709, :c8710, :c8711, :c8712, :c8713, :c8714, :c8715, :c8716, :c8717, :c8718, :c8719, :c8720, :c8721, :c8722, :c8723, :c8724, :c8725, :c8726, :c8727, :c8728, :c8729, :c8730, :c8731, :c8732, :c8733, :c8734, :c8735, :c8736, :c8737, :c8738, :c8739, :c8740, :c8741, :c8742, :c8743, :c8744, :c8745, :c8746, :c8747, :c8748, :c8749, :c8750, :c8751, :c8752, :c8753, :c8754, :c8755, :c8756, :c8757, :c8758, :c8759, :c8760, :c8761, :c8762, :c8763, :c8764, :c8765, :c8766, :c8767, :c8768, :c8769, :c8770, :c8771, :c8772, :c8773, :c8774, :c8775, :c8776, :c8777, :c8778, :c8779, :c8780, :c8781, :c8782, :c8783, :c8784, :c8785, :c8786, :c8787, :c8788, :c8789, :c8790, :c8791, :c8792, :c8793, :c8794, :c8795, :c8796, :c8797, :c8798, :c8799, :c8800, :c8801, :c8802, :c8803, :c8804, :c8805, :c8806, :c8807, :c8808, :c8809, :c8810, :c8811, :c8812, :c8813, :c8814, :c8815, :c8816, :c8817, :c8818, :c8819, :c8820, :c8821, :c8822, :c8823, :c8824, :c8825, :c8826, :c8827, :c8828, :c8829, :c8830, :c8831, :c8832, :c8833, :c8834, :c8835, :c8836, :c8837, :c8838, :c8839, :c8840, :c8841, :c8842, :c8843, :c8844, :c8845, :c8846, :c8847, :c8848, :c8849, :c8850, :c8851, :c8852, :c8853, :c8854, :c8855, :c8856, :c8857, :c8858, :c8859, :c8860, :c8861, :c8862, :c8863, :c8864, :c8865, :c8866, :c8867, :c8868, :c8869, :c8870, :c8871, :c8872, :c8873, :c8874, :c8875, :c8876, :c8877, :c8878, :c8879, :c8880, :c8881, :c8882, :c8883, :c8884, :c8885, :c8886, :c8887, :c8888, :c8889, :c8890, :c8891, :c8892, :c8893, :c8894, :c8895, :c8896, :c8897, :c8898, :c8899, :c8900, :c8901, :c8902, :c8903, :c8904, :c8905, :c8906, :c8907, :c8908, :c8909, :c8910, :c8911, :c8912, :c8913, :c8914, :c8915, :c8916, :c8917, :c8918, :c8919, :c8920, :c8921, :c8922, :c8923, :c8924, :c8925, :c8926, :c8927, :c8928, :c8929, :c8930, :c8931, :c8932, :c8933, :c8934, :c8935, :c8936, :c8937, :c8938, :c8939, :c8940, :c8941, :c8942, :c8943, :c8944, :c8945, :c8946, :c8947, :c8948, :c8949, :c8950, :c8951, :c8952, :c8953, :c8954, :c8955, :c8956, :c8957, :c8958, :c8959, :c8960, :c8961, :c8962, :c8963, :c8964, :c8965, :c8966, :c8967, :c8968, :c8969, :c8970, :c8971, :c8972, :c8973, :c8974, :c8975, :c8976, :c8977, :c8978, :c8979, :c8980, :c8981, :c8982, :c8983, :c8984, :c8985, :c8986, :c8987, :c8988, :c8989, :c8990, :c8991, :c8992, :c8993, :c8994, :c8995, :c8996, :c8997, :c8998, :c8999, :c9000, :c9001, :c9002, :c9003, :c9004, :c9005, :c9006, :c9007, :c9008, :c9009, :c9010, :c9011, :c9012, :c9013, :c9014, :c9015, :c9016, :c9017, :c9018, :c9019, :c9020, :c9021, :c9022, :c9023, :c9024, :c9025, :c9026, :c9027, :c9028, :c9029, :c9030, :c9031, :c9032, :c9033, :c9034, :c9035, :c9036, :c9037, :c9038, :c9039, :c9040, :c9041, :c9042, :c9043, :c9044, :c9045, :c9046, :c9047, :c9048, :c9049, :c9050, :c9051, :c9052, :c9053, :c9054, :c9055, :c9056, :c9057, :c9058, :c9059, :c9060, :c9061, :c9062, :c9063, :c9064, :c9065, :c9066, :c9067, :c9068, :c9069, :c9070, :c9071, :c9072, :c9073, :c9074, :c9075, :c9076, :c9077, :c9078, :c9079, :c9080, :c9081, :c9082, :c9083, :c9084, :c9085, :c9086, :c9087, :c9088, :c9089, :c9090, :c9091, :c9092, :c9093, :c9094, :c9095, :c9096, :c9097, :c9098, :c9099, :c9100, :c9101, :c9102, :c9103, :c9104, :c9105, :c9106, :c9107, :c9108, :c9109, :c9110, :c9111, :c9112, :c9113, :c9114, :c9115, :c9116, :c9117, :c9118, :c9119, :c9120, :c9121, :c9122, :c9123, :c9124, :c9125, :c9126, :c9127, :c9128, :c9129, :c9130, :c9131, :c9132, :c9133, :c9134, :c9135, :c9136, :c9137, :c9138, :c9139, :c9140, :c9141, :c9142, :c9143, :c9144, :c9145, :c9146, :c9147, :c9148, :c9149, :c9150, :c9151, :c9152, :c9153, :c9154, :c9155, :c9156, :c9157, :c9158, :c9159, :c9160, :c9161, :c9162, :c9163, :c9164, :c9165, :c9166, :c9167, :c9168, :c9169, :c9170, :c9171, :c9172, :c9173, :c9174, :c9175, :c9176, :c9177, :c9178, :c9179, :c9180, :c9181, :c9182, :c9183, :c9184, :c9185, :c9186, :c9187, :c9188, :c9189, :c9190, :c9191, :c9192, :c9193, :c9194, :c9195, :c9196, :c9197, :c9198, :c9199, :c9200, :c9201, :c9202, :c9203, :c9204, :c9205, :c9206, :c9207, :c9208, :c9209, :c9210, :c9211, :c9212, :c9213, :c9214, :c9215, :c9216, :c9217, :c9218, :c9219, :c9220, :c9221, :c9222, :c9223, :c9224, :c9225, :c9226, :c9227, :c9228, :c9229, :c9230, :c9231, :c9232, :c9233, :c9234, :c9235, :c9236, :c9237, :c9238, :c9239, :c9240, :c9241, :c9242, :c9243, :c9244, :c9245, :c9246, :c9247, :c9248, :c9249, :c9250, :c9251, :c9252, :c9253, :c9254, :c9255, :c9256, :c9257, :c9258, :c9259, :c9260, :c9261, :c9262, :c9263, :c9264, :c9265, :c9266, :c9267, :c9268, :c9269, :c9270, :c9271, :c9272, :c9273, :c9274, :c9275, :c9276, :c9277, :c9278, :c9279, :c9280, :c9281, :c9282, :c9283, :c9284, :c9285, :c9286, :c9287, :c9288, :c9289, :c9290, :c9291, :c9292, :c9293, :c9294, :c9295, :c9296, :c9297, :c9298, :c9299, :c9300, :c9301, :c9302, :c9303, :c9304, :c9305, :c9306, :c9307, :c9308, :c9309, :c9310, :c9311, :c9312, :c9313, :c9314, :c9315, :c9316, :c9317, :c9318, :c9319, :c9320, :c9321, :c9322, :c9323, :c9324, :c9325, :c9326, :c9327, :c9328, :c9329, :c9330, :c9331, :c9332, :c9333, :c9334, :c9335, :c9336, :c9337, :c9338, :c9339, :c9340, :c9341, :c9342, :c9343, :c9344, :c9345, :c9346, :c9347, :c9348, :c9349, :c9350, :c9351, :c9352, :c9353, :c9354, :c9355, :c9356, :c9357, :c9358, :c9359, :c9360, :c9361, :c9362, :c9363, :c9364, :c9365, :c9366, :c9367, :c9368, :c9369, :c9370, :c9371, :c9372, :c9373, :c9374, :c9375, :c9376, :c9377, :c9378, :c9379, :c9380, :c9381, :c9382, :c9383, :c9384, :c9385, :c9386, :c9387, :c9388, :c9389, :c9390, :c9391, :c9392, :c9393, :c9394, :c9395, :c9396, :c9397, :c9398, :c9399, :c9400, :c9401, :c9402, :c9403, :c9404, :c9405, :c9406, :c9407, :c9408, :c9409, :c9410, :c9411, :c9412, :c9413, :c9414, :c9415, :c9416, :c9417, :c9418, :c9419, :c9420, :c9421, :c9422, :c9423, :c9424, :c9425, :c9426, :c9427, :c9428, :c9429, :c9430, :c9431, :c9432, :c9433, :c9434, :c9435, :c9436, :c9437, :c9438, :c9439, :c9440, :c9441, :c9442, :c9443, :c9444, :c9445, :c9446, :c9447, :c9448, :c9449, :c9450, :c9451, :c9452, :c9453, :c9454, :c9455, :c9456, :c9457, :c9458, :c9459, :c9460, :c9461, :c9462, :c9463, :c9464, :c9465, :c9466, :c9467, :c9468, :c9469, :c9470, :c9471, :c9472, :c9473, :c9474, :c9475, :c9476, :c9477, :c9478, :c9479, :c9480, :c9481, :c9482, :c9483, :c9484, :c9485, :c9486, :c9487, :c9488, :c9489, :c9490, :c9491, :c9492, :c9493, :c9494, :c9495, :c9496, :c9497, :c9498, :c9499, :c9500, :c9501, :c9502, :c9503, :c9504, :c9505, :c9506, :c9507, :c9508, :c9509, :c9510, :c9511, :c9512, :c9513, :c9514, :c9515, :c9516, :c9517, :c9518, :c9519, :c9520, :c9521, :c9522, :c9523, :c9524, :c9525, :c9526, :c9527, :c9528, :c9529, :c9530, :c9531, :c9532, :c9533, :c9534, :c9535, :c9536, :c9537, :c9538, :c9539, :c9540, :c9541, :c9542, :c9543, :c9544, :c9545, :c9546, :c9547, :c9548, :c9549, :c9550, :c9551, :c9552, :c9553, :c9554, :c9555, :c9556, :c9557, :c9558, :c9559, :c9560, :c9561, :c9562, :c9563, :c9564, :c9565, :c9566, :c9567, :c9568, :c9569, :c9570, :c9571, :c9572, :c9573, :c9574, :c9575, :c9576, :c9577, :c9578, :c9579, :c9580, :c9581, :c9582, :c9583, :c9584, :c9585, :c9586, :c9587, :c9588, :c9589, :c9590, :c9591, :c9592, :c9593, :c9594, :c9595, :c9596, :c9597, :c9598, :c9599, :c9600, :c9601, :c9602, :c9603, :c9604, :c9605, :c9606, :c9607, :c9608, :c9609, :c9610, :c9611, :c9612, :c9613, :c9614, :c9615, :c9616, :c9617, :c9618, :c9619, :c9620, :c9621, :c9622, :c9623, :c9624, :c9625, :c9626, :c9627, :c9628, :c9629, :c9630, :c9631, :c9632, :c9633, :c9634, :c9635, :c9636, :c9637, :c9638, :c9639, :c9640, :c9641, :c9642, :c9643, :c9644, :c9645, :c9646, :c9647, :c9648, :c9649, :c9650, :c9651, :c9652, :c9653, :c9654, :c9655, :c9656, :c9657, :c9658, :c9659, :c9660, :c9661, :c9662, :c9663, :c9664, :c9665, :c9666, :c9667, :c9668, :c9669, :c9670, :c9671, :c9672, :c9673, :c9674, :c9675, :c9676, :c9677, :c9678, :c9679, :c9680, :c9681, :c9682, :c9683, :c9684, :c9685, :c9686, :c9687, :c9688, :c9689, :c9690, :c9691, :c9692, :c9693, :c9694, :c9695, :c9696, :c9697, :c9698, :c9699, :c9700, :c9701, :c9702, :c9703, :c9704, :c9705, :c9706, :c9707, :c9708, :c9709, :c9710, :c9711, :c9712, :c9713, :c9714, :c9715, :c9716, :c9717, :c9718, :c9719, :c9720, :c9721, :c9722, :c9723, :c9724, :c9725, :c9726, :c9727, :c9728, :c9729, :c9730, :c9731, :c9732, :c9733, :c9734, :c9735, :c9736, :c9737, :c9738, :c9739, :c9740, :c9741, :c9742, :c9743, :c9744, :c9745, :c9746, :c9747, :c9748, :c9749, :c9750, :c9751, :c9752, :c9753, :c9754, :c9755, :c9756, :c9757, :c9758, :c9759, :c9760, :c9761, :c9762, :c9763, :c9764, :c9765, :c9766, :c9767, :c9768, :c9769, :c9770, :c9771, :c9772, :c9773, :c9774, :c9775, :c9776, :c9777, :c9778, :c9779, :c9780, :c9781, :c9782, :c9783, :c9784, :c9785, :c9786, :c9787, :c9788, :c9789, :c9790, :c9791, :c9792, :c9793, :c9794, :c9795, :c9796, :c9797, :c9798, :c9799, :c9800, :c9801, :c9802, :c9803, :c9804, :c9805, :c9806, :c9807, :c9808, :c9809, :c9810, :c9811, :c9812, :c9813, :c9814, :c9815, :c9816, :c9817, :c9818, :c9819, :c9820, :c9821, :c9822, :c9823, :c9824, :c9825, :c9826, :c9827, :c9828, :c9829, :c9830, :c9831, :c9832, :c9833, :c9834, :c9835, :c9836, :c9837, :c9838, :c9839, :c9840, :c9841, :c9842, :c9843, :c9844, :c9845, :c9846, :c9847, :c9848, :c9849, :c9850, :c9851, :c9852, :c9853, :c9854, :c9855, :c9856, :c9857, :c9858, :c9859, :c9860, :c9861, :c9862, :c9863, :c9864, :c9865, :c9866, :c9867, :c9868, :c9869, :c9870, :c9871, :c9872, :c9873, :c9874, :c9875, :c9876, :c9877, :c9878, :c9879, :c9880, :c9881, :c9882, :c9883, :c9884, :c9885, :c9886, :c9887, :c9888, :c9889, :c9890, :c9891, :c9892, :c9893, :c9894, :c9895, :c9896, :c9897, :c9898, :c9899, :c9900, :c9901, :c9902, :c9903, :c9904, :c9905, :c9906, :c9907, :c9908, :c9909, :c9910, :c9911, :c9912, :c9913, :c9914, :c9915, :c9916, :c9917, :c9918, :c9919, :c9920, :c9921, :c9922, :c9923, :c9924, :c9925, :c9926, :c9927, :c9928, :c9929, :c9930, :c9931, :c9932, :c9933, :c9934, :c9935, :c9936, :c9937, :c9938, :c9939, :c9940, :c9941, :c9942, :c9943, :c9944, :c9945, :c9946, :c9947, :c9948, :c9949, :c9950, :c9951, :c9952, :c9953, :c9954, :c9955, :c9956, :c9957, :c9958, :c9959, :c9960, :c9961, :c9962, :c9963, :c9964, :c9965, :c9966, :c9967, :c9968, :c9969, :c9970, :c9971, :c9972, :c9973, :c9974, :c9975, :c9976, :c9977, :c9978, :c9979, :c9980, :c9981, :c9982, :c9983, :c9984, :c9985, :c9986, :c9987, :c9988, :c9989, :c9990, :c9991, :c9992, :c9993, :c9994, :c9995, :c9996, :c9997, :c9998, :c9999, :c10000 . diff --git a/testsuite/serd-tests/good/test-16.nt b/testsuite/serd-tests/good/test-16.nt new file mode 100644 index 00000000..c0604b3b --- /dev/null +++ b/testsuite/serd-tests/good/test-16.nt @@ -0,0 +1,10000 @@ +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c10> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c11> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c12> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c13> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c14> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c15> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c16> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c17> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c18> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c19> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c20> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c21> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c22> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c23> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c24> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c25> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c26> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c27> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c28> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c29> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c30> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c31> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c32> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c33> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c34> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c35> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c36> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c37> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c38> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c39> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c40> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c41> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c42> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c43> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c44> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c45> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c46> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c47> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c48> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c49> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c50> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c51> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c52> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c53> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c54> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c55> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c56> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c57> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c58> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c59> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c60> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c61> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c62> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c63> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c64> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c65> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c66> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c67> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c68> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c69> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c70> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c71> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c72> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c73> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c74> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c75> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c76> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c77> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c78> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c79> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c80> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c81> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c82> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c83> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c84> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c85> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c86> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c87> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c88> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c89> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c90> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c91> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c92> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c93> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c94> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c95> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c96> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c97> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c98> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c99> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c1999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c2999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c3999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c4999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c5999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c6999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c7999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c8999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9000> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9001> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9002> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9003> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9004> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9005> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9006> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9007> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9008> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9009> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9010> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9011> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9012> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9013> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9014> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9015> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9016> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9017> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9018> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9019> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9020> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9021> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9022> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9023> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9024> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9025> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9026> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9027> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9028> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9029> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9030> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9031> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9032> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9033> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9034> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9035> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9036> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9037> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9038> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9039> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9040> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9041> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9042> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9043> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9044> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9045> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9046> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9047> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9048> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9049> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9050> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9051> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9052> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9053> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9054> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9055> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9056> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9057> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9058> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9059> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9060> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9061> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9062> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9063> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9064> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9065> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9066> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9067> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9068> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9069> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9070> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9071> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9072> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9073> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9074> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9075> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9076> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9077> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9078> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9079> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9080> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9081> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9082> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9083> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9084> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9085> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9086> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9087> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9088> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9089> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9090> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9091> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9092> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9093> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9094> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9095> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9096> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9097> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9098> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9099> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9100> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9101> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9102> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9103> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9104> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9105> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9106> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9107> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9108> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9109> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9110> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9111> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9112> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9113> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9114> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9115> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9116> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9117> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9118> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9119> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9120> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9121> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9122> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9123> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9124> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9125> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9126> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9127> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9128> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9129> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9130> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9131> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9132> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9133> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9134> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9135> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9136> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9137> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9138> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9139> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9140> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9141> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9142> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9143> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9144> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9145> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9146> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9147> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9148> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9149> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9150> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9151> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9152> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9153> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9154> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9155> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9156> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9157> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9158> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9159> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9160> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9161> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9162> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9163> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9164> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9165> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9166> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9167> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9168> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9169> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9170> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9171> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9172> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9173> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9174> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9175> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9176> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9177> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9178> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9179> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9180> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9181> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9182> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9183> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9184> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9185> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9186> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9187> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9188> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9189> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9190> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9191> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9192> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9193> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9194> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9195> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9196> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9197> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9198> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9199> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9200> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9201> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9202> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9203> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9204> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9205> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9206> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9207> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9208> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9209> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9210> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9211> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9212> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9213> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9214> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9215> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9216> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9217> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9218> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9219> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9220> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9221> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9222> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9223> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9224> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9225> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9226> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9227> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9228> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9229> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9230> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9231> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9232> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9233> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9234> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9235> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9236> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9237> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9238> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9239> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9240> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9241> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9242> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9243> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9244> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9245> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9246> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9247> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9248> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9249> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9250> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9251> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9252> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9253> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9254> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9255> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9256> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9257> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9258> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9259> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9260> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9261> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9262> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9263> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9264> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9265> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9266> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9267> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9268> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9269> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9270> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9271> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9272> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9273> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9274> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9275> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9276> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9277> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9278> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9279> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9280> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9281> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9282> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9283> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9284> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9285> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9286> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9287> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9288> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9289> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9290> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9291> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9292> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9293> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9294> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9295> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9296> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9297> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9298> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9299> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9300> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9301> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9302> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9303> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9304> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9305> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9306> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9307> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9308> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9309> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9310> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9311> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9312> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9313> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9314> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9315> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9316> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9317> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9318> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9319> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9320> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9321> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9322> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9323> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9324> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9325> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9326> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9327> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9328> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9329> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9330> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9331> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9332> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9333> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9334> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9335> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9336> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9337> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9338> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9339> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9340> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9341> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9342> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9343> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9344> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9345> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9346> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9347> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9348> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9349> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9350> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9351> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9352> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9353> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9354> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9355> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9356> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9357> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9358> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9359> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9360> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9361> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9362> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9363> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9364> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9365> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9366> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9367> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9368> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9369> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9370> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9371> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9372> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9373> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9374> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9375> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9376> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9377> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9378> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9379> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9380> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9381> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9382> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9383> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9384> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9385> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9386> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9387> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9388> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9389> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9390> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9391> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9392> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9393> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9394> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9395> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9396> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9397> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9398> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9399> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9400> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9401> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9402> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9403> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9404> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9405> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9406> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9407> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9408> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9409> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9410> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9411> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9412> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9413> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9414> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9415> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9416> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9417> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9418> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9419> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9420> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9421> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9422> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9423> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9424> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9425> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9426> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9427> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9428> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9429> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9430> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9431> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9432> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9433> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9434> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9435> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9436> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9437> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9438> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9439> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9440> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9441> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9442> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9443> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9444> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9445> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9446> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9447> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9448> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9449> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9450> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9451> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9452> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9453> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9454> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9455> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9456> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9457> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9458> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9459> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9460> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9461> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9462> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9463> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9464> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9465> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9466> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9467> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9468> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9469> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9470> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9471> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9472> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9473> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9474> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9475> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9476> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9477> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9478> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9479> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9480> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9481> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9482> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9483> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9484> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9485> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9486> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9487> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9488> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9489> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9490> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9491> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9492> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9493> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9494> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9495> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9496> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9497> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9498> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9499> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9500> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9501> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9502> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9503> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9504> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9505> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9506> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9507> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9508> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9509> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9510> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9511> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9512> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9513> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9514> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9515> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9516> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9517> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9518> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9519> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9520> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9521> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9522> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9523> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9524> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9525> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9526> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9527> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9528> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9529> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9530> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9531> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9532> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9533> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9534> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9535> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9536> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9537> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9538> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9539> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9540> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9541> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9542> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9543> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9544> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9545> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9546> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9547> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9548> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9549> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9550> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9551> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9552> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9553> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9554> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9555> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9556> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9557> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9558> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9559> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9560> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9561> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9562> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9563> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9564> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9565> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9566> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9567> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9568> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9569> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9570> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9571> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9572> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9573> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9574> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9575> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9576> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9577> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9578> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9579> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9580> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9581> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9582> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9583> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9584> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9585> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9586> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9587> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9588> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9589> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9590> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9591> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9592> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9593> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9594> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9595> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9596> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9597> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9598> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9599> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9600> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9601> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9602> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9603> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9604> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9605> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9606> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9607> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9608> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9609> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9610> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9611> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9612> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9613> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9614> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9615> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9616> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9617> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9618> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9619> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9620> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9621> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9622> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9623> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9624> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9625> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9626> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9627> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9628> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9629> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9630> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9631> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9632> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9633> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9634> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9635> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9636> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9637> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9638> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9639> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9640> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9641> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9642> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9643> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9644> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9645> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9646> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9647> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9648> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9649> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9650> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9651> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9652> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9653> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9654> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9655> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9656> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9657> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9658> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9659> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9660> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9661> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9662> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9663> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9664> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9665> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9666> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9667> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9668> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9669> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9670> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9671> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9672> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9673> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9674> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9675> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9676> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9677> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9678> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9679> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9680> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9681> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9682> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9683> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9684> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9685> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9686> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9687> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9688> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9689> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9690> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9691> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9692> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9693> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9694> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9695> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9696> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9697> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9698> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9699> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9700> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9701> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9702> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9703> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9704> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9705> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9706> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9707> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9708> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9709> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9710> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9711> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9712> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9713> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9714> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9715> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9716> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9717> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9718> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9719> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9720> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9721> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9722> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9723> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9724> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9725> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9726> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9727> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9728> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9729> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9730> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9731> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9732> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9733> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9734> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9735> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9736> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9737> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9738> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9739> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9740> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9741> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9742> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9743> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9744> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9745> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9746> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9747> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9748> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9749> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9750> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9751> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9752> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9753> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9754> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9755> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9756> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9757> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9758> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9759> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9760> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9761> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9762> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9763> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9764> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9765> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9766> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9767> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9768> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9769> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9770> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9771> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9772> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9773> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9774> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9775> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9776> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9777> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9778> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9779> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9780> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9781> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9782> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9783> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9784> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9785> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9786> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9787> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9788> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9789> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9790> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9791> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9792> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9793> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9794> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9795> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9796> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9797> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9798> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9799> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9800> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9801> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9802> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9803> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9804> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9805> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9806> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9807> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9808> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9809> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9810> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9811> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9812> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9813> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9814> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9815> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9816> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9817> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9818> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9819> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9820> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9821> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9822> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9823> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9824> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9825> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9826> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9827> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9828> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9829> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9830> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9831> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9832> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9833> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9834> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9835> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9836> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9837> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9838> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9839> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9840> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9841> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9842> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9843> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9844> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9845> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9846> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9847> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9848> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9849> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9850> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9851> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9852> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9853> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9854> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9855> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9856> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9857> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9858> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9859> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9860> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9861> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9862> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9863> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9864> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9865> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9866> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9867> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9868> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9869> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9870> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9871> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9872> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9873> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9874> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9875> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9876> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9877> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9878> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9879> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9880> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9881> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9882> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9883> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9884> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9885> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9886> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9887> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9888> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9889> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9890> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9891> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9892> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9893> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9894> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9895> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9896> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9897> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9898> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9899> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9900> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9901> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9902> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9903> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9904> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9905> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9906> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9907> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9908> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9909> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9910> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9911> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9912> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9913> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9914> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9915> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9916> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9917> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9918> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9919> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9920> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9921> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9922> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9923> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9924> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9925> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9926> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9927> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9928> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9929> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9930> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9931> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9932> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9933> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9934> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9935> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9936> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9937> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9938> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9939> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9940> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9941> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9942> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9943> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9944> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9945> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9946> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9947> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9948> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9949> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9950> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9951> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9952> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9953> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9954> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9955> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9956> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9957> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9958> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9959> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9960> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9961> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9962> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9963> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9964> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9965> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9966> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9967> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9968> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9969> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9970> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9971> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9972> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9973> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9974> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9975> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9976> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9977> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9978> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9979> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9980> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9981> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9982> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9983> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9984> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9985> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9986> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9987> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9988> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9989> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9990> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9991> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9992> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9993> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9994> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9995> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9996> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9997> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9998> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c9999> . +<http://example.org/ns#a> <http://example.org/ns#b> <http://example.org/ns#c10000> . diff --git a/testsuite/serd-tests/good/test-16.ttl b/testsuite/serd-tests/good/test-16.ttl new file mode 100644 index 00000000..a9ac37fb --- /dev/null +++ b/testsuite/serd-tests/good/test-16.ttl @@ -0,0 +1,10002 @@ +# 10000 items (10000 triples) more than the default Bison stack size +@prefix : <http://example.org/ns#> . +:a :b :c1; + :b :c2; + :b :c3; + :b :c4; + :b :c5; + :b :c6; + :b :c7; + :b :c8; + :b :c9; + :b :c10; + :b :c11; + :b :c12; + :b :c13; + :b :c14; + :b :c15; + :b :c16; + :b :c17; + :b :c18; + :b :c19; + :b :c20; + :b :c21; + :b :c22; + :b :c23; + :b :c24; + :b :c25; + :b :c26; + :b :c27; + :b :c28; + :b :c29; + :b :c30; + :b :c31; + :b :c32; + :b :c33; + :b :c34; + :b :c35; + :b :c36; + :b :c37; + :b :c38; + :b :c39; + :b :c40; + :b :c41; + :b :c42; + :b :c43; + :b :c44; + :b :c45; + :b :c46; + :b :c47; + :b :c48; + :b :c49; + :b :c50; + :b :c51; + :b :c52; + :b :c53; + :b :c54; + :b :c55; + :b :c56; + :b :c57; + :b :c58; + :b :c59; + :b :c60; + :b :c61; + :b :c62; + :b :c63; + :b :c64; + :b :c65; + :b :c66; + :b :c67; + :b :c68; + :b :c69; + :b :c70; + :b :c71; + :b :c72; + :b :c73; + :b :c74; + :b :c75; + :b :c76; + :b :c77; + :b :c78; + :b :c79; + :b :c80; + :b :c81; + :b :c82; + :b :c83; + :b :c84; + :b :c85; + :b :c86; + :b :c87; + :b :c88; + :b :c89; + :b :c90; + :b :c91; + :b :c92; + :b :c93; + :b :c94; + :b :c95; + :b :c96; + :b :c97; + :b :c98; + :b :c99; + :b :c100; + :b :c101; + :b :c102; + :b :c103; + :b :c104; + :b :c105; + :b :c106; + :b :c107; + :b :c108; + :b :c109; + :b :c110; + :b :c111; + :b :c112; + :b :c113; + :b :c114; + :b :c115; + :b :c116; + :b :c117; + :b :c118; + :b :c119; + :b :c120; + :b :c121; + :b :c122; + :b :c123; + :b :c124; + :b :c125; + :b :c126; + :b :c127; + :b :c128; + :b :c129; + :b :c130; + :b :c131; + :b :c132; + :b :c133; + :b :c134; + :b :c135; + :b :c136; + :b :c137; + :b :c138; + :b :c139; + :b :c140; + :b :c141; + :b :c142; + :b :c143; + :b :c144; + :b :c145; + :b :c146; + :b :c147; + :b :c148; + :b :c149; + :b :c150; + :b :c151; + :b :c152; + :b :c153; + :b :c154; + :b :c155; + :b :c156; + :b :c157; + :b :c158; + :b :c159; + :b :c160; + :b :c161; + :b :c162; + :b :c163; + :b :c164; + :b :c165; + :b :c166; + :b :c167; + :b :c168; + :b :c169; + :b :c170; + :b :c171; + :b :c172; + :b :c173; + :b :c174; + :b :c175; + :b :c176; + :b :c177; + :b :c178; + :b :c179; + :b :c180; + :b :c181; + :b :c182; + :b :c183; + :b :c184; + :b :c185; + :b :c186; + :b :c187; + :b :c188; + :b :c189; + :b :c190; + :b :c191; + :b :c192; + :b :c193; + :b :c194; + :b :c195; + :b :c196; + :b :c197; + :b :c198; + :b :c199; + :b :c200; + :b :c201; + :b :c202; + :b :c203; + :b :c204; + :b :c205; + :b :c206; + :b :c207; + :b :c208; + :b :c209; + :b :c210; + :b :c211; + :b :c212; + :b :c213; + :b :c214; + :b :c215; + :b :c216; + :b :c217; + :b :c218; + :b :c219; + :b :c220; + :b :c221; + :b :c222; + :b :c223; + :b :c224; + :b :c225; + :b :c226; + :b :c227; + :b :c228; + :b :c229; + :b :c230; + :b :c231; + :b :c232; + :b :c233; + :b :c234; + :b :c235; + :b :c236; + :b :c237; + :b :c238; + :b :c239; + :b :c240; + :b :c241; + :b :c242; + :b :c243; + :b :c244; + :b :c245; + :b :c246; + :b :c247; + :b :c248; + :b :c249; + :b :c250; + :b :c251; + :b :c252; + :b :c253; + :b :c254; + :b :c255; + :b :c256; + :b :c257; + :b :c258; + :b :c259; + :b :c260; + :b :c261; + :b :c262; + :b :c263; + :b :c264; + :b :c265; + :b :c266; + :b :c267; + :b :c268; + :b :c269; + :b :c270; + :b :c271; + :b :c272; + :b :c273; + :b :c274; + :b :c275; + :b :c276; + :b :c277; + :b :c278; + :b :c279; + :b :c280; + :b :c281; + :b :c282; + :b :c283; + :b :c284; + :b :c285; + :b :c286; + :b :c287; + :b :c288; + :b :c289; + :b :c290; + :b :c291; + :b :c292; + :b :c293; + :b :c294; + :b :c295; + :b :c296; + :b :c297; + :b :c298; + :b :c299; + :b :c300; + :b :c301; + :b :c302; + :b :c303; + :b :c304; + :b :c305; + :b :c306; + :b :c307; + :b :c308; + :b :c309; + :b :c310; + :b :c311; + :b :c312; + :b :c313; + :b :c314; + :b :c315; + :b :c316; + :b :c317; + :b :c318; + :b :c319; + :b :c320; + :b :c321; + :b :c322; + :b :c323; + :b :c324; + :b :c325; + :b :c326; + :b :c327; + :b :c328; + :b :c329; + :b :c330; + :b :c331; + :b :c332; + :b :c333; + :b :c334; + :b :c335; + :b :c336; + :b :c337; + :b :c338; + :b :c339; + :b :c340; + :b :c341; + :b :c342; + :b :c343; + :b :c344; + :b :c345; + :b :c346; + :b :c347; + :b :c348; + :b :c349; + :b :c350; + :b :c351; + :b :c352; + :b :c353; + :b :c354; + :b :c355; + :b :c356; + :b :c357; + :b :c358; + :b :c359; + :b :c360; + :b :c361; + :b :c362; + :b :c363; + :b :c364; + :b :c365; + :b :c366; + :b :c367; + :b :c368; + :b :c369; + :b :c370; + :b :c371; + :b :c372; + :b :c373; + :b :c374; + :b :c375; + :b :c376; + :b :c377; + :b :c378; + :b :c379; + :b :c380; + :b :c381; + :b :c382; + :b :c383; + :b :c384; + :b :c385; + :b :c386; + :b :c387; + :b :c388; + :b :c389; + :b :c390; + :b :c391; + :b :c392; + :b :c393; + :b :c394; + :b :c395; + :b :c396; + :b :c397; + :b :c398; + :b :c399; + :b :c400; + :b :c401; + :b :c402; + :b :c403; + :b :c404; + :b :c405; + :b :c406; + :b :c407; + :b :c408; + :b :c409; + :b :c410; + :b :c411; + :b :c412; + :b :c413; + :b :c414; + :b :c415; + :b :c416; + :b :c417; + :b :c418; + :b :c419; + :b :c420; + :b :c421; + :b :c422; + :b :c423; + :b :c424; + :b :c425; + :b :c426; + :b :c427; + :b :c428; + :b :c429; + :b :c430; + :b :c431; + :b :c432; + :b :c433; + :b :c434; + :b :c435; + :b :c436; + :b :c437; + :b :c438; + :b :c439; + :b :c440; + :b :c441; + :b :c442; + :b :c443; + :b :c444; + :b :c445; + :b :c446; + :b :c447; + :b :c448; + :b :c449; + :b :c450; + :b :c451; + :b :c452; + :b :c453; + :b :c454; + :b :c455; + :b :c456; + :b :c457; + :b :c458; + :b :c459; + :b :c460; + :b :c461; + :b :c462; + :b :c463; + :b :c464; + :b :c465; + :b :c466; + :b :c467; + :b :c468; + :b :c469; + :b :c470; + :b :c471; + :b :c472; + :b :c473; + :b :c474; + :b :c475; + :b :c476; + :b :c477; + :b :c478; + :b :c479; + :b :c480; + :b :c481; + :b :c482; + :b :c483; + :b :c484; + :b :c485; + :b :c486; + :b :c487; + :b :c488; + :b :c489; + :b :c490; + :b :c491; + :b :c492; + :b :c493; + :b :c494; + :b :c495; + :b :c496; + :b :c497; + :b :c498; + :b :c499; + :b :c500; + :b :c501; + :b :c502; + :b :c503; + :b :c504; + :b :c505; + :b :c506; + :b :c507; + :b :c508; + :b :c509; + :b :c510; + :b :c511; + :b :c512; + :b :c513; + :b :c514; + :b :c515; + :b :c516; + :b :c517; + :b :c518; + :b :c519; + :b :c520; + :b :c521; + :b :c522; + :b :c523; + :b :c524; + :b :c525; + :b :c526; + :b :c527; + :b :c528; + :b :c529; + :b :c530; + :b :c531; + :b :c532; + :b :c533; + :b :c534; + :b :c535; + :b :c536; + :b :c537; + :b :c538; + :b :c539; + :b :c540; + :b :c541; + :b :c542; + :b :c543; + :b :c544; + :b :c545; + :b :c546; + :b :c547; + :b :c548; + :b :c549; + :b :c550; + :b :c551; + :b :c552; + :b :c553; + :b :c554; + :b :c555; + :b :c556; + :b :c557; + :b :c558; + :b :c559; + :b :c560; + :b :c561; + :b :c562; + :b :c563; + :b :c564; + :b :c565; + :b :c566; + :b :c567; + :b :c568; + :b :c569; + :b :c570; + :b :c571; + :b :c572; + :b :c573; + :b :c574; + :b :c575; + :b :c576; + :b :c577; + :b :c578; + :b :c579; + :b :c580; + :b :c581; + :b :c582; + :b :c583; + :b :c584; + :b :c585; + :b :c586; + :b :c587; + :b :c588; + :b :c589; + :b :c590; + :b :c591; + :b :c592; + :b :c593; + :b :c594; + :b :c595; + :b :c596; + :b :c597; + :b :c598; + :b :c599; + :b :c600; + :b :c601; + :b :c602; + :b :c603; + :b :c604; + :b :c605; + :b :c606; + :b :c607; + :b :c608; + :b :c609; + :b :c610; + :b :c611; + :b :c612; + :b :c613; + :b :c614; + :b :c615; + :b :c616; + :b :c617; + :b :c618; + :b :c619; + :b :c620; + :b :c621; + :b :c622; + :b :c623; + :b :c624; + :b :c625; + :b :c626; + :b :c627; + :b :c628; + :b :c629; + :b :c630; + :b :c631; + :b :c632; + :b :c633; + :b :c634; + :b :c635; + :b :c636; + :b :c637; + :b :c638; + :b :c639; + :b :c640; + :b :c641; + :b :c642; + :b :c643; + :b :c644; + :b :c645; + :b :c646; + :b :c647; + :b :c648; + :b :c649; + :b :c650; + :b :c651; + :b :c652; + :b :c653; + :b :c654; + :b :c655; + :b :c656; + :b :c657; + :b :c658; + :b :c659; + :b :c660; + :b :c661; + :b :c662; + :b :c663; + :b :c664; + :b :c665; + :b :c666; + :b :c667; + :b :c668; + :b :c669; + :b :c670; + :b :c671; + :b :c672; + :b :c673; + :b :c674; + :b :c675; + :b :c676; + :b :c677; + :b :c678; + :b :c679; + :b :c680; + :b :c681; + :b :c682; + :b :c683; + :b :c684; + :b :c685; + :b :c686; + :b :c687; + :b :c688; + :b :c689; + :b :c690; + :b :c691; + :b :c692; + :b :c693; + :b :c694; + :b :c695; + :b :c696; + :b :c697; + :b :c698; + :b :c699; + :b :c700; + :b :c701; + :b :c702; + :b :c703; + :b :c704; + :b :c705; + :b :c706; + :b :c707; + :b :c708; + :b :c709; + :b :c710; + :b :c711; + :b :c712; + :b :c713; + :b :c714; + :b :c715; + :b :c716; + :b :c717; + :b :c718; + :b :c719; + :b :c720; + :b :c721; + :b :c722; + :b :c723; + :b :c724; + :b :c725; + :b :c726; + :b :c727; + :b :c728; + :b :c729; + :b :c730; + :b :c731; + :b :c732; + :b :c733; + :b :c734; + :b :c735; + :b :c736; + :b :c737; + :b :c738; + :b :c739; + :b :c740; + :b :c741; + :b :c742; + :b :c743; + :b :c744; + :b :c745; + :b :c746; + :b :c747; + :b :c748; + :b :c749; + :b :c750; + :b :c751; + :b :c752; + :b :c753; + :b :c754; + :b :c755; + :b :c756; + :b :c757; + :b :c758; + :b :c759; + :b :c760; + :b :c761; + :b :c762; + :b :c763; + :b :c764; + :b :c765; + :b :c766; + :b :c767; + :b :c768; + :b :c769; + :b :c770; + :b :c771; + :b :c772; + :b :c773; + :b :c774; + :b :c775; + :b :c776; + :b :c777; + :b :c778; + :b :c779; + :b :c780; + :b :c781; + :b :c782; + :b :c783; + :b :c784; + :b :c785; + :b :c786; + :b :c787; + :b :c788; + :b :c789; + :b :c790; + :b :c791; + :b :c792; + :b :c793; + :b :c794; + :b :c795; + :b :c796; + :b :c797; + :b :c798; + :b :c799; + :b :c800; + :b :c801; + :b :c802; + :b :c803; + :b :c804; + :b :c805; + :b :c806; + :b :c807; + :b :c808; + :b :c809; + :b :c810; + :b :c811; + :b :c812; + :b :c813; + :b :c814; + :b :c815; + :b :c816; + :b :c817; + :b :c818; + :b :c819; + :b :c820; + :b :c821; + :b :c822; + :b :c823; + :b :c824; + :b :c825; + :b :c826; + :b :c827; + :b :c828; + :b :c829; + :b :c830; + :b :c831; + :b :c832; + :b :c833; + :b :c834; + :b :c835; + :b :c836; + :b :c837; + :b :c838; + :b :c839; + :b :c840; + :b :c841; + :b :c842; + :b :c843; + :b :c844; + :b :c845; + :b :c846; + :b :c847; + :b :c848; + :b :c849; + :b :c850; + :b :c851; + :b :c852; + :b :c853; + :b :c854; + :b :c855; + :b :c856; + :b :c857; + :b :c858; + :b :c859; + :b :c860; + :b :c861; + :b :c862; + :b :c863; + :b :c864; + :b :c865; + :b :c866; + :b :c867; + :b :c868; + :b :c869; + :b :c870; + :b :c871; + :b :c872; + :b :c873; + :b :c874; + :b :c875; + :b :c876; + :b :c877; + :b :c878; + :b :c879; + :b :c880; + :b :c881; + :b :c882; + :b :c883; + :b :c884; + :b :c885; + :b :c886; + :b :c887; + :b :c888; + :b :c889; + :b :c890; + :b :c891; + :b :c892; + :b :c893; + :b :c894; + :b :c895; + :b :c896; + :b :c897; + :b :c898; + :b :c899; + :b :c900; + :b :c901; + :b :c902; + :b :c903; + :b :c904; + :b :c905; + :b :c906; + :b :c907; + :b :c908; + :b :c909; + :b :c910; + :b :c911; + :b :c912; + :b :c913; + :b :c914; + :b :c915; + :b :c916; + :b :c917; + :b :c918; + :b :c919; + :b :c920; + :b :c921; + :b :c922; + :b :c923; + :b :c924; + :b :c925; + :b :c926; + :b :c927; + :b :c928; + :b :c929; + :b :c930; + :b :c931; + :b :c932; + :b :c933; + :b :c934; + :b :c935; + :b :c936; + :b :c937; + :b :c938; + :b :c939; + :b :c940; + :b :c941; + :b :c942; + :b :c943; + :b :c944; + :b :c945; + :b :c946; + :b :c947; + :b :c948; + :b :c949; + :b :c950; + :b :c951; + :b :c952; + :b :c953; + :b :c954; + :b :c955; + :b :c956; + :b :c957; + :b :c958; + :b :c959; + :b :c960; + :b :c961; + :b :c962; + :b :c963; + :b :c964; + :b :c965; + :b :c966; + :b :c967; + :b :c968; + :b :c969; + :b :c970; + :b :c971; + :b :c972; + :b :c973; + :b :c974; + :b :c975; + :b :c976; + :b :c977; + :b :c978; + :b :c979; + :b :c980; + :b :c981; + :b :c982; + :b :c983; + :b :c984; + :b :c985; + :b :c986; + :b :c987; + :b :c988; + :b :c989; + :b :c990; + :b :c991; + :b :c992; + :b :c993; + :b :c994; + :b :c995; + :b :c996; + :b :c997; + :b :c998; + :b :c999; + :b :c1000; + :b :c1001; + :b :c1002; + :b :c1003; + :b :c1004; + :b :c1005; + :b :c1006; + :b :c1007; + :b :c1008; + :b :c1009; + :b :c1010; + :b :c1011; + :b :c1012; + :b :c1013; + :b :c1014; + :b :c1015; + :b :c1016; + :b :c1017; + :b :c1018; + :b :c1019; + :b :c1020; + :b :c1021; + :b :c1022; + :b :c1023; + :b :c1024; + :b :c1025; + :b :c1026; + :b :c1027; + :b :c1028; + :b :c1029; + :b :c1030; + :b :c1031; + :b :c1032; + :b :c1033; + :b :c1034; + :b :c1035; + :b :c1036; + :b :c1037; + :b :c1038; + :b :c1039; + :b :c1040; + :b :c1041; + :b :c1042; + :b :c1043; + :b :c1044; + :b :c1045; + :b :c1046; + :b :c1047; + :b :c1048; + :b :c1049; + :b :c1050; + :b :c1051; + :b :c1052; + :b :c1053; + :b :c1054; + :b :c1055; + :b :c1056; + :b :c1057; + :b :c1058; + :b :c1059; + :b :c1060; + :b :c1061; + :b :c1062; + :b :c1063; + :b :c1064; + :b :c1065; + :b :c1066; + :b :c1067; + :b :c1068; + :b :c1069; + :b :c1070; + :b :c1071; + :b :c1072; + :b :c1073; + :b :c1074; + :b :c1075; + :b :c1076; + :b :c1077; + :b :c1078; + :b :c1079; + :b :c1080; + :b :c1081; + :b :c1082; + :b :c1083; + :b :c1084; + :b :c1085; + :b :c1086; + :b :c1087; + :b :c1088; + :b :c1089; + :b :c1090; + :b :c1091; + :b :c1092; + :b :c1093; + :b :c1094; + :b :c1095; + :b :c1096; + :b :c1097; + :b :c1098; + :b :c1099; + :b :c1100; + :b :c1101; + :b :c1102; + :b :c1103; + :b :c1104; + :b :c1105; + :b :c1106; + :b :c1107; + :b :c1108; + :b :c1109; + :b :c1110; + :b :c1111; + :b :c1112; + :b :c1113; + :b :c1114; + :b :c1115; + :b :c1116; + :b :c1117; + :b :c1118; + :b :c1119; + :b :c1120; + :b :c1121; + :b :c1122; + :b :c1123; + :b :c1124; + :b :c1125; + :b :c1126; + :b :c1127; + :b :c1128; + :b :c1129; + :b :c1130; + :b :c1131; + :b :c1132; + :b :c1133; + :b :c1134; + :b :c1135; + :b :c1136; + :b :c1137; + :b :c1138; + :b :c1139; + :b :c1140; + :b :c1141; + :b :c1142; + :b :c1143; + :b :c1144; + :b :c1145; + :b :c1146; + :b :c1147; + :b :c1148; + :b :c1149; + :b :c1150; + :b :c1151; + :b :c1152; + :b :c1153; + :b :c1154; + :b :c1155; + :b :c1156; + :b :c1157; + :b :c1158; + :b :c1159; + :b :c1160; + :b :c1161; + :b :c1162; + :b :c1163; + :b :c1164; + :b :c1165; + :b :c1166; + :b :c1167; + :b :c1168; + :b :c1169; + :b :c1170; + :b :c1171; + :b :c1172; + :b :c1173; + :b :c1174; + :b :c1175; + :b :c1176; + :b :c1177; + :b :c1178; + :b :c1179; + :b :c1180; + :b :c1181; + :b :c1182; + :b :c1183; + :b :c1184; + :b :c1185; + :b :c1186; + :b :c1187; + :b :c1188; + :b :c1189; + :b :c1190; + :b :c1191; + :b :c1192; + :b :c1193; + :b :c1194; + :b :c1195; + :b :c1196; + :b :c1197; + :b :c1198; + :b :c1199; + :b :c1200; + :b :c1201; + :b :c1202; + :b :c1203; + :b :c1204; + :b :c1205; + :b :c1206; + :b :c1207; + :b :c1208; + :b :c1209; + :b :c1210; + :b :c1211; + :b :c1212; + :b :c1213; + :b :c1214; + :b :c1215; + :b :c1216; + :b :c1217; + :b :c1218; + :b :c1219; + :b :c1220; + :b :c1221; + :b :c1222; + :b :c1223; + :b :c1224; + :b :c1225; + :b :c1226; + :b :c1227; + :b :c1228; + :b :c1229; + :b :c1230; + :b :c1231; + :b :c1232; + :b :c1233; + :b :c1234; + :b :c1235; + :b :c1236; + :b :c1237; + :b :c1238; + :b :c1239; + :b :c1240; + :b :c1241; + :b :c1242; + :b :c1243; + :b :c1244; + :b :c1245; + :b :c1246; + :b :c1247; + :b :c1248; + :b :c1249; + :b :c1250; + :b :c1251; + :b :c1252; + :b :c1253; + :b :c1254; + :b :c1255; + :b :c1256; + :b :c1257; + :b :c1258; + :b :c1259; + :b :c1260; + :b :c1261; + :b :c1262; + :b :c1263; + :b :c1264; + :b :c1265; + :b :c1266; + :b :c1267; + :b :c1268; + :b :c1269; + :b :c1270; + :b :c1271; + :b :c1272; + :b :c1273; + :b :c1274; + :b :c1275; + :b :c1276; + :b :c1277; + :b :c1278; + :b :c1279; + :b :c1280; + :b :c1281; + :b :c1282; + :b :c1283; + :b :c1284; + :b :c1285; + :b :c1286; + :b :c1287; + :b :c1288; + :b :c1289; + :b :c1290; + :b :c1291; + :b :c1292; + :b :c1293; + :b :c1294; + :b :c1295; + :b :c1296; + :b :c1297; + :b :c1298; + :b :c1299; + :b :c1300; + :b :c1301; + :b :c1302; + :b :c1303; + :b :c1304; + :b :c1305; + :b :c1306; + :b :c1307; + :b :c1308; + :b :c1309; + :b :c1310; + :b :c1311; + :b :c1312; + :b :c1313; + :b :c1314; + :b :c1315; + :b :c1316; + :b :c1317; + :b :c1318; + :b :c1319; + :b :c1320; + :b :c1321; + :b :c1322; + :b :c1323; + :b :c1324; + :b :c1325; + :b :c1326; + :b :c1327; + :b :c1328; + :b :c1329; + :b :c1330; + :b :c1331; + :b :c1332; + :b :c1333; + :b :c1334; + :b :c1335; + :b :c1336; + :b :c1337; + :b :c1338; + :b :c1339; + :b :c1340; + :b :c1341; + :b :c1342; + :b :c1343; + :b :c1344; + :b :c1345; + :b :c1346; + :b :c1347; + :b :c1348; + :b :c1349; + :b :c1350; + :b :c1351; + :b :c1352; + :b :c1353; + :b :c1354; + :b :c1355; + :b :c1356; + :b :c1357; + :b :c1358; + :b :c1359; + :b :c1360; + :b :c1361; + :b :c1362; + :b :c1363; + :b :c1364; + :b :c1365; + :b :c1366; + :b :c1367; + :b :c1368; + :b :c1369; + :b :c1370; + :b :c1371; + :b :c1372; + :b :c1373; + :b :c1374; + :b :c1375; + :b :c1376; + :b :c1377; + :b :c1378; + :b :c1379; + :b :c1380; + :b :c1381; + :b :c1382; + :b :c1383; + :b :c1384; + :b :c1385; + :b :c1386; + :b :c1387; + :b :c1388; + :b :c1389; + :b :c1390; + :b :c1391; + :b :c1392; + :b :c1393; + :b :c1394; + :b :c1395; + :b :c1396; + :b :c1397; + :b :c1398; + :b :c1399; + :b :c1400; + :b :c1401; + :b :c1402; + :b :c1403; + :b :c1404; + :b :c1405; + :b :c1406; + :b :c1407; + :b :c1408; + :b :c1409; + :b :c1410; + :b :c1411; + :b :c1412; + :b :c1413; + :b :c1414; + :b :c1415; + :b :c1416; + :b :c1417; + :b :c1418; + :b :c1419; + :b :c1420; + :b :c1421; + :b :c1422; + :b :c1423; + :b :c1424; + :b :c1425; + :b :c1426; + :b :c1427; + :b :c1428; + :b :c1429; + :b :c1430; + :b :c1431; + :b :c1432; + :b :c1433; + :b :c1434; + :b :c1435; + :b :c1436; + :b :c1437; + :b :c1438; + :b :c1439; + :b :c1440; + :b :c1441; + :b :c1442; + :b :c1443; + :b :c1444; + :b :c1445; + :b :c1446; + :b :c1447; + :b :c1448; + :b :c1449; + :b :c1450; + :b :c1451; + :b :c1452; + :b :c1453; + :b :c1454; + :b :c1455; + :b :c1456; + :b :c1457; + :b :c1458; + :b :c1459; + :b :c1460; + :b :c1461; + :b :c1462; + :b :c1463; + :b :c1464; + :b :c1465; + :b :c1466; + :b :c1467; + :b :c1468; + :b :c1469; + :b :c1470; + :b :c1471; + :b :c1472; + :b :c1473; + :b :c1474; + :b :c1475; + :b :c1476; + :b :c1477; + :b :c1478; + :b :c1479; + :b :c1480; + :b :c1481; + :b :c1482; + :b :c1483; + :b :c1484; + :b :c1485; + :b :c1486; + :b :c1487; + :b :c1488; + :b :c1489; + :b :c1490; + :b :c1491; + :b :c1492; + :b :c1493; + :b :c1494; + :b :c1495; + :b :c1496; + :b :c1497; + :b :c1498; + :b :c1499; + :b :c1500; + :b :c1501; + :b :c1502; + :b :c1503; + :b :c1504; + :b :c1505; + :b :c1506; + :b :c1507; + :b :c1508; + :b :c1509; + :b :c1510; + :b :c1511; + :b :c1512; + :b :c1513; + :b :c1514; + :b :c1515; + :b :c1516; + :b :c1517; + :b :c1518; + :b :c1519; + :b :c1520; + :b :c1521; + :b :c1522; + :b :c1523; + :b :c1524; + :b :c1525; + :b :c1526; + :b :c1527; + :b :c1528; + :b :c1529; + :b :c1530; + :b :c1531; + :b :c1532; + :b :c1533; + :b :c1534; + :b :c1535; + :b :c1536; + :b :c1537; + :b :c1538; + :b :c1539; + :b :c1540; + :b :c1541; + :b :c1542; + :b :c1543; + :b :c1544; + :b :c1545; + :b :c1546; + :b :c1547; + :b :c1548; + :b :c1549; + :b :c1550; + :b :c1551; + :b :c1552; + :b :c1553; + :b :c1554; + :b :c1555; + :b :c1556; + :b :c1557; + :b :c1558; + :b :c1559; + :b :c1560; + :b :c1561; + :b :c1562; + :b :c1563; + :b :c1564; + :b :c1565; + :b :c1566; + :b :c1567; + :b :c1568; + :b :c1569; + :b :c1570; + :b :c1571; + :b :c1572; + :b :c1573; + :b :c1574; + :b :c1575; + :b :c1576; + :b :c1577; + :b :c1578; + :b :c1579; + :b :c1580; + :b :c1581; + :b :c1582; + :b :c1583; + :b :c1584; + :b :c1585; + :b :c1586; + :b :c1587; + :b :c1588; + :b :c1589; + :b :c1590; + :b :c1591; + :b :c1592; + :b :c1593; + :b :c1594; + :b :c1595; + :b :c1596; + :b :c1597; + :b :c1598; + :b :c1599; + :b :c1600; + :b :c1601; + :b :c1602; + :b :c1603; + :b :c1604; + :b :c1605; + :b :c1606; + :b :c1607; + :b :c1608; + :b :c1609; + :b :c1610; + :b :c1611; + :b :c1612; + :b :c1613; + :b :c1614; + :b :c1615; + :b :c1616; + :b :c1617; + :b :c1618; + :b :c1619; + :b :c1620; + :b :c1621; + :b :c1622; + :b :c1623; + :b :c1624; + :b :c1625; + :b :c1626; + :b :c1627; + :b :c1628; + :b :c1629; + :b :c1630; + :b :c1631; + :b :c1632; + :b :c1633; + :b :c1634; + :b :c1635; + :b :c1636; + :b :c1637; + :b :c1638; + :b :c1639; + :b :c1640; + :b :c1641; + :b :c1642; + :b :c1643; + :b :c1644; + :b :c1645; + :b :c1646; + :b :c1647; + :b :c1648; + :b :c1649; + :b :c1650; + :b :c1651; + :b :c1652; + :b :c1653; + :b :c1654; + :b :c1655; + :b :c1656; + :b :c1657; + :b :c1658; + :b :c1659; + :b :c1660; + :b :c1661; + :b :c1662; + :b :c1663; + :b :c1664; + :b :c1665; + :b :c1666; + :b :c1667; + :b :c1668; + :b :c1669; + :b :c1670; + :b :c1671; + :b :c1672; + :b :c1673; + :b :c1674; + :b :c1675; + :b :c1676; + :b :c1677; + :b :c1678; + :b :c1679; + :b :c1680; + :b :c1681; + :b :c1682; + :b :c1683; + :b :c1684; + :b :c1685; + :b :c1686; + :b :c1687; + :b :c1688; + :b :c1689; + :b :c1690; + :b :c1691; + :b :c1692; + :b :c1693; + :b :c1694; + :b :c1695; + :b :c1696; + :b :c1697; + :b :c1698; + :b :c1699; + :b :c1700; + :b :c1701; + :b :c1702; + :b :c1703; + :b :c1704; + :b :c1705; + :b :c1706; + :b :c1707; + :b :c1708; + :b :c1709; + :b :c1710; + :b :c1711; + :b :c1712; + :b :c1713; + :b :c1714; + :b :c1715; + :b :c1716; + :b :c1717; + :b :c1718; + :b :c1719; + :b :c1720; + :b :c1721; + :b :c1722; + :b :c1723; + :b :c1724; + :b :c1725; + :b :c1726; + :b :c1727; + :b :c1728; + :b :c1729; + :b :c1730; + :b :c1731; + :b :c1732; + :b :c1733; + :b :c1734; + :b :c1735; + :b :c1736; + :b :c1737; + :b :c1738; + :b :c1739; + :b :c1740; + :b :c1741; + :b :c1742; + :b :c1743; + :b :c1744; + :b :c1745; + :b :c1746; + :b :c1747; + :b :c1748; + :b :c1749; + :b :c1750; + :b :c1751; + :b :c1752; + :b :c1753; + :b :c1754; + :b :c1755; + :b :c1756; + :b :c1757; + :b :c1758; + :b :c1759; + :b :c1760; + :b :c1761; + :b :c1762; + :b :c1763; + :b :c1764; + :b :c1765; + :b :c1766; + :b :c1767; + :b :c1768; + :b :c1769; + :b :c1770; + :b :c1771; + :b :c1772; + :b :c1773; + :b :c1774; + :b :c1775; + :b :c1776; + :b :c1777; + :b :c1778; + :b :c1779; + :b :c1780; + :b :c1781; + :b :c1782; + :b :c1783; + :b :c1784; + :b :c1785; + :b :c1786; + :b :c1787; + :b :c1788; + :b :c1789; + :b :c1790; + :b :c1791; + :b :c1792; + :b :c1793; + :b :c1794; + :b :c1795; + :b :c1796; + :b :c1797; + :b :c1798; + :b :c1799; + :b :c1800; + :b :c1801; + :b :c1802; + :b :c1803; + :b :c1804; + :b :c1805; + :b :c1806; + :b :c1807; + :b :c1808; + :b :c1809; + :b :c1810; + :b :c1811; + :b :c1812; + :b :c1813; + :b :c1814; + :b :c1815; + :b :c1816; + :b :c1817; + :b :c1818; + :b :c1819; + :b :c1820; + :b :c1821; + :b :c1822; + :b :c1823; + :b :c1824; + :b :c1825; + :b :c1826; + :b :c1827; + :b :c1828; + :b :c1829; + :b :c1830; + :b :c1831; + :b :c1832; + :b :c1833; + :b :c1834; + :b :c1835; + :b :c1836; + :b :c1837; + :b :c1838; + :b :c1839; + :b :c1840; + :b :c1841; + :b :c1842; + :b :c1843; + :b :c1844; + :b :c1845; + :b :c1846; + :b :c1847; + :b :c1848; + :b :c1849; + :b :c1850; + :b :c1851; + :b :c1852; + :b :c1853; + :b :c1854; + :b :c1855; + :b :c1856; + :b :c1857; + :b :c1858; + :b :c1859; + :b :c1860; + :b :c1861; + :b :c1862; + :b :c1863; + :b :c1864; + :b :c1865; + :b :c1866; + :b :c1867; + :b :c1868; + :b :c1869; + :b :c1870; + :b :c1871; + :b :c1872; + :b :c1873; + :b :c1874; + :b :c1875; + :b :c1876; + :b :c1877; + :b :c1878; + :b :c1879; + :b :c1880; + :b :c1881; + :b :c1882; + :b :c1883; + :b :c1884; + :b :c1885; + :b :c1886; + :b :c1887; + :b :c1888; + :b :c1889; + :b :c1890; + :b :c1891; + :b :c1892; + :b :c1893; + :b :c1894; + :b :c1895; + :b :c1896; + :b :c1897; + :b :c1898; + :b :c1899; + :b :c1900; + :b :c1901; + :b :c1902; + :b :c1903; + :b :c1904; + :b :c1905; + :b :c1906; + :b :c1907; + :b :c1908; + :b :c1909; + :b :c1910; + :b :c1911; + :b :c1912; + :b :c1913; + :b :c1914; + :b :c1915; + :b :c1916; + :b :c1917; + :b :c1918; + :b :c1919; + :b :c1920; + :b :c1921; + :b :c1922; + :b :c1923; + :b :c1924; + :b :c1925; + :b :c1926; + :b :c1927; + :b :c1928; + :b :c1929; + :b :c1930; + :b :c1931; + :b :c1932; + :b :c1933; + :b :c1934; + :b :c1935; + :b :c1936; + :b :c1937; + :b :c1938; + :b :c1939; + :b :c1940; + :b :c1941; + :b :c1942; + :b :c1943; + :b :c1944; + :b :c1945; + :b :c1946; + :b :c1947; + :b :c1948; + :b :c1949; + :b :c1950; + :b :c1951; + :b :c1952; + :b :c1953; + :b :c1954; + :b :c1955; + :b :c1956; + :b :c1957; + :b :c1958; + :b :c1959; + :b :c1960; + :b :c1961; + :b :c1962; + :b :c1963; + :b :c1964; + :b :c1965; + :b :c1966; + :b :c1967; + :b :c1968; + :b :c1969; + :b :c1970; + :b :c1971; + :b :c1972; + :b :c1973; + :b :c1974; + :b :c1975; + :b :c1976; + :b :c1977; + :b :c1978; + :b :c1979; + :b :c1980; + :b :c1981; + :b :c1982; + :b :c1983; + :b :c1984; + :b :c1985; + :b :c1986; + :b :c1987; + :b :c1988; + :b :c1989; + :b :c1990; + :b :c1991; + :b :c1992; + :b :c1993; + :b :c1994; + :b :c1995; + :b :c1996; + :b :c1997; + :b :c1998; + :b :c1999; + :b :c2000; + :b :c2001; + :b :c2002; + :b :c2003; + :b :c2004; + :b :c2005; + :b :c2006; + :b :c2007; + :b :c2008; + :b :c2009; + :b :c2010; + :b :c2011; + :b :c2012; + :b :c2013; + :b :c2014; + :b :c2015; + :b :c2016; + :b :c2017; + :b :c2018; + :b :c2019; + :b :c2020; + :b :c2021; + :b :c2022; + :b :c2023; + :b :c2024; + :b :c2025; + :b :c2026; + :b :c2027; + :b :c2028; + :b :c2029; + :b :c2030; + :b :c2031; + :b :c2032; + :b :c2033; + :b :c2034; + :b :c2035; + :b :c2036; + :b :c2037; + :b :c2038; + :b :c2039; + :b :c2040; + :b :c2041; + :b :c2042; + :b :c2043; + :b :c2044; + :b :c2045; + :b :c2046; + :b :c2047; + :b :c2048; + :b :c2049; + :b :c2050; + :b :c2051; + :b :c2052; + :b :c2053; + :b :c2054; + :b :c2055; + :b :c2056; + :b :c2057; + :b :c2058; + :b :c2059; + :b :c2060; + :b :c2061; + :b :c2062; + :b :c2063; + :b :c2064; + :b :c2065; + :b :c2066; + :b :c2067; + :b :c2068; + :b :c2069; + :b :c2070; + :b :c2071; + :b :c2072; + :b :c2073; + :b :c2074; + :b :c2075; + :b :c2076; + :b :c2077; + :b :c2078; + :b :c2079; + :b :c2080; + :b :c2081; + :b :c2082; + :b :c2083; + :b :c2084; + :b :c2085; + :b :c2086; + :b :c2087; + :b :c2088; + :b :c2089; + :b :c2090; + :b :c2091; + :b :c2092; + :b :c2093; + :b :c2094; + :b :c2095; + :b :c2096; + :b :c2097; + :b :c2098; + :b :c2099; + :b :c2100; + :b :c2101; + :b :c2102; + :b :c2103; + :b :c2104; + :b :c2105; + :b :c2106; + :b :c2107; + :b :c2108; + :b :c2109; + :b :c2110; + :b :c2111; + :b :c2112; + :b :c2113; + :b :c2114; + :b :c2115; + :b :c2116; + :b :c2117; + :b :c2118; + :b :c2119; + :b :c2120; + :b :c2121; + :b :c2122; + :b :c2123; + :b :c2124; + :b :c2125; + :b :c2126; + :b :c2127; + :b :c2128; + :b :c2129; + :b :c2130; + :b :c2131; + :b :c2132; + :b :c2133; + :b :c2134; + :b :c2135; + :b :c2136; + :b :c2137; + :b :c2138; + :b :c2139; + :b :c2140; + :b :c2141; + :b :c2142; + :b :c2143; + :b :c2144; + :b :c2145; + :b :c2146; + :b :c2147; + :b :c2148; + :b :c2149; + :b :c2150; + :b :c2151; + :b :c2152; + :b :c2153; + :b :c2154; + :b :c2155; + :b :c2156; + :b :c2157; + :b :c2158; + :b :c2159; + :b :c2160; + :b :c2161; + :b :c2162; + :b :c2163; + :b :c2164; + :b :c2165; + :b :c2166; + :b :c2167; + :b :c2168; + :b :c2169; + :b :c2170; + :b :c2171; + :b :c2172; + :b :c2173; + :b :c2174; + :b :c2175; + :b :c2176; + :b :c2177; + :b :c2178; + :b :c2179; + :b :c2180; + :b :c2181; + :b :c2182; + :b :c2183; + :b :c2184; + :b :c2185; + :b :c2186; + :b :c2187; + :b :c2188; + :b :c2189; + :b :c2190; + :b :c2191; + :b :c2192; + :b :c2193; + :b :c2194; + :b :c2195; + :b :c2196; + :b :c2197; + :b :c2198; + :b :c2199; + :b :c2200; + :b :c2201; + :b :c2202; + :b :c2203; + :b :c2204; + :b :c2205; + :b :c2206; + :b :c2207; + :b :c2208; + :b :c2209; + :b :c2210; + :b :c2211; + :b :c2212; + :b :c2213; + :b :c2214; + :b :c2215; + :b :c2216; + :b :c2217; + :b :c2218; + :b :c2219; + :b :c2220; + :b :c2221; + :b :c2222; + :b :c2223; + :b :c2224; + :b :c2225; + :b :c2226; + :b :c2227; + :b :c2228; + :b :c2229; + :b :c2230; + :b :c2231; + :b :c2232; + :b :c2233; + :b :c2234; + :b :c2235; + :b :c2236; + :b :c2237; + :b :c2238; + :b :c2239; + :b :c2240; + :b :c2241; + :b :c2242; + :b :c2243; + :b :c2244; + :b :c2245; + :b :c2246; + :b :c2247; + :b :c2248; + :b :c2249; + :b :c2250; + :b :c2251; + :b :c2252; + :b :c2253; + :b :c2254; + :b :c2255; + :b :c2256; + :b :c2257; + :b :c2258; + :b :c2259; + :b :c2260; + :b :c2261; + :b :c2262; + :b :c2263; + :b :c2264; + :b :c2265; + :b :c2266; + :b :c2267; + :b :c2268; + :b :c2269; + :b :c2270; + :b :c2271; + :b :c2272; + :b :c2273; + :b :c2274; + :b :c2275; + :b :c2276; + :b :c2277; + :b :c2278; + :b :c2279; + :b :c2280; + :b :c2281; + :b :c2282; + :b :c2283; + :b :c2284; + :b :c2285; + :b :c2286; + :b :c2287; + :b :c2288; + :b :c2289; + :b :c2290; + :b :c2291; + :b :c2292; + :b :c2293; + :b :c2294; + :b :c2295; + :b :c2296; + :b :c2297; + :b :c2298; + :b :c2299; + :b :c2300; + :b :c2301; + :b :c2302; + :b :c2303; + :b :c2304; + :b :c2305; + :b :c2306; + :b :c2307; + :b :c2308; + :b :c2309; + :b :c2310; + :b :c2311; + :b :c2312; + :b :c2313; + :b :c2314; + :b :c2315; + :b :c2316; + :b :c2317; + :b :c2318; + :b :c2319; + :b :c2320; + :b :c2321; + :b :c2322; + :b :c2323; + :b :c2324; + :b :c2325; + :b :c2326; + :b :c2327; + :b :c2328; + :b :c2329; + :b :c2330; + :b :c2331; + :b :c2332; + :b :c2333; + :b :c2334; + :b :c2335; + :b :c2336; + :b :c2337; + :b :c2338; + :b :c2339; + :b :c2340; + :b :c2341; + :b :c2342; + :b :c2343; + :b :c2344; + :b :c2345; + :b :c2346; + :b :c2347; + :b :c2348; + :b :c2349; + :b :c2350; + :b :c2351; + :b :c2352; + :b :c2353; + :b :c2354; + :b :c2355; + :b :c2356; + :b :c2357; + :b :c2358; + :b :c2359; + :b :c2360; + :b :c2361; + :b :c2362; + :b :c2363; + :b :c2364; + :b :c2365; + :b :c2366; + :b :c2367; + :b :c2368; + :b :c2369; + :b :c2370; + :b :c2371; + :b :c2372; + :b :c2373; + :b :c2374; + :b :c2375; + :b :c2376; + :b :c2377; + :b :c2378; + :b :c2379; + :b :c2380; + :b :c2381; + :b :c2382; + :b :c2383; + :b :c2384; + :b :c2385; + :b :c2386; + :b :c2387; + :b :c2388; + :b :c2389; + :b :c2390; + :b :c2391; + :b :c2392; + :b :c2393; + :b :c2394; + :b :c2395; + :b :c2396; + :b :c2397; + :b :c2398; + :b :c2399; + :b :c2400; + :b :c2401; + :b :c2402; + :b :c2403; + :b :c2404; + :b :c2405; + :b :c2406; + :b :c2407; + :b :c2408; + :b :c2409; + :b :c2410; + :b :c2411; + :b :c2412; + :b :c2413; + :b :c2414; + :b :c2415; + :b :c2416; + :b :c2417; + :b :c2418; + :b :c2419; + :b :c2420; + :b :c2421; + :b :c2422; + :b :c2423; + :b :c2424; + :b :c2425; + :b :c2426; + :b :c2427; + :b :c2428; + :b :c2429; + :b :c2430; + :b :c2431; + :b :c2432; + :b :c2433; + :b :c2434; + :b :c2435; + :b :c2436; + :b :c2437; + :b :c2438; + :b :c2439; + :b :c2440; + :b :c2441; + :b :c2442; + :b :c2443; + :b :c2444; + :b :c2445; + :b :c2446; + :b :c2447; + :b :c2448; + :b :c2449; + :b :c2450; + :b :c2451; + :b :c2452; + :b :c2453; + :b :c2454; + :b :c2455; + :b :c2456; + :b :c2457; + :b :c2458; + :b :c2459; + :b :c2460; + :b :c2461; + :b :c2462; + :b :c2463; + :b :c2464; + :b :c2465; + :b :c2466; + :b :c2467; + :b :c2468; + :b :c2469; + :b :c2470; + :b :c2471; + :b :c2472; + :b :c2473; + :b :c2474; + :b :c2475; + :b :c2476; + :b :c2477; + :b :c2478; + :b :c2479; + :b :c2480; + :b :c2481; + :b :c2482; + :b :c2483; + :b :c2484; + :b :c2485; + :b :c2486; + :b :c2487; + :b :c2488; + :b :c2489; + :b :c2490; + :b :c2491; + :b :c2492; + :b :c2493; + :b :c2494; + :b :c2495; + :b :c2496; + :b :c2497; + :b :c2498; + :b :c2499; + :b :c2500; + :b :c2501; + :b :c2502; + :b :c2503; + :b :c2504; + :b :c2505; + :b :c2506; + :b :c2507; + :b :c2508; + :b :c2509; + :b :c2510; + :b :c2511; + :b :c2512; + :b :c2513; + :b :c2514; + :b :c2515; + :b :c2516; + :b :c2517; + :b :c2518; + :b :c2519; + :b :c2520; + :b :c2521; + :b :c2522; + :b :c2523; + :b :c2524; + :b :c2525; + :b :c2526; + :b :c2527; + :b :c2528; + :b :c2529; + :b :c2530; + :b :c2531; + :b :c2532; + :b :c2533; + :b :c2534; + :b :c2535; + :b :c2536; + :b :c2537; + :b :c2538; + :b :c2539; + :b :c2540; + :b :c2541; + :b :c2542; + :b :c2543; + :b :c2544; + :b :c2545; + :b :c2546; + :b :c2547; + :b :c2548; + :b :c2549; + :b :c2550; + :b :c2551; + :b :c2552; + :b :c2553; + :b :c2554; + :b :c2555; + :b :c2556; + :b :c2557; + :b :c2558; + :b :c2559; + :b :c2560; + :b :c2561; + :b :c2562; + :b :c2563; + :b :c2564; + :b :c2565; + :b :c2566; + :b :c2567; + :b :c2568; + :b :c2569; + :b :c2570; + :b :c2571; + :b :c2572; + :b :c2573; + :b :c2574; + :b :c2575; + :b :c2576; + :b :c2577; + :b :c2578; + :b :c2579; + :b :c2580; + :b :c2581; + :b :c2582; + :b :c2583; + :b :c2584; + :b :c2585; + :b :c2586; + :b :c2587; + :b :c2588; + :b :c2589; + :b :c2590; + :b :c2591; + :b :c2592; + :b :c2593; + :b :c2594; + :b :c2595; + :b :c2596; + :b :c2597; + :b :c2598; + :b :c2599; + :b :c2600; + :b :c2601; + :b :c2602; + :b :c2603; + :b :c2604; + :b :c2605; + :b :c2606; + :b :c2607; + :b :c2608; + :b :c2609; + :b :c2610; + :b :c2611; + :b :c2612; + :b :c2613; + :b :c2614; + :b :c2615; + :b :c2616; + :b :c2617; + :b :c2618; + :b :c2619; + :b :c2620; + :b :c2621; + :b :c2622; + :b :c2623; + :b :c2624; + :b :c2625; + :b :c2626; + :b :c2627; + :b :c2628; + :b :c2629; + :b :c2630; + :b :c2631; + :b :c2632; + :b :c2633; + :b :c2634; + :b :c2635; + :b :c2636; + :b :c2637; + :b :c2638; + :b :c2639; + :b :c2640; + :b :c2641; + :b :c2642; + :b :c2643; + :b :c2644; + :b :c2645; + :b :c2646; + :b :c2647; + :b :c2648; + :b :c2649; + :b :c2650; + :b :c2651; + :b :c2652; + :b :c2653; + :b :c2654; + :b :c2655; + :b :c2656; + :b :c2657; + :b :c2658; + :b :c2659; + :b :c2660; + :b :c2661; + :b :c2662; + :b :c2663; + :b :c2664; + :b :c2665; + :b :c2666; + :b :c2667; + :b :c2668; + :b :c2669; + :b :c2670; + :b :c2671; + :b :c2672; + :b :c2673; + :b :c2674; + :b :c2675; + :b :c2676; + :b :c2677; + :b :c2678; + :b :c2679; + :b :c2680; + :b :c2681; + :b :c2682; + :b :c2683; + :b :c2684; + :b :c2685; + :b :c2686; + :b :c2687; + :b :c2688; + :b :c2689; + :b :c2690; + :b :c2691; + :b :c2692; + :b :c2693; + :b :c2694; + :b :c2695; + :b :c2696; + :b :c2697; + :b :c2698; + :b :c2699; + :b :c2700; + :b :c2701; + :b :c2702; + :b :c2703; + :b :c2704; + :b :c2705; + :b :c2706; + :b :c2707; + :b :c2708; + :b :c2709; + :b :c2710; + :b :c2711; + :b :c2712; + :b :c2713; + :b :c2714; + :b :c2715; + :b :c2716; + :b :c2717; + :b :c2718; + :b :c2719; + :b :c2720; + :b :c2721; + :b :c2722; + :b :c2723; + :b :c2724; + :b :c2725; + :b :c2726; + :b :c2727; + :b :c2728; + :b :c2729; + :b :c2730; + :b :c2731; + :b :c2732; + :b :c2733; + :b :c2734; + :b :c2735; + :b :c2736; + :b :c2737; + :b :c2738; + :b :c2739; + :b :c2740; + :b :c2741; + :b :c2742; + :b :c2743; + :b :c2744; + :b :c2745; + :b :c2746; + :b :c2747; + :b :c2748; + :b :c2749; + :b :c2750; + :b :c2751; + :b :c2752; + :b :c2753; + :b :c2754; + :b :c2755; + :b :c2756; + :b :c2757; + :b :c2758; + :b :c2759; + :b :c2760; + :b :c2761; + :b :c2762; + :b :c2763; + :b :c2764; + :b :c2765; + :b :c2766; + :b :c2767; + :b :c2768; + :b :c2769; + :b :c2770; + :b :c2771; + :b :c2772; + :b :c2773; + :b :c2774; + :b :c2775; + :b :c2776; + :b :c2777; + :b :c2778; + :b :c2779; + :b :c2780; + :b :c2781; + :b :c2782; + :b :c2783; + :b :c2784; + :b :c2785; + :b :c2786; + :b :c2787; + :b :c2788; + :b :c2789; + :b :c2790; + :b :c2791; + :b :c2792; + :b :c2793; + :b :c2794; + :b :c2795; + :b :c2796; + :b :c2797; + :b :c2798; + :b :c2799; + :b :c2800; + :b :c2801; + :b :c2802; + :b :c2803; + :b :c2804; + :b :c2805; + :b :c2806; + :b :c2807; + :b :c2808; + :b :c2809; + :b :c2810; + :b :c2811; + :b :c2812; + :b :c2813; + :b :c2814; + :b :c2815; + :b :c2816; + :b :c2817; + :b :c2818; + :b :c2819; + :b :c2820; + :b :c2821; + :b :c2822; + :b :c2823; + :b :c2824; + :b :c2825; + :b :c2826; + :b :c2827; + :b :c2828; + :b :c2829; + :b :c2830; + :b :c2831; + :b :c2832; + :b :c2833; + :b :c2834; + :b :c2835; + :b :c2836; + :b :c2837; + :b :c2838; + :b :c2839; + :b :c2840; + :b :c2841; + :b :c2842; + :b :c2843; + :b :c2844; + :b :c2845; + :b :c2846; + :b :c2847; + :b :c2848; + :b :c2849; + :b :c2850; + :b :c2851; + :b :c2852; + :b :c2853; + :b :c2854; + :b :c2855; + :b :c2856; + :b :c2857; + :b :c2858; + :b :c2859; + :b :c2860; + :b :c2861; + :b :c2862; + :b :c2863; + :b :c2864; + :b :c2865; + :b :c2866; + :b :c2867; + :b :c2868; + :b :c2869; + :b :c2870; + :b :c2871; + :b :c2872; + :b :c2873; + :b :c2874; + :b :c2875; + :b :c2876; + :b :c2877; + :b :c2878; + :b :c2879; + :b :c2880; + :b :c2881; + :b :c2882; + :b :c2883; + :b :c2884; + :b :c2885; + :b :c2886; + :b :c2887; + :b :c2888; + :b :c2889; + :b :c2890; + :b :c2891; + :b :c2892; + :b :c2893; + :b :c2894; + :b :c2895; + :b :c2896; + :b :c2897; + :b :c2898; + :b :c2899; + :b :c2900; + :b :c2901; + :b :c2902; + :b :c2903; + :b :c2904; + :b :c2905; + :b :c2906; + :b :c2907; + :b :c2908; + :b :c2909; + :b :c2910; + :b :c2911; + :b :c2912; + :b :c2913; + :b :c2914; + :b :c2915; + :b :c2916; + :b :c2917; + :b :c2918; + :b :c2919; + :b :c2920; + :b :c2921; + :b :c2922; + :b :c2923; + :b :c2924; + :b :c2925; + :b :c2926; + :b :c2927; + :b :c2928; + :b :c2929; + :b :c2930; + :b :c2931; + :b :c2932; + :b :c2933; + :b :c2934; + :b :c2935; + :b :c2936; + :b :c2937; + :b :c2938; + :b :c2939; + :b :c2940; + :b :c2941; + :b :c2942; + :b :c2943; + :b :c2944; + :b :c2945; + :b :c2946; + :b :c2947; + :b :c2948; + :b :c2949; + :b :c2950; + :b :c2951; + :b :c2952; + :b :c2953; + :b :c2954; + :b :c2955; + :b :c2956; + :b :c2957; + :b :c2958; + :b :c2959; + :b :c2960; + :b :c2961; + :b :c2962; + :b :c2963; + :b :c2964; + :b :c2965; + :b :c2966; + :b :c2967; + :b :c2968; + :b :c2969; + :b :c2970; + :b :c2971; + :b :c2972; + :b :c2973; + :b :c2974; + :b :c2975; + :b :c2976; + :b :c2977; + :b :c2978; + :b :c2979; + :b :c2980; + :b :c2981; + :b :c2982; + :b :c2983; + :b :c2984; + :b :c2985; + :b :c2986; + :b :c2987; + :b :c2988; + :b :c2989; + :b :c2990; + :b :c2991; + :b :c2992; + :b :c2993; + :b :c2994; + :b :c2995; + :b :c2996; + :b :c2997; + :b :c2998; + :b :c2999; + :b :c3000; + :b :c3001; + :b :c3002; + :b :c3003; + :b :c3004; + :b :c3005; + :b :c3006; + :b :c3007; + :b :c3008; + :b :c3009; + :b :c3010; + :b :c3011; + :b :c3012; + :b :c3013; + :b :c3014; + :b :c3015; + :b :c3016; + :b :c3017; + :b :c3018; + :b :c3019; + :b :c3020; + :b :c3021; + :b :c3022; + :b :c3023; + :b :c3024; + :b :c3025; + :b :c3026; + :b :c3027; + :b :c3028; + :b :c3029; + :b :c3030; + :b :c3031; + :b :c3032; + :b :c3033; + :b :c3034; + :b :c3035; + :b :c3036; + :b :c3037; + :b :c3038; + :b :c3039; + :b :c3040; + :b :c3041; + :b :c3042; + :b :c3043; + :b :c3044; + :b :c3045; + :b :c3046; + :b :c3047; + :b :c3048; + :b :c3049; + :b :c3050; + :b :c3051; + :b :c3052; + :b :c3053; + :b :c3054; + :b :c3055; + :b :c3056; + :b :c3057; + :b :c3058; + :b :c3059; + :b :c3060; + :b :c3061; + :b :c3062; + :b :c3063; + :b :c3064; + :b :c3065; + :b :c3066; + :b :c3067; + :b :c3068; + :b :c3069; + :b :c3070; + :b :c3071; + :b :c3072; + :b :c3073; + :b :c3074; + :b :c3075; + :b :c3076; + :b :c3077; + :b :c3078; + :b :c3079; + :b :c3080; + :b :c3081; + :b :c3082; + :b :c3083; + :b :c3084; + :b :c3085; + :b :c3086; + :b :c3087; + :b :c3088; + :b :c3089; + :b :c3090; + :b :c3091; + :b :c3092; + :b :c3093; + :b :c3094; + :b :c3095; + :b :c3096; + :b :c3097; + :b :c3098; + :b :c3099; + :b :c3100; + :b :c3101; + :b :c3102; + :b :c3103; + :b :c3104; + :b :c3105; + :b :c3106; + :b :c3107; + :b :c3108; + :b :c3109; + :b :c3110; + :b :c3111; + :b :c3112; + :b :c3113; + :b :c3114; + :b :c3115; + :b :c3116; + :b :c3117; + :b :c3118; + :b :c3119; + :b :c3120; + :b :c3121; + :b :c3122; + :b :c3123; + :b :c3124; + :b :c3125; + :b :c3126; + :b :c3127; + :b :c3128; + :b :c3129; + :b :c3130; + :b :c3131; + :b :c3132; + :b :c3133; + :b :c3134; + :b :c3135; + :b :c3136; + :b :c3137; + :b :c3138; + :b :c3139; + :b :c3140; + :b :c3141; + :b :c3142; + :b :c3143; + :b :c3144; + :b :c3145; + :b :c3146; + :b :c3147; + :b :c3148; + :b :c3149; + :b :c3150; + :b :c3151; + :b :c3152; + :b :c3153; + :b :c3154; + :b :c3155; + :b :c3156; + :b :c3157; + :b :c3158; + :b :c3159; + :b :c3160; + :b :c3161; + :b :c3162; + :b :c3163; + :b :c3164; + :b :c3165; + :b :c3166; + :b :c3167; + :b :c3168; + :b :c3169; + :b :c3170; + :b :c3171; + :b :c3172; + :b :c3173; + :b :c3174; + :b :c3175; + :b :c3176; + :b :c3177; + :b :c3178; + :b :c3179; + :b :c3180; + :b :c3181; + :b :c3182; + :b :c3183; + :b :c3184; + :b :c3185; + :b :c3186; + :b :c3187; + :b :c3188; + :b :c3189; + :b :c3190; + :b :c3191; + :b :c3192; + :b :c3193; + :b :c3194; + :b :c3195; + :b :c3196; + :b :c3197; + :b :c3198; + :b :c3199; + :b :c3200; + :b :c3201; + :b :c3202; + :b :c3203; + :b :c3204; + :b :c3205; + :b :c3206; + :b :c3207; + :b :c3208; + :b :c3209; + :b :c3210; + :b :c3211; + :b :c3212; + :b :c3213; + :b :c3214; + :b :c3215; + :b :c3216; + :b :c3217; + :b :c3218; + :b :c3219; + :b :c3220; + :b :c3221; + :b :c3222; + :b :c3223; + :b :c3224; + :b :c3225; + :b :c3226; + :b :c3227; + :b :c3228; + :b :c3229; + :b :c3230; + :b :c3231; + :b :c3232; + :b :c3233; + :b :c3234; + :b :c3235; + :b :c3236; + :b :c3237; + :b :c3238; + :b :c3239; + :b :c3240; + :b :c3241; + :b :c3242; + :b :c3243; + :b :c3244; + :b :c3245; + :b :c3246; + :b :c3247; + :b :c3248; + :b :c3249; + :b :c3250; + :b :c3251; + :b :c3252; + :b :c3253; + :b :c3254; + :b :c3255; + :b :c3256; + :b :c3257; + :b :c3258; + :b :c3259; + :b :c3260; + :b :c3261; + :b :c3262; + :b :c3263; + :b :c3264; + :b :c3265; + :b :c3266; + :b :c3267; + :b :c3268; + :b :c3269; + :b :c3270; + :b :c3271; + :b :c3272; + :b :c3273; + :b :c3274; + :b :c3275; + :b :c3276; + :b :c3277; + :b :c3278; + :b :c3279; + :b :c3280; + :b :c3281; + :b :c3282; + :b :c3283; + :b :c3284; + :b :c3285; + :b :c3286; + :b :c3287; + :b :c3288; + :b :c3289; + :b :c3290; + :b :c3291; + :b :c3292; + :b :c3293; + :b :c3294; + :b :c3295; + :b :c3296; + :b :c3297; + :b :c3298; + :b :c3299; + :b :c3300; + :b :c3301; + :b :c3302; + :b :c3303; + :b :c3304; + :b :c3305; + :b :c3306; + :b :c3307; + :b :c3308; + :b :c3309; + :b :c3310; + :b :c3311; + :b :c3312; + :b :c3313; + :b :c3314; + :b :c3315; + :b :c3316; + :b :c3317; + :b :c3318; + :b :c3319; + :b :c3320; + :b :c3321; + :b :c3322; + :b :c3323; + :b :c3324; + :b :c3325; + :b :c3326; + :b :c3327; + :b :c3328; + :b :c3329; + :b :c3330; + :b :c3331; + :b :c3332; + :b :c3333; + :b :c3334; + :b :c3335; + :b :c3336; + :b :c3337; + :b :c3338; + :b :c3339; + :b :c3340; + :b :c3341; + :b :c3342; + :b :c3343; + :b :c3344; + :b :c3345; + :b :c3346; + :b :c3347; + :b :c3348; + :b :c3349; + :b :c3350; + :b :c3351; + :b :c3352; + :b :c3353; + :b :c3354; + :b :c3355; + :b :c3356; + :b :c3357; + :b :c3358; + :b :c3359; + :b :c3360; + :b :c3361; + :b :c3362; + :b :c3363; + :b :c3364; + :b :c3365; + :b :c3366; + :b :c3367; + :b :c3368; + :b :c3369; + :b :c3370; + :b :c3371; + :b :c3372; + :b :c3373; + :b :c3374; + :b :c3375; + :b :c3376; + :b :c3377; + :b :c3378; + :b :c3379; + :b :c3380; + :b :c3381; + :b :c3382; + :b :c3383; + :b :c3384; + :b :c3385; + :b :c3386; + :b :c3387; + :b :c3388; + :b :c3389; + :b :c3390; + :b :c3391; + :b :c3392; + :b :c3393; + :b :c3394; + :b :c3395; + :b :c3396; + :b :c3397; + :b :c3398; + :b :c3399; + :b :c3400; + :b :c3401; + :b :c3402; + :b :c3403; + :b :c3404; + :b :c3405; + :b :c3406; + :b :c3407; + :b :c3408; + :b :c3409; + :b :c3410; + :b :c3411; + :b :c3412; + :b :c3413; + :b :c3414; + :b :c3415; + :b :c3416; + :b :c3417; + :b :c3418; + :b :c3419; + :b :c3420; + :b :c3421; + :b :c3422; + :b :c3423; + :b :c3424; + :b :c3425; + :b :c3426; + :b :c3427; + :b :c3428; + :b :c3429; + :b :c3430; + :b :c3431; + :b :c3432; + :b :c3433; + :b :c3434; + :b :c3435; + :b :c3436; + :b :c3437; + :b :c3438; + :b :c3439; + :b :c3440; + :b :c3441; + :b :c3442; + :b :c3443; + :b :c3444; + :b :c3445; + :b :c3446; + :b :c3447; + :b :c3448; + :b :c3449; + :b :c3450; + :b :c3451; + :b :c3452; + :b :c3453; + :b :c3454; + :b :c3455; + :b :c3456; + :b :c3457; + :b :c3458; + :b :c3459; + :b :c3460; + :b :c3461; + :b :c3462; + :b :c3463; + :b :c3464; + :b :c3465; + :b :c3466; + :b :c3467; + :b :c3468; + :b :c3469; + :b :c3470; + :b :c3471; + :b :c3472; + :b :c3473; + :b :c3474; + :b :c3475; + :b :c3476; + :b :c3477; + :b :c3478; + :b :c3479; + :b :c3480; + :b :c3481; + :b :c3482; + :b :c3483; + :b :c3484; + :b :c3485; + :b :c3486; + :b :c3487; + :b :c3488; + :b :c3489; + :b :c3490; + :b :c3491; + :b :c3492; + :b :c3493; + :b :c3494; + :b :c3495; + :b :c3496; + :b :c3497; + :b :c3498; + :b :c3499; + :b :c3500; + :b :c3501; + :b :c3502; + :b :c3503; + :b :c3504; + :b :c3505; + :b :c3506; + :b :c3507; + :b :c3508; + :b :c3509; + :b :c3510; + :b :c3511; + :b :c3512; + :b :c3513; + :b :c3514; + :b :c3515; + :b :c3516; + :b :c3517; + :b :c3518; + :b :c3519; + :b :c3520; + :b :c3521; + :b :c3522; + :b :c3523; + :b :c3524; + :b :c3525; + :b :c3526; + :b :c3527; + :b :c3528; + :b :c3529; + :b :c3530; + :b :c3531; + :b :c3532; + :b :c3533; + :b :c3534; + :b :c3535; + :b :c3536; + :b :c3537; + :b :c3538; + :b :c3539; + :b :c3540; + :b :c3541; + :b :c3542; + :b :c3543; + :b :c3544; + :b :c3545; + :b :c3546; + :b :c3547; + :b :c3548; + :b :c3549; + :b :c3550; + :b :c3551; + :b :c3552; + :b :c3553; + :b :c3554; + :b :c3555; + :b :c3556; + :b :c3557; + :b :c3558; + :b :c3559; + :b :c3560; + :b :c3561; + :b :c3562; + :b :c3563; + :b :c3564; + :b :c3565; + :b :c3566; + :b :c3567; + :b :c3568; + :b :c3569; + :b :c3570; + :b :c3571; + :b :c3572; + :b :c3573; + :b :c3574; + :b :c3575; + :b :c3576; + :b :c3577; + :b :c3578; + :b :c3579; + :b :c3580; + :b :c3581; + :b :c3582; + :b :c3583; + :b :c3584; + :b :c3585; + :b :c3586; + :b :c3587; + :b :c3588; + :b :c3589; + :b :c3590; + :b :c3591; + :b :c3592; + :b :c3593; + :b :c3594; + :b :c3595; + :b :c3596; + :b :c3597; + :b :c3598; + :b :c3599; + :b :c3600; + :b :c3601; + :b :c3602; + :b :c3603; + :b :c3604; + :b :c3605; + :b :c3606; + :b :c3607; + :b :c3608; + :b :c3609; + :b :c3610; + :b :c3611; + :b :c3612; + :b :c3613; + :b :c3614; + :b :c3615; + :b :c3616; + :b :c3617; + :b :c3618; + :b :c3619; + :b :c3620; + :b :c3621; + :b :c3622; + :b :c3623; + :b :c3624; + :b :c3625; + :b :c3626; + :b :c3627; + :b :c3628; + :b :c3629; + :b :c3630; + :b :c3631; + :b :c3632; + :b :c3633; + :b :c3634; + :b :c3635; + :b :c3636; + :b :c3637; + :b :c3638; + :b :c3639; + :b :c3640; + :b :c3641; + :b :c3642; + :b :c3643; + :b :c3644; + :b :c3645; + :b :c3646; + :b :c3647; + :b :c3648; + :b :c3649; + :b :c3650; + :b :c3651; + :b :c3652; + :b :c3653; + :b :c3654; + :b :c3655; + :b :c3656; + :b :c3657; + :b :c3658; + :b :c3659; + :b :c3660; + :b :c3661; + :b :c3662; + :b :c3663; + :b :c3664; + :b :c3665; + :b :c3666; + :b :c3667; + :b :c3668; + :b :c3669; + :b :c3670; + :b :c3671; + :b :c3672; + :b :c3673; + :b :c3674; + :b :c3675; + :b :c3676; + :b :c3677; + :b :c3678; + :b :c3679; + :b :c3680; + :b :c3681; + :b :c3682; + :b :c3683; + :b :c3684; + :b :c3685; + :b :c3686; + :b :c3687; + :b :c3688; + :b :c3689; + :b :c3690; + :b :c3691; + :b :c3692; + :b :c3693; + :b :c3694; + :b :c3695; + :b :c3696; + :b :c3697; + :b :c3698; + :b :c3699; + :b :c3700; + :b :c3701; + :b :c3702; + :b :c3703; + :b :c3704; + :b :c3705; + :b :c3706; + :b :c3707; + :b :c3708; + :b :c3709; + :b :c3710; + :b :c3711; + :b :c3712; + :b :c3713; + :b :c3714; + :b :c3715; + :b :c3716; + :b :c3717; + :b :c3718; + :b :c3719; + :b :c3720; + :b :c3721; + :b :c3722; + :b :c3723; + :b :c3724; + :b :c3725; + :b :c3726; + :b :c3727; + :b :c3728; + :b :c3729; + :b :c3730; + :b :c3731; + :b :c3732; + :b :c3733; + :b :c3734; + :b :c3735; + :b :c3736; + :b :c3737; + :b :c3738; + :b :c3739; + :b :c3740; + :b :c3741; + :b :c3742; + :b :c3743; + :b :c3744; + :b :c3745; + :b :c3746; + :b :c3747; + :b :c3748; + :b :c3749; + :b :c3750; + :b :c3751; + :b :c3752; + :b :c3753; + :b :c3754; + :b :c3755; + :b :c3756; + :b :c3757; + :b :c3758; + :b :c3759; + :b :c3760; + :b :c3761; + :b :c3762; + :b :c3763; + :b :c3764; + :b :c3765; + :b :c3766; + :b :c3767; + :b :c3768; + :b :c3769; + :b :c3770; + :b :c3771; + :b :c3772; + :b :c3773; + :b :c3774; + :b :c3775; + :b :c3776; + :b :c3777; + :b :c3778; + :b :c3779; + :b :c3780; + :b :c3781; + :b :c3782; + :b :c3783; + :b :c3784; + :b :c3785; + :b :c3786; + :b :c3787; + :b :c3788; + :b :c3789; + :b :c3790; + :b :c3791; + :b :c3792; + :b :c3793; + :b :c3794; + :b :c3795; + :b :c3796; + :b :c3797; + :b :c3798; + :b :c3799; + :b :c3800; + :b :c3801; + :b :c3802; + :b :c3803; + :b :c3804; + :b :c3805; + :b :c3806; + :b :c3807; + :b :c3808; + :b :c3809; + :b :c3810; + :b :c3811; + :b :c3812; + :b :c3813; + :b :c3814; + :b :c3815; + :b :c3816; + :b :c3817; + :b :c3818; + :b :c3819; + :b :c3820; + :b :c3821; + :b :c3822; + :b :c3823; + :b :c3824; + :b :c3825; + :b :c3826; + :b :c3827; + :b :c3828; + :b :c3829; + :b :c3830; + :b :c3831; + :b :c3832; + :b :c3833; + :b :c3834; + :b :c3835; + :b :c3836; + :b :c3837; + :b :c3838; + :b :c3839; + :b :c3840; + :b :c3841; + :b :c3842; + :b :c3843; + :b :c3844; + :b :c3845; + :b :c3846; + :b :c3847; + :b :c3848; + :b :c3849; + :b :c3850; + :b :c3851; + :b :c3852; + :b :c3853; + :b :c3854; + :b :c3855; + :b :c3856; + :b :c3857; + :b :c3858; + :b :c3859; + :b :c3860; + :b :c3861; + :b :c3862; + :b :c3863; + :b :c3864; + :b :c3865; + :b :c3866; + :b :c3867; + :b :c3868; + :b :c3869; + :b :c3870; + :b :c3871; + :b :c3872; + :b :c3873; + :b :c3874; + :b :c3875; + :b :c3876; + :b :c3877; + :b :c3878; + :b :c3879; + :b :c3880; + :b :c3881; + :b :c3882; + :b :c3883; + :b :c3884; + :b :c3885; + :b :c3886; + :b :c3887; + :b :c3888; + :b :c3889; + :b :c3890; + :b :c3891; + :b :c3892; + :b :c3893; + :b :c3894; + :b :c3895; + :b :c3896; + :b :c3897; + :b :c3898; + :b :c3899; + :b :c3900; + :b :c3901; + :b :c3902; + :b :c3903; + :b :c3904; + :b :c3905; + :b :c3906; + :b :c3907; + :b :c3908; + :b :c3909; + :b :c3910; + :b :c3911; + :b :c3912; + :b :c3913; + :b :c3914; + :b :c3915; + :b :c3916; + :b :c3917; + :b :c3918; + :b :c3919; + :b :c3920; + :b :c3921; + :b :c3922; + :b :c3923; + :b :c3924; + :b :c3925; + :b :c3926; + :b :c3927; + :b :c3928; + :b :c3929; + :b :c3930; + :b :c3931; + :b :c3932; + :b :c3933; + :b :c3934; + :b :c3935; + :b :c3936; + :b :c3937; + :b :c3938; + :b :c3939; + :b :c3940; + :b :c3941; + :b :c3942; + :b :c3943; + :b :c3944; + :b :c3945; + :b :c3946; + :b :c3947; + :b :c3948; + :b :c3949; + :b :c3950; + :b :c3951; + :b :c3952; + :b :c3953; + :b :c3954; + :b :c3955; + :b :c3956; + :b :c3957; + :b :c3958; + :b :c3959; + :b :c3960; + :b :c3961; + :b :c3962; + :b :c3963; + :b :c3964; + :b :c3965; + :b :c3966; + :b :c3967; + :b :c3968; + :b :c3969; + :b :c3970; + :b :c3971; + :b :c3972; + :b :c3973; + :b :c3974; + :b :c3975; + :b :c3976; + :b :c3977; + :b :c3978; + :b :c3979; + :b :c3980; + :b :c3981; + :b :c3982; + :b :c3983; + :b :c3984; + :b :c3985; + :b :c3986; + :b :c3987; + :b :c3988; + :b :c3989; + :b :c3990; + :b :c3991; + :b :c3992; + :b :c3993; + :b :c3994; + :b :c3995; + :b :c3996; + :b :c3997; + :b :c3998; + :b :c3999; + :b :c4000; + :b :c4001; + :b :c4002; + :b :c4003; + :b :c4004; + :b :c4005; + :b :c4006; + :b :c4007; + :b :c4008; + :b :c4009; + :b :c4010; + :b :c4011; + :b :c4012; + :b :c4013; + :b :c4014; + :b :c4015; + :b :c4016; + :b :c4017; + :b :c4018; + :b :c4019; + :b :c4020; + :b :c4021; + :b :c4022; + :b :c4023; + :b :c4024; + :b :c4025; + :b :c4026; + :b :c4027; + :b :c4028; + :b :c4029; + :b :c4030; + :b :c4031; + :b :c4032; + :b :c4033; + :b :c4034; + :b :c4035; + :b :c4036; + :b :c4037; + :b :c4038; + :b :c4039; + :b :c4040; + :b :c4041; + :b :c4042; + :b :c4043; + :b :c4044; + :b :c4045; + :b :c4046; + :b :c4047; + :b :c4048; + :b :c4049; + :b :c4050; + :b :c4051; + :b :c4052; + :b :c4053; + :b :c4054; + :b :c4055; + :b :c4056; + :b :c4057; + :b :c4058; + :b :c4059; + :b :c4060; + :b :c4061; + :b :c4062; + :b :c4063; + :b :c4064; + :b :c4065; + :b :c4066; + :b :c4067; + :b :c4068; + :b :c4069; + :b :c4070; + :b :c4071; + :b :c4072; + :b :c4073; + :b :c4074; + :b :c4075; + :b :c4076; + :b :c4077; + :b :c4078; + :b :c4079; + :b :c4080; + :b :c4081; + :b :c4082; + :b :c4083; + :b :c4084; + :b :c4085; + :b :c4086; + :b :c4087; + :b :c4088; + :b :c4089; + :b :c4090; + :b :c4091; + :b :c4092; + :b :c4093; + :b :c4094; + :b :c4095; + :b :c4096; + :b :c4097; + :b :c4098; + :b :c4099; + :b :c4100; + :b :c4101; + :b :c4102; + :b :c4103; + :b :c4104; + :b :c4105; + :b :c4106; + :b :c4107; + :b :c4108; + :b :c4109; + :b :c4110; + :b :c4111; + :b :c4112; + :b :c4113; + :b :c4114; + :b :c4115; + :b :c4116; + :b :c4117; + :b :c4118; + :b :c4119; + :b :c4120; + :b :c4121; + :b :c4122; + :b :c4123; + :b :c4124; + :b :c4125; + :b :c4126; + :b :c4127; + :b :c4128; + :b :c4129; + :b :c4130; + :b :c4131; + :b :c4132; + :b :c4133; + :b :c4134; + :b :c4135; + :b :c4136; + :b :c4137; + :b :c4138; + :b :c4139; + :b :c4140; + :b :c4141; + :b :c4142; + :b :c4143; + :b :c4144; + :b :c4145; + :b :c4146; + :b :c4147; + :b :c4148; + :b :c4149; + :b :c4150; + :b :c4151; + :b :c4152; + :b :c4153; + :b :c4154; + :b :c4155; + :b :c4156; + :b :c4157; + :b :c4158; + :b :c4159; + :b :c4160; + :b :c4161; + :b :c4162; + :b :c4163; + :b :c4164; + :b :c4165; + :b :c4166; + :b :c4167; + :b :c4168; + :b :c4169; + :b :c4170; + :b :c4171; + :b :c4172; + :b :c4173; + :b :c4174; + :b :c4175; + :b :c4176; + :b :c4177; + :b :c4178; + :b :c4179; + :b :c4180; + :b :c4181; + :b :c4182; + :b :c4183; + :b :c4184; + :b :c4185; + :b :c4186; + :b :c4187; + :b :c4188; + :b :c4189; + :b :c4190; + :b :c4191; + :b :c4192; + :b :c4193; + :b :c4194; + :b :c4195; + :b :c4196; + :b :c4197; + :b :c4198; + :b :c4199; + :b :c4200; + :b :c4201; + :b :c4202; + :b :c4203; + :b :c4204; + :b :c4205; + :b :c4206; + :b :c4207; + :b :c4208; + :b :c4209; + :b :c4210; + :b :c4211; + :b :c4212; + :b :c4213; + :b :c4214; + :b :c4215; + :b :c4216; + :b :c4217; + :b :c4218; + :b :c4219; + :b :c4220; + :b :c4221; + :b :c4222; + :b :c4223; + :b :c4224; + :b :c4225; + :b :c4226; + :b :c4227; + :b :c4228; + :b :c4229; + :b :c4230; + :b :c4231; + :b :c4232; + :b :c4233; + :b :c4234; + :b :c4235; + :b :c4236; + :b :c4237; + :b :c4238; + :b :c4239; + :b :c4240; + :b :c4241; + :b :c4242; + :b :c4243; + :b :c4244; + :b :c4245; + :b :c4246; + :b :c4247; + :b :c4248; + :b :c4249; + :b :c4250; + :b :c4251; + :b :c4252; + :b :c4253; + :b :c4254; + :b :c4255; + :b :c4256; + :b :c4257; + :b :c4258; + :b :c4259; + :b :c4260; + :b :c4261; + :b :c4262; + :b :c4263; + :b :c4264; + :b :c4265; + :b :c4266; + :b :c4267; + :b :c4268; + :b :c4269; + :b :c4270; + :b :c4271; + :b :c4272; + :b :c4273; + :b :c4274; + :b :c4275; + :b :c4276; + :b :c4277; + :b :c4278; + :b :c4279; + :b :c4280; + :b :c4281; + :b :c4282; + :b :c4283; + :b :c4284; + :b :c4285; + :b :c4286; + :b :c4287; + :b :c4288; + :b :c4289; + :b :c4290; + :b :c4291; + :b :c4292; + :b :c4293; + :b :c4294; + :b :c4295; + :b :c4296; + :b :c4297; + :b :c4298; + :b :c4299; + :b :c4300; + :b :c4301; + :b :c4302; + :b :c4303; + :b :c4304; + :b :c4305; + :b :c4306; + :b :c4307; + :b :c4308; + :b :c4309; + :b :c4310; + :b :c4311; + :b :c4312; + :b :c4313; + :b :c4314; + :b :c4315; + :b :c4316; + :b :c4317; + :b :c4318; + :b :c4319; + :b :c4320; + :b :c4321; + :b :c4322; + :b :c4323; + :b :c4324; + :b :c4325; + :b :c4326; + :b :c4327; + :b :c4328; + :b :c4329; + :b :c4330; + :b :c4331; + :b :c4332; + :b :c4333; + :b :c4334; + :b :c4335; + :b :c4336; + :b :c4337; + :b :c4338; + :b :c4339; + :b :c4340; + :b :c4341; + :b :c4342; + :b :c4343; + :b :c4344; + :b :c4345; + :b :c4346; + :b :c4347; + :b :c4348; + :b :c4349; + :b :c4350; + :b :c4351; + :b :c4352; + :b :c4353; + :b :c4354; + :b :c4355; + :b :c4356; + :b :c4357; + :b :c4358; + :b :c4359; + :b :c4360; + :b :c4361; + :b :c4362; + :b :c4363; + :b :c4364; + :b :c4365; + :b :c4366; + :b :c4367; + :b :c4368; + :b :c4369; + :b :c4370; + :b :c4371; + :b :c4372; + :b :c4373; + :b :c4374; + :b :c4375; + :b :c4376; + :b :c4377; + :b :c4378; + :b :c4379; + :b :c4380; + :b :c4381; + :b :c4382; + :b :c4383; + :b :c4384; + :b :c4385; + :b :c4386; + :b :c4387; + :b :c4388; + :b :c4389; + :b :c4390; + :b :c4391; + :b :c4392; + :b :c4393; + :b :c4394; + :b :c4395; + :b :c4396; + :b :c4397; + :b :c4398; + :b :c4399; + :b :c4400; + :b :c4401; + :b :c4402; + :b :c4403; + :b :c4404; + :b :c4405; + :b :c4406; + :b :c4407; + :b :c4408; + :b :c4409; + :b :c4410; + :b :c4411; + :b :c4412; + :b :c4413; + :b :c4414; + :b :c4415; + :b :c4416; + :b :c4417; + :b :c4418; + :b :c4419; + :b :c4420; + :b :c4421; + :b :c4422; + :b :c4423; + :b :c4424; + :b :c4425; + :b :c4426; + :b :c4427; + :b :c4428; + :b :c4429; + :b :c4430; + :b :c4431; + :b :c4432; + :b :c4433; + :b :c4434; + :b :c4435; + :b :c4436; + :b :c4437; + :b :c4438; + :b :c4439; + :b :c4440; + :b :c4441; + :b :c4442; + :b :c4443; + :b :c4444; + :b :c4445; + :b :c4446; + :b :c4447; + :b :c4448; + :b :c4449; + :b :c4450; + :b :c4451; + :b :c4452; + :b :c4453; + :b :c4454; + :b :c4455; + :b :c4456; + :b :c4457; + :b :c4458; + :b :c4459; + :b :c4460; + :b :c4461; + :b :c4462; + :b :c4463; + :b :c4464; + :b :c4465; + :b :c4466; + :b :c4467; + :b :c4468; + :b :c4469; + :b :c4470; + :b :c4471; + :b :c4472; + :b :c4473; + :b :c4474; + :b :c4475; + :b :c4476; + :b :c4477; + :b :c4478; + :b :c4479; + :b :c4480; + :b :c4481; + :b :c4482; + :b :c4483; + :b :c4484; + :b :c4485; + :b :c4486; + :b :c4487; + :b :c4488; + :b :c4489; + :b :c4490; + :b :c4491; + :b :c4492; + :b :c4493; + :b :c4494; + :b :c4495; + :b :c4496; + :b :c4497; + :b :c4498; + :b :c4499; + :b :c4500; + :b :c4501; + :b :c4502; + :b :c4503; + :b :c4504; + :b :c4505; + :b :c4506; + :b :c4507; + :b :c4508; + :b :c4509; + :b :c4510; + :b :c4511; + :b :c4512; + :b :c4513; + :b :c4514; + :b :c4515; + :b :c4516; + :b :c4517; + :b :c4518; + :b :c4519; + :b :c4520; + :b :c4521; + :b :c4522; + :b :c4523; + :b :c4524; + :b :c4525; + :b :c4526; + :b :c4527; + :b :c4528; + :b :c4529; + :b :c4530; + :b :c4531; + :b :c4532; + :b :c4533; + :b :c4534; + :b :c4535; + :b :c4536; + :b :c4537; + :b :c4538; + :b :c4539; + :b :c4540; + :b :c4541; + :b :c4542; + :b :c4543; + :b :c4544; + :b :c4545; + :b :c4546; + :b :c4547; + :b :c4548; + :b :c4549; + :b :c4550; + :b :c4551; + :b :c4552; + :b :c4553; + :b :c4554; + :b :c4555; + :b :c4556; + :b :c4557; + :b :c4558; + :b :c4559; + :b :c4560; + :b :c4561; + :b :c4562; + :b :c4563; + :b :c4564; + :b :c4565; + :b :c4566; + :b :c4567; + :b :c4568; + :b :c4569; + :b :c4570; + :b :c4571; + :b :c4572; + :b :c4573; + :b :c4574; + :b :c4575; + :b :c4576; + :b :c4577; + :b :c4578; + :b :c4579; + :b :c4580; + :b :c4581; + :b :c4582; + :b :c4583; + :b :c4584; + :b :c4585; + :b :c4586; + :b :c4587; + :b :c4588; + :b :c4589; + :b :c4590; + :b :c4591; + :b :c4592; + :b :c4593; + :b :c4594; + :b :c4595; + :b :c4596; + :b :c4597; + :b :c4598; + :b :c4599; + :b :c4600; + :b :c4601; + :b :c4602; + :b :c4603; + :b :c4604; + :b :c4605; + :b :c4606; + :b :c4607; + :b :c4608; + :b :c4609; + :b :c4610; + :b :c4611; + :b :c4612; + :b :c4613; + :b :c4614; + :b :c4615; + :b :c4616; + :b :c4617; + :b :c4618; + :b :c4619; + :b :c4620; + :b :c4621; + :b :c4622; + :b :c4623; + :b :c4624; + :b :c4625; + :b :c4626; + :b :c4627; + :b :c4628; + :b :c4629; + :b :c4630; + :b :c4631; + :b :c4632; + :b :c4633; + :b :c4634; + :b :c4635; + :b :c4636; + :b :c4637; + :b :c4638; + :b :c4639; + :b :c4640; + :b :c4641; + :b :c4642; + :b :c4643; + :b :c4644; + :b :c4645; + :b :c4646; + :b :c4647; + :b :c4648; + :b :c4649; + :b :c4650; + :b :c4651; + :b :c4652; + :b :c4653; + :b :c4654; + :b :c4655; + :b :c4656; + :b :c4657; + :b :c4658; + :b :c4659; + :b :c4660; + :b :c4661; + :b :c4662; + :b :c4663; + :b :c4664; + :b :c4665; + :b :c4666; + :b :c4667; + :b :c4668; + :b :c4669; + :b :c4670; + :b :c4671; + :b :c4672; + :b :c4673; + :b :c4674; + :b :c4675; + :b :c4676; + :b :c4677; + :b :c4678; + :b :c4679; + :b :c4680; + :b :c4681; + :b :c4682; + :b :c4683; + :b :c4684; + :b :c4685; + :b :c4686; + :b :c4687; + :b :c4688; + :b :c4689; + :b :c4690; + :b :c4691; + :b :c4692; + :b :c4693; + :b :c4694; + :b :c4695; + :b :c4696; + :b :c4697; + :b :c4698; + :b :c4699; + :b :c4700; + :b :c4701; + :b :c4702; + :b :c4703; + :b :c4704; + :b :c4705; + :b :c4706; + :b :c4707; + :b :c4708; + :b :c4709; + :b :c4710; + :b :c4711; + :b :c4712; + :b :c4713; + :b :c4714; + :b :c4715; + :b :c4716; + :b :c4717; + :b :c4718; + :b :c4719; + :b :c4720; + :b :c4721; + :b :c4722; + :b :c4723; + :b :c4724; + :b :c4725; + :b :c4726; + :b :c4727; + :b :c4728; + :b :c4729; + :b :c4730; + :b :c4731; + :b :c4732; + :b :c4733; + :b :c4734; + :b :c4735; + :b :c4736; + :b :c4737; + :b :c4738; + :b :c4739; + :b :c4740; + :b :c4741; + :b :c4742; + :b :c4743; + :b :c4744; + :b :c4745; + :b :c4746; + :b :c4747; + :b :c4748; + :b :c4749; + :b :c4750; + :b :c4751; + :b :c4752; + :b :c4753; + :b :c4754; + :b :c4755; + :b :c4756; + :b :c4757; + :b :c4758; + :b :c4759; + :b :c4760; + :b :c4761; + :b :c4762; + :b :c4763; + :b :c4764; + :b :c4765; + :b :c4766; + :b :c4767; + :b :c4768; + :b :c4769; + :b :c4770; + :b :c4771; + :b :c4772; + :b :c4773; + :b :c4774; + :b :c4775; + :b :c4776; + :b :c4777; + :b :c4778; + :b :c4779; + :b :c4780; + :b :c4781; + :b :c4782; + :b :c4783; + :b :c4784; + :b :c4785; + :b :c4786; + :b :c4787; + :b :c4788; + :b :c4789; + :b :c4790; + :b :c4791; + :b :c4792; + :b :c4793; + :b :c4794; + :b :c4795; + :b :c4796; + :b :c4797; + :b :c4798; + :b :c4799; + :b :c4800; + :b :c4801; + :b :c4802; + :b :c4803; + :b :c4804; + :b :c4805; + :b :c4806; + :b :c4807; + :b :c4808; + :b :c4809; + :b :c4810; + :b :c4811; + :b :c4812; + :b :c4813; + :b :c4814; + :b :c4815; + :b :c4816; + :b :c4817; + :b :c4818; + :b :c4819; + :b :c4820; + :b :c4821; + :b :c4822; + :b :c4823; + :b :c4824; + :b :c4825; + :b :c4826; + :b :c4827; + :b :c4828; + :b :c4829; + :b :c4830; + :b :c4831; + :b :c4832; + :b :c4833; + :b :c4834; + :b :c4835; + :b :c4836; + :b :c4837; + :b :c4838; + :b :c4839; + :b :c4840; + :b :c4841; + :b :c4842; + :b :c4843; + :b :c4844; + :b :c4845; + :b :c4846; + :b :c4847; + :b :c4848; + :b :c4849; + :b :c4850; + :b :c4851; + :b :c4852; + :b :c4853; + :b :c4854; + :b :c4855; + :b :c4856; + :b :c4857; + :b :c4858; + :b :c4859; + :b :c4860; + :b :c4861; + :b :c4862; + :b :c4863; + :b :c4864; + :b :c4865; + :b :c4866; + :b :c4867; + :b :c4868; + :b :c4869; + :b :c4870; + :b :c4871; + :b :c4872; + :b :c4873; + :b :c4874; + :b :c4875; + :b :c4876; + :b :c4877; + :b :c4878; + :b :c4879; + :b :c4880; + :b :c4881; + :b :c4882; + :b :c4883; + :b :c4884; + :b :c4885; + :b :c4886; + :b :c4887; + :b :c4888; + :b :c4889; + :b :c4890; + :b :c4891; + :b :c4892; + :b :c4893; + :b :c4894; + :b :c4895; + :b :c4896; + :b :c4897; + :b :c4898; + :b :c4899; + :b :c4900; + :b :c4901; + :b :c4902; + :b :c4903; + :b :c4904; + :b :c4905; + :b :c4906; + :b :c4907; + :b :c4908; + :b :c4909; + :b :c4910; + :b :c4911; + :b :c4912; + :b :c4913; + :b :c4914; + :b :c4915; + :b :c4916; + :b :c4917; + :b :c4918; + :b :c4919; + :b :c4920; + :b :c4921; + :b :c4922; + :b :c4923; + :b :c4924; + :b :c4925; + :b :c4926; + :b :c4927; + :b :c4928; + :b :c4929; + :b :c4930; + :b :c4931; + :b :c4932; + :b :c4933; + :b :c4934; + :b :c4935; + :b :c4936; + :b :c4937; + :b :c4938; + :b :c4939; + :b :c4940; + :b :c4941; + :b :c4942; + :b :c4943; + :b :c4944; + :b :c4945; + :b :c4946; + :b :c4947; + :b :c4948; + :b :c4949; + :b :c4950; + :b :c4951; + :b :c4952; + :b :c4953; + :b :c4954; + :b :c4955; + :b :c4956; + :b :c4957; + :b :c4958; + :b :c4959; + :b :c4960; + :b :c4961; + :b :c4962; + :b :c4963; + :b :c4964; + :b :c4965; + :b :c4966; + :b :c4967; + :b :c4968; + :b :c4969; + :b :c4970; + :b :c4971; + :b :c4972; + :b :c4973; + :b :c4974; + :b :c4975; + :b :c4976; + :b :c4977; + :b :c4978; + :b :c4979; + :b :c4980; + :b :c4981; + :b :c4982; + :b :c4983; + :b :c4984; + :b :c4985; + :b :c4986; + :b :c4987; + :b :c4988; + :b :c4989; + :b :c4990; + :b :c4991; + :b :c4992; + :b :c4993; + :b :c4994; + :b :c4995; + :b :c4996; + :b :c4997; + :b :c4998; + :b :c4999; + :b :c5000; + :b :c5001; + :b :c5002; + :b :c5003; + :b :c5004; + :b :c5005; + :b :c5006; + :b :c5007; + :b :c5008; + :b :c5009; + :b :c5010; + :b :c5011; + :b :c5012; + :b :c5013; + :b :c5014; + :b :c5015; + :b :c5016; + :b :c5017; + :b :c5018; + :b :c5019; + :b :c5020; + :b :c5021; + :b :c5022; + :b :c5023; + :b :c5024; + :b :c5025; + :b :c5026; + :b :c5027; + :b :c5028; + :b :c5029; + :b :c5030; + :b :c5031; + :b :c5032; + :b :c5033; + :b :c5034; + :b :c5035; + :b :c5036; + :b :c5037; + :b :c5038; + :b :c5039; + :b :c5040; + :b :c5041; + :b :c5042; + :b :c5043; + :b :c5044; + :b :c5045; + :b :c5046; + :b :c5047; + :b :c5048; + :b :c5049; + :b :c5050; + :b :c5051; + :b :c5052; + :b :c5053; + :b :c5054; + :b :c5055; + :b :c5056; + :b :c5057; + :b :c5058; + :b :c5059; + :b :c5060; + :b :c5061; + :b :c5062; + :b :c5063; + :b :c5064; + :b :c5065; + :b :c5066; + :b :c5067; + :b :c5068; + :b :c5069; + :b :c5070; + :b :c5071; + :b :c5072; + :b :c5073; + :b :c5074; + :b :c5075; + :b :c5076; + :b :c5077; + :b :c5078; + :b :c5079; + :b :c5080; + :b :c5081; + :b :c5082; + :b :c5083; + :b :c5084; + :b :c5085; + :b :c5086; + :b :c5087; + :b :c5088; + :b :c5089; + :b :c5090; + :b :c5091; + :b :c5092; + :b :c5093; + :b :c5094; + :b :c5095; + :b :c5096; + :b :c5097; + :b :c5098; + :b :c5099; + :b :c5100; + :b :c5101; + :b :c5102; + :b :c5103; + :b :c5104; + :b :c5105; + :b :c5106; + :b :c5107; + :b :c5108; + :b :c5109; + :b :c5110; + :b :c5111; + :b :c5112; + :b :c5113; + :b :c5114; + :b :c5115; + :b :c5116; + :b :c5117; + :b :c5118; + :b :c5119; + :b :c5120; + :b :c5121; + :b :c5122; + :b :c5123; + :b :c5124; + :b :c5125; + :b :c5126; + :b :c5127; + :b :c5128; + :b :c5129; + :b :c5130; + :b :c5131; + :b :c5132; + :b :c5133; + :b :c5134; + :b :c5135; + :b :c5136; + :b :c5137; + :b :c5138; + :b :c5139; + :b :c5140; + :b :c5141; + :b :c5142; + :b :c5143; + :b :c5144; + :b :c5145; + :b :c5146; + :b :c5147; + :b :c5148; + :b :c5149; + :b :c5150; + :b :c5151; + :b :c5152; + :b :c5153; + :b :c5154; + :b :c5155; + :b :c5156; + :b :c5157; + :b :c5158; + :b :c5159; + :b :c5160; + :b :c5161; + :b :c5162; + :b :c5163; + :b :c5164; + :b :c5165; + :b :c5166; + :b :c5167; + :b :c5168; + :b :c5169; + :b :c5170; + :b :c5171; + :b :c5172; + :b :c5173; + :b :c5174; + :b :c5175; + :b :c5176; + :b :c5177; + :b :c5178; + :b :c5179; + :b :c5180; + :b :c5181; + :b :c5182; + :b :c5183; + :b :c5184; + :b :c5185; + :b :c5186; + :b :c5187; + :b :c5188; + :b :c5189; + :b :c5190; + :b :c5191; + :b :c5192; + :b :c5193; + :b :c5194; + :b :c5195; + :b :c5196; + :b :c5197; + :b :c5198; + :b :c5199; + :b :c5200; + :b :c5201; + :b :c5202; + :b :c5203; + :b :c5204; + :b :c5205; + :b :c5206; + :b :c5207; + :b :c5208; + :b :c5209; + :b :c5210; + :b :c5211; + :b :c5212; + :b :c5213; + :b :c5214; + :b :c5215; + :b :c5216; + :b :c5217; + :b :c5218; + :b :c5219; + :b :c5220; + :b :c5221; + :b :c5222; + :b :c5223; + :b :c5224; + :b :c5225; + :b :c5226; + :b :c5227; + :b :c5228; + :b :c5229; + :b :c5230; + :b :c5231; + :b :c5232; + :b :c5233; + :b :c5234; + :b :c5235; + :b :c5236; + :b :c5237; + :b :c5238; + :b :c5239; + :b :c5240; + :b :c5241; + :b :c5242; + :b :c5243; + :b :c5244; + :b :c5245; + :b :c5246; + :b :c5247; + :b :c5248; + :b :c5249; + :b :c5250; + :b :c5251; + :b :c5252; + :b :c5253; + :b :c5254; + :b :c5255; + :b :c5256; + :b :c5257; + :b :c5258; + :b :c5259; + :b :c5260; + :b :c5261; + :b :c5262; + :b :c5263; + :b :c5264; + :b :c5265; + :b :c5266; + :b :c5267; + :b :c5268; + :b :c5269; + :b :c5270; + :b :c5271; + :b :c5272; + :b :c5273; + :b :c5274; + :b :c5275; + :b :c5276; + :b :c5277; + :b :c5278; + :b :c5279; + :b :c5280; + :b :c5281; + :b :c5282; + :b :c5283; + :b :c5284; + :b :c5285; + :b :c5286; + :b :c5287; + :b :c5288; + :b :c5289; + :b :c5290; + :b :c5291; + :b :c5292; + :b :c5293; + :b :c5294; + :b :c5295; + :b :c5296; + :b :c5297; + :b :c5298; + :b :c5299; + :b :c5300; + :b :c5301; + :b :c5302; + :b :c5303; + :b :c5304; + :b :c5305; + :b :c5306; + :b :c5307; + :b :c5308; + :b :c5309; + :b :c5310; + :b :c5311; + :b :c5312; + :b :c5313; + :b :c5314; + :b :c5315; + :b :c5316; + :b :c5317; + :b :c5318; + :b :c5319; + :b :c5320; + :b :c5321; + :b :c5322; + :b :c5323; + :b :c5324; + :b :c5325; + :b :c5326; + :b :c5327; + :b :c5328; + :b :c5329; + :b :c5330; + :b :c5331; + :b :c5332; + :b :c5333; + :b :c5334; + :b :c5335; + :b :c5336; + :b :c5337; + :b :c5338; + :b :c5339; + :b :c5340; + :b :c5341; + :b :c5342; + :b :c5343; + :b :c5344; + :b :c5345; + :b :c5346; + :b :c5347; + :b :c5348; + :b :c5349; + :b :c5350; + :b :c5351; + :b :c5352; + :b :c5353; + :b :c5354; + :b :c5355; + :b :c5356; + :b :c5357; + :b :c5358; + :b :c5359; + :b :c5360; + :b :c5361; + :b :c5362; + :b :c5363; + :b :c5364; + :b :c5365; + :b :c5366; + :b :c5367; + :b :c5368; + :b :c5369; + :b :c5370; + :b :c5371; + :b :c5372; + :b :c5373; + :b :c5374; + :b :c5375; + :b :c5376; + :b :c5377; + :b :c5378; + :b :c5379; + :b :c5380; + :b :c5381; + :b :c5382; + :b :c5383; + :b :c5384; + :b :c5385; + :b :c5386; + :b :c5387; + :b :c5388; + :b :c5389; + :b :c5390; + :b :c5391; + :b :c5392; + :b :c5393; + :b :c5394; + :b :c5395; + :b :c5396; + :b :c5397; + :b :c5398; + :b :c5399; + :b :c5400; + :b :c5401; + :b :c5402; + :b :c5403; + :b :c5404; + :b :c5405; + :b :c5406; + :b :c5407; + :b :c5408; + :b :c5409; + :b :c5410; + :b :c5411; + :b :c5412; + :b :c5413; + :b :c5414; + :b :c5415; + :b :c5416; + :b :c5417; + :b :c5418; + :b :c5419; + :b :c5420; + :b :c5421; + :b :c5422; + :b :c5423; + :b :c5424; + :b :c5425; + :b :c5426; + :b :c5427; + :b :c5428; + :b :c5429; + :b :c5430; + :b :c5431; + :b :c5432; + :b :c5433; + :b :c5434; + :b :c5435; + :b :c5436; + :b :c5437; + :b :c5438; + :b :c5439; + :b :c5440; + :b :c5441; + :b :c5442; + :b :c5443; + :b :c5444; + :b :c5445; + :b :c5446; + :b :c5447; + :b :c5448; + :b :c5449; + :b :c5450; + :b :c5451; + :b :c5452; + :b :c5453; + :b :c5454; + :b :c5455; + :b :c5456; + :b :c5457; + :b :c5458; + :b :c5459; + :b :c5460; + :b :c5461; + :b :c5462; + :b :c5463; + :b :c5464; + :b :c5465; + :b :c5466; + :b :c5467; + :b :c5468; + :b :c5469; + :b :c5470; + :b :c5471; + :b :c5472; + :b :c5473; + :b :c5474; + :b :c5475; + :b :c5476; + :b :c5477; + :b :c5478; + :b :c5479; + :b :c5480; + :b :c5481; + :b :c5482; + :b :c5483; + :b :c5484; + :b :c5485; + :b :c5486; + :b :c5487; + :b :c5488; + :b :c5489; + :b :c5490; + :b :c5491; + :b :c5492; + :b :c5493; + :b :c5494; + :b :c5495; + :b :c5496; + :b :c5497; + :b :c5498; + :b :c5499; + :b :c5500; + :b :c5501; + :b :c5502; + :b :c5503; + :b :c5504; + :b :c5505; + :b :c5506; + :b :c5507; + :b :c5508; + :b :c5509; + :b :c5510; + :b :c5511; + :b :c5512; + :b :c5513; + :b :c5514; + :b :c5515; + :b :c5516; + :b :c5517; + :b :c5518; + :b :c5519; + :b :c5520; + :b :c5521; + :b :c5522; + :b :c5523; + :b :c5524; + :b :c5525; + :b :c5526; + :b :c5527; + :b :c5528; + :b :c5529; + :b :c5530; + :b :c5531; + :b :c5532; + :b :c5533; + :b :c5534; + :b :c5535; + :b :c5536; + :b :c5537; + :b :c5538; + :b :c5539; + :b :c5540; + :b :c5541; + :b :c5542; + :b :c5543; + :b :c5544; + :b :c5545; + :b :c5546; + :b :c5547; + :b :c5548; + :b :c5549; + :b :c5550; + :b :c5551; + :b :c5552; + :b :c5553; + :b :c5554; + :b :c5555; + :b :c5556; + :b :c5557; + :b :c5558; + :b :c5559; + :b :c5560; + :b :c5561; + :b :c5562; + :b :c5563; + :b :c5564; + :b :c5565; + :b :c5566; + :b :c5567; + :b :c5568; + :b :c5569; + :b :c5570; + :b :c5571; + :b :c5572; + :b :c5573; + :b :c5574; + :b :c5575; + :b :c5576; + :b :c5577; + :b :c5578; + :b :c5579; + :b :c5580; + :b :c5581; + :b :c5582; + :b :c5583; + :b :c5584; + :b :c5585; + :b :c5586; + :b :c5587; + :b :c5588; + :b :c5589; + :b :c5590; + :b :c5591; + :b :c5592; + :b :c5593; + :b :c5594; + :b :c5595; + :b :c5596; + :b :c5597; + :b :c5598; + :b :c5599; + :b :c5600; + :b :c5601; + :b :c5602; + :b :c5603; + :b :c5604; + :b :c5605; + :b :c5606; + :b :c5607; + :b :c5608; + :b :c5609; + :b :c5610; + :b :c5611; + :b :c5612; + :b :c5613; + :b :c5614; + :b :c5615; + :b :c5616; + :b :c5617; + :b :c5618; + :b :c5619; + :b :c5620; + :b :c5621; + :b :c5622; + :b :c5623; + :b :c5624; + :b :c5625; + :b :c5626; + :b :c5627; + :b :c5628; + :b :c5629; + :b :c5630; + :b :c5631; + :b :c5632; + :b :c5633; + :b :c5634; + :b :c5635; + :b :c5636; + :b :c5637; + :b :c5638; + :b :c5639; + :b :c5640; + :b :c5641; + :b :c5642; + :b :c5643; + :b :c5644; + :b :c5645; + :b :c5646; + :b :c5647; + :b :c5648; + :b :c5649; + :b :c5650; + :b :c5651; + :b :c5652; + :b :c5653; + :b :c5654; + :b :c5655; + :b :c5656; + :b :c5657; + :b :c5658; + :b :c5659; + :b :c5660; + :b :c5661; + :b :c5662; + :b :c5663; + :b :c5664; + :b :c5665; + :b :c5666; + :b :c5667; + :b :c5668; + :b :c5669; + :b :c5670; + :b :c5671; + :b :c5672; + :b :c5673; + :b :c5674; + :b :c5675; + :b :c5676; + :b :c5677; + :b :c5678; + :b :c5679; + :b :c5680; + :b :c5681; + :b :c5682; + :b :c5683; + :b :c5684; + :b :c5685; + :b :c5686; + :b :c5687; + :b :c5688; + :b :c5689; + :b :c5690; + :b :c5691; + :b :c5692; + :b :c5693; + :b :c5694; + :b :c5695; + :b :c5696; + :b :c5697; + :b :c5698; + :b :c5699; + :b :c5700; + :b :c5701; + :b :c5702; + :b :c5703; + :b :c5704; + :b :c5705; + :b :c5706; + :b :c5707; + :b :c5708; + :b :c5709; + :b :c5710; + :b :c5711; + :b :c5712; + :b :c5713; + :b :c5714; + :b :c5715; + :b :c5716; + :b :c5717; + :b :c5718; + :b :c5719; + :b :c5720; + :b :c5721; + :b :c5722; + :b :c5723; + :b :c5724; + :b :c5725; + :b :c5726; + :b :c5727; + :b :c5728; + :b :c5729; + :b :c5730; + :b :c5731; + :b :c5732; + :b :c5733; + :b :c5734; + :b :c5735; + :b :c5736; + :b :c5737; + :b :c5738; + :b :c5739; + :b :c5740; + :b :c5741; + :b :c5742; + :b :c5743; + :b :c5744; + :b :c5745; + :b :c5746; + :b :c5747; + :b :c5748; + :b :c5749; + :b :c5750; + :b :c5751; + :b :c5752; + :b :c5753; + :b :c5754; + :b :c5755; + :b :c5756; + :b :c5757; + :b :c5758; + :b :c5759; + :b :c5760; + :b :c5761; + :b :c5762; + :b :c5763; + :b :c5764; + :b :c5765; + :b :c5766; + :b :c5767; + :b :c5768; + :b :c5769; + :b :c5770; + :b :c5771; + :b :c5772; + :b :c5773; + :b :c5774; + :b :c5775; + :b :c5776; + :b :c5777; + :b :c5778; + :b :c5779; + :b :c5780; + :b :c5781; + :b :c5782; + :b :c5783; + :b :c5784; + :b :c5785; + :b :c5786; + :b :c5787; + :b :c5788; + :b :c5789; + :b :c5790; + :b :c5791; + :b :c5792; + :b :c5793; + :b :c5794; + :b :c5795; + :b :c5796; + :b :c5797; + :b :c5798; + :b :c5799; + :b :c5800; + :b :c5801; + :b :c5802; + :b :c5803; + :b :c5804; + :b :c5805; + :b :c5806; + :b :c5807; + :b :c5808; + :b :c5809; + :b :c5810; + :b :c5811; + :b :c5812; + :b :c5813; + :b :c5814; + :b :c5815; + :b :c5816; + :b :c5817; + :b :c5818; + :b :c5819; + :b :c5820; + :b :c5821; + :b :c5822; + :b :c5823; + :b :c5824; + :b :c5825; + :b :c5826; + :b :c5827; + :b :c5828; + :b :c5829; + :b :c5830; + :b :c5831; + :b :c5832; + :b :c5833; + :b :c5834; + :b :c5835; + :b :c5836; + :b :c5837; + :b :c5838; + :b :c5839; + :b :c5840; + :b :c5841; + :b :c5842; + :b :c5843; + :b :c5844; + :b :c5845; + :b :c5846; + :b :c5847; + :b :c5848; + :b :c5849; + :b :c5850; + :b :c5851; + :b :c5852; + :b :c5853; + :b :c5854; + :b :c5855; + :b :c5856; + :b :c5857; + :b :c5858; + :b :c5859; + :b :c5860; + :b :c5861; + :b :c5862; + :b :c5863; + :b :c5864; + :b :c5865; + :b :c5866; + :b :c5867; + :b :c5868; + :b :c5869; + :b :c5870; + :b :c5871; + :b :c5872; + :b :c5873; + :b :c5874; + :b :c5875; + :b :c5876; + :b :c5877; + :b :c5878; + :b :c5879; + :b :c5880; + :b :c5881; + :b :c5882; + :b :c5883; + :b :c5884; + :b :c5885; + :b :c5886; + :b :c5887; + :b :c5888; + :b :c5889; + :b :c5890; + :b :c5891; + :b :c5892; + :b :c5893; + :b :c5894; + :b :c5895; + :b :c5896; + :b :c5897; + :b :c5898; + :b :c5899; + :b :c5900; + :b :c5901; + :b :c5902; + :b :c5903; + :b :c5904; + :b :c5905; + :b :c5906; + :b :c5907; + :b :c5908; + :b :c5909; + :b :c5910; + :b :c5911; + :b :c5912; + :b :c5913; + :b :c5914; + :b :c5915; + :b :c5916; + :b :c5917; + :b :c5918; + :b :c5919; + :b :c5920; + :b :c5921; + :b :c5922; + :b :c5923; + :b :c5924; + :b :c5925; + :b :c5926; + :b :c5927; + :b :c5928; + :b :c5929; + :b :c5930; + :b :c5931; + :b :c5932; + :b :c5933; + :b :c5934; + :b :c5935; + :b :c5936; + :b :c5937; + :b :c5938; + :b :c5939; + :b :c5940; + :b :c5941; + :b :c5942; + :b :c5943; + :b :c5944; + :b :c5945; + :b :c5946; + :b :c5947; + :b :c5948; + :b :c5949; + :b :c5950; + :b :c5951; + :b :c5952; + :b :c5953; + :b :c5954; + :b :c5955; + :b :c5956; + :b :c5957; + :b :c5958; + :b :c5959; + :b :c5960; + :b :c5961; + :b :c5962; + :b :c5963; + :b :c5964; + :b :c5965; + :b :c5966; + :b :c5967; + :b :c5968; + :b :c5969; + :b :c5970; + :b :c5971; + :b :c5972; + :b :c5973; + :b :c5974; + :b :c5975; + :b :c5976; + :b :c5977; + :b :c5978; + :b :c5979; + :b :c5980; + :b :c5981; + :b :c5982; + :b :c5983; + :b :c5984; + :b :c5985; + :b :c5986; + :b :c5987; + :b :c5988; + :b :c5989; + :b :c5990; + :b :c5991; + :b :c5992; + :b :c5993; + :b :c5994; + :b :c5995; + :b :c5996; + :b :c5997; + :b :c5998; + :b :c5999; + :b :c6000; + :b :c6001; + :b :c6002; + :b :c6003; + :b :c6004; + :b :c6005; + :b :c6006; + :b :c6007; + :b :c6008; + :b :c6009; + :b :c6010; + :b :c6011; + :b :c6012; + :b :c6013; + :b :c6014; + :b :c6015; + :b :c6016; + :b :c6017; + :b :c6018; + :b :c6019; + :b :c6020; + :b :c6021; + :b :c6022; + :b :c6023; + :b :c6024; + :b :c6025; + :b :c6026; + :b :c6027; + :b :c6028; + :b :c6029; + :b :c6030; + :b :c6031; + :b :c6032; + :b :c6033; + :b :c6034; + :b :c6035; + :b :c6036; + :b :c6037; + :b :c6038; + :b :c6039; + :b :c6040; + :b :c6041; + :b :c6042; + :b :c6043; + :b :c6044; + :b :c6045; + :b :c6046; + :b :c6047; + :b :c6048; + :b :c6049; + :b :c6050; + :b :c6051; + :b :c6052; + :b :c6053; + :b :c6054; + :b :c6055; + :b :c6056; + :b :c6057; + :b :c6058; + :b :c6059; + :b :c6060; + :b :c6061; + :b :c6062; + :b :c6063; + :b :c6064; + :b :c6065; + :b :c6066; + :b :c6067; + :b :c6068; + :b :c6069; + :b :c6070; + :b :c6071; + :b :c6072; + :b :c6073; + :b :c6074; + :b :c6075; + :b :c6076; + :b :c6077; + :b :c6078; + :b :c6079; + :b :c6080; + :b :c6081; + :b :c6082; + :b :c6083; + :b :c6084; + :b :c6085; + :b :c6086; + :b :c6087; + :b :c6088; + :b :c6089; + :b :c6090; + :b :c6091; + :b :c6092; + :b :c6093; + :b :c6094; + :b :c6095; + :b :c6096; + :b :c6097; + :b :c6098; + :b :c6099; + :b :c6100; + :b :c6101; + :b :c6102; + :b :c6103; + :b :c6104; + :b :c6105; + :b :c6106; + :b :c6107; + :b :c6108; + :b :c6109; + :b :c6110; + :b :c6111; + :b :c6112; + :b :c6113; + :b :c6114; + :b :c6115; + :b :c6116; + :b :c6117; + :b :c6118; + :b :c6119; + :b :c6120; + :b :c6121; + :b :c6122; + :b :c6123; + :b :c6124; + :b :c6125; + :b :c6126; + :b :c6127; + :b :c6128; + :b :c6129; + :b :c6130; + :b :c6131; + :b :c6132; + :b :c6133; + :b :c6134; + :b :c6135; + :b :c6136; + :b :c6137; + :b :c6138; + :b :c6139; + :b :c6140; + :b :c6141; + :b :c6142; + :b :c6143; + :b :c6144; + :b :c6145; + :b :c6146; + :b :c6147; + :b :c6148; + :b :c6149; + :b :c6150; + :b :c6151; + :b :c6152; + :b :c6153; + :b :c6154; + :b :c6155; + :b :c6156; + :b :c6157; + :b :c6158; + :b :c6159; + :b :c6160; + :b :c6161; + :b :c6162; + :b :c6163; + :b :c6164; + :b :c6165; + :b :c6166; + :b :c6167; + :b :c6168; + :b :c6169; + :b :c6170; + :b :c6171; + :b :c6172; + :b :c6173; + :b :c6174; + :b :c6175; + :b :c6176; + :b :c6177; + :b :c6178; + :b :c6179; + :b :c6180; + :b :c6181; + :b :c6182; + :b :c6183; + :b :c6184; + :b :c6185; + :b :c6186; + :b :c6187; + :b :c6188; + :b :c6189; + :b :c6190; + :b :c6191; + :b :c6192; + :b :c6193; + :b :c6194; + :b :c6195; + :b :c6196; + :b :c6197; + :b :c6198; + :b :c6199; + :b :c6200; + :b :c6201; + :b :c6202; + :b :c6203; + :b :c6204; + :b :c6205; + :b :c6206; + :b :c6207; + :b :c6208; + :b :c6209; + :b :c6210; + :b :c6211; + :b :c6212; + :b :c6213; + :b :c6214; + :b :c6215; + :b :c6216; + :b :c6217; + :b :c6218; + :b :c6219; + :b :c6220; + :b :c6221; + :b :c6222; + :b :c6223; + :b :c6224; + :b :c6225; + :b :c6226; + :b :c6227; + :b :c6228; + :b :c6229; + :b :c6230; + :b :c6231; + :b :c6232; + :b :c6233; + :b :c6234; + :b :c6235; + :b :c6236; + :b :c6237; + :b :c6238; + :b :c6239; + :b :c6240; + :b :c6241; + :b :c6242; + :b :c6243; + :b :c6244; + :b :c6245; + :b :c6246; + :b :c6247; + :b :c6248; + :b :c6249; + :b :c6250; + :b :c6251; + :b :c6252; + :b :c6253; + :b :c6254; + :b :c6255; + :b :c6256; + :b :c6257; + :b :c6258; + :b :c6259; + :b :c6260; + :b :c6261; + :b :c6262; + :b :c6263; + :b :c6264; + :b :c6265; + :b :c6266; + :b :c6267; + :b :c6268; + :b :c6269; + :b :c6270; + :b :c6271; + :b :c6272; + :b :c6273; + :b :c6274; + :b :c6275; + :b :c6276; + :b :c6277; + :b :c6278; + :b :c6279; + :b :c6280; + :b :c6281; + :b :c6282; + :b :c6283; + :b :c6284; + :b :c6285; + :b :c6286; + :b :c6287; + :b :c6288; + :b :c6289; + :b :c6290; + :b :c6291; + :b :c6292; + :b :c6293; + :b :c6294; + :b :c6295; + :b :c6296; + :b :c6297; + :b :c6298; + :b :c6299; + :b :c6300; + :b :c6301; + :b :c6302; + :b :c6303; + :b :c6304; + :b :c6305; + :b :c6306; + :b :c6307; + :b :c6308; + :b :c6309; + :b :c6310; + :b :c6311; + :b :c6312; + :b :c6313; + :b :c6314; + :b :c6315; + :b :c6316; + :b :c6317; + :b :c6318; + :b :c6319; + :b :c6320; + :b :c6321; + :b :c6322; + :b :c6323; + :b :c6324; + :b :c6325; + :b :c6326; + :b :c6327; + :b :c6328; + :b :c6329; + :b :c6330; + :b :c6331; + :b :c6332; + :b :c6333; + :b :c6334; + :b :c6335; + :b :c6336; + :b :c6337; + :b :c6338; + :b :c6339; + :b :c6340; + :b :c6341; + :b :c6342; + :b :c6343; + :b :c6344; + :b :c6345; + :b :c6346; + :b :c6347; + :b :c6348; + :b :c6349; + :b :c6350; + :b :c6351; + :b :c6352; + :b :c6353; + :b :c6354; + :b :c6355; + :b :c6356; + :b :c6357; + :b :c6358; + :b :c6359; + :b :c6360; + :b :c6361; + :b :c6362; + :b :c6363; + :b :c6364; + :b :c6365; + :b :c6366; + :b :c6367; + :b :c6368; + :b :c6369; + :b :c6370; + :b :c6371; + :b :c6372; + :b :c6373; + :b :c6374; + :b :c6375; + :b :c6376; + :b :c6377; + :b :c6378; + :b :c6379; + :b :c6380; + :b :c6381; + :b :c6382; + :b :c6383; + :b :c6384; + :b :c6385; + :b :c6386; + :b :c6387; + :b :c6388; + :b :c6389; + :b :c6390; + :b :c6391; + :b :c6392; + :b :c6393; + :b :c6394; + :b :c6395; + :b :c6396; + :b :c6397; + :b :c6398; + :b :c6399; + :b :c6400; + :b :c6401; + :b :c6402; + :b :c6403; + :b :c6404; + :b :c6405; + :b :c6406; + :b :c6407; + :b :c6408; + :b :c6409; + :b :c6410; + :b :c6411; + :b :c6412; + :b :c6413; + :b :c6414; + :b :c6415; + :b :c6416; + :b :c6417; + :b :c6418; + :b :c6419; + :b :c6420; + :b :c6421; + :b :c6422; + :b :c6423; + :b :c6424; + :b :c6425; + :b :c6426; + :b :c6427; + :b :c6428; + :b :c6429; + :b :c6430; + :b :c6431; + :b :c6432; + :b :c6433; + :b :c6434; + :b :c6435; + :b :c6436; + :b :c6437; + :b :c6438; + :b :c6439; + :b :c6440; + :b :c6441; + :b :c6442; + :b :c6443; + :b :c6444; + :b :c6445; + :b :c6446; + :b :c6447; + :b :c6448; + :b :c6449; + :b :c6450; + :b :c6451; + :b :c6452; + :b :c6453; + :b :c6454; + :b :c6455; + :b :c6456; + :b :c6457; + :b :c6458; + :b :c6459; + :b :c6460; + :b :c6461; + :b :c6462; + :b :c6463; + :b :c6464; + :b :c6465; + :b :c6466; + :b :c6467; + :b :c6468; + :b :c6469; + :b :c6470; + :b :c6471; + :b :c6472; + :b :c6473; + :b :c6474; + :b :c6475; + :b :c6476; + :b :c6477; + :b :c6478; + :b :c6479; + :b :c6480; + :b :c6481; + :b :c6482; + :b :c6483; + :b :c6484; + :b :c6485; + :b :c6486; + :b :c6487; + :b :c6488; + :b :c6489; + :b :c6490; + :b :c6491; + :b :c6492; + :b :c6493; + :b :c6494; + :b :c6495; + :b :c6496; + :b :c6497; + :b :c6498; + :b :c6499; + :b :c6500; + :b :c6501; + :b :c6502; + :b :c6503; + :b :c6504; + :b :c6505; + :b :c6506; + :b :c6507; + :b :c6508; + :b :c6509; + :b :c6510; + :b :c6511; + :b :c6512; + :b :c6513; + :b :c6514; + :b :c6515; + :b :c6516; + :b :c6517; + :b :c6518; + :b :c6519; + :b :c6520; + :b :c6521; + :b :c6522; + :b :c6523; + :b :c6524; + :b :c6525; + :b :c6526; + :b :c6527; + :b :c6528; + :b :c6529; + :b :c6530; + :b :c6531; + :b :c6532; + :b :c6533; + :b :c6534; + :b :c6535; + :b :c6536; + :b :c6537; + :b :c6538; + :b :c6539; + :b :c6540; + :b :c6541; + :b :c6542; + :b :c6543; + :b :c6544; + :b :c6545; + :b :c6546; + :b :c6547; + :b :c6548; + :b :c6549; + :b :c6550; + :b :c6551; + :b :c6552; + :b :c6553; + :b :c6554; + :b :c6555; + :b :c6556; + :b :c6557; + :b :c6558; + :b :c6559; + :b :c6560; + :b :c6561; + :b :c6562; + :b :c6563; + :b :c6564; + :b :c6565; + :b :c6566; + :b :c6567; + :b :c6568; + :b :c6569; + :b :c6570; + :b :c6571; + :b :c6572; + :b :c6573; + :b :c6574; + :b :c6575; + :b :c6576; + :b :c6577; + :b :c6578; + :b :c6579; + :b :c6580; + :b :c6581; + :b :c6582; + :b :c6583; + :b :c6584; + :b :c6585; + :b :c6586; + :b :c6587; + :b :c6588; + :b :c6589; + :b :c6590; + :b :c6591; + :b :c6592; + :b :c6593; + :b :c6594; + :b :c6595; + :b :c6596; + :b :c6597; + :b :c6598; + :b :c6599; + :b :c6600; + :b :c6601; + :b :c6602; + :b :c6603; + :b :c6604; + :b :c6605; + :b :c6606; + :b :c6607; + :b :c6608; + :b :c6609; + :b :c6610; + :b :c6611; + :b :c6612; + :b :c6613; + :b :c6614; + :b :c6615; + :b :c6616; + :b :c6617; + :b :c6618; + :b :c6619; + :b :c6620; + :b :c6621; + :b :c6622; + :b :c6623; + :b :c6624; + :b :c6625; + :b :c6626; + :b :c6627; + :b :c6628; + :b :c6629; + :b :c6630; + :b :c6631; + :b :c6632; + :b :c6633; + :b :c6634; + :b :c6635; + :b :c6636; + :b :c6637; + :b :c6638; + :b :c6639; + :b :c6640; + :b :c6641; + :b :c6642; + :b :c6643; + :b :c6644; + :b :c6645; + :b :c6646; + :b :c6647; + :b :c6648; + :b :c6649; + :b :c6650; + :b :c6651; + :b :c6652; + :b :c6653; + :b :c6654; + :b :c6655; + :b :c6656; + :b :c6657; + :b :c6658; + :b :c6659; + :b :c6660; + :b :c6661; + :b :c6662; + :b :c6663; + :b :c6664; + :b :c6665; + :b :c6666; + :b :c6667; + :b :c6668; + :b :c6669; + :b :c6670; + :b :c6671; + :b :c6672; + :b :c6673; + :b :c6674; + :b :c6675; + :b :c6676; + :b :c6677; + :b :c6678; + :b :c6679; + :b :c6680; + :b :c6681; + :b :c6682; + :b :c6683; + :b :c6684; + :b :c6685; + :b :c6686; + :b :c6687; + :b :c6688; + :b :c6689; + :b :c6690; + :b :c6691; + :b :c6692; + :b :c6693; + :b :c6694; + :b :c6695; + :b :c6696; + :b :c6697; + :b :c6698; + :b :c6699; + :b :c6700; + :b :c6701; + :b :c6702; + :b :c6703; + :b :c6704; + :b :c6705; + :b :c6706; + :b :c6707; + :b :c6708; + :b :c6709; + :b :c6710; + :b :c6711; + :b :c6712; + :b :c6713; + :b :c6714; + :b :c6715; + :b :c6716; + :b :c6717; + :b :c6718; + :b :c6719; + :b :c6720; + :b :c6721; + :b :c6722; + :b :c6723; + :b :c6724; + :b :c6725; + :b :c6726; + :b :c6727; + :b :c6728; + :b :c6729; + :b :c6730; + :b :c6731; + :b :c6732; + :b :c6733; + :b :c6734; + :b :c6735; + :b :c6736; + :b :c6737; + :b :c6738; + :b :c6739; + :b :c6740; + :b :c6741; + :b :c6742; + :b :c6743; + :b :c6744; + :b :c6745; + :b :c6746; + :b :c6747; + :b :c6748; + :b :c6749; + :b :c6750; + :b :c6751; + :b :c6752; + :b :c6753; + :b :c6754; + :b :c6755; + :b :c6756; + :b :c6757; + :b :c6758; + :b :c6759; + :b :c6760; + :b :c6761; + :b :c6762; + :b :c6763; + :b :c6764; + :b :c6765; + :b :c6766; + :b :c6767; + :b :c6768; + :b :c6769; + :b :c6770; + :b :c6771; + :b :c6772; + :b :c6773; + :b :c6774; + :b :c6775; + :b :c6776; + :b :c6777; + :b :c6778; + :b :c6779; + :b :c6780; + :b :c6781; + :b :c6782; + :b :c6783; + :b :c6784; + :b :c6785; + :b :c6786; + :b :c6787; + :b :c6788; + :b :c6789; + :b :c6790; + :b :c6791; + :b :c6792; + :b :c6793; + :b :c6794; + :b :c6795; + :b :c6796; + :b :c6797; + :b :c6798; + :b :c6799; + :b :c6800; + :b :c6801; + :b :c6802; + :b :c6803; + :b :c6804; + :b :c6805; + :b :c6806; + :b :c6807; + :b :c6808; + :b :c6809; + :b :c6810; + :b :c6811; + :b :c6812; + :b :c6813; + :b :c6814; + :b :c6815; + :b :c6816; + :b :c6817; + :b :c6818; + :b :c6819; + :b :c6820; + :b :c6821; + :b :c6822; + :b :c6823; + :b :c6824; + :b :c6825; + :b :c6826; + :b :c6827; + :b :c6828; + :b :c6829; + :b :c6830; + :b :c6831; + :b :c6832; + :b :c6833; + :b :c6834; + :b :c6835; + :b :c6836; + :b :c6837; + :b :c6838; + :b :c6839; + :b :c6840; + :b :c6841; + :b :c6842; + :b :c6843; + :b :c6844; + :b :c6845; + :b :c6846; + :b :c6847; + :b :c6848; + :b :c6849; + :b :c6850; + :b :c6851; + :b :c6852; + :b :c6853; + :b :c6854; + :b :c6855; + :b :c6856; + :b :c6857; + :b :c6858; + :b :c6859; + :b :c6860; + :b :c6861; + :b :c6862; + :b :c6863; + :b :c6864; + :b :c6865; + :b :c6866; + :b :c6867; + :b :c6868; + :b :c6869; + :b :c6870; + :b :c6871; + :b :c6872; + :b :c6873; + :b :c6874; + :b :c6875; + :b :c6876; + :b :c6877; + :b :c6878; + :b :c6879; + :b :c6880; + :b :c6881; + :b :c6882; + :b :c6883; + :b :c6884; + :b :c6885; + :b :c6886; + :b :c6887; + :b :c6888; + :b :c6889; + :b :c6890; + :b :c6891; + :b :c6892; + :b :c6893; + :b :c6894; + :b :c6895; + :b :c6896; + :b :c6897; + :b :c6898; + :b :c6899; + :b :c6900; + :b :c6901; + :b :c6902; + :b :c6903; + :b :c6904; + :b :c6905; + :b :c6906; + :b :c6907; + :b :c6908; + :b :c6909; + :b :c6910; + :b :c6911; + :b :c6912; + :b :c6913; + :b :c6914; + :b :c6915; + :b :c6916; + :b :c6917; + :b :c6918; + :b :c6919; + :b :c6920; + :b :c6921; + :b :c6922; + :b :c6923; + :b :c6924; + :b :c6925; + :b :c6926; + :b :c6927; + :b :c6928; + :b :c6929; + :b :c6930; + :b :c6931; + :b :c6932; + :b :c6933; + :b :c6934; + :b :c6935; + :b :c6936; + :b :c6937; + :b :c6938; + :b :c6939; + :b :c6940; + :b :c6941; + :b :c6942; + :b :c6943; + :b :c6944; + :b :c6945; + :b :c6946; + :b :c6947; + :b :c6948; + :b :c6949; + :b :c6950; + :b :c6951; + :b :c6952; + :b :c6953; + :b :c6954; + :b :c6955; + :b :c6956; + :b :c6957; + :b :c6958; + :b :c6959; + :b :c6960; + :b :c6961; + :b :c6962; + :b :c6963; + :b :c6964; + :b :c6965; + :b :c6966; + :b :c6967; + :b :c6968; + :b :c6969; + :b :c6970; + :b :c6971; + :b :c6972; + :b :c6973; + :b :c6974; + :b :c6975; + :b :c6976; + :b :c6977; + :b :c6978; + :b :c6979; + :b :c6980; + :b :c6981; + :b :c6982; + :b :c6983; + :b :c6984; + :b :c6985; + :b :c6986; + :b :c6987; + :b :c6988; + :b :c6989; + :b :c6990; + :b :c6991; + :b :c6992; + :b :c6993; + :b :c6994; + :b :c6995; + :b :c6996; + :b :c6997; + :b :c6998; + :b :c6999; + :b :c7000; + :b :c7001; + :b :c7002; + :b :c7003; + :b :c7004; + :b :c7005; + :b :c7006; + :b :c7007; + :b :c7008; + :b :c7009; + :b :c7010; + :b :c7011; + :b :c7012; + :b :c7013; + :b :c7014; + :b :c7015; + :b :c7016; + :b :c7017; + :b :c7018; + :b :c7019; + :b :c7020; + :b :c7021; + :b :c7022; + :b :c7023; + :b :c7024; + :b :c7025; + :b :c7026; + :b :c7027; + :b :c7028; + :b :c7029; + :b :c7030; + :b :c7031; + :b :c7032; + :b :c7033; + :b :c7034; + :b :c7035; + :b :c7036; + :b :c7037; + :b :c7038; + :b :c7039; + :b :c7040; + :b :c7041; + :b :c7042; + :b :c7043; + :b :c7044; + :b :c7045; + :b :c7046; + :b :c7047; + :b :c7048; + :b :c7049; + :b :c7050; + :b :c7051; + :b :c7052; + :b :c7053; + :b :c7054; + :b :c7055; + :b :c7056; + :b :c7057; + :b :c7058; + :b :c7059; + :b :c7060; + :b :c7061; + :b :c7062; + :b :c7063; + :b :c7064; + :b :c7065; + :b :c7066; + :b :c7067; + :b :c7068; + :b :c7069; + :b :c7070; + :b :c7071; + :b :c7072; + :b :c7073; + :b :c7074; + :b :c7075; + :b :c7076; + :b :c7077; + :b :c7078; + :b :c7079; + :b :c7080; + :b :c7081; + :b :c7082; + :b :c7083; + :b :c7084; + :b :c7085; + :b :c7086; + :b :c7087; + :b :c7088; + :b :c7089; + :b :c7090; + :b :c7091; + :b :c7092; + :b :c7093; + :b :c7094; + :b :c7095; + :b :c7096; + :b :c7097; + :b :c7098; + :b :c7099; + :b :c7100; + :b :c7101; + :b :c7102; + :b :c7103; + :b :c7104; + :b :c7105; + :b :c7106; + :b :c7107; + :b :c7108; + :b :c7109; + :b :c7110; + :b :c7111; + :b :c7112; + :b :c7113; + :b :c7114; + :b :c7115; + :b :c7116; + :b :c7117; + :b :c7118; + :b :c7119; + :b :c7120; + :b :c7121; + :b :c7122; + :b :c7123; + :b :c7124; + :b :c7125; + :b :c7126; + :b :c7127; + :b :c7128; + :b :c7129; + :b :c7130; + :b :c7131; + :b :c7132; + :b :c7133; + :b :c7134; + :b :c7135; + :b :c7136; + :b :c7137; + :b :c7138; + :b :c7139; + :b :c7140; + :b :c7141; + :b :c7142; + :b :c7143; + :b :c7144; + :b :c7145; + :b :c7146; + :b :c7147; + :b :c7148; + :b :c7149; + :b :c7150; + :b :c7151; + :b :c7152; + :b :c7153; + :b :c7154; + :b :c7155; + :b :c7156; + :b :c7157; + :b :c7158; + :b :c7159; + :b :c7160; + :b :c7161; + :b :c7162; + :b :c7163; + :b :c7164; + :b :c7165; + :b :c7166; + :b :c7167; + :b :c7168; + :b :c7169; + :b :c7170; + :b :c7171; + :b :c7172; + :b :c7173; + :b :c7174; + :b :c7175; + :b :c7176; + :b :c7177; + :b :c7178; + :b :c7179; + :b :c7180; + :b :c7181; + :b :c7182; + :b :c7183; + :b :c7184; + :b :c7185; + :b :c7186; + :b :c7187; + :b :c7188; + :b :c7189; + :b :c7190; + :b :c7191; + :b :c7192; + :b :c7193; + :b :c7194; + :b :c7195; + :b :c7196; + :b :c7197; + :b :c7198; + :b :c7199; + :b :c7200; + :b :c7201; + :b :c7202; + :b :c7203; + :b :c7204; + :b :c7205; + :b :c7206; + :b :c7207; + :b :c7208; + :b :c7209; + :b :c7210; + :b :c7211; + :b :c7212; + :b :c7213; + :b :c7214; + :b :c7215; + :b :c7216; + :b :c7217; + :b :c7218; + :b :c7219; + :b :c7220; + :b :c7221; + :b :c7222; + :b :c7223; + :b :c7224; + :b :c7225; + :b :c7226; + :b :c7227; + :b :c7228; + :b :c7229; + :b :c7230; + :b :c7231; + :b :c7232; + :b :c7233; + :b :c7234; + :b :c7235; + :b :c7236; + :b :c7237; + :b :c7238; + :b :c7239; + :b :c7240; + :b :c7241; + :b :c7242; + :b :c7243; + :b :c7244; + :b :c7245; + :b :c7246; + :b :c7247; + :b :c7248; + :b :c7249; + :b :c7250; + :b :c7251; + :b :c7252; + :b :c7253; + :b :c7254; + :b :c7255; + :b :c7256; + :b :c7257; + :b :c7258; + :b :c7259; + :b :c7260; + :b :c7261; + :b :c7262; + :b :c7263; + :b :c7264; + :b :c7265; + :b :c7266; + :b :c7267; + :b :c7268; + :b :c7269; + :b :c7270; + :b :c7271; + :b :c7272; + :b :c7273; + :b :c7274; + :b :c7275; + :b :c7276; + :b :c7277; + :b :c7278; + :b :c7279; + :b :c7280; + :b :c7281; + :b :c7282; + :b :c7283; + :b :c7284; + :b :c7285; + :b :c7286; + :b :c7287; + :b :c7288; + :b :c7289; + :b :c7290; + :b :c7291; + :b :c7292; + :b :c7293; + :b :c7294; + :b :c7295; + :b :c7296; + :b :c7297; + :b :c7298; + :b :c7299; + :b :c7300; + :b :c7301; + :b :c7302; + :b :c7303; + :b :c7304; + :b :c7305; + :b :c7306; + :b :c7307; + :b :c7308; + :b :c7309; + :b :c7310; + :b :c7311; + :b :c7312; + :b :c7313; + :b :c7314; + :b :c7315; + :b :c7316; + :b :c7317; + :b :c7318; + :b :c7319; + :b :c7320; + :b :c7321; + :b :c7322; + :b :c7323; + :b :c7324; + :b :c7325; + :b :c7326; + :b :c7327; + :b :c7328; + :b :c7329; + :b :c7330; + :b :c7331; + :b :c7332; + :b :c7333; + :b :c7334; + :b :c7335; + :b :c7336; + :b :c7337; + :b :c7338; + :b :c7339; + :b :c7340; + :b :c7341; + :b :c7342; + :b :c7343; + :b :c7344; + :b :c7345; + :b :c7346; + :b :c7347; + :b :c7348; + :b :c7349; + :b :c7350; + :b :c7351; + :b :c7352; + :b :c7353; + :b :c7354; + :b :c7355; + :b :c7356; + :b :c7357; + :b :c7358; + :b :c7359; + :b :c7360; + :b :c7361; + :b :c7362; + :b :c7363; + :b :c7364; + :b :c7365; + :b :c7366; + :b :c7367; + :b :c7368; + :b :c7369; + :b :c7370; + :b :c7371; + :b :c7372; + :b :c7373; + :b :c7374; + :b :c7375; + :b :c7376; + :b :c7377; + :b :c7378; + :b :c7379; + :b :c7380; + :b :c7381; + :b :c7382; + :b :c7383; + :b :c7384; + :b :c7385; + :b :c7386; + :b :c7387; + :b :c7388; + :b :c7389; + :b :c7390; + :b :c7391; + :b :c7392; + :b :c7393; + :b :c7394; + :b :c7395; + :b :c7396; + :b :c7397; + :b :c7398; + :b :c7399; + :b :c7400; + :b :c7401; + :b :c7402; + :b :c7403; + :b :c7404; + :b :c7405; + :b :c7406; + :b :c7407; + :b :c7408; + :b :c7409; + :b :c7410; + :b :c7411; + :b :c7412; + :b :c7413; + :b :c7414; + :b :c7415; + :b :c7416; + :b :c7417; + :b :c7418; + :b :c7419; + :b :c7420; + :b :c7421; + :b :c7422; + :b :c7423; + :b :c7424; + :b :c7425; + :b :c7426; + :b :c7427; + :b :c7428; + :b :c7429; + :b :c7430; + :b :c7431; + :b :c7432; + :b :c7433; + :b :c7434; + :b :c7435; + :b :c7436; + :b :c7437; + :b :c7438; + :b :c7439; + :b :c7440; + :b :c7441; + :b :c7442; + :b :c7443; + :b :c7444; + :b :c7445; + :b :c7446; + :b :c7447; + :b :c7448; + :b :c7449; + :b :c7450; + :b :c7451; + :b :c7452; + :b :c7453; + :b :c7454; + :b :c7455; + :b :c7456; + :b :c7457; + :b :c7458; + :b :c7459; + :b :c7460; + :b :c7461; + :b :c7462; + :b :c7463; + :b :c7464; + :b :c7465; + :b :c7466; + :b :c7467; + :b :c7468; + :b :c7469; + :b :c7470; + :b :c7471; + :b :c7472; + :b :c7473; + :b :c7474; + :b :c7475; + :b :c7476; + :b :c7477; + :b :c7478; + :b :c7479; + :b :c7480; + :b :c7481; + :b :c7482; + :b :c7483; + :b :c7484; + :b :c7485; + :b :c7486; + :b :c7487; + :b :c7488; + :b :c7489; + :b :c7490; + :b :c7491; + :b :c7492; + :b :c7493; + :b :c7494; + :b :c7495; + :b :c7496; + :b :c7497; + :b :c7498; + :b :c7499; + :b :c7500; + :b :c7501; + :b :c7502; + :b :c7503; + :b :c7504; + :b :c7505; + :b :c7506; + :b :c7507; + :b :c7508; + :b :c7509; + :b :c7510; + :b :c7511; + :b :c7512; + :b :c7513; + :b :c7514; + :b :c7515; + :b :c7516; + :b :c7517; + :b :c7518; + :b :c7519; + :b :c7520; + :b :c7521; + :b :c7522; + :b :c7523; + :b :c7524; + :b :c7525; + :b :c7526; + :b :c7527; + :b :c7528; + :b :c7529; + :b :c7530; + :b :c7531; + :b :c7532; + :b :c7533; + :b :c7534; + :b :c7535; + :b :c7536; + :b :c7537; + :b :c7538; + :b :c7539; + :b :c7540; + :b :c7541; + :b :c7542; + :b :c7543; + :b :c7544; + :b :c7545; + :b :c7546; + :b :c7547; + :b :c7548; + :b :c7549; + :b :c7550; + :b :c7551; + :b :c7552; + :b :c7553; + :b :c7554; + :b :c7555; + :b :c7556; + :b :c7557; + :b :c7558; + :b :c7559; + :b :c7560; + :b :c7561; + :b :c7562; + :b :c7563; + :b :c7564; + :b :c7565; + :b :c7566; + :b :c7567; + :b :c7568; + :b :c7569; + :b :c7570; + :b :c7571; + :b :c7572; + :b :c7573; + :b :c7574; + :b :c7575; + :b :c7576; + :b :c7577; + :b :c7578; + :b :c7579; + :b :c7580; + :b :c7581; + :b :c7582; + :b :c7583; + :b :c7584; + :b :c7585; + :b :c7586; + :b :c7587; + :b :c7588; + :b :c7589; + :b :c7590; + :b :c7591; + :b :c7592; + :b :c7593; + :b :c7594; + :b :c7595; + :b :c7596; + :b :c7597; + :b :c7598; + :b :c7599; + :b :c7600; + :b :c7601; + :b :c7602; + :b :c7603; + :b :c7604; + :b :c7605; + :b :c7606; + :b :c7607; + :b :c7608; + :b :c7609; + :b :c7610; + :b :c7611; + :b :c7612; + :b :c7613; + :b :c7614; + :b :c7615; + :b :c7616; + :b :c7617; + :b :c7618; + :b :c7619; + :b :c7620; + :b :c7621; + :b :c7622; + :b :c7623; + :b :c7624; + :b :c7625; + :b :c7626; + :b :c7627; + :b :c7628; + :b :c7629; + :b :c7630; + :b :c7631; + :b :c7632; + :b :c7633; + :b :c7634; + :b :c7635; + :b :c7636; + :b :c7637; + :b :c7638; + :b :c7639; + :b :c7640; + :b :c7641; + :b :c7642; + :b :c7643; + :b :c7644; + :b :c7645; + :b :c7646; + :b :c7647; + :b :c7648; + :b :c7649; + :b :c7650; + :b :c7651; + :b :c7652; + :b :c7653; + :b :c7654; + :b :c7655; + :b :c7656; + :b :c7657; + :b :c7658; + :b :c7659; + :b :c7660; + :b :c7661; + :b :c7662; + :b :c7663; + :b :c7664; + :b :c7665; + :b :c7666; + :b :c7667; + :b :c7668; + :b :c7669; + :b :c7670; + :b :c7671; + :b :c7672; + :b :c7673; + :b :c7674; + :b :c7675; + :b :c7676; + :b :c7677; + :b :c7678; + :b :c7679; + :b :c7680; + :b :c7681; + :b :c7682; + :b :c7683; + :b :c7684; + :b :c7685; + :b :c7686; + :b :c7687; + :b :c7688; + :b :c7689; + :b :c7690; + :b :c7691; + :b :c7692; + :b :c7693; + :b :c7694; + :b :c7695; + :b :c7696; + :b :c7697; + :b :c7698; + :b :c7699; + :b :c7700; + :b :c7701; + :b :c7702; + :b :c7703; + :b :c7704; + :b :c7705; + :b :c7706; + :b :c7707; + :b :c7708; + :b :c7709; + :b :c7710; + :b :c7711; + :b :c7712; + :b :c7713; + :b :c7714; + :b :c7715; + :b :c7716; + :b :c7717; + :b :c7718; + :b :c7719; + :b :c7720; + :b :c7721; + :b :c7722; + :b :c7723; + :b :c7724; + :b :c7725; + :b :c7726; + :b :c7727; + :b :c7728; + :b :c7729; + :b :c7730; + :b :c7731; + :b :c7732; + :b :c7733; + :b :c7734; + :b :c7735; + :b :c7736; + :b :c7737; + :b :c7738; + :b :c7739; + :b :c7740; + :b :c7741; + :b :c7742; + :b :c7743; + :b :c7744; + :b :c7745; + :b :c7746; + :b :c7747; + :b :c7748; + :b :c7749; + :b :c7750; + :b :c7751; + :b :c7752; + :b :c7753; + :b :c7754; + :b :c7755; + :b :c7756; + :b :c7757; + :b :c7758; + :b :c7759; + :b :c7760; + :b :c7761; + :b :c7762; + :b :c7763; + :b :c7764; + :b :c7765; + :b :c7766; + :b :c7767; + :b :c7768; + :b :c7769; + :b :c7770; + :b :c7771; + :b :c7772; + :b :c7773; + :b :c7774; + :b :c7775; + :b :c7776; + :b :c7777; + :b :c7778; + :b :c7779; + :b :c7780; + :b :c7781; + :b :c7782; + :b :c7783; + :b :c7784; + :b :c7785; + :b :c7786; + :b :c7787; + :b :c7788; + :b :c7789; + :b :c7790; + :b :c7791; + :b :c7792; + :b :c7793; + :b :c7794; + :b :c7795; + :b :c7796; + :b :c7797; + :b :c7798; + :b :c7799; + :b :c7800; + :b :c7801; + :b :c7802; + :b :c7803; + :b :c7804; + :b :c7805; + :b :c7806; + :b :c7807; + :b :c7808; + :b :c7809; + :b :c7810; + :b :c7811; + :b :c7812; + :b :c7813; + :b :c7814; + :b :c7815; + :b :c7816; + :b :c7817; + :b :c7818; + :b :c7819; + :b :c7820; + :b :c7821; + :b :c7822; + :b :c7823; + :b :c7824; + :b :c7825; + :b :c7826; + :b :c7827; + :b :c7828; + :b :c7829; + :b :c7830; + :b :c7831; + :b :c7832; + :b :c7833; + :b :c7834; + :b :c7835; + :b :c7836; + :b :c7837; + :b :c7838; + :b :c7839; + :b :c7840; + :b :c7841; + :b :c7842; + :b :c7843; + :b :c7844; + :b :c7845; + :b :c7846; + :b :c7847; + :b :c7848; + :b :c7849; + :b :c7850; + :b :c7851; + :b :c7852; + :b :c7853; + :b :c7854; + :b :c7855; + :b :c7856; + :b :c7857; + :b :c7858; + :b :c7859; + :b :c7860; + :b :c7861; + :b :c7862; + :b :c7863; + :b :c7864; + :b :c7865; + :b :c7866; + :b :c7867; + :b :c7868; + :b :c7869; + :b :c7870; + :b :c7871; + :b :c7872; + :b :c7873; + :b :c7874; + :b :c7875; + :b :c7876; + :b :c7877; + :b :c7878; + :b :c7879; + :b :c7880; + :b :c7881; + :b :c7882; + :b :c7883; + :b :c7884; + :b :c7885; + :b :c7886; + :b :c7887; + :b :c7888; + :b :c7889; + :b :c7890; + :b :c7891; + :b :c7892; + :b :c7893; + :b :c7894; + :b :c7895; + :b :c7896; + :b :c7897; + :b :c7898; + :b :c7899; + :b :c7900; + :b :c7901; + :b :c7902; + :b :c7903; + :b :c7904; + :b :c7905; + :b :c7906; + :b :c7907; + :b :c7908; + :b :c7909; + :b :c7910; + :b :c7911; + :b :c7912; + :b :c7913; + :b :c7914; + :b :c7915; + :b :c7916; + :b :c7917; + :b :c7918; + :b :c7919; + :b :c7920; + :b :c7921; + :b :c7922; + :b :c7923; + :b :c7924; + :b :c7925; + :b :c7926; + :b :c7927; + :b :c7928; + :b :c7929; + :b :c7930; + :b :c7931; + :b :c7932; + :b :c7933; + :b :c7934; + :b :c7935; + :b :c7936; + :b :c7937; + :b :c7938; + :b :c7939; + :b :c7940; + :b :c7941; + :b :c7942; + :b :c7943; + :b :c7944; + :b :c7945; + :b :c7946; + :b :c7947; + :b :c7948; + :b :c7949; + :b :c7950; + :b :c7951; + :b :c7952; + :b :c7953; + :b :c7954; + :b :c7955; + :b :c7956; + :b :c7957; + :b :c7958; + :b :c7959; + :b :c7960; + :b :c7961; + :b :c7962; + :b :c7963; + :b :c7964; + :b :c7965; + :b :c7966; + :b :c7967; + :b :c7968; + :b :c7969; + :b :c7970; + :b :c7971; + :b :c7972; + :b :c7973; + :b :c7974; + :b :c7975; + :b :c7976; + :b :c7977; + :b :c7978; + :b :c7979; + :b :c7980; + :b :c7981; + :b :c7982; + :b :c7983; + :b :c7984; + :b :c7985; + :b :c7986; + :b :c7987; + :b :c7988; + :b :c7989; + :b :c7990; + :b :c7991; + :b :c7992; + :b :c7993; + :b :c7994; + :b :c7995; + :b :c7996; + :b :c7997; + :b :c7998; + :b :c7999; + :b :c8000; + :b :c8001; + :b :c8002; + :b :c8003; + :b :c8004; + :b :c8005; + :b :c8006; + :b :c8007; + :b :c8008; + :b :c8009; + :b :c8010; + :b :c8011; + :b :c8012; + :b :c8013; + :b :c8014; + :b :c8015; + :b :c8016; + :b :c8017; + :b :c8018; + :b :c8019; + :b :c8020; + :b :c8021; + :b :c8022; + :b :c8023; + :b :c8024; + :b :c8025; + :b :c8026; + :b :c8027; + :b :c8028; + :b :c8029; + :b :c8030; + :b :c8031; + :b :c8032; + :b :c8033; + :b :c8034; + :b :c8035; + :b :c8036; + :b :c8037; + :b :c8038; + :b :c8039; + :b :c8040; + :b :c8041; + :b :c8042; + :b :c8043; + :b :c8044; + :b :c8045; + :b :c8046; + :b :c8047; + :b :c8048; + :b :c8049; + :b :c8050; + :b :c8051; + :b :c8052; + :b :c8053; + :b :c8054; + :b :c8055; + :b :c8056; + :b :c8057; + :b :c8058; + :b :c8059; + :b :c8060; + :b :c8061; + :b :c8062; + :b :c8063; + :b :c8064; + :b :c8065; + :b :c8066; + :b :c8067; + :b :c8068; + :b :c8069; + :b :c8070; + :b :c8071; + :b :c8072; + :b :c8073; + :b :c8074; + :b :c8075; + :b :c8076; + :b :c8077; + :b :c8078; + :b :c8079; + :b :c8080; + :b :c8081; + :b :c8082; + :b :c8083; + :b :c8084; + :b :c8085; + :b :c8086; + :b :c8087; + :b :c8088; + :b :c8089; + :b :c8090; + :b :c8091; + :b :c8092; + :b :c8093; + :b :c8094; + :b :c8095; + :b :c8096; + :b :c8097; + :b :c8098; + :b :c8099; + :b :c8100; + :b :c8101; + :b :c8102; + :b :c8103; + :b :c8104; + :b :c8105; + :b :c8106; + :b :c8107; + :b :c8108; + :b :c8109; + :b :c8110; + :b :c8111; + :b :c8112; + :b :c8113; + :b :c8114; + :b :c8115; + :b :c8116; + :b :c8117; + :b :c8118; + :b :c8119; + :b :c8120; + :b :c8121; + :b :c8122; + :b :c8123; + :b :c8124; + :b :c8125; + :b :c8126; + :b :c8127; + :b :c8128; + :b :c8129; + :b :c8130; + :b :c8131; + :b :c8132; + :b :c8133; + :b :c8134; + :b :c8135; + :b :c8136; + :b :c8137; + :b :c8138; + :b :c8139; + :b :c8140; + :b :c8141; + :b :c8142; + :b :c8143; + :b :c8144; + :b :c8145; + :b :c8146; + :b :c8147; + :b :c8148; + :b :c8149; + :b :c8150; + :b :c8151; + :b :c8152; + :b :c8153; + :b :c8154; + :b :c8155; + :b :c8156; + :b :c8157; + :b :c8158; + :b :c8159; + :b :c8160; + :b :c8161; + :b :c8162; + :b :c8163; + :b :c8164; + :b :c8165; + :b :c8166; + :b :c8167; + :b :c8168; + :b :c8169; + :b :c8170; + :b :c8171; + :b :c8172; + :b :c8173; + :b :c8174; + :b :c8175; + :b :c8176; + :b :c8177; + :b :c8178; + :b :c8179; + :b :c8180; + :b :c8181; + :b :c8182; + :b :c8183; + :b :c8184; + :b :c8185; + :b :c8186; + :b :c8187; + :b :c8188; + :b :c8189; + :b :c8190; + :b :c8191; + :b :c8192; + :b :c8193; + :b :c8194; + :b :c8195; + :b :c8196; + :b :c8197; + :b :c8198; + :b :c8199; + :b :c8200; + :b :c8201; + :b :c8202; + :b :c8203; + :b :c8204; + :b :c8205; + :b :c8206; + :b :c8207; + :b :c8208; + :b :c8209; + :b :c8210; + :b :c8211; + :b :c8212; + :b :c8213; + :b :c8214; + :b :c8215; + :b :c8216; + :b :c8217; + :b :c8218; + :b :c8219; + :b :c8220; + :b :c8221; + :b :c8222; + :b :c8223; + :b :c8224; + :b :c8225; + :b :c8226; + :b :c8227; + :b :c8228; + :b :c8229; + :b :c8230; + :b :c8231; + :b :c8232; + :b :c8233; + :b :c8234; + :b :c8235; + :b :c8236; + :b :c8237; + :b :c8238; + :b :c8239; + :b :c8240; + :b :c8241; + :b :c8242; + :b :c8243; + :b :c8244; + :b :c8245; + :b :c8246; + :b :c8247; + :b :c8248; + :b :c8249; + :b :c8250; + :b :c8251; + :b :c8252; + :b :c8253; + :b :c8254; + :b :c8255; + :b :c8256; + :b :c8257; + :b :c8258; + :b :c8259; + :b :c8260; + :b :c8261; + :b :c8262; + :b :c8263; + :b :c8264; + :b :c8265; + :b :c8266; + :b :c8267; + :b :c8268; + :b :c8269; + :b :c8270; + :b :c8271; + :b :c8272; + :b :c8273; + :b :c8274; + :b :c8275; + :b :c8276; + :b :c8277; + :b :c8278; + :b :c8279; + :b :c8280; + :b :c8281; + :b :c8282; + :b :c8283; + :b :c8284; + :b :c8285; + :b :c8286; + :b :c8287; + :b :c8288; + :b :c8289; + :b :c8290; + :b :c8291; + :b :c8292; + :b :c8293; + :b :c8294; + :b :c8295; + :b :c8296; + :b :c8297; + :b :c8298; + :b :c8299; + :b :c8300; + :b :c8301; + :b :c8302; + :b :c8303; + :b :c8304; + :b :c8305; + :b :c8306; + :b :c8307; + :b :c8308; + :b :c8309; + :b :c8310; + :b :c8311; + :b :c8312; + :b :c8313; + :b :c8314; + :b :c8315; + :b :c8316; + :b :c8317; + :b :c8318; + :b :c8319; + :b :c8320; + :b :c8321; + :b :c8322; + :b :c8323; + :b :c8324; + :b :c8325; + :b :c8326; + :b :c8327; + :b :c8328; + :b :c8329; + :b :c8330; + :b :c8331; + :b :c8332; + :b :c8333; + :b :c8334; + :b :c8335; + :b :c8336; + :b :c8337; + :b :c8338; + :b :c8339; + :b :c8340; + :b :c8341; + :b :c8342; + :b :c8343; + :b :c8344; + :b :c8345; + :b :c8346; + :b :c8347; + :b :c8348; + :b :c8349; + :b :c8350; + :b :c8351; + :b :c8352; + :b :c8353; + :b :c8354; + :b :c8355; + :b :c8356; + :b :c8357; + :b :c8358; + :b :c8359; + :b :c8360; + :b :c8361; + :b :c8362; + :b :c8363; + :b :c8364; + :b :c8365; + :b :c8366; + :b :c8367; + :b :c8368; + :b :c8369; + :b :c8370; + :b :c8371; + :b :c8372; + :b :c8373; + :b :c8374; + :b :c8375; + :b :c8376; + :b :c8377; + :b :c8378; + :b :c8379; + :b :c8380; + :b :c8381; + :b :c8382; + :b :c8383; + :b :c8384; + :b :c8385; + :b :c8386; + :b :c8387; + :b :c8388; + :b :c8389; + :b :c8390; + :b :c8391; + :b :c8392; + :b :c8393; + :b :c8394; + :b :c8395; + :b :c8396; + :b :c8397; + :b :c8398; + :b :c8399; + :b :c8400; + :b :c8401; + :b :c8402; + :b :c8403; + :b :c8404; + :b :c8405; + :b :c8406; + :b :c8407; + :b :c8408; + :b :c8409; + :b :c8410; + :b :c8411; + :b :c8412; + :b :c8413; + :b :c8414; + :b :c8415; + :b :c8416; + :b :c8417; + :b :c8418; + :b :c8419; + :b :c8420; + :b :c8421; + :b :c8422; + :b :c8423; + :b :c8424; + :b :c8425; + :b :c8426; + :b :c8427; + :b :c8428; + :b :c8429; + :b :c8430; + :b :c8431; + :b :c8432; + :b :c8433; + :b :c8434; + :b :c8435; + :b :c8436; + :b :c8437; + :b :c8438; + :b :c8439; + :b :c8440; + :b :c8441; + :b :c8442; + :b :c8443; + :b :c8444; + :b :c8445; + :b :c8446; + :b :c8447; + :b :c8448; + :b :c8449; + :b :c8450; + :b :c8451; + :b :c8452; + :b :c8453; + :b :c8454; + :b :c8455; + :b :c8456; + :b :c8457; + :b :c8458; + :b :c8459; + :b :c8460; + :b :c8461; + :b :c8462; + :b :c8463; + :b :c8464; + :b :c8465; + :b :c8466; + :b :c8467; + :b :c8468; + :b :c8469; + :b :c8470; + :b :c8471; + :b :c8472; + :b :c8473; + :b :c8474; + :b :c8475; + :b :c8476; + :b :c8477; + :b :c8478; + :b :c8479; + :b :c8480; + :b :c8481; + :b :c8482; + :b :c8483; + :b :c8484; + :b :c8485; + :b :c8486; + :b :c8487; + :b :c8488; + :b :c8489; + :b :c8490; + :b :c8491; + :b :c8492; + :b :c8493; + :b :c8494; + :b :c8495; + :b :c8496; + :b :c8497; + :b :c8498; + :b :c8499; + :b :c8500; + :b :c8501; + :b :c8502; + :b :c8503; + :b :c8504; + :b :c8505; + :b :c8506; + :b :c8507; + :b :c8508; + :b :c8509; + :b :c8510; + :b :c8511; + :b :c8512; + :b :c8513; + :b :c8514; + :b :c8515; + :b :c8516; + :b :c8517; + :b :c8518; + :b :c8519; + :b :c8520; + :b :c8521; + :b :c8522; + :b :c8523; + :b :c8524; + :b :c8525; + :b :c8526; + :b :c8527; + :b :c8528; + :b :c8529; + :b :c8530; + :b :c8531; + :b :c8532; + :b :c8533; + :b :c8534; + :b :c8535; + :b :c8536; + :b :c8537; + :b :c8538; + :b :c8539; + :b :c8540; + :b :c8541; + :b :c8542; + :b :c8543; + :b :c8544; + :b :c8545; + :b :c8546; + :b :c8547; + :b :c8548; + :b :c8549; + :b :c8550; + :b :c8551; + :b :c8552; + :b :c8553; + :b :c8554; + :b :c8555; + :b :c8556; + :b :c8557; + :b :c8558; + :b :c8559; + :b :c8560; + :b :c8561; + :b :c8562; + :b :c8563; + :b :c8564; + :b :c8565; + :b :c8566; + :b :c8567; + :b :c8568; + :b :c8569; + :b :c8570; + :b :c8571; + :b :c8572; + :b :c8573; + :b :c8574; + :b :c8575; + :b :c8576; + :b :c8577; + :b :c8578; + :b :c8579; + :b :c8580; + :b :c8581; + :b :c8582; + :b :c8583; + :b :c8584; + :b :c8585; + :b :c8586; + :b :c8587; + :b :c8588; + :b :c8589; + :b :c8590; + :b :c8591; + :b :c8592; + :b :c8593; + :b :c8594; + :b :c8595; + :b :c8596; + :b :c8597; + :b :c8598; + :b :c8599; + :b :c8600; + :b :c8601; + :b :c8602; + :b :c8603; + :b :c8604; + :b :c8605; + :b :c8606; + :b :c8607; + :b :c8608; + :b :c8609; + :b :c8610; + :b :c8611; + :b :c8612; + :b :c8613; + :b :c8614; + :b :c8615; + :b :c8616; + :b :c8617; + :b :c8618; + :b :c8619; + :b :c8620; + :b :c8621; + :b :c8622; + :b :c8623; + :b :c8624; + :b :c8625; + :b :c8626; + :b :c8627; + :b :c8628; + :b :c8629; + :b :c8630; + :b :c8631; + :b :c8632; + :b :c8633; + :b :c8634; + :b :c8635; + :b :c8636; + :b :c8637; + :b :c8638; + :b :c8639; + :b :c8640; + :b :c8641; + :b :c8642; + :b :c8643; + :b :c8644; + :b :c8645; + :b :c8646; + :b :c8647; + :b :c8648; + :b :c8649; + :b :c8650; + :b :c8651; + :b :c8652; + :b :c8653; + :b :c8654; + :b :c8655; + :b :c8656; + :b :c8657; + :b :c8658; + :b :c8659; + :b :c8660; + :b :c8661; + :b :c8662; + :b :c8663; + :b :c8664; + :b :c8665; + :b :c8666; + :b :c8667; + :b :c8668; + :b :c8669; + :b :c8670; + :b :c8671; + :b :c8672; + :b :c8673; + :b :c8674; + :b :c8675; + :b :c8676; + :b :c8677; + :b :c8678; + :b :c8679; + :b :c8680; + :b :c8681; + :b :c8682; + :b :c8683; + :b :c8684; + :b :c8685; + :b :c8686; + :b :c8687; + :b :c8688; + :b :c8689; + :b :c8690; + :b :c8691; + :b :c8692; + :b :c8693; + :b :c8694; + :b :c8695; + :b :c8696; + :b :c8697; + :b :c8698; + :b :c8699; + :b :c8700; + :b :c8701; + :b :c8702; + :b :c8703; + :b :c8704; + :b :c8705; + :b :c8706; + :b :c8707; + :b :c8708; + :b :c8709; + :b :c8710; + :b :c8711; + :b :c8712; + :b :c8713; + :b :c8714; + :b :c8715; + :b :c8716; + :b :c8717; + :b :c8718; + :b :c8719; + :b :c8720; + :b :c8721; + :b :c8722; + :b :c8723; + :b :c8724; + :b :c8725; + :b :c8726; + :b :c8727; + :b :c8728; + :b :c8729; + :b :c8730; + :b :c8731; + :b :c8732; + :b :c8733; + :b :c8734; + :b :c8735; + :b :c8736; + :b :c8737; + :b :c8738; + :b :c8739; + :b :c8740; + :b :c8741; + :b :c8742; + :b :c8743; + :b :c8744; + :b :c8745; + :b :c8746; + :b :c8747; + :b :c8748; + :b :c8749; + :b :c8750; + :b :c8751; + :b :c8752; + :b :c8753; + :b :c8754; + :b :c8755; + :b :c8756; + :b :c8757; + :b :c8758; + :b :c8759; + :b :c8760; + :b :c8761; + :b :c8762; + :b :c8763; + :b :c8764; + :b :c8765; + :b :c8766; + :b :c8767; + :b :c8768; + :b :c8769; + :b :c8770; + :b :c8771; + :b :c8772; + :b :c8773; + :b :c8774; + :b :c8775; + :b :c8776; + :b :c8777; + :b :c8778; + :b :c8779; + :b :c8780; + :b :c8781; + :b :c8782; + :b :c8783; + :b :c8784; + :b :c8785; + :b :c8786; + :b :c8787; + :b :c8788; + :b :c8789; + :b :c8790; + :b :c8791; + :b :c8792; + :b :c8793; + :b :c8794; + :b :c8795; + :b :c8796; + :b :c8797; + :b :c8798; + :b :c8799; + :b :c8800; + :b :c8801; + :b :c8802; + :b :c8803; + :b :c8804; + :b :c8805; + :b :c8806; + :b :c8807; + :b :c8808; + :b :c8809; + :b :c8810; + :b :c8811; + :b :c8812; + :b :c8813; + :b :c8814; + :b :c8815; + :b :c8816; + :b :c8817; + :b :c8818; + :b :c8819; + :b :c8820; + :b :c8821; + :b :c8822; + :b :c8823; + :b :c8824; + :b :c8825; + :b :c8826; + :b :c8827; + :b :c8828; + :b :c8829; + :b :c8830; + :b :c8831; + :b :c8832; + :b :c8833; + :b :c8834; + :b :c8835; + :b :c8836; + :b :c8837; + :b :c8838; + :b :c8839; + :b :c8840; + :b :c8841; + :b :c8842; + :b :c8843; + :b :c8844; + :b :c8845; + :b :c8846; + :b :c8847; + :b :c8848; + :b :c8849; + :b :c8850; + :b :c8851; + :b :c8852; + :b :c8853; + :b :c8854; + :b :c8855; + :b :c8856; + :b :c8857; + :b :c8858; + :b :c8859; + :b :c8860; + :b :c8861; + :b :c8862; + :b :c8863; + :b :c8864; + :b :c8865; + :b :c8866; + :b :c8867; + :b :c8868; + :b :c8869; + :b :c8870; + :b :c8871; + :b :c8872; + :b :c8873; + :b :c8874; + :b :c8875; + :b :c8876; + :b :c8877; + :b :c8878; + :b :c8879; + :b :c8880; + :b :c8881; + :b :c8882; + :b :c8883; + :b :c8884; + :b :c8885; + :b :c8886; + :b :c8887; + :b :c8888; + :b :c8889; + :b :c8890; + :b :c8891; + :b :c8892; + :b :c8893; + :b :c8894; + :b :c8895; + :b :c8896; + :b :c8897; + :b :c8898; + :b :c8899; + :b :c8900; + :b :c8901; + :b :c8902; + :b :c8903; + :b :c8904; + :b :c8905; + :b :c8906; + :b :c8907; + :b :c8908; + :b :c8909; + :b :c8910; + :b :c8911; + :b :c8912; + :b :c8913; + :b :c8914; + :b :c8915; + :b :c8916; + :b :c8917; + :b :c8918; + :b :c8919; + :b :c8920; + :b :c8921; + :b :c8922; + :b :c8923; + :b :c8924; + :b :c8925; + :b :c8926; + :b :c8927; + :b :c8928; + :b :c8929; + :b :c8930; + :b :c8931; + :b :c8932; + :b :c8933; + :b :c8934; + :b :c8935; + :b :c8936; + :b :c8937; + :b :c8938; + :b :c8939; + :b :c8940; + :b :c8941; + :b :c8942; + :b :c8943; + :b :c8944; + :b :c8945; + :b :c8946; + :b :c8947; + :b :c8948; + :b :c8949; + :b :c8950; + :b :c8951; + :b :c8952; + :b :c8953; + :b :c8954; + :b :c8955; + :b :c8956; + :b :c8957; + :b :c8958; + :b :c8959; + :b :c8960; + :b :c8961; + :b :c8962; + :b :c8963; + :b :c8964; + :b :c8965; + :b :c8966; + :b :c8967; + :b :c8968; + :b :c8969; + :b :c8970; + :b :c8971; + :b :c8972; + :b :c8973; + :b :c8974; + :b :c8975; + :b :c8976; + :b :c8977; + :b :c8978; + :b :c8979; + :b :c8980; + :b :c8981; + :b :c8982; + :b :c8983; + :b :c8984; + :b :c8985; + :b :c8986; + :b :c8987; + :b :c8988; + :b :c8989; + :b :c8990; + :b :c8991; + :b :c8992; + :b :c8993; + :b :c8994; + :b :c8995; + :b :c8996; + :b :c8997; + :b :c8998; + :b :c8999; + :b :c9000; + :b :c9001; + :b :c9002; + :b :c9003; + :b :c9004; + :b :c9005; + :b :c9006; + :b :c9007; + :b :c9008; + :b :c9009; + :b :c9010; + :b :c9011; + :b :c9012; + :b :c9013; + :b :c9014; + :b :c9015; + :b :c9016; + :b :c9017; + :b :c9018; + :b :c9019; + :b :c9020; + :b :c9021; + :b :c9022; + :b :c9023; + :b :c9024; + :b :c9025; + :b :c9026; + :b :c9027; + :b :c9028; + :b :c9029; + :b :c9030; + :b :c9031; + :b :c9032; + :b :c9033; + :b :c9034; + :b :c9035; + :b :c9036; + :b :c9037; + :b :c9038; + :b :c9039; + :b :c9040; + :b :c9041; + :b :c9042; + :b :c9043; + :b :c9044; + :b :c9045; + :b :c9046; + :b :c9047; + :b :c9048; + :b :c9049; + :b :c9050; + :b :c9051; + :b :c9052; + :b :c9053; + :b :c9054; + :b :c9055; + :b :c9056; + :b :c9057; + :b :c9058; + :b :c9059; + :b :c9060; + :b :c9061; + :b :c9062; + :b :c9063; + :b :c9064; + :b :c9065; + :b :c9066; + :b :c9067; + :b :c9068; + :b :c9069; + :b :c9070; + :b :c9071; + :b :c9072; + :b :c9073; + :b :c9074; + :b :c9075; + :b :c9076; + :b :c9077; + :b :c9078; + :b :c9079; + :b :c9080; + :b :c9081; + :b :c9082; + :b :c9083; + :b :c9084; + :b :c9085; + :b :c9086; + :b :c9087; + :b :c9088; + :b :c9089; + :b :c9090; + :b :c9091; + :b :c9092; + :b :c9093; + :b :c9094; + :b :c9095; + :b :c9096; + :b :c9097; + :b :c9098; + :b :c9099; + :b :c9100; + :b :c9101; + :b :c9102; + :b :c9103; + :b :c9104; + :b :c9105; + :b :c9106; + :b :c9107; + :b :c9108; + :b :c9109; + :b :c9110; + :b :c9111; + :b :c9112; + :b :c9113; + :b :c9114; + :b :c9115; + :b :c9116; + :b :c9117; + :b :c9118; + :b :c9119; + :b :c9120; + :b :c9121; + :b :c9122; + :b :c9123; + :b :c9124; + :b :c9125; + :b :c9126; + :b :c9127; + :b :c9128; + :b :c9129; + :b :c9130; + :b :c9131; + :b :c9132; + :b :c9133; + :b :c9134; + :b :c9135; + :b :c9136; + :b :c9137; + :b :c9138; + :b :c9139; + :b :c9140; + :b :c9141; + :b :c9142; + :b :c9143; + :b :c9144; + :b :c9145; + :b :c9146; + :b :c9147; + :b :c9148; + :b :c9149; + :b :c9150; + :b :c9151; + :b :c9152; + :b :c9153; + :b :c9154; + :b :c9155; + :b :c9156; + :b :c9157; + :b :c9158; + :b :c9159; + :b :c9160; + :b :c9161; + :b :c9162; + :b :c9163; + :b :c9164; + :b :c9165; + :b :c9166; + :b :c9167; + :b :c9168; + :b :c9169; + :b :c9170; + :b :c9171; + :b :c9172; + :b :c9173; + :b :c9174; + :b :c9175; + :b :c9176; + :b :c9177; + :b :c9178; + :b :c9179; + :b :c9180; + :b :c9181; + :b :c9182; + :b :c9183; + :b :c9184; + :b :c9185; + :b :c9186; + :b :c9187; + :b :c9188; + :b :c9189; + :b :c9190; + :b :c9191; + :b :c9192; + :b :c9193; + :b :c9194; + :b :c9195; + :b :c9196; + :b :c9197; + :b :c9198; + :b :c9199; + :b :c9200; + :b :c9201; + :b :c9202; + :b :c9203; + :b :c9204; + :b :c9205; + :b :c9206; + :b :c9207; + :b :c9208; + :b :c9209; + :b :c9210; + :b :c9211; + :b :c9212; + :b :c9213; + :b :c9214; + :b :c9215; + :b :c9216; + :b :c9217; + :b :c9218; + :b :c9219; + :b :c9220; + :b :c9221; + :b :c9222; + :b :c9223; + :b :c9224; + :b :c9225; + :b :c9226; + :b :c9227; + :b :c9228; + :b :c9229; + :b :c9230; + :b :c9231; + :b :c9232; + :b :c9233; + :b :c9234; + :b :c9235; + :b :c9236; + :b :c9237; + :b :c9238; + :b :c9239; + :b :c9240; + :b :c9241; + :b :c9242; + :b :c9243; + :b :c9244; + :b :c9245; + :b :c9246; + :b :c9247; + :b :c9248; + :b :c9249; + :b :c9250; + :b :c9251; + :b :c9252; + :b :c9253; + :b :c9254; + :b :c9255; + :b :c9256; + :b :c9257; + :b :c9258; + :b :c9259; + :b :c9260; + :b :c9261; + :b :c9262; + :b :c9263; + :b :c9264; + :b :c9265; + :b :c9266; + :b :c9267; + :b :c9268; + :b :c9269; + :b :c9270; + :b :c9271; + :b :c9272; + :b :c9273; + :b :c9274; + :b :c9275; + :b :c9276; + :b :c9277; + :b :c9278; + :b :c9279; + :b :c9280; + :b :c9281; + :b :c9282; + :b :c9283; + :b :c9284; + :b :c9285; + :b :c9286; + :b :c9287; + :b :c9288; + :b :c9289; + :b :c9290; + :b :c9291; + :b :c9292; + :b :c9293; + :b :c9294; + :b :c9295; + :b :c9296; + :b :c9297; + :b :c9298; + :b :c9299; + :b :c9300; + :b :c9301; + :b :c9302; + :b :c9303; + :b :c9304; + :b :c9305; + :b :c9306; + :b :c9307; + :b :c9308; + :b :c9309; + :b :c9310; + :b :c9311; + :b :c9312; + :b :c9313; + :b :c9314; + :b :c9315; + :b :c9316; + :b :c9317; + :b :c9318; + :b :c9319; + :b :c9320; + :b :c9321; + :b :c9322; + :b :c9323; + :b :c9324; + :b :c9325; + :b :c9326; + :b :c9327; + :b :c9328; + :b :c9329; + :b :c9330; + :b :c9331; + :b :c9332; + :b :c9333; + :b :c9334; + :b :c9335; + :b :c9336; + :b :c9337; + :b :c9338; + :b :c9339; + :b :c9340; + :b :c9341; + :b :c9342; + :b :c9343; + :b :c9344; + :b :c9345; + :b :c9346; + :b :c9347; + :b :c9348; + :b :c9349; + :b :c9350; + :b :c9351; + :b :c9352; + :b :c9353; + :b :c9354; + :b :c9355; + :b :c9356; + :b :c9357; + :b :c9358; + :b :c9359; + :b :c9360; + :b :c9361; + :b :c9362; + :b :c9363; + :b :c9364; + :b :c9365; + :b :c9366; + :b :c9367; + :b :c9368; + :b :c9369; + :b :c9370; + :b :c9371; + :b :c9372; + :b :c9373; + :b :c9374; + :b :c9375; + :b :c9376; + :b :c9377; + :b :c9378; + :b :c9379; + :b :c9380; + :b :c9381; + :b :c9382; + :b :c9383; + :b :c9384; + :b :c9385; + :b :c9386; + :b :c9387; + :b :c9388; + :b :c9389; + :b :c9390; + :b :c9391; + :b :c9392; + :b :c9393; + :b :c9394; + :b :c9395; + :b :c9396; + :b :c9397; + :b :c9398; + :b :c9399; + :b :c9400; + :b :c9401; + :b :c9402; + :b :c9403; + :b :c9404; + :b :c9405; + :b :c9406; + :b :c9407; + :b :c9408; + :b :c9409; + :b :c9410; + :b :c9411; + :b :c9412; + :b :c9413; + :b :c9414; + :b :c9415; + :b :c9416; + :b :c9417; + :b :c9418; + :b :c9419; + :b :c9420; + :b :c9421; + :b :c9422; + :b :c9423; + :b :c9424; + :b :c9425; + :b :c9426; + :b :c9427; + :b :c9428; + :b :c9429; + :b :c9430; + :b :c9431; + :b :c9432; + :b :c9433; + :b :c9434; + :b :c9435; + :b :c9436; + :b :c9437; + :b :c9438; + :b :c9439; + :b :c9440; + :b :c9441; + :b :c9442; + :b :c9443; + :b :c9444; + :b :c9445; + :b :c9446; + :b :c9447; + :b :c9448; + :b :c9449; + :b :c9450; + :b :c9451; + :b :c9452; + :b :c9453; + :b :c9454; + :b :c9455; + :b :c9456; + :b :c9457; + :b :c9458; + :b :c9459; + :b :c9460; + :b :c9461; + :b :c9462; + :b :c9463; + :b :c9464; + :b :c9465; + :b :c9466; + :b :c9467; + :b :c9468; + :b :c9469; + :b :c9470; + :b :c9471; + :b :c9472; + :b :c9473; + :b :c9474; + :b :c9475; + :b :c9476; + :b :c9477; + :b :c9478; + :b :c9479; + :b :c9480; + :b :c9481; + :b :c9482; + :b :c9483; + :b :c9484; + :b :c9485; + :b :c9486; + :b :c9487; + :b :c9488; + :b :c9489; + :b :c9490; + :b :c9491; + :b :c9492; + :b :c9493; + :b :c9494; + :b :c9495; + :b :c9496; + :b :c9497; + :b :c9498; + :b :c9499; + :b :c9500; + :b :c9501; + :b :c9502; + :b :c9503; + :b :c9504; + :b :c9505; + :b :c9506; + :b :c9507; + :b :c9508; + :b :c9509; + :b :c9510; + :b :c9511; + :b :c9512; + :b :c9513; + :b :c9514; + :b :c9515; + :b :c9516; + :b :c9517; + :b :c9518; + :b :c9519; + :b :c9520; + :b :c9521; + :b :c9522; + :b :c9523; + :b :c9524; + :b :c9525; + :b :c9526; + :b :c9527; + :b :c9528; + :b :c9529; + :b :c9530; + :b :c9531; + :b :c9532; + :b :c9533; + :b :c9534; + :b :c9535; + :b :c9536; + :b :c9537; + :b :c9538; + :b :c9539; + :b :c9540; + :b :c9541; + :b :c9542; + :b :c9543; + :b :c9544; + :b :c9545; + :b :c9546; + :b :c9547; + :b :c9548; + :b :c9549; + :b :c9550; + :b :c9551; + :b :c9552; + :b :c9553; + :b :c9554; + :b :c9555; + :b :c9556; + :b :c9557; + :b :c9558; + :b :c9559; + :b :c9560; + :b :c9561; + :b :c9562; + :b :c9563; + :b :c9564; + :b :c9565; + :b :c9566; + :b :c9567; + :b :c9568; + :b :c9569; + :b :c9570; + :b :c9571; + :b :c9572; + :b :c9573; + :b :c9574; + :b :c9575; + :b :c9576; + :b :c9577; + :b :c9578; + :b :c9579; + :b :c9580; + :b :c9581; + :b :c9582; + :b :c9583; + :b :c9584; + :b :c9585; + :b :c9586; + :b :c9587; + :b :c9588; + :b :c9589; + :b :c9590; + :b :c9591; + :b :c9592; + :b :c9593; + :b :c9594; + :b :c9595; + :b :c9596; + :b :c9597; + :b :c9598; + :b :c9599; + :b :c9600; + :b :c9601; + :b :c9602; + :b :c9603; + :b :c9604; + :b :c9605; + :b :c9606; + :b :c9607; + :b :c9608; + :b :c9609; + :b :c9610; + :b :c9611; + :b :c9612; + :b :c9613; + :b :c9614; + :b :c9615; + :b :c9616; + :b :c9617; + :b :c9618; + :b :c9619; + :b :c9620; + :b :c9621; + :b :c9622; + :b :c9623; + :b :c9624; + :b :c9625; + :b :c9626; + :b :c9627; + :b :c9628; + :b :c9629; + :b :c9630; + :b :c9631; + :b :c9632; + :b :c9633; + :b :c9634; + :b :c9635; + :b :c9636; + :b :c9637; + :b :c9638; + :b :c9639; + :b :c9640; + :b :c9641; + :b :c9642; + :b :c9643; + :b :c9644; + :b :c9645; + :b :c9646; + :b :c9647; + :b :c9648; + :b :c9649; + :b :c9650; + :b :c9651; + :b :c9652; + :b :c9653; + :b :c9654; + :b :c9655; + :b :c9656; + :b :c9657; + :b :c9658; + :b :c9659; + :b :c9660; + :b :c9661; + :b :c9662; + :b :c9663; + :b :c9664; + :b :c9665; + :b :c9666; + :b :c9667; + :b :c9668; + :b :c9669; + :b :c9670; + :b :c9671; + :b :c9672; + :b :c9673; + :b :c9674; + :b :c9675; + :b :c9676; + :b :c9677; + :b :c9678; + :b :c9679; + :b :c9680; + :b :c9681; + :b :c9682; + :b :c9683; + :b :c9684; + :b :c9685; + :b :c9686; + :b :c9687; + :b :c9688; + :b :c9689; + :b :c9690; + :b :c9691; + :b :c9692; + :b :c9693; + :b :c9694; + :b :c9695; + :b :c9696; + :b :c9697; + :b :c9698; + :b :c9699; + :b :c9700; + :b :c9701; + :b :c9702; + :b :c9703; + :b :c9704; + :b :c9705; + :b :c9706; + :b :c9707; + :b :c9708; + :b :c9709; + :b :c9710; + :b :c9711; + :b :c9712; + :b :c9713; + :b :c9714; + :b :c9715; + :b :c9716; + :b :c9717; + :b :c9718; + :b :c9719; + :b :c9720; + :b :c9721; + :b :c9722; + :b :c9723; + :b :c9724; + :b :c9725; + :b :c9726; + :b :c9727; + :b :c9728; + :b :c9729; + :b :c9730; + :b :c9731; + :b :c9732; + :b :c9733; + :b :c9734; + :b :c9735; + :b :c9736; + :b :c9737; + :b :c9738; + :b :c9739; + :b :c9740; + :b :c9741; + :b :c9742; + :b :c9743; + :b :c9744; + :b :c9745; + :b :c9746; + :b :c9747; + :b :c9748; + :b :c9749; + :b :c9750; + :b :c9751; + :b :c9752; + :b :c9753; + :b :c9754; + :b :c9755; + :b :c9756; + :b :c9757; + :b :c9758; + :b :c9759; + :b :c9760; + :b :c9761; + :b :c9762; + :b :c9763; + :b :c9764; + :b :c9765; + :b :c9766; + :b :c9767; + :b :c9768; + :b :c9769; + :b :c9770; + :b :c9771; + :b :c9772; + :b :c9773; + :b :c9774; + :b :c9775; + :b :c9776; + :b :c9777; + :b :c9778; + :b :c9779; + :b :c9780; + :b :c9781; + :b :c9782; + :b :c9783; + :b :c9784; + :b :c9785; + :b :c9786; + :b :c9787; + :b :c9788; + :b :c9789; + :b :c9790; + :b :c9791; + :b :c9792; + :b :c9793; + :b :c9794; + :b :c9795; + :b :c9796; + :b :c9797; + :b :c9798; + :b :c9799; + :b :c9800; + :b :c9801; + :b :c9802; + :b :c9803; + :b :c9804; + :b :c9805; + :b :c9806; + :b :c9807; + :b :c9808; + :b :c9809; + :b :c9810; + :b :c9811; + :b :c9812; + :b :c9813; + :b :c9814; + :b :c9815; + :b :c9816; + :b :c9817; + :b :c9818; + :b :c9819; + :b :c9820; + :b :c9821; + :b :c9822; + :b :c9823; + :b :c9824; + :b :c9825; + :b :c9826; + :b :c9827; + :b :c9828; + :b :c9829; + :b :c9830; + :b :c9831; + :b :c9832; + :b :c9833; + :b :c9834; + :b :c9835; + :b :c9836; + :b :c9837; + :b :c9838; + :b :c9839; + :b :c9840; + :b :c9841; + :b :c9842; + :b :c9843; + :b :c9844; + :b :c9845; + :b :c9846; + :b :c9847; + :b :c9848; + :b :c9849; + :b :c9850; + :b :c9851; + :b :c9852; + :b :c9853; + :b :c9854; + :b :c9855; + :b :c9856; + :b :c9857; + :b :c9858; + :b :c9859; + :b :c9860; + :b :c9861; + :b :c9862; + :b :c9863; + :b :c9864; + :b :c9865; + :b :c9866; + :b :c9867; + :b :c9868; + :b :c9869; + :b :c9870; + :b :c9871; + :b :c9872; + :b :c9873; + :b :c9874; + :b :c9875; + :b :c9876; + :b :c9877; + :b :c9878; + :b :c9879; + :b :c9880; + :b :c9881; + :b :c9882; + :b :c9883; + :b :c9884; + :b :c9885; + :b :c9886; + :b :c9887; + :b :c9888; + :b :c9889; + :b :c9890; + :b :c9891; + :b :c9892; + :b :c9893; + :b :c9894; + :b :c9895; + :b :c9896; + :b :c9897; + :b :c9898; + :b :c9899; + :b :c9900; + :b :c9901; + :b :c9902; + :b :c9903; + :b :c9904; + :b :c9905; + :b :c9906; + :b :c9907; + :b :c9908; + :b :c9909; + :b :c9910; + :b :c9911; + :b :c9912; + :b :c9913; + :b :c9914; + :b :c9915; + :b :c9916; + :b :c9917; + :b :c9918; + :b :c9919; + :b :c9920; + :b :c9921; + :b :c9922; + :b :c9923; + :b :c9924; + :b :c9925; + :b :c9926; + :b :c9927; + :b :c9928; + :b :c9929; + :b :c9930; + :b :c9931; + :b :c9932; + :b :c9933; + :b :c9934; + :b :c9935; + :b :c9936; + :b :c9937; + :b :c9938; + :b :c9939; + :b :c9940; + :b :c9941; + :b :c9942; + :b :c9943; + :b :c9944; + :b :c9945; + :b :c9946; + :b :c9947; + :b :c9948; + :b :c9949; + :b :c9950; + :b :c9951; + :b :c9952; + :b :c9953; + :b :c9954; + :b :c9955; + :b :c9956; + :b :c9957; + :b :c9958; + :b :c9959; + :b :c9960; + :b :c9961; + :b :c9962; + :b :c9963; + :b :c9964; + :b :c9965; + :b :c9966; + :b :c9967; + :b :c9968; + :b :c9969; + :b :c9970; + :b :c9971; + :b :c9972; + :b :c9973; + :b :c9974; + :b :c9975; + :b :c9976; + :b :c9977; + :b :c9978; + :b :c9979; + :b :c9980; + :b :c9981; + :b :c9982; + :b :c9983; + :b :c9984; + :b :c9985; + :b :c9986; + :b :c9987; + :b :c9988; + :b :c9989; + :b :c9990; + :b :c9991; + :b :c9992; + :b :c9993; + :b :c9994; + :b :c9995; + :b :c9996; + :b :c9997; + :b :c9998; + :b :c9999; + :b :c10000 . diff --git a/testsuite/serd-tests/good/test-18.nt b/testsuite/serd-tests/good/test-18.nt new file mode 100644 index 00000000..4ff4b95b --- /dev/null +++ b/testsuite/serd-tests/good/test-18.nt @@ -0,0 +1,2 @@ +<http://example.org/foo#a> <http://example.org/foo#b> "\nthis \ris a \U00015678long\t\nliteral\uABCD\n" . +<http://example.org/foo#d> <http://example.org/foo#e> "\tThis \uABCDis\r \U00015678another\n\none\n" . diff --git a/testsuite/serd-tests/good/test-18.ttl b/testsuite/serd-tests/good/test-18.ttl new file mode 100644 index 00000000..1adfa451 --- /dev/null +++ b/testsuite/serd-tests/good/test-18.ttl @@ -0,0 +1,9 @@ +@prefix : <http://example.org/foo#> . + +:a :b """\nthis \ris a \U00015678long\t +literal\uABCD +""" . + +:d :e """\tThis \uABCDis\r \U00015678another\n +one +""" . diff --git a/testsuite/serd-tests/good/test-30.nt b/testsuite/serd-tests/good/test-30.nt new file mode 100644 index 00000000..f400cba6 --- /dev/null +++ b/testsuite/serd-tests/good/test-30.nt @@ -0,0 +1,5 @@ +<http://drobilla.net/sw/serd/test/good/a1> <http://drobilla.net/sw/serd/test/good/b1> <http://drobilla.net/sw/serd/test/good/c1> . +<http://example.org/ns/a2> <http://example.org/ns/b2> <http://example.org/ns/c2> . +<http://example.org/ns/foo/a3> <http://example.org/ns/foo/b3> <http://example.org/ns/foo/c3> . +<http://example.org/ns/foo/bar#a4> <http://example.org/ns/foo/bar#b4> <http://example.org/ns/foo/bar#c4> . +<http://example.org/ns2#a5> <http://example.org/ns2#b5> <http://example.org/ns2#c5> . diff --git a/testsuite/serd-tests/good/test-30.ttl b/testsuite/serd-tests/good/test-30.ttl new file mode 100644 index 00000000..9aff060f --- /dev/null +++ b/testsuite/serd-tests/good/test-30.ttl @@ -0,0 +1,12 @@ +# In-scope base URI is http://drobilla.net/sw/serd/test/good/ at this point +<a1> <b1> <c1> . +@base <http://example.org/ns/> . +# In-scope base URI is http://example.org/ns/ at this point +<a2> <http://example.org/ns/b2> <c2> . +@base <foo/> . +# In-scope base URI is http://example.org/ns/foo/ at this point +<a3> <b3> <c3> . +@prefix : <bar#> . +:a4 :b4 :c4 . +@prefix : <http://example.org/ns2#> . +:a5 :b5 :c5 . diff --git a/testsuite/serd-tests/good/test-a-without-whitespace.nt b/testsuite/serd-tests/good/test-a-without-whitespace.nt new file mode 100644 index 00000000..27c5e7da --- /dev/null +++ b/testsuite/serd-tests/good/test-a-without-whitespace.nt @@ -0,0 +1,6 @@ +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/> . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> _:b3 . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +<http://example.org/s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> _:b5 . +<http://example.org/s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . diff --git a/testsuite/serd-tests/good/test-a-without-whitespace.ttl b/testsuite/serd-tests/good/test-a-without-whitespace.ttl new file mode 100644 index 00000000..2d6db000 --- /dev/null +++ b/testsuite/serd-tests/good/test-a-without-whitespace.ttl @@ -0,0 +1,6 @@ +[a<http://example.org/>]. +[a[]]. +[a()]. +<http://example.org/s>a<http://example.org/Thing>. +<http://example.org/s>a[]. +<http://example.org/s>a(). diff --git a/testsuite/serd-tests/good/test-backspace.nt b/testsuite/serd-tests/good/test-backspace.nt new file mode 100644 index 00000000..3dfffa38 --- /dev/null +++ b/testsuite/serd-tests/good/test-backspace.nt @@ -0,0 +1,3 @@ +<http://example.org/thing> <http://example.org/label> "\u0008" . +<http://example.org/thing> <http://example.org/label> "\u0008" . +<http://example.org/thing> <http://example.org/label> "\n\u0008\n" . diff --git a/testsuite/serd-tests/good/test-backspace.ttl b/testsuite/serd-tests/good/test-backspace.ttl new file mode 100644 index 00000000..1e33ba95 --- /dev/null +++ b/testsuite/serd-tests/good/test-backspace.ttl @@ -0,0 +1,5 @@ +<http://example.org/thing> <http://example.org/label> "\u0008" . +<http://example.org/thing> <http://example.org/label> "" . +<http://example.org/thing> <http://example.org/label> """ + +""" . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-base-nopath.nt b/testsuite/serd-tests/good/test-base-nopath.nt new file mode 100644 index 00000000..8628a30b --- /dev/null +++ b/testsuite/serd-tests/good/test-base-nopath.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/good/test-base-nopath.ttl b/testsuite/serd-tests/good/test-base-nopath.ttl new file mode 100644 index 00000000..8735936a --- /dev/null +++ b/testsuite/serd-tests/good/test-base-nopath.ttl @@ -0,0 +1,3 @@ +@base <http://example.org> . + +<s> <p> <o> . diff --git a/testsuite/serd-tests/good/test-base-query.nt b/testsuite/serd-tests/good/test-base-query.nt new file mode 100644 index 00000000..d40c2f6b --- /dev/null +++ b/testsuite/serd-tests/good/test-base-query.nt @@ -0,0 +1 @@ +<http://example.org/a/b/c/d;p?q> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-base-query.ttl b/testsuite/serd-tests/good/test-base-query.ttl new file mode 100644 index 00000000..77638817 --- /dev/null +++ b/testsuite/serd-tests/good/test-base-query.ttl @@ -0,0 +1,3 @@ +@base <http://example.org/a/b/c/d;p?q> . + +<> a <http://example.org/Thing> . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-blank-cont.nt b/testsuite/serd-tests/good/test-blank-cont.nt new file mode 100644 index 00000000..a4b44e7d --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-cont.nt @@ -0,0 +1,4 @@ +<http://example.org/base#subj> <http://example.org/base#pred> _:b1 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/base#FirstThing> . +<http://example.org/base#subj> <http://example.org/base#pred> _:b2 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/base#SecondThing> . diff --git a/testsuite/serd-tests/good/test-blank-cont.ttl b/testsuite/serd-tests/good/test-blank-cont.ttl new file mode 100644 index 00000000..b161cdc4 --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-cont.ttl @@ -0,0 +1,4 @@ +@prefix : <http://example.org/base#> . + +:subj :pred [ a :FirstThing ] ; + :pred [ a :SecondThing ] . diff --git a/testsuite/serd-tests/good/test-blank-in-list.nt b/testsuite/serd-tests/good/test-blank-in-list.nt new file mode 100644 index 00000000..36bac6d7 --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-in-list.nt @@ -0,0 +1,4 @@ +<http://example.org/stuff/1.0/a> <http://example.org/stuff/1.0/b> _:b1 . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b2 . +_:b2 <http://example.org/stuff/1.0/c> <http://example.org/stuff/1.0/d> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . diff --git a/testsuite/serd-tests/good/test-blank-in-list.ttl b/testsuite/serd-tests/good/test-blank-in-list.ttl new file mode 100644 index 00000000..5c0b0766 --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-in-list.ttl @@ -0,0 +1,2 @@ +@prefix : <http://example.org/stuff/1.0/> . +:a :b ( [ :c :d ] ) . diff --git a/testsuite/serd-tests/good/test-blank-node-statement.nt b/testsuite/serd-tests/good/test-blank-node-statement.nt new file mode 100644 index 00000000..3280b28d --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-node-statement.nt @@ -0,0 +1 @@ +_:b1 <http://example.org/p> <http://example.org/o> . diff --git a/testsuite/serd-tests/good/test-blank-node-statement.ttl b/testsuite/serd-tests/good/test-blank-node-statement.ttl new file mode 100644 index 00000000..c84f8487 --- /dev/null +++ b/testsuite/serd-tests/good/test-blank-node-statement.ttl @@ -0,0 +1,3 @@ +[ + <http://example.org/p> <http://example.org/o> +] . diff --git a/testsuite/serd-tests/good/test-blankdot.nt b/testsuite/serd-tests/good/test-blankdot.nt new file mode 100644 index 00000000..9d4b769b --- /dev/null +++ b/testsuite/serd-tests/good/test-blankdot.nt @@ -0,0 +1 @@ +<http://example.org/subject> <http://example.org/predicate> _:c . diff --git a/testsuite/serd-tests/good/test-blankdot.ttl b/testsuite/serd-tests/good/test-blankdot.ttl new file mode 100644 index 00000000..a6ee7234 --- /dev/null +++ b/testsuite/serd-tests/good/test-blankdot.ttl @@ -0,0 +1 @@ +<http://example.org/subject> <http://example.org/predicate> _:c. diff --git a/testsuite/serd-tests/good/test-bom.nt b/testsuite/serd-tests/good/test-bom.nt new file mode 100644 index 00000000..aea1655b --- /dev/null +++ b/testsuite/serd-tests/good/test-bom.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-bom.ttl b/testsuite/serd-tests/good/test-bom.ttl new file mode 100644 index 00000000..8d6534e1 --- /dev/null +++ b/testsuite/serd-tests/good/test-bom.ttl @@ -0,0 +1,3 @@ +# This file starts with a UTF-8 Byte Order Mark + +<http://example.org/thing> a <http://example.org/Thing> . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-cr.nt b/testsuite/serd-tests/good/test-cr.nt new file mode 100644 index 00000000..aea1655b --- /dev/null +++ b/testsuite/serd-tests/good/test-cr.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-cr.ttl b/testsuite/serd-tests/good/test-cr.ttl new file mode 100644 index 00000000..5410648a --- /dev/null +++ b/testsuite/serd-tests/good/test-cr.ttl @@ -0,0 +1,2 @@ +#Test <http://example.org/thing> a <http://example.org/Thing> . + diff --git a/testsuite/serd-tests/good/test-delete.nt b/testsuite/serd-tests/good/test-delete.nt new file mode 100644 index 00000000..41ac8062 --- /dev/null +++ b/testsuite/serd-tests/good/test-delete.nt @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/label> "\u007F" . +<http://example.org/thing> <http://example.org/label> "\u007F" . diff --git a/testsuite/serd-tests/good/test-delete.ttl b/testsuite/serd-tests/good/test-delete.ttl new file mode 100644 index 00000000..4bc97060 --- /dev/null +++ b/testsuite/serd-tests/good/test-delete.ttl @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/label> "\u007F" . +<http://example.org/thing> <http://example.org/label> "" . diff --git a/testsuite/serd-tests/good/test-digit-start-pname.nt b/testsuite/serd-tests/good/test-digit-start-pname.nt new file mode 100644 index 00000000..66eab7db --- /dev/null +++ b/testsuite/serd-tests/good/test-digit-start-pname.nt @@ -0,0 +1 @@ +<http://example.org/1thing> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-digit-start-pname.ttl b/testsuite/serd-tests/good/test-digit-start-pname.ttl new file mode 100644 index 00000000..6ca8ade8 --- /dev/null +++ b/testsuite/serd-tests/good/test-digit-start-pname.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:1thing a eg:Thing . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-empty-path-base.nt b/testsuite/serd-tests/good/test-empty-path-base.nt new file mode 100644 index 00000000..9ad50617 --- /dev/null +++ b/testsuite/serd-tests/good/test-empty-path-base.nt @@ -0,0 +1 @@ +<http://example.org/instance> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-empty-path-base.ttl b/testsuite/serd-tests/good/test-empty-path-base.ttl new file mode 100644 index 00000000..8410553a --- /dev/null +++ b/testsuite/serd-tests/good/test-empty-path-base.ttl @@ -0,0 +1,3 @@ +@base <http://example.org/> . + +<instance> a <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-empty.nt b/testsuite/serd-tests/good/test-empty.nt new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/serd-tests/good/test-empty.ttl b/testsuite/serd-tests/good/test-empty.ttl new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/serd-tests/good/test-eof-at-page-end.nt b/testsuite/serd-tests/good/test-eof-at-page-end.nt new file mode 100644 index 00000000..64d24586 --- /dev/null +++ b/testsuite/serd-tests/good/test-eof-at-page-end.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/comment> "\n0123456789012345678901234567890123456789\n\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567890123456789012345678901234567890123456789\n01234567" . diff --git a/testsuite/serd-tests/good/test-eof-at-page-end.ttl b/testsuite/serd-tests/good/test-eof-at-page-end.ttl new file mode 100644 index 00000000..d6d9af26 --- /dev/null +++ b/testsuite/serd-tests/good/test-eof-at-page-end.ttl @@ -0,0 +1,85 @@ +<http://example.org/thing> <http://example.org/comment> """ +0123456789012345678901234567890123456789 + +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 + +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 + +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 + +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567890123456789012345678901234567890123456789 +01234567""" . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-escapes.nt b/testsuite/serd-tests/good/test-escapes.nt new file mode 100644 index 00000000..e30222e7 --- /dev/null +++ b/testsuite/serd-tests/good/test-escapes.nt @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/comment> "\\\r\n\t" . +<http://example.org/thing> <http://example.org/comment> <http://example.org/\u005C> . diff --git a/testsuite/serd-tests/good/test-escapes.ttl b/testsuite/serd-tests/good/test-escapes.ttl new file mode 100644 index 00000000..e30222e7 --- /dev/null +++ b/testsuite/serd-tests/good/test-escapes.ttl @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/comment> "\\\r\n\t" . +<http://example.org/thing> <http://example.org/comment> <http://example.org/\u005C> . diff --git a/testsuite/serd-tests/good/test-ext-namedblank-iri.nt b/testsuite/serd-tests/good/test-ext-namedblank-iri.nt new file mode 100644 index 00000000..26075a73 --- /dev/null +++ b/testsuite/serd-tests/good/test-ext-namedblank-iri.nt @@ -0,0 +1,2 @@ +<http://example.org/eg#s> <http://example.org/eg#p> <http://example.org/object> . +<http://example.org/object> <http://example.org/eg#name> "o" . diff --git a/testsuite/serd-tests/good/test-ext-namedblank-iri.ttl b/testsuite/serd-tests/good/test-ext-namedblank-iri.ttl new file mode 100644 index 00000000..28fb32ab --- /dev/null +++ b/testsuite/serd-tests/good/test-ext-namedblank-iri.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s eg:p [ == <http://example.org/object> ; eg:name "o" ] . diff --git a/testsuite/serd-tests/good/test-ext-namedblank-prefix.nt b/testsuite/serd-tests/good/test-ext-namedblank-prefix.nt new file mode 100644 index 00000000..9a2710fb --- /dev/null +++ b/testsuite/serd-tests/good/test-ext-namedblank-prefix.nt @@ -0,0 +1,2 @@ +<http://example.org/eg#s> <http://example.org/eg#p> <http://example.org/eg#o> . +<http://example.org/eg#o> <http://example.org/eg#name> "o" . diff --git a/testsuite/serd-tests/good/test-ext-namedblank-prefix.ttl b/testsuite/serd-tests/good/test-ext-namedblank-prefix.ttl new file mode 100644 index 00000000..7de79655 --- /dev/null +++ b/testsuite/serd-tests/good/test-ext-namedblank-prefix.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s eg:p [ == eg:o ; eg:name "o" ] . diff --git a/testsuite/serd-tests/good/test-form-feed.nt b/testsuite/serd-tests/good/test-form-feed.nt new file mode 100644 index 00000000..05478971 --- /dev/null +++ b/testsuite/serd-tests/good/test-form-feed.nt @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/label> "\u000C" . +<http://example.org/thing> <http://example.org/label> "\u000C" . diff --git a/testsuite/serd-tests/good/test-form-feed.ttl b/testsuite/serd-tests/good/test-form-feed.ttl new file mode 100644 index 00000000..78921159 --- /dev/null +++ b/testsuite/serd-tests/good/test-form-feed.ttl @@ -0,0 +1,2 @@ +<http://example.org/thing> <http://example.org/label> "\u000C" . +<http://example.org/thing> <http://example.org/label> "" . diff --git a/testsuite/serd-tests/good/test-id.nt b/testsuite/serd-tests/good/test-id.nt new file mode 100644 index 00000000..b4b11069 --- /dev/null +++ b/testsuite/serd-tests/good/test-id.nt @@ -0,0 +1,2 @@ +<http://example.org/base#c> <http://example.org/base#d> _:b1 . +_:B1 <http://example.org/base#a> <http://example.org/base#b> . diff --git a/testsuite/serd-tests/good/test-id.ttl b/testsuite/serd-tests/good/test-id.ttl new file mode 100644 index 00000000..cfd0e9ca --- /dev/null +++ b/testsuite/serd-tests/good/test-id.ttl @@ -0,0 +1,4 @@ +@prefix : <http://example.org/base#> . + +:c :d [] . +_:b1 :a :b . diff --git a/testsuite/serd-tests/good/test-lang.nt b/testsuite/serd-tests/good/test-lang.nt new file mode 100644 index 00000000..c36dda42 --- /dev/null +++ b/testsuite/serd-tests/good/test-lang.nt @@ -0,0 +1,4 @@ +<http://example.org/test-lang#thing> <http://example.org/test-lang#greeting> "Hello"@en . +<http://example.org/test-lang#thing> <http://example.org/test-lang#greeting> "Howdy"@en-us . +<http://example.org/test-lang#thing> <http://example.org/test-lang#greeting> "Bonjour"@fr . +<http://example.org/test-lang#thing> <http://example.org/test-lang#greeting> "Guten Tag"@de-latn-de . diff --git a/testsuite/serd-tests/good/test-lang.ttl b/testsuite/serd-tests/good/test-lang.ttl new file mode 100644 index 00000000..f7c2727f --- /dev/null +++ b/testsuite/serd-tests/good/test-lang.ttl @@ -0,0 +1,6 @@ +@prefix : <http://example.org/test-lang#> . + +:thing :greeting "Hello"@en ; + :greeting "Howdy"@en-us ; + :greeting "Bonjour"@fr ; + :greeting "Guten Tag"@de-latn-de . diff --git a/testsuite/serd-tests/good/test-list-in-blank.nt b/testsuite/serd-tests/good/test-list-in-blank.nt new file mode 100644 index 00000000..108363f2 --- /dev/null +++ b/testsuite/serd-tests/good/test-list-in-blank.nt @@ -0,0 +1,6 @@ +<http://example.org/stuff/1.0/a> <http://example.org/stuff/1.0/b> _:b1 . +_:b1 <http://example.org/stuff/1.0/c> _:b2 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "apple" . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b3 . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "banana" . +_:b3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . diff --git a/testsuite/serd-tests/good/test-list-in-blank.ttl b/testsuite/serd-tests/good/test-list-in-blank.ttl new file mode 100644 index 00000000..bdf75fce --- /dev/null +++ b/testsuite/serd-tests/good/test-list-in-blank.ttl @@ -0,0 +1,2 @@ +@prefix : <http://example.org/stuff/1.0/> . +:a :b [ :c ( "apple" "banana" ) ] . diff --git a/testsuite/serd-tests/good/test-list-subject.nt b/testsuite/serd-tests/good/test-list-subject.nt new file mode 100644 index 00000000..e4f9c40c --- /dev/null +++ b/testsuite/serd-tests/good/test-list-subject.nt @@ -0,0 +1,6 @@ +<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/List> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "apple" . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b2 . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "banana" . +_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/List> . diff --git a/testsuite/serd-tests/good/test-list-subject.ttl b/testsuite/serd-tests/good/test-list-subject.ttl new file mode 100644 index 00000000..5cd81dfb --- /dev/null +++ b/testsuite/serd-tests/good/test-list-subject.ttl @@ -0,0 +1,2 @@ +() a <http://example.org/List> . +("apple" "banana") a <http://example.org/List> . diff --git a/testsuite/serd-tests/good/test-list.nt b/testsuite/serd-tests/good/test-list.nt new file mode 100644 index 00000000..3a27a5a6 --- /dev/null +++ b/testsuite/serd-tests/good/test-list.nt @@ -0,0 +1 @@ +<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/List> . diff --git a/testsuite/serd-tests/good/test-list.ttl b/testsuite/serd-tests/good/test-list.ttl new file mode 100644 index 00000000..7f4c7699 --- /dev/null +++ b/testsuite/serd-tests/good/test-list.ttl @@ -0,0 +1 @@ +() a <http://example.org/List> . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-local-name-ends-with-dot.ttl b/testsuite/serd-tests/good/test-local-name-ends-with-dot.ttl new file mode 100644 index 00000000..e426876d --- /dev/null +++ b/testsuite/serd-tests/good/test-local-name-ends-with-dot.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:s eg:p eg:foo\. . diff --git a/testsuite/serd-tests/good/test-long-string.nt b/testsuite/serd-tests/good/test-long-string.nt new file mode 100644 index 00000000..ba6be49c --- /dev/null +++ b/testsuite/serd-tests/good/test-long-string.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/greeting> "This is a\nlong string\nwith\n tabs\nand spaces." . diff --git a/testsuite/serd-tests/good/test-long-string.ttl b/testsuite/serd-tests/good/test-long-string.ttl new file mode 100644 index 00000000..7da44b4b --- /dev/null +++ b/testsuite/serd-tests/good/test-long-string.ttl @@ -0,0 +1,7 @@ +@prefix : <http://example.org/> . + +:thing :greeting """This is a +long string +with + tabs +and spaces.""" . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-no-spaces.nt b/testsuite/serd-tests/good/test-no-spaces.nt new file mode 100644 index 00000000..3619a5f0 --- /dev/null +++ b/testsuite/serd-tests/good/test-no-spaces.nt @@ -0,0 +1,4 @@ +<http://example.org/s> <http://example.org/p> <http://example.org/o> . +<http://example.org/s> <http://example.org/p2> <http://example.org/o2> . +<http://example.org/s> <http://example.org/p2> <http://example.org/o3> . +<http://example.org/s> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-no-spaces.ttl b/testsuite/serd-tests/good/test-no-spaces.ttl new file mode 100644 index 00000000..88171e71 --- /dev/null +++ b/testsuite/serd-tests/good/test-no-spaces.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . +eg:s eg:p eg:o;eg:p2 eg:o2,eg:o3 . +eg:s a<http://example.org/Thing> . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-non-curie-uri.nt b/testsuite/serd-tests/good/test-non-curie-uri.nt new file mode 100644 index 00000000..502a8754 --- /dev/null +++ b/testsuite/serd-tests/good/test-non-curie-uri.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <http://example.org/notacurie.> . diff --git a/testsuite/serd-tests/good/test-non-curie-uri.ttl b/testsuite/serd-tests/good/test-non-curie-uri.ttl new file mode 100644 index 00000000..40734514 --- /dev/null +++ b/testsuite/serd-tests/good/test-non-curie-uri.ttl @@ -0,0 +1,3 @@ +@prefix eg: <http://example.org/> . + +eg:s eg:p <http://example.org/notacurie.> . diff --git a/testsuite/serd-tests/good/test-num.nt b/testsuite/serd-tests/good/test-num.nt new file mode 100644 index 00000000..54263d46 --- /dev/null +++ b/testsuite/serd-tests/good/test-num.nt @@ -0,0 +1,10 @@ +<http://example.org/eg#thing> <http://example.org/eg#num> "0.1"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> "+0.2"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> "-0.3"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> ".4"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> "+.5"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> "-.6"^^<http://www.w3.org/2001/XMLSchema#decimal> . +<http://example.org/eg#thing> <http://example.org/eg#num> "1.58490e-05"^^<http://www.w3.org/2001/XMLSchema#double> . +<http://example.org/eg#thing> <http://example.org/eg#num> "1.58490e+05"^^<http://www.w3.org/2001/XMLSchema#double> . +<http://example.org/eg#thing> <http://example.org/eg#num> "1.58490e05"^^<http://www.w3.org/2001/XMLSchema#double> . +<http://example.org/eg#thing> <http://example.org/eg#num> "1.58490E05"^^<http://www.w3.org/2001/XMLSchema#double> . diff --git a/testsuite/serd-tests/good/test-num.ttl b/testsuite/serd-tests/good/test-num.ttl new file mode 100644 index 00000000..68ad290b --- /dev/null +++ b/testsuite/serd-tests/good/test-num.ttl @@ -0,0 +1,12 @@ +@prefix eg: <http://example.org/eg#> . + +eg:thing eg:num 0.1 . +eg:thing eg:num +0.2 . +eg:thing eg:num -0.3 . +eg:thing eg:num .4 . +eg:thing eg:num +.5 . +eg:thing eg:num -.6 . +eg:thing eg:num 1.58490e-05 . +eg:thing eg:num 1.58490e+05 . +eg:thing eg:num 1.58490e05 . +eg:thing eg:num 1.58490E05 . diff --git a/testsuite/serd-tests/good/test-out-of-range-unicode.nt b/testsuite/serd-tests/good/test-out-of-range-unicode.nt new file mode 100644 index 00000000..5def9e31 --- /dev/null +++ b/testsuite/serd-tests/good/test-out-of-range-unicode.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/character> "\uFFFD" . diff --git a/testsuite/serd-tests/good/test-out-of-range-unicode.ttl b/testsuite/serd-tests/good/test-out-of-range-unicode.ttl new file mode 100644 index 00000000..7e64785a --- /dev/null +++ b/testsuite/serd-tests/good/test-out-of-range-unicode.ttl @@ -0,0 +1 @@ +<http://example.org/thing> <http://example.org/character> "\U00110000" . diff --git a/testsuite/serd-tests/good/test-prefix.nt b/testsuite/serd-tests/good/test-prefix.nt new file mode 100644 index 00000000..bcfdd4b6 --- /dev/null +++ b/testsuite/serd-tests/good/test-prefix.nt @@ -0,0 +1,6 @@ +<http://example.org/a/b> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/a/b/c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/a/num0num> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/a/under_under> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/a/dash-dash> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://example.org/a/.invalidname.> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-prefix.ttl b/testsuite/serd-tests/good/test-prefix.ttl new file mode 100644 index 00000000..f79896cb --- /dev/null +++ b/testsuite/serd-tests/good/test-prefix.ttl @@ -0,0 +1,8 @@ +@prefix eg: <http://example.org/a/> . + +<http://example.org/a/b> a <http://example.org/Thing> . +<http://example.org/a/b/c> a <http://example.org/Thing> . +<http://example.org/a/num0num> a <http://example.org/Thing> . +<http://example.org/a/under_under> a <http://example.org/Thing> . +<http://example.org/a/dash-dash> a <http://example.org/Thing> . +<http://example.org/a/.invalidname.> a <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-pretty.nt b/testsuite/serd-tests/good/test-pretty.nt new file mode 100644 index 00000000..9251563a --- /dev/null +++ b/testsuite/serd-tests/good/test-pretty.nt @@ -0,0 +1,46 @@ +<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://example.org/isA> <http://example.org/List> . +_:b1 <http://example.org/isA> <http://example.org/Blank> . +<http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> <http://example.org/sameAs> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b2 <http://example.org/sameAs> _:b3 . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "apple" . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b5 . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "banana" . +_:b5 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b6 . +_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "pear" . +_:b6 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b4 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/List> . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b8 . +_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/a> . +_:b8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b9 . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/b> . +_:b9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b10 . +_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b11 . +_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/c> . +_:b11 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b12 . +_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <http://example.org/d> . +_:b12 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b10 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/List> . +_:b13 <http://example.org/list> _:b14 . +_:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "apple" . +_:b14 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b15 . +_:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "banana" . +_:b15 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b16 . +_:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> "pear" . +_:b16 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . +_:b17 <http://example.org/a> <http://example.org/b> . +_:b17 <http://example.org/a> <http://example.org/c> . +_:b17 <http://example.org/a> <http://example.org/d> . +_:b18 <http://example.org/a> _:b19 . +_:b19 <http://example.org/b> <http://example.org/c> . +_:b19 <http://example.org/d> <http://example.org/e> . +_:b18 <http://example.org/a> _:b20 . +_:b20 <http://example.org/f> <http://example.org/g> . +_:b21 <http://example.org/list> _:b22 . +_:b22 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b23 . +_:b23 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Apple> . +_:b22 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:b24 . +_:b24 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:b25 . +_:b25 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Banana> . +_:b24 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . diff --git a/testsuite/serd-tests/good/test-pretty.ttl b/testsuite/serd-tests/good/test-pretty.ttl new file mode 100644 index 00000000..4eb7204f --- /dev/null +++ b/testsuite/serd-tests/good/test-pretty.ttl @@ -0,0 +1,44 @@ +@prefix : <http://example.org/> . + +() :isA :List . + +[] :isA :Blank . + +() :sameAs () . + +[] :sameAs [] . + +( + "apple" + "banana" + "pear" +) a :List . + +( + (:a :b) + (:c :d) +) a :List . + +[] + :list ( + "apple" + "banana" + "pear" + ) . + +[] + :a :b , :c , :d . + +[] + :a [ + :b :c ; + :d :e ; + ] , [ + :f :g + ] . + +[] + :list ( + [ a :Apple ] + [ a :Banana ] + ) . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-rel.nt b/testsuite/serd-tests/good/test-rel.nt new file mode 100644 index 00000000..343ce19c --- /dev/null +++ b/testsuite/serd-tests/good/test-rel.nt @@ -0,0 +1,6 @@ +<http://drobilla.net/sw/serd/test/good/a/b/c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test/good/test-rel.ttl> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test/good/test-not.ttl> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test/good/a/b/c> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . +<http://www.w3.org/> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-rel.ttl b/testsuite/serd-tests/good/test-rel.ttl new file mode 100644 index 00000000..4752be70 --- /dev/null +++ b/testsuite/serd-tests/good/test-rel.ttl @@ -0,0 +1,6 @@ +<http://drobilla.net/sw/serd/test/good/a/b/c> a <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test> a <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test/good/test-rel.ttl> a <http://example.org/Thing> . +<http://drobilla.net/sw/serd/test/good/test-not.ttl> a <http://example.org/Thing> . +<a/b/c> a <http://example.org/Thing> . +<http://www.w3.org/> a <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-semi-dot.nt b/testsuite/serd-tests/good/test-semi-dot.nt new file mode 100644 index 00000000..aea1655b --- /dev/null +++ b/testsuite/serd-tests/good/test-semi-dot.nt @@ -0,0 +1 @@ +<http://example.org/thing> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-semi-dot.ttl b/testsuite/serd-tests/good/test-semi-dot.ttl new file mode 100644 index 00000000..6d4b4146 --- /dev/null +++ b/testsuite/serd-tests/good/test-semi-dot.ttl @@ -0,0 +1 @@ +<http://example.org/thing> a <http://example.org/Thing> ; . \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-several-eaten-dots.nq b/testsuite/serd-tests/good/test-several-eaten-dots.nq new file mode 100644 index 00000000..5cafa59f --- /dev/null +++ b/testsuite/serd-tests/good/test-several-eaten-dots.nq @@ -0,0 +1,3 @@ +<https://example.com/s> <https://example.com/p1> <https://example.com/o1> <https://example.com/g> . +<https://example.com/s> <https://example.com/p1> <https://example.com/o2> <https://example.com/g> . +<https://example.com/s> <https://example.com/p2> <https://example.com/o3> <https://example.com/g> . diff --git a/testsuite/serd-tests/good/test-several-eaten-dots.trig b/testsuite/serd-tests/good/test-several-eaten-dots.trig new file mode 100644 index 00000000..bab135ed --- /dev/null +++ b/testsuite/serd-tests/good/test-several-eaten-dots.trig @@ -0,0 +1,6 @@ +prefix : <https://example.com/> + +:g { + :s :p1 :o1. + :s :p1 :o2; :p2 :o3. +} \ No newline at end of file diff --git a/testsuite/serd-tests/good/test-uri-escape.nt b/testsuite/serd-tests/good/test-uri-escape.nt new file mode 100644 index 00000000..320e7c33 --- /dev/null +++ b/testsuite/serd-tests/good/test-uri-escape.nt @@ -0,0 +1 @@ +<http://example.org/node> <http://example.org/prop> <scheme:\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F%20!\u0022#$%&'()*+,-./0123456789:/%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\u005C]\u005E_\u0060abcdefghijklmnopqrstuvwxyz\u007B\u007C\u007D~\u007F> . diff --git a/testsuite/serd-tests/good/test-uri-escape.ttl b/testsuite/serd-tests/good/test-uri-escape.ttl new file mode 100644 index 00000000..320e7c33 --- /dev/null +++ b/testsuite/serd-tests/good/test-uri-escape.ttl @@ -0,0 +1 @@ +<http://example.org/node> <http://example.org/prop> <scheme:\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F%20!\u0022#$%&'()*+,-./0123456789:/%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\u005C]\u005E_\u0060abcdefghijklmnopqrstuvwxyz\u007B\u007C\u007D~\u007F> . diff --git a/testsuite/serd-tests/good/test-uri.nt b/testsuite/serd-tests/good/test-uri.nt new file mode 100644 index 00000000..1744963c --- /dev/null +++ b/testsuite/serd-tests/good/test-uri.nt @@ -0,0 +1,48 @@ +<g:h> <http://www.w3.org/2002/07/owl#sameAs> <g:h> . +<http://a/b/c/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g> . +<http://a/b/c/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g> . +<http://a/b/c/g/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g/> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://g> <http://www.w3.org/2002/07/owl#sameAs> <http://g> . +<http://a/b/c/d;p?y> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/d;p?y> . +<http://a/b/c/g?y> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g?y> . +<http://a/b/c/d;p?q#s> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/d;p?q#s> . +<http://a/b/c/g#s> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g#s> . +<http://a/b/c/g?y#s> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g?y#s> . +<http://a/b/c/;x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/;x> . +<http://a/b/c/g;x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g;x> . +<http://a/b/c/g;x?y#s> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g;x?y#s> . +<http://a/b/c/d;p?q> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/d;p?q> . +<http://a/b/c/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/> . +<http://a/b/c/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/> . +<http://a/b/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/> . +<http://a/b/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/> . +<http://a/b/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/g> . +<http://a/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/> . +<http://a/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://a/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/g> . +<http://a/b/c/g.> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g.> . +<http://a/b/c/.g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/.g> . +<http://a/b/c/g..> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g..> . +<http://a/b/c/..g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/..g> . +<http://a/b/g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/g> . +<http://a/b/c/g?y/./x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g?y/./x> . +<http://a/b/c/g?y/../x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g?y/../x> . +<http://a/b/c/g#s/./x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g#s/./x> . +<http://a/b/c/g#s/../x> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/g#s/../x> . +<http://a/.g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/.g> . +<http://a/..g> <http://www.w3.org/2002/07/owl#sameAs> <http://a/..g> . +<http://A?aquery> <http://www.w3.org/2002/07/owl#sameAs> <http://A?aquery> . +<http://A#afragment> <http://www.w3.org/2002/07/owl#sameAs> <http://A#afragment> . +<http://a/b/c/d;p?aquery> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/d;p?aquery> . +<http://a/b/c/d;p?q#afragment> <http://www.w3.org/2002/07/owl#sameAs> <http://a/b/c/d;p?q#afragment> . +<http://a/> <http://www.w3.org/2002/07/owl#sameAs> <http://a/> . +<view-source://foo> <http://www.w3.org/2002/07/owl#sameAs> <view-source://foo> . +<coap+tcp://foo> <http://www.w3.org/2002/07/owl#sameAs> <coap+tcp://foo> . +<osc.udp://foo> <http://www.w3.org/2002/07/owl#sameAs> <osc.udp://foo> . +<http://B/foo> <http://www.w3.org/2002/07/owl#sameAs> <http://B/foo> . +<http://C/bar> <http://www.w3.org/2002/07/owl#sameAs> <http://C/bar> . diff --git a/testsuite/serd-tests/good/test-uri.ttl b/testsuite/serd-tests/good/test-uri.ttl new file mode 100644 index 00000000..b6a8d967 --- /dev/null +++ b/testsuite/serd-tests/good/test-uri.ttl @@ -0,0 +1,71 @@ +# http://tools.ietf.org/html/rfc3986#section-5.4 + +@base <http://a/b/c/d;p?q> . + +@prefix owl: <http://www.w3.org/2002/07/owl#> . + +# 5.4.1. Normal Examples +<g:h> owl:sameAs <g:h> . +<g> owl:sameAs <http://a/b/c/g> . +<./g> owl:sameAs <http://a/b/c/g> . +<g/> owl:sameAs <http://a/b/c/g/> . +</g> owl:sameAs <http://a/g> . +<//g> owl:sameAs <http://g> . +<?y> owl:sameAs <http://a/b/c/d;p?y> . +<g?y> owl:sameAs <http://a/b/c/g?y> . +<#s> owl:sameAs <http://a/b/c/d;p?q#s> . +<g#s> owl:sameAs <http://a/b/c/g#s> . +<g?y#s> owl:sameAs <http://a/b/c/g?y#s> . +<;x> owl:sameAs <http://a/b/c/;x> . +<g;x> owl:sameAs <http://a/b/c/g;x> . +<g;x?y#s> owl:sameAs <http://a/b/c/g;x?y#s> . +<> owl:sameAs <http://a/b/c/d;p?q> . +<.> owl:sameAs <http://a/b/c/> . +<./> owl:sameAs <http://a/b/c/> . +<..> owl:sameAs <http://a/b/> . +<../> owl:sameAs <http://a/b/> . +<../g> owl:sameAs <http://a/b/g> . +<../..> owl:sameAs <http://a/> . +<../../> owl:sameAs <http://a/> . +<../../g> owl:sameAs <http://a/g> . + +# 5.4.2. Abnormal Examples +<../../../g> owl:sameAs <http://a/g> . +<../../../../g> owl:sameAs <http://a/g> . +</./g> owl:sameAs <http://a/g> . +</../g> owl:sameAs <http://a/g> . +<g.> owl:sameAs <http://a/b/c/g.> . +<.g> owl:sameAs <http://a/b/c/.g> . +<g..> owl:sameAs <http://a/b/c/g..> . +<..g> owl:sameAs <http://a/b/c/..g> . +<./../g> owl:sameAs <http://a/b/g> . +# Serd only resolves the leading components +#<./g/.> owl:sameAs <http://a/b/c/g/> . +#<g/./h> owl:sameAs <http://a/b/c/g/h> . +#<g/../h> owl:sameAs <http://a/b/c/h> . +#<g;x=1/./y> owl:sameAs <http://a/b/c/g;x=1/y> . +#<g;x=1/../y> owl:sameAs <http://a/b/c/y> . +<g?y/./x> owl:sameAs <http://a/b/c/g?y/./x> . +<g?y/../x> owl:sameAs <http://a/b/c/g?y/../x> . +<g#s/./x> owl:sameAs <http://a/b/c/g#s/./x> . +<g#s/../x> owl:sameAs <http://a/b/c/g#s/../x> . + +# Additional tests for Serd +</.g> owl:sameAs <http://a/.g> . +</..g> owl:sameAs <http://a/..g> . +<http://A?aquery> owl:sameAs <http://A?aquery> . +<http://A#afragment> owl:sameAs <http://A#afragment> . +<?aquery> owl:sameAs <http://a/b/c/d;p?aquery> . +<#afragment> owl:sameAs <http://a/b/c/d;p?q#afragment> . +<../../../../../../> owl:sameAs <http://a/> . +<view-source://foo> owl:sameAs <view-source://foo> . +<coap+tcp://foo> owl:sameAs <coap+tcp://foo> . +<osc.udp://foo> owl:sameAs <osc.udp://foo> . + +@base <http://B?bquery> . + +</foo> owl:sameAs <http://B/foo> . + +@base <http://C#cfragment> . + +</bar> owl:sameAs <http://C/bar> . diff --git a/testsuite/serd-tests/good/test-utf8-uri.nt b/testsuite/serd-tests/good/test-utf8-uri.nt new file mode 100644 index 00000000..b8a73a88 --- /dev/null +++ b/testsuite/serd-tests/good/test-utf8-uri.nt @@ -0,0 +1 @@ +<http://example.org/math/\u2200x\u2208\u211D> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/Thing> . diff --git a/testsuite/serd-tests/good/test-utf8-uri.ttl b/testsuite/serd-tests/good/test-utf8-uri.ttl new file mode 100644 index 00000000..51f26ff2 --- /dev/null +++ b/testsuite/serd-tests/good/test-utf8-uri.ttl @@ -0,0 +1 @@ +<http://example.org/math/∀x∈ℝ> a <http://example.org/Thing> . \ No newline at end of file diff --git a/testsuite/src/files.rs b/testsuite/src/files.rs index 0d744b1f..7ded2d1f 100644 --- a/testsuite/src/files.rs +++ b/testsuite/src/files.rs @@ -1,27 +1,27 @@ -use anyhow::{anyhow, bail, Result}; -use oxigraph::io::{DatasetFormat, DatasetParser, GraphFormat, GraphParser}; +use anyhow::{bail, Context, Result}; +use oxigraph::io::{RdfFormat, RdfParser}; use oxigraph::model::{Dataset, Graph}; +use oxttl::n3::N3Quad; +use oxttl::N3Parser; use std::fs::File; -use std::io::{BufRead, BufReader, Read}; +use std::io::Read; use std::path::PathBuf; -pub fn read_file(url: &str) -> Result<impl BufRead> { +pub fn read_file(url: &str) -> Result<impl Read> { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push(if url.starts_with("http://w3c.github.io/") { - url.replace("http://w3c.github.io/", "") - } else if url.starts_with("https://w3c.github.io/") { + path.push(if url.starts_with("https://w3c.github.io/") { url.replace("https://w3c.github.io/", "") - } else if url.starts_with("http://www.w3.org/2013/RDFXMLTests/") { - url.replace("http://www.w3.org/2013/RDFXMLTests/", "rdf-tests/rdf-xml/") } else if url.starts_with("https://github.com/oxigraph/oxigraph/tests/") { url.replace( "https://github.com/oxigraph/oxigraph/tests/", "oxigraph-tests/", ) + } else if url.starts_with("http://drobilla.net/sw/serd/test/") { + url.replace("http://drobilla.net/sw/serd/test/", "serd-tests/") } else { bail!("Not supported url for file: {url}") }); - Ok(BufReader::new(File::open(&path)?)) + File::open(&path).with_context(|| format!("Failed to read {}", path.display())) } pub fn read_file_to_string(url: &str) -> Result<String> { @@ -30,42 +30,84 @@ pub fn read_file_to_string(url: &str) -> Result<String> { Ok(buf) } -pub fn load_to_graph(url: &str, graph: &mut Graph, format: GraphFormat) -> Result<()> { - let parser = GraphParser::from_format(format).with_base_iri(url)?; - for t in parser.read_triples(read_file(url)?)? { - graph.insert(&t?); +pub fn load_to_graph( + url: &str, + graph: &mut Graph, + format: RdfFormat, + base_iri: Option<&str>, + ignore_errors: bool, +) -> Result<()> { + let parser = RdfParser::from_format(format).with_base_iri(base_iri.unwrap_or(url))?; + for t in parser.parse_read(read_file(url)?) { + match t { + Ok(t) => { + graph.insert(&t.into()); + } + Err(e) => { + if !ignore_errors { + return Err(e.into()); + } + } + } } Ok(()) } -pub fn load_graph(url: &str, format: GraphFormat) -> Result<Graph> { +pub fn load_graph(url: &str, format: RdfFormat, ignore_errors: bool) -> Result<Graph> { let mut graph = Graph::new(); - load_to_graph(url, &mut graph, format)?; + load_to_graph(url, &mut graph, format, None, ignore_errors)?; Ok(graph) } -pub fn guess_graph_format(url: &str) -> Result<GraphFormat> { - url.rsplit_once('.') - .and_then(|(_, extension)| GraphFormat::from_extension(extension)) - .ok_or_else(|| anyhow!("Serialization type not found for {url}")) -} - -pub fn load_to_dataset(url: &str, dataset: &mut Dataset, format: DatasetFormat) -> Result<()> { - let parser = DatasetParser::from_format(format).with_base_iri(url)?; - for q in parser.read_quads(read_file(url)?)? { - dataset.insert(&q?); +pub fn load_to_dataset( + url: &str, + dataset: &mut Dataset, + format: RdfFormat, + ignore_errors: bool, +) -> Result<()> { + let parser = RdfParser::from_format(format).with_base_iri(url)?; + for q in parser.parse_read(read_file(url)?) { + match q { + Ok(q) => { + dataset.insert(&q); + } + Err(e) => { + if !ignore_errors { + return Err(e.into()); + } + } + } } Ok(()) } -pub fn load_dataset(url: &str, format: DatasetFormat) -> Result<Dataset> { +pub fn load_dataset(url: &str, format: RdfFormat, ignore_errors: bool) -> Result<Dataset> { let mut dataset = Dataset::new(); - load_to_dataset(url, &mut dataset, format)?; + load_to_dataset(url, &mut dataset, format, ignore_errors)?; Ok(dataset) } -pub fn guess_dataset_format(url: &str) -> Result<DatasetFormat> { +pub fn guess_rdf_format(url: &str) -> Result<RdfFormat> { url.rsplit_once('.') - .and_then(|(_, extension)| DatasetFormat::from_extension(extension)) - .ok_or_else(|| anyhow!("Serialization type not found for {url}")) + .and_then(|(_, extension)| RdfFormat::from_extension(extension)) + .with_context(|| format!("Serialization type not found for {url}")) +} + +pub fn load_n3(url: &str, ignore_errors: bool) -> Result<Vec<N3Quad>> { + let mut quads = Vec::new(); + for q in N3Parser::new() + .with_base_iri(url)? + .with_prefix("", format!("{url}#"))? + .parse_read(read_file(url)?) + { + match q { + Ok(q) => quads.push(q), + Err(e) => { + if !ignore_errors { + return Err(e.into()); + } + } + } + } + Ok(quads) } diff --git a/testsuite/src/lib.rs b/testsuite/src/lib.rs index 3ebc2669..e9ce6df0 100644 --- a/testsuite/src/lib.rs +++ b/testsuite/src/lib.rs @@ -7,3 +7,36 @@ pub mod parser_evaluator; pub mod report; pub mod sparql_evaluator; mod vocab; + +use crate::evaluator::TestEvaluator; +use crate::manifest::TestManifest; +use crate::parser_evaluator::register_parser_tests; +use crate::sparql_evaluator::register_sparql_tests; +use anyhow::Result; + +#[allow(clippy::panic_in_result_fn)] +pub fn check_testsuite(manifest_url: &str, ignored_tests: &[&str]) -> Result<()> { + let mut evaluator = TestEvaluator::default(); + register_parser_tests(&mut evaluator); + register_sparql_tests(&mut evaluator); + + let manifest = TestManifest::new([manifest_url]); + let results = evaluator.evaluate(manifest)?; + + let mut errors = Vec::default(); + for result in results { + if let Err(error) = &result.outcome { + if !ignored_tests.contains(&result.test.as_str()) { + errors.push(format!("{}: failed with error {error:?}", result.test)) + } + } + } + + assert!( + errors.is_empty(), + "{} failing tests:\n{}\n", + errors.len(), + errors.join("\n") + ); + Ok(()) +} diff --git a/testsuite/src/manifest.rs b/testsuite/src/manifest.rs index 1b93f244..b911a630 100644 --- a/testsuite/src/manifest.rs +++ b/testsuite/src/manifest.rs @@ -1,6 +1,6 @@ -use crate::files::{guess_graph_format, load_to_graph}; +use crate::files::{guess_rdf_format, load_to_graph}; use crate::vocab::*; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use oxigraph::model::vocab::*; use oxigraph::model::*; use std::collections::VecDeque; @@ -34,7 +34,7 @@ impl fmt::Display for Test { write!(f, " on file \"{action}\"")?; } if let Some(query) = &self.query { - write!(f, " on query {}", &query)?; + write!(f, " on query {query}")?; } for data in &self.data { write!(f, " with data {data}")?; @@ -58,7 +58,7 @@ pub struct TestManifest { impl Iterator for TestManifest { type Item = Result<Test>; - fn next(&mut self) -> Option<Result<Test>> { + fn next(&mut self) -> Option<Self::Item> { loop { if let Some(next) = self.next_test().transpose() { return Some(next); @@ -84,14 +84,10 @@ impl TestManifest { fn next_test(&mut self) -> Result<Option<Test>> { loop { - let test_node = if let Some(test_node) = self.tests_to_do.pop_front() { - test_node - } else { + let Some(test_node) = self.tests_to_do.pop_front() else { return Ok(None); }; - let test_node = if let Term::NamedNode(test_node) = test_node { - test_node - } else { + let Term::NamedNode(test_node) = test_node else { bail!("Invalid test identifier. Got {test_node}"); }; @@ -273,52 +269,70 @@ impl TestManifest { } fn load_next_manifest(&mut self) -> Result<Option<()>> { - let url = if let Some(url) = self.manifests_to_do.pop_front() { - url - } else { + let Some(url) = self.manifests_to_do.pop_front() else { return Ok(None); }; self.graph.clear(); - load_to_graph(&url, &mut self.graph, guess_graph_format(&url)?)?; + load_to_graph(&url, &mut self.graph, guess_rdf_format(&url)?, None, false)?; let manifests = self .graph .subjects_for_predicate_object(rdf::TYPE, mf::MANIFEST) .collect::<Vec<_>>(); if manifests.len() != 1 { - bail!("The file {url} should contain a single manifest"); + bail!("The file should contain a single manifest"); } - for manifest in manifests { - match self + let mut manifest = manifests[0]; + if let Some(base_iri) = self + .graph + .object_for_subject_predicate(manifest, mf::ASSUMED_TEST_BASE) + { + let Term::NamedNode(base_iri) = base_iri.into_owned() else { + bail!("Invalid base IRI: {base_iri}"); + }; + self.graph.clear(); + load_to_graph( + &url, + &mut self.graph, + guess_rdf_format(&url)?, + Some(base_iri.as_str()), + false, + )?; + manifest = self .graph - .object_for_subject_predicate(manifest, mf::INCLUDE) - { - Some(TermRef::BlankNode(list)) => { - self.manifests_to_do.extend( - RdfListIterator::iter(&self.graph, list.into()).filter_map(|m| match m { - Term::NamedNode(nm) => Some(nm.into_string()), - _ => None, - }), - ); - } - Some(_) => bail!("invalid tests list"), - None => (), + .subject_for_predicate_object(rdf::TYPE, mf::MANIFEST) + .context("no manifest found")?; + } + + match self + .graph + .object_for_subject_predicate(manifest, mf::INCLUDE) + { + Some(TermRef::BlankNode(list)) => { + self.manifests_to_do.extend( + RdfListIterator::iter(&self.graph, list.into()).filter_map(|m| match m { + Term::NamedNode(nm) => Some(nm.into_string()), + _ => None, + }), + ); } + Some(_) => bail!("invalid tests list"), + None => (), + } - // New tests - match self - .graph - .object_for_subject_predicate(manifest, mf::ENTRIES) - { - Some(TermRef::BlankNode(list)) => { - self.tests_to_do - .extend(RdfListIterator::iter(&self.graph, list.into())); - } - Some(term) => { - bail!("Invalid tests list. Got term {term}"); - } - None => (), + // New tests + match self + .graph + .object_for_subject_predicate(manifest, mf::ENTRIES) + { + Some(TermRef::BlankNode(list)) => { + self.tests_to_do + .extend(RdfListIterator::iter(&self.graph, list.into())); + } + Some(term) => { + bail!("Invalid tests list. Got term {term}"); } + None => (), } Ok(Some(())) } @@ -341,7 +355,7 @@ impl<'a> RdfListIterator<'a> { impl<'a> Iterator for RdfListIterator<'a> { type Item = Term; - fn next(&mut self) -> Option<Term> { + fn next(&mut self) -> Option<Self::Item> { match self.current_node { Some(current) => { let result = self diff --git a/testsuite/src/parser_evaluator.rs b/testsuite/src/parser_evaluator.rs index 3ea3f91b..830607b0 100644 --- a/testsuite/src/parser_evaluator.rs +++ b/testsuite/src/parser_evaluator.rs @@ -1,147 +1,216 @@ use crate::evaluator::TestEvaluator; -use crate::files::{guess_dataset_format, guess_graph_format, load_dataset, load_graph}; +use crate::files::{guess_rdf_format, load_dataset, load_n3, read_file_to_string}; use crate::manifest::Test; -use crate::report::{dataset_diff, graph_diff}; -use anyhow::{anyhow, bail, Result}; -use oxigraph::io::{DatasetFormat, GraphFormat}; +use crate::report::{dataset_diff, format_diff}; +use anyhow::{bail, ensure, Context, Result}; +use oxigraph::io::RdfFormat; +use oxigraph::model::{BlankNode, Dataset, Quad}; +use oxttl::n3::{N3Quad, N3Term}; pub fn register_parser_tests(evaluator: &mut TestEvaluator) { evaluator.register( "http://www.w3.org/ns/rdftest#TestNTriplesPositiveSyntax", - |t| evaluate_positive_graph_syntax_test(t, GraphFormat::NTriples), + |t| evaluate_positive_syntax_test(t, RdfFormat::NTriples), ); evaluator.register( "http://www.w3.org/ns/rdftest#TestNQuadsPositiveSyntax", - |t| evaluate_positive_dataset_syntax_test(t, DatasetFormat::NQuads), + |t| evaluate_positive_syntax_test(t, RdfFormat::NQuads), ); evaluator.register( "http://www.w3.org/ns/rdftest#TestTurtlePositiveSyntax", - |t| evaluate_positive_graph_syntax_test(t, GraphFormat::Turtle), + |t| evaluate_positive_syntax_test(t, RdfFormat::Turtle), ); evaluator.register("http://www.w3.org/ns/rdftest#TestTrigPositiveSyntax", |t| { - evaluate_positive_dataset_syntax_test(t, DatasetFormat::TriG) + evaluate_positive_syntax_test(t, RdfFormat::TriG) }); + evaluator.register( + "https://w3c.github.io/N3/tests/test.n3#TestN3PositiveSyntax", + evaluate_positive_n3_syntax_test, + ); evaluator.register( "http://www.w3.org/ns/rdftest#TestNTriplesNegativeSyntax", - |t| evaluate_negative_graph_syntax_test(t, GraphFormat::NTriples), + |t| evaluate_negative_syntax_test(t, RdfFormat::NTriples), ); evaluator.register( "http://www.w3.org/ns/rdftest#TestNQuadsNegativeSyntax", - |t| evaluate_negative_dataset_syntax_test(t, DatasetFormat::NQuads), + |t| evaluate_negative_syntax_test(t, RdfFormat::NQuads), ); evaluator.register( "http://www.w3.org/ns/rdftest#TestTurtleNegativeSyntax", - |t| evaluate_negative_graph_syntax_test(t, GraphFormat::Turtle), + |t| evaluate_negative_syntax_test(t, RdfFormat::Turtle), ); evaluator.register("http://www.w3.org/ns/rdftest#TestTrigNegativeSyntax", |t| { - evaluate_negative_dataset_syntax_test(t, DatasetFormat::TriG) + evaluate_negative_syntax_test(t, RdfFormat::TriG) }); evaluator.register("http://www.w3.org/ns/rdftest#TestXMLNegativeSyntax", |t| { - evaluate_negative_graph_syntax_test(t, GraphFormat::RdfXml) + evaluate_negative_syntax_test(t, RdfFormat::RdfXml) }); + evaluator.register( + "https://w3c.github.io/N3/tests/test.n3#TestN3NegativeSyntax", + evaluate_negative_n3_syntax_test, + ); evaluator.register("http://www.w3.org/ns/rdftest#TestTurtleEval", |t| { - evaluate_graph_eval_test(t, GraphFormat::Turtle) + evaluate_eval_test(t, RdfFormat::Turtle, false) }); evaluator.register("http://www.w3.org/ns/rdftest#TestTrigEval", |t| { - evaluate_dataset_eval_test(t, DatasetFormat::TriG) + evaluate_eval_test(t, RdfFormat::TriG, false) }); evaluator.register("http://www.w3.org/ns/rdftest#TestXMLEval", |t| { - evaluate_graph_eval_test(t, GraphFormat::RdfXml) + evaluate_eval_test(t, RdfFormat::RdfXml, false) + }); + evaluator.register("https://w3c.github.io/N3/tests/test.n3#TestN3Eval", |t| { + evaluate_n3_eval_test(t, false) }); evaluator.register("http://www.w3.org/ns/rdftest#TestTurtleNegativeEval", |t| { - evaluate_negative_graph_syntax_test(t, GraphFormat::Turtle) + evaluate_negative_syntax_test(t, RdfFormat::Turtle) }); evaluator.register("http://www.w3.org/ns/rdftest#TestTrigNegativeEval", |t| { - evaluate_negative_dataset_syntax_test(t, DatasetFormat::TriG) + evaluate_negative_syntax_test(t, RdfFormat::TriG) }); + evaluator.register( + "http://www.w3.org/ns/rdftest#TestNTriplesPositiveC14N", + |t| evaluate_positive_c14n_test(t, RdfFormat::NTriples), + ); + evaluator.register( + "https://w3c.github.io/rdf-canon/tests/vocab#RDFC10EvalTest", + |t| evaluate_positive_syntax_test(t, RdfFormat::NQuads), //TODO: not a proper implementation! + ); + evaluator.register( + "https://w3c.github.io/rdf-canon/tests/vocab#RDFC10NegativeEvalTest", + |_| Ok(()), // TODO: not a proper implementation + ); + evaluator.register( + "https://w3c.github.io/rdf-canon/tests/vocab#RDFC10MapTest", + |_| Ok(()), // TODO: not a proper implementation + ); + evaluator.register( + "https://github.com/oxigraph/oxigraph/tests#TestNTripleRecovery", + |t| evaluate_eval_test(t, RdfFormat::NTriples, true), + ); + evaluator.register( + "https://github.com/oxigraph/oxigraph/tests#TestTurtleRecovery", + |t| evaluate_eval_test(t, RdfFormat::Turtle, true), + ); + evaluator.register( + "https://github.com/oxigraph/oxigraph/tests#TestN3Recovery", + |t| evaluate_n3_eval_test(t, true), + ); } -fn evaluate_positive_graph_syntax_test(test: &Test, format: GraphFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - load_graph(action, format).map_err(|e| anyhow!("Parse error: {e}"))?; +fn evaluate_positive_syntax_test(test: &Test, format: RdfFormat) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + load_dataset(action, format, false).context("Parse error")?; Ok(()) } -fn evaluate_positive_dataset_syntax_test(test: &Test, format: DatasetFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - load_dataset(action, format).map_err(|e| anyhow!("Parse error: {e}"))?; +fn evaluate_positive_n3_syntax_test(test: &Test) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + load_n3(action, false).context("Parse error")?; Ok(()) } -fn evaluate_negative_graph_syntax_test(test: &Test, format: GraphFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - match load_graph(action, format) { - Ok(_) => bail!("File parsed without errors even if it should not"), - Err(_) => Ok(()), +fn evaluate_negative_syntax_test(test: &Test, format: RdfFormat) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + let Err(error) = load_dataset(action, format, false) else { + bail!("File parsed without errors even if it should not"); + }; + if let Some(result) = &test.result { + let expected = read_file_to_string(result)?; + ensure!( + expected == error.to_string(), + "Not expected error message:\n{}", + format_diff(&expected, &error.to_string(), "message") + ); } + Ok(()) } -fn evaluate_negative_dataset_syntax_test(test: &Test, format: DatasetFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - match load_dataset(action, format) { - Ok(_) => bail!("File parsed without errors even if it should not"), - Err(_) => Ok(()), - } +fn evaluate_negative_n3_syntax_test(test: &Test) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + ensure!( + load_n3(action, false).is_err(), + "File parsed without errors even if it should not" + ); + Ok(()) } -fn evaluate_graph_eval_test(test: &Test, format: GraphFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - let mut actual_graph = - load_graph(action, format).map_err(|e| anyhow!("Parse error on file {action}: {e}"))?; - actual_graph.canonicalize(); - let results = test - .result - .as_ref() - .ok_or_else(|| anyhow!("No tests result found"))?; - let mut expected_graph = load_graph(results, guess_graph_format(results)?) - .map_err(|e| anyhow!("Parse error on file {results}: {e}"))?; - expected_graph.canonicalize(); - if expected_graph == actual_graph { - Ok(()) - } else { - bail!( - "The two files are not isomorphic. Diff:\n{}", - graph_diff(&expected_graph, &actual_graph) - ) - } +fn evaluate_eval_test(test: &Test, format: RdfFormat, ignore_errors: bool) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + let mut actual_dataset = load_dataset(action, format, ignore_errors) + .with_context(|| format!("Parse error on file {action}"))?; + actual_dataset.canonicalize(); + let results = test.result.as_ref().context("No tests result found")?; + let mut expected_dataset = load_dataset(results, guess_rdf_format(results)?, false) + .with_context(|| format!("Parse error on file {results}"))?; + expected_dataset.canonicalize(); + ensure!( + expected_dataset == actual_dataset, + "The two files are not isomorphic. Diff:\n{}", + dataset_diff(&expected_dataset, &actual_dataset) + ); + Ok(()) } -fn evaluate_dataset_eval_test(test: &Test, format: DatasetFormat) -> Result<()> { - let action = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - let mut actual_dataset = - load_dataset(action, format).map_err(|e| anyhow!("Parse error on file {action}: {e}"))?; +fn evaluate_n3_eval_test(test: &Test, ignore_errors: bool) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + let mut actual_dataset = n3_to_dataset( + load_n3(action, ignore_errors).with_context(|| format!("Parse error on file {action}"))?, + ); actual_dataset.canonicalize(); - let results = test - .result - .as_ref() - .ok_or_else(|| anyhow!("No tests result found"))?; - let mut expected_dataset = load_dataset(results, guess_dataset_format(results)?) - .map_err(|e| anyhow!("Parse error on file {results}: {e}"))?; + let results = test.result.as_ref().context("No tests result found")?; + let mut expected_dataset = n3_to_dataset( + load_n3(results, false).with_context(|| format!("Parse error on file {results}"))?, + ); expected_dataset.canonicalize(); - if expected_dataset == actual_dataset { - Ok(()) - } else { - bail!( - "The two files are not isomorphic. Diff:\n{}", - dataset_diff(&expected_dataset, &actual_dataset) - ) - } + ensure!( + expected_dataset == actual_dataset, + "The two files are not isomorphic. Diff:\n{}", + dataset_diff(&expected_dataset, &actual_dataset) + ); + Ok(()) +} + +fn evaluate_positive_c14n_test(test: &Test, format: RdfFormat) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + let actual = load_dataset(action, format, false) + .with_context(|| format!("Parse error on file {action}"))? + .to_string(); + let results = test.result.as_ref().context("No tests result found")?; + let expected = + read_file_to_string(results).with_context(|| format!("Read error on file {results}"))?; + ensure!( + expected == actual, + "The two files are not equal. Diff:\n{}", + format_diff(&expected, &actual, "c14n") + ); + Ok(()) +} + +fn n3_to_dataset(quads: Vec<N3Quad>) -> Dataset { + quads + .into_iter() + .filter_map(|q| { + Some(Quad { + subject: match q.subject { + N3Term::NamedNode(n) => n.into(), + N3Term::BlankNode(n) => n.into(), + N3Term::Triple(n) => n.into(), + N3Term::Literal(_) => return None, + N3Term::Variable(v) => BlankNode::new_unchecked(v.into_string()).into(), + }, + predicate: match q.predicate { + N3Term::NamedNode(n) => n, + _ => return None, + }, + object: match q.object { + N3Term::NamedNode(n) => n.into(), + N3Term::BlankNode(n) => n.into(), + N3Term::Triple(n) => n.into(), + N3Term::Literal(n) => n.into(), + N3Term::Variable(v) => BlankNode::new_unchecked(v.into_string()).into(), + }, + graph_name: q.graph_name, + }) + }) + .collect() } diff --git a/testsuite/src/report.rs b/testsuite/src/report.rs index ba24ee2c..be27110a 100644 --- a/testsuite/src/report.rs +++ b/testsuite/src/report.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use oxigraph::model::{Dataset, Graph, NamedNode}; +use oxigraph::model::{Dataset, NamedNode}; use std::fmt::Write; use text_diff::{diff, Difference}; use time::format_description::well_known::Rfc3339; @@ -26,20 +26,6 @@ fn normalize_dataset_text(store: &Dataset) -> String { quads.join("\n") } -pub(super) fn graph_diff(expected: &Graph, actual: &Graph) -> String { - format_diff( - &normalize_graph_text(expected), - &normalize_graph_text(actual), - "triples", - ) -} - -fn normalize_graph_text(store: &Graph) -> String { - let mut triples: Vec<_> = store.iter().map(|q| q.to_string()).collect(); - triples.sort(); - triples.join("\n") -} - pub(super) fn format_diff(expected: &str, actual: &str, kind: &str) -> String { let (_, changeset) = diff(expected, actual, "\n"); let mut ret = String::new(); diff --git a/testsuite/src/sparql_evaluator.rs b/testsuite/src/sparql_evaluator.rs index 4790d175..b68c4c2b 100644 --- a/testsuite/src/sparql_evaluator.rs +++ b/testsuite/src/sparql_evaluator.rs @@ -3,16 +3,20 @@ use crate::files::*; use crate::manifest::*; use crate::report::{dataset_diff, format_diff}; use crate::vocab::*; -use anyhow::{anyhow, bail, Result}; +use anyhow::{bail, ensure, Context, Error, Result}; +use oxigraph::io::RdfParser; use oxigraph::model::vocab::*; use oxigraph::model::*; +use oxigraph::sparql::results::QueryResultsFormat; use oxigraph::sparql::*; use oxigraph::store::Store; +use sparopt::Optimizer; use std::collections::HashMap; use std::fmt::Write; use std::io::{self, Cursor}; +use std::ops::Deref; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, Mutex, OnceLock}; pub fn register_sparql_tests(evaluator: &mut TestEvaluator) { evaluator.register( @@ -49,145 +53,116 @@ pub fn register_sparql_tests(evaluator: &mut TestEvaluator) { ); evaluator.register( "https://github.com/oxigraph/oxigraph/tests#PositiveJsonResultsSyntaxTest", - evaluate_positive_json_result_syntax_test, + |t| evaluate_positive_result_syntax_test(t, QueryResultsFormat::Json), ); evaluator.register( "https://github.com/oxigraph/oxigraph/tests#NegativeJsonResultsSyntaxTest", - evaluate_negative_json_result_syntax_test, + |t| evaluate_negative_result_syntax_test(t, QueryResultsFormat::Json), ); evaluator.register( "https://github.com/oxigraph/oxigraph/tests#PositiveXmlResultsSyntaxTest", - evaluate_positive_xml_result_syntax_test, + |t| evaluate_positive_result_syntax_test(t, QueryResultsFormat::Xml), ); evaluator.register( "https://github.com/oxigraph/oxigraph/tests#NegativeXmlResultsSyntaxTest", - evaluate_negative_xml_result_syntax_test, + |t| evaluate_negative_result_syntax_test(t, QueryResultsFormat::Xml), ); evaluator.register( "https://github.com/oxigraph/oxigraph/tests#NegativeTsvResultsSyntaxTest", - evaluate_negative_tsv_result_syntax_test, + |t| evaluate_negative_result_syntax_test(t, QueryResultsFormat::Tsv), + ); + evaluator.register( + "https://github.com/oxigraph/oxigraph/tests#QueryOptimizationTest", + evaluate_query_optimization_test, ); } fn evaluate_positive_syntax_test(test: &Test) -> Result<()> { - let query_file = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; + let query_file = test.action.as_deref().context("No action found")?; let query = Query::parse(&read_file_to_string(query_file)?, Some(query_file)) - .map_err(|e| anyhow!("Not able to parse {test} with error: {e}"))?; + .context("Not able to parse")?; Query::parse(&query.to_string(), None) - .map_err(|e| anyhow!("Failure to deserialize \"{query}\" of {test} with error: {e}"))?; + .with_context(|| format!("Failure to deserialize \"{query}\""))?; Ok(()) } fn evaluate_negative_syntax_test(test: &Test) -> Result<()> { - let query_file = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - match Query::parse(&read_file_to_string(query_file)?, Some(query_file)) { - Ok(result) => { - bail!("Oxigraph parses even if it should not {test}. The output tree is: {result}") - } - Err(_) => Ok(()), - } -} - -fn evaluate_positive_json_result_syntax_test(test: &Test) -> Result<()> { - result_syntax_check(test, QueryResultsFormat::Json) -} - -fn evaluate_negative_json_result_syntax_test(test: &Test) -> Result<()> { - if result_syntax_check(test, QueryResultsFormat::Json).is_ok() { - bail!("Oxigraph parses even if it should not {test}.") - } - Ok(()) -} - -fn evaluate_positive_xml_result_syntax_test(test: &Test) -> Result<()> { - result_syntax_check(test, QueryResultsFormat::Xml) -} - -fn evaluate_negative_xml_result_syntax_test(test: &Test) -> Result<()> { - if result_syntax_check(test, QueryResultsFormat::Xml).is_ok() { - bail!("Oxigraph parses even if it should not {test}.") - } - Ok(()) -} - -fn evaluate_negative_tsv_result_syntax_test(test: &Test) -> Result<()> { - if result_syntax_check(test, QueryResultsFormat::Tsv).is_ok() { - bail!("Oxigraph parses even if it should not {test}.") - } + let query_file = test.action.as_deref().context("No action found")?; + ensure!( + Query::parse(&read_file_to_string(query_file)?, Some(query_file)).is_err(), + "Oxigraph parses even if it should not." + ); Ok(()) } -fn result_syntax_check(test: &Test, format: QueryResultsFormat) -> Result<()> { - let action_file = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; +fn evaluate_positive_result_syntax_test(test: &Test, format: QueryResultsFormat) -> Result<()> { + let action_file = test.action.as_deref().context("No action found")?; let actual_results = StaticQueryResults::from_query_results( - QueryResults::read(Cursor::new(read_file_to_string(action_file)?), format)?, + QueryResults::read(read_file(action_file)?, format)?, true, )?; if let Some(result_file) = test.result.as_deref() { let expected_results = StaticQueryResults::from_query_results( - QueryResults::read(Cursor::new(read_file_to_string(result_file)?), format)?, + QueryResults::read(read_file(result_file)?, format)?, true, )?; - if !are_query_results_isomorphic(&expected_results, &actual_results) { - bail!( - "Failure on {test}.\n{}\n", - results_diff(expected_results, actual_results), - ); - } + ensure!( + are_query_results_isomorphic(&expected_results, &actual_results), + "Not isomorphic results:\n{}\n", + results_diff(expected_results, actual_results), + ); } Ok(()) } +fn evaluate_negative_result_syntax_test(test: &Test, format: QueryResultsFormat) -> Result<()> { + let action_file = test.action.as_deref().context("No action found")?; + ensure!( + QueryResults::read(Cursor::new(read_file_to_string(action_file)?), format) + .map_err(Error::from) + .and_then(|r| { StaticQueryResults::from_query_results(r, true) }) + .is_err(), + "Oxigraph parses even if it should not." + ); + Ok(()) +} + fn evaluate_evaluation_test(test: &Test) -> Result<()> { - let store = Store::new()?; + let store = get_store()?; if let Some(data) = &test.data { - load_dataset_to_store(data, &store)?; + load_to_store(data, &store, GraphName::DefaultGraph)?; } for (name, value) in &test.graph_data { - load_graph_to_store(value, &store, name)?; + load_to_store(value, &store, name.clone())?; } - let query_file = test - .query - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; + let query_file = test.query.as_deref().context("No action found")?; let options = QueryOptions::default() .with_service_handler(StaticServiceHandler::new(&test.service_data)?); let query = Query::parse(&read_file_to_string(query_file)?, Some(query_file)) - .map_err(|e| anyhow!("Failure to parse query of {test} with error: {e}"))?; + .context("Failure to parse query")?; // We check parsing roundtrip Query::parse(&query.to_string(), None) - .map_err(|e| anyhow!("Failure to deserialize \"{query}\" of {test} with error: {e}"))?; + .with_context(|| format!("Failure to deserialize \"{query}\""))?; // FROM and FROM NAMED support. We make sure the data is in the store if !query.dataset().is_default_dataset() { for graph_name in query.dataset().default_graph_graphs().unwrap_or(&[]) { - if let GraphName::NamedNode(graph_name) = graph_name { - load_graph_to_store(graph_name.as_str(), &store, graph_name.as_ref())?; - } else { - bail!("Invalid FROM in query {query} for test {test}"); - } + let GraphName::NamedNode(graph_name) = graph_name else { + bail!("Invalid FROM in query {query}"); + }; + load_to_store(graph_name.as_str(), &store, graph_name.as_ref())?; } for graph_name in query.dataset().available_named_graphs().unwrap_or(&[]) { - if let NamedOrBlankNode::NamedNode(graph_name) = graph_name { - load_graph_to_store(graph_name.as_str(), &store, graph_name.as_ref())?; - } else { - bail!("Invalid FROM NAMED in query {query} for test {test}"); - } + let NamedOrBlankNode::NamedNode(graph_name) = graph_name else { + bail!("Invalid FROM NAMED in query {query}"); + }; + load_to_store(graph_name.as_str(), &store, graph_name.as_ref())?; } } let expected_results = load_sparql_query_result(test.result.as_ref().unwrap()) - .map_err(|e| anyhow!("Error constructing expected graph for {test}: {e}"))?; + .context("Error constructing expected graph")?; let with_order = if let StaticQueryResults::Solutions { ordered, .. } = &expected_results { *ordered } else { @@ -201,89 +176,75 @@ fn evaluate_evaluation_test(test: &Test) -> Result<()> { } let actual_results = store .query_opt(query.clone(), options) - .map_err(|e| anyhow!("Failure to execute query of {test} with error: {e}"))?; + .context("Failure to execute query")?; let actual_results = StaticQueryResults::from_query_results(actual_results, with_order)?; - if !are_query_results_isomorphic(&expected_results, &actual_results) { - bail!( - "Failure on {test}.\n{}\nParsed query:\n{}\nData:\n{store}\n", - results_diff(expected_results, actual_results), - Query::parse(&read_file_to_string(query_file)?, Some(query_file)).unwrap() - ); - } + ensure!( + are_query_results_isomorphic(&expected_results, &actual_results), + "Not isomorphic results.\n{}\nParsed query:\n{}\nData:\n{}\n", + results_diff(expected_results, actual_results), + Query::parse(&read_file_to_string(query_file)?, Some(query_file)).unwrap(), + &*store + ); } Ok(()) } fn evaluate_positive_update_syntax_test(test: &Test) -> Result<()> { - let update_file = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; + let update_file = test.action.as_deref().context("No action found")?; let update = Update::parse(&read_file_to_string(update_file)?, Some(update_file)) - .map_err(|e| anyhow!("Not able to parse {test} with error: {e}"))?; + .context("Not able to parse")?; Update::parse(&update.to_string(), None) - .map_err(|e| anyhow!("Failure to deserialize \"{update}\" of {test} with error: {e}"))?; + .with_context(|| format!("Failure to deserialize \"{update}\""))?; Ok(()) } fn evaluate_negative_update_syntax_test(test: &Test) -> Result<()> { - let update_file = test - .action - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; - match Update::parse(&read_file_to_string(update_file)?, Some(update_file)) { - Ok(result) => { - bail!("Oxigraph parses even if it should not {test}. The output tree is: {result}") - } - Err(_) => Ok(()), - } + let update_file = test.action.as_deref().context("No action found")?; + ensure!( + Update::parse(&read_file_to_string(update_file)?, Some(update_file)).is_err(), + "Oxigraph parses even if it should not." + ); + Ok(()) } fn evaluate_update_evaluation_test(test: &Test) -> Result<()> { - let store = Store::new()?; + let store = get_store()?; if let Some(data) = &test.data { - load_dataset_to_store(data, &store)?; + load_to_store(data, &store, GraphName::DefaultGraph)?; } for (name, value) in &test.graph_data { - load_graph_to_store(value, &store, name)?; + load_to_store(value, &store, name.clone())?; } - let result_store = Store::new()?; + let result_store = get_store()?; if let Some(data) = &test.result { - load_dataset_to_store(data, &result_store)?; + load_to_store(data, &result_store, GraphName::DefaultGraph)?; } for (name, value) in &test.result_graph_data { - load_graph_to_store(value, &result_store, name)?; + load_to_store(value, &result_store, name.clone())?; } - let update_file = test - .update - .as_deref() - .ok_or_else(|| anyhow!("No action found for test {test}"))?; + let update_file = test.update.as_deref().context("No action found")?; let update = Update::parse(&read_file_to_string(update_file)?, Some(update_file)) - .map_err(|e| anyhow!("Failure to parse update of {test} with error: {e}"))?; + .context("Failure to parse update")?; // We check parsing roundtrip Update::parse(&update.to_string(), None) - .map_err(|e| anyhow!("Failure to deserialize \"{update}\" of {test} with error: {e}"))?; + .with_context(|| format!("Failure to deserialize \"{update}\""))?; - store - .update(update) - .map_err(|e| anyhow!("Failure to execute update of {test} with error: {e}"))?; + store.update(update).context("Failure to execute update")?; let mut store_dataset: Dataset = store.iter().collect::<Result<_, _>>()?; store_dataset.canonicalize(); let mut result_store_dataset: Dataset = result_store.iter().collect::<Result<_, _>>()?; result_store_dataset.canonicalize(); - if store_dataset == result_store_dataset { - Ok(()) - } else { - bail!( - "Failure on {test}.\nDiff:\n{}\nParsed update:\n{}\n", - dataset_diff(&result_store_dataset, &store_dataset), - Update::parse(&read_file_to_string(update_file)?, Some(update_file)).unwrap(), - ) - } + ensure!( + store_dataset == result_store_dataset, + "Not isomorphic result dataset.\nDiff:\n{}\nParsed update:\n{}\n", + dataset_diff(&result_store_dataset, &store_dataset), + Update::parse(&read_file_to_string(update_file)?, Some(update_file)).unwrap(), + ); + Ok(()) } fn load_sparql_query_result(url: &str) -> Result<StaticQueryResults> { @@ -293,13 +254,13 @@ fn load_sparql_query_result(url: &str) -> Result<StaticQueryResults> { { StaticQueryResults::from_query_results(QueryResults::read(read_file(url)?, format)?, false) } else { - StaticQueryResults::from_graph(&load_graph(url, guess_graph_format(url)?)?) + StaticQueryResults::from_graph(&load_graph(url, guess_rdf_format(url)?, false)?) } } #[derive(Clone)] struct StaticServiceHandler { - services: Arc<HashMap<NamedNode, Store>>, + services: Arc<HashMap<NamedNode, StoreRef>>, } impl StaticServiceHandler { @@ -310,8 +271,8 @@ impl StaticServiceHandler { .iter() .map(|(name, data)| { let name = NamedNode::new(name)?; - let store = Store::new()?; - load_dataset_to_store(data, &store)?; + let store = get_store()?; + load_to_store(data, &store, GraphName::DefaultGraph)?; Ok((name, store)) }) .collect::<Result<_>>()?, @@ -331,10 +292,10 @@ impl ServiceHandler for StaticServiceHandler { self.services .get(&service_name) .ok_or_else(|| { - io::Error::new( + EvaluationError::Service(Box::new(io::Error::new( io::ErrorKind::InvalidInput, format!("Service {service_name} not found"), - ) + ))) })? .query_opt( query, @@ -495,13 +456,14 @@ impl StaticQueryResults { fn from_graph(graph: &Graph) -> Result<Self> { // Hack to normalize literals - let store = Store::new()?; - for t in graph.iter() { - store - .insert(t.in_graph(GraphNameRef::DefaultGraph)) - .unwrap(); + let store = get_store()?; + for t in graph { + store.insert(t.in_graph(GraphNameRef::DefaultGraph))?; } - let mut graph: Graph = store.iter().map(|q| Triple::from(q.unwrap())).collect(); + let mut graph = store + .iter() + .map(|q| Ok(Triple::from(q?))) + .collect::<Result<Graph>>()?; if let Some(result_set) = graph.subject_for_predicate_object(rdf::TYPE, rs::RESULT_SET) { if let Some(bool) = graph.object_for_subject_predicate(result_set, rs::BOOLEAN) { @@ -512,11 +474,10 @@ impl StaticQueryResults { let mut variables: Vec<Variable> = graph .objects_for_subject_predicate(result_set, rs::RESULT_VARIABLE) .map(|object| { - if let TermRef::Literal(l) = object { - Ok(Variable::new_unchecked(l.value())) - } else { + let TermRef::Literal(l) = object else { bail!("Invalid rs:resultVariable: {object}") - } + }; + Ok(Variable::new_unchecked(l.value())) }) .collect::<Result<Vec<_>>>()?; variables.sort(); @@ -524,45 +485,38 @@ impl StaticQueryResults { let mut solutions = graph .objects_for_subject_predicate(result_set, rs::SOLUTION) .map(|object| { - if let TermRef::BlankNode(solution) = object { - let mut bindings = graph - .objects_for_subject_predicate(solution, rs::BINDING) - .map(|object| { - if let TermRef::BlankNode(binding) = object { - if let (Some(TermRef::Literal(variable)), Some(value)) = ( - graph.object_for_subject_predicate( - binding, - rs::VARIABLE, - ), - graph.object_for_subject_predicate(binding, rs::VALUE), - ) { - Ok(( - Variable::new_unchecked(variable.value()), - value.into_owned(), - )) - } else { - bail!("Invalid rs:binding: {binding}") - } - } else { - bail!("Invalid rs:binding: {object}") - } - }) - .collect::<Result<Vec<_>>>()?; - bindings.sort_by(|(a, _), (b, _)| a.cmp(b)); - let index = graph - .object_for_subject_predicate(solution, rs::INDEX) - .map(|object| { - if let TermRef::Literal(l) = object { - Ok(u64::from_str(l.value())?) - } else { - bail!("Invalid rs:index: {object}") - } - }) - .transpose()?; - Ok((bindings, index)) - } else { + let TermRef::BlankNode(solution) = object else { bail!("Invalid rs:solution: {object}") - } + }; + let mut bindings = graph + .objects_for_subject_predicate(solution, rs::BINDING) + .map(|object| { + let TermRef::BlankNode(binding) = object else { + bail!("Invalid rs:binding: {object}") + }; + let (Some(TermRef::Literal(variable)), Some(value)) = ( + graph.object_for_subject_predicate(binding, rs::VARIABLE), + graph.object_for_subject_predicate(binding, rs::VALUE), + ) else { + bail!("Invalid rs:binding: {binding}") + }; + Ok(( + Variable::new_unchecked(variable.value()), + value.into_owned(), + )) + }) + .collect::<Result<Vec<_>>>()?; + bindings.sort_by(|(a, _), (b, _)| a.cmp(b)); + let index = graph + .object_for_subject_predicate(solution, rs::INDEX) + .map(|object| { + let TermRef::Literal(l) = object else { + bail!("Invalid rs:index: {object}") + }; + Ok(u64::from_str(l.value())?) + }) + .transpose()?; + Ok((bindings, index)) }) .collect::<Result<Vec<_>>>()?; solutions.sort_by(|(_, index_a), (_, index_b)| index_a.cmp(index_b)); @@ -675,12 +629,12 @@ fn solutions_to_string(solutions: Vec<Vec<(Variable, Term)>>, ordered: bool) -> .into_iter() .map(|mut s| { let mut out = String::new(); - write!(&mut out, "{{").unwrap(); + out.write_str("{").unwrap(); s.sort_unstable_by(|(v1, _), (v2, _)| v1.cmp(v2)); for (variable, value) in s { write!(&mut out, "{variable} = {value} ").unwrap(); } - write!(&mut out, "}}").unwrap(); + out.write_str("}").unwrap(); out }) .collect::<Vec<_>>(); @@ -690,30 +644,90 @@ fn solutions_to_string(solutions: Vec<Vec<(Variable, Term)>>, ordered: bool) -> lines.join("\n") } -fn load_graph_to_store<'a>( - url: &str, - store: &Store, - to_graph_name: impl Into<GraphNameRef<'a>>, -) -> Result<()> { - store.load_graph( +fn load_to_store(url: &str, store: &Store, to_graph_name: impl Into<GraphName>) -> Result<()> { + store.load_from_read( + RdfParser::from_format(guess_rdf_format(url)?) + .with_base_iri(url)? + .with_default_graph(to_graph_name), read_file(url)?, - guess_graph_format(url)?, - to_graph_name, - Some(url), )?; Ok(()) } -fn load_dataset_to_store(url: &str, store: &Store) -> Result<()> { - if let Ok(format) = guess_dataset_format(url) { - store.load_dataset(read_file(url)?, format, Some(url)) - } else { - store.load_graph( - read_file(url)?, - guess_graph_format(url)?, - GraphNameRef::DefaultGraph, - Some(url), +fn evaluate_query_optimization_test(test: &Test) -> Result<()> { + let action = test.action.as_deref().context("No action found")?; + let actual = (&Optimizer::optimize_graph_pattern( + (&if let spargebra::Query::Select { pattern, .. } = + spargebra::Query::parse(&read_file_to_string(action)?, Some(action))? + { + pattern + } else { + bail!("Only SELECT queries are supported in query sparql-optimization tests") + }) + .into(), + )) + .into(); + let result = test.result.as_ref().context("No tests result found")?; + let spargebra::Query::Select { + pattern: expected, .. + } = spargebra::Query::parse(&read_file_to_string(result)?, Some(result))? + else { + bail!("Only SELECT queries are supported in query sparql-optimization tests") + }; + ensure!( + expected == actual, + "Not equal queries.\nDiff:\n{}\n", + format_diff( + &spargebra::Query::Select { + pattern: expected, + dataset: None, + base_iri: None + } + .to_sse(), + &spargebra::Query::Select { + pattern: actual, + dataset: None, + base_iri: None + } + .to_sse(), + "query" ) - }?; + ); Ok(()) } + +// Pool of stores to avoid allocating/deallocating them a lot +static STORE_POOL: OnceLock<Mutex<Vec<Store>>> = OnceLock::new(); + +fn get_store() -> Result<StoreRef> { + let store = if let Some(store) = STORE_POOL.get_or_init(Mutex::default).lock().unwrap().pop() { + store + } else { + Store::new()? + }; + Ok(StoreRef { store }) +} + +struct StoreRef { + store: Store, +} + +impl Drop for StoreRef { + fn drop(&mut self) { + if self.store.clear().is_ok() { + STORE_POOL + .get_or_init(Mutex::default) + .lock() + .unwrap() + .push(self.store.clone()) + } + } +} + +impl Deref for StoreRef { + type Target = Store; + + fn deref(&self) -> &Self::Target { + &self.store + } +} diff --git a/testsuite/src/vocab.rs b/testsuite/src/vocab.rs index 64327755..0fdc8f0d 100644 --- a/testsuite/src/vocab.rs +++ b/testsuite/src/vocab.rs @@ -43,6 +43,9 @@ pub mod mf { pub const ACTION: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#action", ); + pub const ASSUMED_TEST_BASE: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( + "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#assumedTestBase", + ); pub const RESULT: NamedNodeRef<'_> = NamedNodeRef::new_unchecked( "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#result", ); diff --git a/testsuite/tests/canonicalization.rs b/testsuite/tests/canonicalization.rs new file mode 100644 index 00000000..978902d2 --- /dev/null +++ b/testsuite/tests/canonicalization.rs @@ -0,0 +1,9 @@ +#![cfg(test)] + +use anyhow::Result; +use oxigraph_testsuite::check_testsuite; + +#[test] +fn rdf_canon_w3c_testsuite() -> Result<()> { + check_testsuite("https://w3c.github.io/rdf-canon/tests/manifest.ttl", &[]) +} diff --git a/testsuite/tests/oxigraph.rs b/testsuite/tests/oxigraph.rs index 04360a9e..238b57c7 100644 --- a/testsuite/tests/oxigraph.rs +++ b/testsuite/tests/oxigraph.rs @@ -1,40 +1,53 @@ +#![cfg(test)] + use anyhow::Result; -use oxigraph_testsuite::evaluator::TestEvaluator; -use oxigraph_testsuite::manifest::TestManifest; -use oxigraph_testsuite::sparql_evaluator::register_sparql_tests; +use oxigraph_testsuite::check_testsuite; -fn run_testsuite(manifest_urls: Vec<&str>) -> Result<()> { - let mut evaluator = TestEvaluator::default(); - register_sparql_tests(&mut evaluator); - let manifest = TestManifest::new(manifest_urls); - let results = evaluator.evaluate(manifest)?; +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows +#[test] +fn oxigraph_parser_testsuite() -> Result<()> { + check_testsuite( + "https://github.com/oxigraph/oxigraph/tests/parser/manifest.ttl", + &[], + ) +} - let mut errors = Vec::default(); - for result in results { - if let Err(error) = &result.outcome { - errors.push(format!("{}: failed with error {}", result.test, error)) - } - } +#[test] +fn oxigraph_parser_recovery_testsuite() -> Result<()> { + check_testsuite( + "https://github.com/oxigraph/oxigraph/tests/parser-recovery/manifest.ttl", + &[], + ) +} - assert!( - errors.is_empty(), - "{} failing tests:\n{}\n", - errors.len(), - errors.join("\n") - ); - Ok(()) +#[test] +fn oxigraph_parser_error_testsuite() -> Result<()> { + check_testsuite( + "https://github.com/oxigraph/oxigraph/tests/parser-error/manifest.ttl", + &[], + ) } #[test] fn oxigraph_sparql_testsuite() -> Result<()> { - run_testsuite(vec![ + check_testsuite( "https://github.com/oxigraph/oxigraph/tests/sparql/manifest.ttl", - ]) + &[], + ) } #[test] fn oxigraph_sparql_results_testsuite() -> Result<()> { - run_testsuite(vec![ + check_testsuite( "https://github.com/oxigraph/oxigraph/tests/sparql-results/manifest.ttl", - ]) + &[], + ) +} + +#[test] +fn oxigraph_optimizer_testsuite() -> Result<()> { + check_testsuite( + "https://github.com/oxigraph/oxigraph/tests/sparql-optimization/manifest.ttl", + &[], + ) } diff --git a/testsuite/tests/parser.rs b/testsuite/tests/parser.rs index 5a28e37f..af39b857 100644 --- a/testsuite/tests/parser.rs +++ b/testsuite/tests/parser.rs @@ -1,78 +1,130 @@ +#![cfg(test)] + use anyhow::Result; -use oxigraph_testsuite::evaluator::TestEvaluator; -use oxigraph_testsuite::manifest::TestManifest; -use oxigraph_testsuite::parser_evaluator::register_parser_tests; +use oxigraph_testsuite::check_testsuite; -fn run_testsuite(manifest_url: &str) -> Result<()> { - let mut evaluator = TestEvaluator::default(); - register_parser_tests(&mut evaluator); - let manifest = TestManifest::new(vec![manifest_url]); - let results = evaluator.evaluate(manifest)?; +// TODO: add support of language directions - let mut errors = Vec::default(); - for result in results { - if let Err(error) = &result.outcome { - errors.push(format!("{}: failed with error {}", result.test, error)) - } - } +#[test] +fn rdf11_n_triples_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-triples/manifest.ttl", + &[], + ) +} - assert!( - errors.is_empty(), - "{} failing tests:\n{}\n", - errors.len(), - errors.join("\n") - ); - Ok(()) +#[test] +fn rdf12_n_triples_syntax_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-n-triples/syntax/manifest.ttl", + &[ + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-n-triples/syntax#ntriples-base-1", + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-n-triples/syntax#ntriples-base-2", + ], + ) } +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows #[test] -fn ntriples_w3c_testsuite() -> Result<()> { - run_testsuite("http://w3c.github.io/rdf-tests/ntriples/manifest.ttl") +fn rdf12_n_triples_c14n_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-n-triples/c14n/manifest.ttl", + &["https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-n-triples/c14n#dirlangtagged_string"], + ) } #[test] -fn nquads_w3c_testsuite() -> Result<()> { - run_testsuite("http://w3c.github.io/rdf-tests/nquads/manifest.ttl") +fn rdf11_n_quads_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-n-quads/manifest.ttl", + &[], + ) } -#[cfg(not(target_os = "windows"))] // Tests don't like git auto "\r\n" on Windows +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows #[test] -fn turtle_w3c_testsuite() -> Result<()> { - run_testsuite("http://w3c.github.io/rdf-tests/turtle/manifest.ttl") +fn rdf11_turtle_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-turtle/manifest.ttl", + &[], + ) } -#[cfg(not(target_os = "windows"))] // Tests don't like git auto "\r\n" on Windows #[test] -fn trig_w3c_testsuite() -> Result<()> { - run_testsuite("http://w3c.github.io/rdf-tests/trig/manifest.ttl") +fn rdf12_turtle_syntax_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-turtle/syntax/manifest.ttl", + &[ + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-turtle/syntax#nt-ttl-base-1", + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-turtle/syntax#nt-ttl-base-2", + ], + ) } #[test] -fn rdf_xml_w3c_testsuite() -> Result<()> { - run_testsuite("http://www.w3.org/2013/RDFXMLTests/manifest.ttl") +fn rdf12_turtle_eval_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-turtle/eval/manifest.ttl", + &[], + ) } +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows #[test] -fn ntriples_star_w3c_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-star/tests/nt/syntax/manifest.ttl") +fn rdf11_trig_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/manifest.ttl", + &[], + ) } #[test] -fn turtle_star_syntax_w3c_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-star/tests/turtle/syntax/manifest.ttl") +fn rdf12_trig_syntax_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-trig/syntax/manifest.ttl", + &[ + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-trig/syntax#trig-base-1", + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-trig/syntax#trig-base-2", + ], + ) } #[test] -fn turtle_star_eval_w3c_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-star/tests/turtle/eval/manifest.ttl") +fn rdf12_trig_eval_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf12/rdf-trig/eval/manifest.ttl", + &[], + ) } #[test] -fn trig_star_syntax_w3c_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-star/tests/trig/syntax/manifest.ttl") +fn rdf11_xml_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-xml/manifest.ttl", + &[], + ) +} + +#[test] +fn n3_parser_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/N3/tests/N3Tests/manifest-parser.ttl", + &[], + ) +} +#[test] +fn n3_extended_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/N3/tests/N3Tests/manifest-extended.ttl", + &[], + ) } +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows #[test] -fn trig_star_eval_w3c_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-star/tests/trig/eval/manifest.ttl") +fn n3_turtle_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/N3/tests/TurtleTests/manifest.ttl", + &[], + ) } diff --git a/testsuite/tests/serd.rs b/testsuite/tests/serd.rs new file mode 100644 index 00000000..eb4910ad --- /dev/null +++ b/testsuite/tests/serd.rs @@ -0,0 +1,15 @@ +#![cfg(test)] + +use anyhow::Result; +use oxigraph_testsuite::check_testsuite; + +#[cfg(not(windows))] // Tests don't like git auto "\r\n" on Windows +#[test] +fn serd_good_testsuite() -> Result<()> { + check_testsuite("http://drobilla.net/sw/serd/test/good/manifest.ttl", &[]) +} + +#[test] +fn serd_bad_testsuite() -> Result<()> { + check_testsuite("http://drobilla.net/sw/serd/test/bad/manifest.ttl", &[]) +} diff --git a/testsuite/tests/sparql.rs b/testsuite/tests/sparql.rs index ca59e397..0de42891 100644 --- a/testsuite/tests/sparql.rs +++ b/testsuite/tests/sparql.rs @@ -1,45 +1,21 @@ -use anyhow::Result; -use oxigraph_testsuite::evaluator::TestEvaluator; -use oxigraph_testsuite::manifest::TestManifest; -use oxigraph_testsuite::sparql_evaluator::register_sparql_tests; - -fn run_testsuite(manifest_url: &str, ignored_tests: &[&str]) -> Result<()> { - let mut evaluator = TestEvaluator::default(); - register_sparql_tests(&mut evaluator); - let manifest = TestManifest::new(vec![manifest_url]); - let results = evaluator.evaluate(manifest)?; - - let mut errors = Vec::default(); - for result in results { - if let Err(error) = &result.outcome { - if !ignored_tests.contains(&result.test.as_str()) { - errors.push(format!("{}: failed with error {}", result.test, error)) - } - } - } +#![cfg(test)] - assert!( - errors.is_empty(), - "{} failing tests:\n{}\n", - errors.len(), - errors.join("\n") - ); - Ok(()) -} +use anyhow::Result; +use oxigraph_testsuite::check_testsuite; #[test] fn sparql10_w3c_query_syntax_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql10/manifest-syntax.ttl", &[ - "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql3/manifest#syn-bad-26", // tokenizer + "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/syntax-sparql3/manifest#syn-bad-26", /* tokenizer */ ], ) } #[test] fn sparql10_w3c_query_evaluation_testsuite() -> Result<()> { - run_testsuite("https://w3c.github.io/rdf-tests/sparql/sparql10/manifest-evaluation.ttl", &[ + check_testsuite("https://w3c.github.io/rdf-tests/sparql/sparql10/manifest-evaluation.ttl", &[ //Multiple writing of the same xsd:integer. Our system does strong normalization. "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-1", "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-9", @@ -67,18 +43,19 @@ fn sparql10_w3c_query_evaluation_testsuite() -> Result<()> { // We choose to simplify first the nested group patterns in OPTIONAL "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/optional-filter/manifest#dawg-optional-filter-005-not-simplified", // This test relies on naive iteration on the input file + "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-1", "http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-2" ]) } #[test] fn sparql11_query_w3c_evaluation_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql11/manifest-sparql11-query.ttl", &[ - //BNODE() scope is currently wrong + // BNODE() scope is currently wrong "http://www.w3.org/2009/sparql/docs/tests/data-sparql11/functions/manifest#bnode01", - //SERVICE name from a BGP + // SERVICE name from a BGP "http://www.w3.org/2009/sparql/docs/tests/data-sparql11/service/manifest#service5", ], ) @@ -86,7 +63,7 @@ fn sparql11_query_w3c_evaluation_testsuite() -> Result<()> { #[test] fn sparql11_federation_w3c_evaluation_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql11/manifest-sparql11-fed.ttl", &[ // Problem during service evaluation order @@ -97,7 +74,7 @@ fn sparql11_federation_w3c_evaluation_testsuite() -> Result<()> { #[test] fn sparql11_update_w3c_evaluation_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql11/manifest-sparql11-update.ttl", &[ // We allow multiple INSERT DATA with the same blank nodes @@ -108,7 +85,7 @@ fn sparql11_update_w3c_evaluation_testsuite() -> Result<()> { #[test] fn sparql11_json_w3c_evaluation_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql11/json-res/manifest.ttl", &[], ) @@ -116,7 +93,7 @@ fn sparql11_json_w3c_evaluation_testsuite() -> Result<()> { #[test] fn sparql11_tsv_w3c_evaluation_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-tests/sparql/sparql11/csv-tsv-res/manifest.ttl", &[ // We do not run CSVResultFormatTest tests yet @@ -127,9 +104,20 @@ fn sparql11_tsv_w3c_evaluation_testsuite() -> Result<()> { ) } +#[test] +fn sparql12_w3c_testsuite() -> Result<()> { + check_testsuite( + "https://w3c.github.io/rdf-tests/sparql/sparql12/manifest.ttl", + &[ + // Literal normalization + "https://w3c.github.io/rdf-tests/sparql/sparql12/grouping#group01", + ], + ) +} + #[test] fn sparql_star_syntax_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-star/tests/sparql/syntax/manifest.ttl", &[], ) @@ -137,7 +125,7 @@ fn sparql_star_syntax_testsuite() -> Result<()> { #[test] fn sparql_star_eval_testsuite() -> Result<()> { - run_testsuite( + check_testsuite( "https://w3c.github.io/rdf-star/tests/sparql/eval/manifest.ttl", &[], )