diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index c7a3107..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: CI - -on: - pull_request: - paths: - - 'jpo-deduplicator/**' - -jobs: - deduplicator-test: - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: "21" - distribution: "temurin" - cache: 'maven' - - - name: Run tests - env: - MAVEN_GITHUB_TOKEN: ${{ secrets.MAVEN_GITHUB_TOKEN }} - MAVEN_GITHUB_ORG: ${{ github.repository_owner }} - run: | - cd $GITHUB_WORKSPACE/jpo-deduplicator/jpo-deduplicator - mvn verify -s ./settings.xml \ No newline at end of file diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8853375..7660b5e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,27 +4,7 @@ on: pull_request: types: [opened, synchronize, reopened] -jobs: - jpo-deduplicator: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Build - uses: docker/build-push-action@v3 - with: - context: jpo-deduplicator - build-args: | - MAVEN_GITHUB_TOKEN_NAME=${{ vars.MAVEN_GITHUB_TOKEN_NAME }} - MAVEN_GITHUB_TOKEN=${{ secrets.MAVEN_GITHUB_TOKEN }} - MAVEN_GITHUB_ORG=${{ github.repository_owner }} - secrets: | - MAVEN_GITHUB_TOKEN: ${{ secrets.MAVEN_GITHUB_TOKEN }} - cache-from: type=gha - cache-to: type=gha,mode=max - +jobs: jpo-jikkou: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml index 5b12f7f..a49ccba 100644 --- a/.github/workflows/dockerhub.yml +++ b/.github/workflows/dockerhub.yml @@ -7,39 +7,7 @@ on: - "master" - "release/*" -jobs: - dockerhub-jpo-deduplicator: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Replace Docker tag - id: set_tag - run: echo "TAG=$(echo ${GITHUB_REF##*/} | sed 's/\//-/g')" >> $GITHUB_ENV - - - name: Build - uses: docker/build-push-action@v3 - with: - context: jpo-deduplicator - push: true - tags: usdotjpoode/jpo-deduplicator:${{ env.TAG }} - build-args: | - MAVEN_GITHUB_TOKEN_NAME=${{ vars.MAVEN_GITHUB_TOKEN_NAME }} - MAVEN_GITHUB_TOKEN=${{ secrets.MAVEN_GITHUB_TOKEN }} - MAVEN_GITHUB_ORG=${{ github.repository_owner }} - secrets: | - MAVEN_GITHUB_TOKEN: ${{ secrets.MAVEN_GITHUB_TOKEN }} - cache-from: type=gha - cache-to: type=gha,mode=max - +jobs: dockerhub-jpo-jikkou: runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index 53d023e..4014f8c 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,6 @@ The JPO ITS utilities repository serves as a central location for deploying open - [Configuration](#configuration) - [Configure Kafka Connector Creation](#configure-kafka-connector-creation) - [Quick Run](#quick-run-2) - - [5. jpo-deduplicator](#5-jpo-deduplicator) - - [Deduplication Config](#deduplication-config) - - [Generate a Github Token](#generate-a-github-token) - - [Quick Run](#quick-run-3) - [Security Notice](#security-notice) @@ -190,70 +186,6 @@ The following environment variables can be used to configure Kafka Connectors: 3. Click `OdeBsmJson`, and now you should see your message! 8. Feel free to test this with other topics or by producing to these topics using the [ODE](https://github.com/usdot-jpo-ode/jpo-ode) - - - -## 5. jpo-deduplicator -The JPO-Deduplicator is a Kafka Java spring-boot application designed to reduce the number of messages stored and processed in the ODE system. This is done by reading in messages from an input topic (such as topic.ProcessedMap) and outputting a subset of those messages on a related output topic (topic.DeduplicatedProcessedMap). Functionally, this is done by removing deduplicate messages from the input topic and only passing on unique messages. In addition, each topic will pass on at least 1 message per hour even if the message is a duplicate. This behavior helps ensure messages are still flowing through the system. The following topics currently support deduplication. - -- topic.ProcessedMap -> topic.DeduplicatedProcessedMap -- topic.ProcessedMapWKT -> topic.DeduplicatedProcessedMapWKT -- topic.OdeMapJson -> topic.DeduplicatedOdeMapJson -- topic.OdeTimJson -> topic.DeduplicatedOdeTimJson -- topic.OdeRawEncodedTIMJson -> topic.DeduplicatedOdeRawEncodedTIMJson -- topic.OdeBsmJson -> topic.DeduplicatedOdeBsmJson -- topic.ProcessedSpat -> topic.DeduplicatedProcessedSpat - -### Deduplication Config - -When running the jpo-deduplication as a submodule in jpo-utils, the deduplicator will automatically configure an algorithm as enabled or disabled depending on if the corresponding subcomponent is also active. For example if the KAFKA_TOPIC_CREATE_GEOJSONCONVERTER environment variable is set to true, the deduplicator will start performing deduplication for ProcessedMap, ProcessedMapWKT, and ProcessedSpat data. If the KAFKA_TOPIC_CREATE_GEOJSONCONVERTER is set to false, the deduplicator will disable deduplication for those same topics. To manually configure deduplication for a topic, the following environment variables can also be used. If no value is passed for a given environment variable, the corresponding deduplication algorithm will default to enabled. - -| Environment Variable | Description | -|---|---| -| `ENABLE_PROCESSED_MAP_DEDUPLICATION` | `true` / `false` - Enable ProcessedMap message Deduplication | -| `ENABLE_PROCESSED_MAP_WKT_DEDUPLICATION` | `true` / `false` - Enable ProcessedMap WKT message Deduplication | -| `ENABLE_ODE_MAP_DEDUPLICATION` | `true` / `false` - Enable ODE MAP message Deduplication | -| `ENABLE_ODE_TIM_DEDUPLICATION` | `true` / `false` - Enable ODE TIM message Deduplication | -| `ENABLE_ODE_RAW_ENCODED_TIM_DEDUPLICATION` | `true` / `false` - Enable ODE Raw Encoded TIM Deduplication | -| `ENABLE_PROCESSED_SPAT_DEDUPLICATION` | `true` / `false` - Enable ProcessedSpat Deduplication | -| `ENABLE_ODE_BSM_DEDUPLICATION` | `true` / `false` - Enable ODE BSM Deduplication | - -### Generate a Github Token - -A GitHub token is required to pull artifacts from GitHub repositories. This is required to obtain the jpo-deduplicator jars and must be done before attempting to build this repository. - -1. Log into GitHub. -2. Navigate to Settings -> Developer settings -> Personal access tokens. -3. Click "New personal access token (classic)". - 1. As of now, GitHub does not support `Fine-grained tokens` for obtaining packages. -4. Provide a name and expiration for the token. -5. Select the `read:packages` scope. -6. Click "Generate token" and copy the token. -7. Copy the token name and token value into your `.env` file. - -For local development the following steps are also required -8. Create a copy of [settings.xml](jpo-deduplicator/jpo-deduplicator/settings.xml) and save it to `~/.m2/settings.xml` -9. Update the variables in your `~/.m2/settings.xml` with the token value and target jpo-ode organization. - -### Quick Run -1. Create a copy of `sample.env` and rename it to `.env`. -2. Update the variable `MAVEN_GITHUB_TOKEN` to a github token used for downloading jar file dependencies. For full instructions on how to generate a token please see here: -3. Set the password for `MONGO_ADMIN_DB_PASS` and `MONGO_READ_WRITE_PASS` environmental variables to a secure password. -4. Set the `COMPOSE_PROFILES` variable to: `kafka,kafka_ui,kafka_setup, jpo-deduplicator` -5. Navigate back to the root directory and run the following command: `docker compose up -d` -6. Produce a sample message to one of the sink topics by using `kafka_ui` by: - 1. Go to `localhost:8001` - 2. Click local -> Topics - 3. Select `topic.OdeMapJson` - 4. Select `Produce Message` - 5. Copy in sample JSON for a Map Message - 6. Click `Produce Message` multiple times -7. View the synced message in `kafka_ui` by: - 1. Go to `localhost:8001` - 2. Click local -> Topics - 3. Select `topic.DeduplicatedOdeMapJson` - 4. You should now see only one copy of the map message sent. - [Back to top](#toc) ## Security Notice diff --git a/docker-compose-deduplicator.yml b/docker-compose-deduplicator.yml deleted file mode 100644 index c1e7410..0000000 --- a/docker-compose-deduplicator.yml +++ /dev/null @@ -1,41 +0,0 @@ -services: - deduplicator: - profiles: - - all - - deduplicator - build: - context: jpo-deduplicator - dockerfile: Dockerfile - args: - MAVEN_GITHUB_TOKEN: ${MAVEN_GITHUB_TOKEN} - MAVEN_GITHUB_ORG: ${MAVEN_GITHUB_ORG} - image: jpo-deduplicator:latest - restart: ${RESTART_POLICY} - environment: - DOCKER_HOST_IP: ${DOCKER_HOST_IP} - KAFKA_BOOTSTRAP_SERVERS: ${KAFKA_BOOTSTRAP_SERVERS} - spring.kafka.bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS} - enableProcessedMapDeduplication: ${ENABLE_PROCESSED_MAP_DEDUPLICATION} - enableProcessedMapWktDeduplication: ${ENABLE_PROCESSED_MAP_WKT_DEDUPLICATION} - enableOdeMapDeduplication: ${ENABLE_ODE_MAP_DEDUPLICATION} - enableOdeTimDeduplication: ${ENABLE_ODE_TIM_DEDUPLICATION} - enableOdeRawEncodedTimDeduplication: ${ENABLE_ODE_RAW_ENCODED_TIM_DEDUPLICATION} - enableProcessedSpatDeduplication: ${ENABLE_PROCESSED_SPAT_DEDUPLICATION} - enableOdeBsmDeduplication: ${ENABLE_ODE_BSM_DEDUPLICATION} - healthcheck: - test: ["CMD", "java", "-version"] - interval: 10s - timeout: 10s - retries: 20 - logging: - options: - max-size: "10m" - max-file: "5" - deploy: - resources: - limits: - memory: 3G - depends_on: - kafka: - condition: service_healthy - required: false diff --git a/docker-compose.yml b/docker-compose.yml index c0719e5..4410b10 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,4 @@ include: - docker-compose-connect.yml - docker-compose-mongo.yml - - docker-compose-kafka.yml - - docker-compose-deduplicator.yml \ No newline at end of file + - docker-compose-kafka.yml \ No newline at end of file diff --git a/docs/Release_notes.md b/docs/Release_notes.md index 40fe69d..6c1a6eb 100644 --- a/docs/Release_notes.md +++ b/docs/Release_notes.md @@ -40,4 +40,5 @@ USDOT PR 23: Adding missing ode topics USDOT PR 24: Index updates CDOT PR 6: Adding MEC Deposit Resources USDOT PR 25: Updating version for kafka ui to latest release -CDOT PR 7: Tim compatibility and CI updates \ No newline at end of file +CDOT PR 7: Tim compatibility and CI updates +CDOT PR 8: Jpo deduplicator removal \ No newline at end of file diff --git a/jpo-deduplicator/.dockerignore b/jpo-deduplicator/.dockerignore deleted file mode 100644 index 1ace176..0000000 --- a/jpo-deduplicator/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -jpo-deduplicator/target/ \ No newline at end of file diff --git a/jpo-deduplicator/Dockerfile b/jpo-deduplicator/Dockerfile deleted file mode 100644 index 2631f79..0000000 --- a/jpo-deduplicator/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM maven:3.8-eclipse-temurin-21-alpine AS builder - -WORKDIR /home - -ARG MAVEN_GITHUB_TOKEN -ARG MAVEN_GITHUB_ORG - -ENV MAVEN_GITHUB_TOKEN=$MAVEN_GITHUB_TOKEN -ENV MAVEN_GITHUB_ORG=$MAVEN_GITHUB_ORG - -RUN test -n "$MAVEN_GITHUB_TOKEN" || (echo "Error: MAVEN_GITHUB_TOKEN cannot be empty" && exit 1) -RUN test -n "$MAVEN_GITHUB_ORG" || (echo "Error: MAVEN_GITHUB_ORG cannot be empty" && exit 1) - -# Copy and Build Deduplicator -WORKDIR /home -COPY ./jpo-deduplicator/pom.xml ./jpo-deduplicator/ -COPY ./jpo-deduplicator/settings.xml ./jpo-deduplicator/ - -WORKDIR /home/jpo-deduplicator -RUN mvn -s settings.xml dependency:resolve - -COPY ./jpo-deduplicator/src ./src -RUN mvn -s settings.xml install -DskipTests - -FROM amazoncorretto:21 - -WORKDIR /home - -COPY --from=builder /home/jpo-deduplicator/src/main/resources/application.yaml /home -COPY --from=builder /home/jpo-deduplicator/src/main/resources/logback.xml /home -COPY --from=builder /home/jpo-deduplicator/target/jpo-deduplicator.jar /home - -#COPY cert.crt /home/cert.crt -#RUN keytool -import -trustcacerts -keystore /usr/local/openjdk-11/lib/security/cacerts -storepass changeit -noprompt -alias mycert -file cert.crt - -ENTRYPOINT ["java", \ - "-Djava.rmi.server.hostname=$DOCKER_HOST_IP", \ - "-Dcom.sun.management.jmxremote.port=9090", \ - "-Dcom.sun.management.jmxremote.rmi.port=9090", \ - "-Dcom.sun.management.jmxremote", \ - "-Dcom.sun.management.jmxremote.local.only=true", \ - "-Dcom.sun.management.jmxremote.authenticate=false", \ - "-Dcom.sun.management.jmxremote.ssl=false", \ - "-Dlogback.configurationFile=/home/logback.xml", \ - "-jar", \ - "/home/jpo-deduplicator.jar"] - -# ENTRYPOINT ["tail", "-f", "/dev/null"] diff --git a/jpo-deduplicator/jpo-deduplicator/LICENSE-2.0.html b/jpo-deduplicator/jpo-deduplicator/LICENSE-2.0.html deleted file mode 100644 index d1055c8..0000000 --- a/jpo-deduplicator/jpo-deduplicator/LICENSE-2.0.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - Apache License, Version 2.0 - - -
- -

Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/

-

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND - DISTRIBUTION

-

1. - Definitions.

-

"License" shall mean the terms and conditions for use, - reproduction, and distribution as defined by Sections 1 through 9 - of this document.

-

"Licensor" shall mean the copyright owner or entity authorized - by the copyright owner that is granting the License.

-

"Legal Entity" shall mean the union of the acting entity and - all other entities that control, are controlled by, or are under - common control with that entity. For the purposes of this - definition, "control" means (i) the power, direct or indirect, to - cause the direction or management of such entity, whether by - contract or otherwise, or (ii) ownership of fifty percent (50%) - or more of the outstanding shares, or (iii) beneficial ownership - of such entity.

-

"You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License.

-

"Source" form shall mean the preferred form for making - modifications, including but not limited to software source code, - documentation source, and configuration files.

-

"Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but not - limited to compiled object code, generated documentation, and - conversions to other media types.

-

"Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work (an - example is provided in the Appendix below).

-

"Derivative Works" shall mean any work, whether in Source or - Object form, that is based on (or derived from) the Work and for - which the editorial revisions, annotations, elaborations, or - other modifications represent, as a whole, an original work of - authorship. For the purposes of this License, Derivative Works - shall not include works that remain separable from, or merely - link (or bind by name) to the interfaces of, the Work and - Derivative Works thereof.

-

"Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or - additions to that Work or Derivative Works thereof, that is - intentionally submitted to Licensor for inclusion in the Work by - the copyright owner or by an individual or Legal Entity - authorized to submit on behalf of the copyright owner. For the - purposes of this definition, "submitted" means any form of - electronic, verbal, or written communication sent to the Licensor - or its representatives, including but not limited to - communication on electronic mailing lists, source code control - systems, and issue tracking systems that are managed by, or on - behalf of, the Licensor for the purpose of discussing and - improving the Work, but excluding communication that is - conspicuously marked or otherwise designated in writing by the - copyright owner as "Not a Contribution."

-

"Contributor" shall mean Licensor and any individual or Legal - Entity on behalf of whom a Contribution has been received by - Licensor and subsequently incorporated within the Work.

-

2. Grant of - Copyright License. Subject to the terms and - conditions of this License, each Contributor hereby grants to You - a perpetual, worldwide, non-exclusive, no-charge, royalty-free, - irrevocable copyright license to reproduce, prepare Derivative - Works of, publicly display, publicly perform, sublicense, and - distribute the Work and such Derivative Works in Source or Object - form.

-

3. Grant of Patent - License. Subject to the terms and conditions of this - License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have - made, use, offer to sell, sell, import, and otherwise transfer - the Work, where such license applies only to those patent claims - licensable by such Contributor that are necessarily infringed by - their Contribution(s) alone or by combination of their - Contribution(s) with the Work to which such Contribution(s) was - submitted. If You institute patent litigation against any entity - (including a cross-claim or counterclaim in a lawsuit) alleging - that the Work or a Contribution incorporated within the Work - constitutes direct or contributory patent infringement, then any - patent licenses granted to You under this License for that Work - shall terminate as of the date such litigation is filed.

-

4. - Redistribution. You may reproduce and distribute - copies of the Work or Derivative Works thereof in any medium, - with or without modifications, and in Source or Object form, - provided that You meet the following conditions:

-
    -
  1. You must give any other recipients of the Work or - Derivative Works a copy of this License; and
  2. -
  3. You must cause any modified files to carry prominent - notices stating that You changed the files; and
  4. -
  5. You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, excluding - those notices that do not pertain to any part of the Derivative - Works; and
  6. -
  7. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute - must include a readable copy of the attribution notices - contained within such NOTICE file, excluding those notices that - do not pertain to any part of the Derivative Works, in at least - one of the following places: within a NOTICE text file - distributed as part of the Derivative Works; within the Source - form or documentation, if provided along with the Derivative - Works; or, within a display generated by the Derivative Works, - if and wherever such third-party notices normally appear. The - contents of the NOTICE file are for informational purposes only - and do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed as - modifying the License.
    -
    - You may add Your own copyright statement to Your modifications - and may provide additional or different license terms and - conditions for use, reproduction, or distribution of Your - modifications, or for any such Derivative Works as a whole, - provided Your use, reproduction, and distribution of the Work - otherwise complies with the conditions stated in this - License.
  8. -
-

5. - Submission of Contributions. Unless You explicitly - state otherwise, any Contribution intentionally submitted for - inclusion in the Work by You to the Licensor shall be under the - terms and conditions of this License, without any additional - terms or conditions. Notwithstanding the above, nothing herein - shall supersede or modify the terms of any separate license - agreement you may have executed with Licensor regarding such - Contributions.

-

6. - Trademarks. This License does not grant permission - to use the trade names, trademarks, service marks, or product - names of the Licensor, except as required for reasonable and - customary use in describing the origin of the Work and - reproducing the content of the NOTICE file.

-

7. Disclaimer - of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or - conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or - FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for - determining the appropriateness of using or redistributing the - Work and assume any risks associated with Your exercise of - permissions under this License.

-

8. Limitation - of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, - special, incidental, or consequential damages of any character - arising as a result of this License or out of the use or - inability to use the Work (including but not limited to damages - for loss of goodwill, work stoppage, computer failure or - malfunction, or any and all other commercial damages or losses), - even if such Contributor has been advised of the possibility of - such damages.

-

9. Accepting - Warranty or Additional Liability. While - redistributing the Work or Derivative Works thereof, You may - choose to offer, and charge a fee for, acceptance of support, - warranty, indemnity, or other liability obligations and/or rights - consistent with this License. However, in accepting such - obligations, You may act only on Your own behalf and on Your sole - responsibility, not on behalf of any other Contributor, and only - if You agree to indemnify, defend, and hold each Contributor - harmless for any liability incurred by, or claims asserted - against, such Contributor by reason of your accepting any such - warranty or additional liability.

-

END OF TERMS AND CONDITIONS

-

APPENDIX: How to apply the Apache License to your - work

-

To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a file - or class name and description of purpose be included on the same - "printed page" as the copyright notice for easier identification - within third-party archives.

-
-
Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-    
-
-
- - - diff --git a/jpo-deduplicator/jpo-deduplicator/pom.xml b/jpo-deduplicator/jpo-deduplicator/pom.xml deleted file mode 100644 index 25a15bd..0000000 --- a/jpo-deduplicator/jpo-deduplicator/pom.xml +++ /dev/null @@ -1,294 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.1.3 - - - usdot.jpo.ode - jpo-deduplicator - 2.0.0 - jar - jpo-deduplicator - http://maven.apache.org - - UTF-8 - 29-SNAPSHOT - usdot-jpo-ode - https://sonarcloud.io - - Deduplicates Messages generated by Subcomponents of the ODE - 21 - - ^ - - - 0.8.11 - jacoco - reuseReports - ${project.basedir}/target/site/jacoco/jacoco.xml - java - - - - - org.springframework.boot - spring-boot-starter - - - org.apache.logging.log4j - log4j-to-slf4j - - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.vaadin.external.google - android-json - - - - - - org.springframework.boot - spring-boot-devtools - runtime - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.restdocs - spring-restdocs-mockmvc - test - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.kafka - spring-kafka - - - org.springframework.kafka - spring-kafka-test - test - - - - - usdot.jpo.ode - jpo-ode-core - 4.0.0 - - - usdot.jpo.ode - jpo-ode-plugins - 4.0.0 - - - usdot.jpo.ode - jpo-geojsonconverter - 2.0.0 - - - usdot.jpo.ode - jpo-conflictmonitor - 1.5.0 - - - junit - junit - 4.13.2 - test - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - test - - - org.mockito - mockito-core - 5.10.0 - test - - - - com.google.guava - guava - 33.0.0-jre - - - - - - - - org.projectlombok - lombok - 1.18.30 - - - - - - - - - false - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - - - - ${project.artifactId} - - - org.sonarsource.scanner.maven - sonar-maven-plugin - 3.10.0.2594 - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - build-info - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.2.5 - - all - exit - - - - @{argLine} - -XX:+EnableDynamicAgentLoading - - - - - - org.apache.maven.surefire - surefire-junit47 - 3.2.5 - - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - jacoco-initialize - - prepare-agent - - - - jacoco-site - package - - report - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.3.0 - - - - jar - - package - - - jpo-deduplicator - - - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 3.2.5 - - - - diff --git a/jpo-deduplicator/jpo-deduplicator/settings.xml b/jpo-deduplicator/jpo-deduplicator/settings.xml deleted file mode 100644 index 2a4f90b..0000000 --- a/jpo-deduplicator/jpo-deduplicator/settings.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - default - - - - github - jpo_deduplicator - ${env.MAVEN_GITHUB_TOKEN} - - - - - default - - - github - GitHub JPO Conflict Monitor - https://maven.pkg.github.com/${env.MAVEN_GITHUB_ORG}/* - - false - - - - - - \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorApplication.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorApplication.java deleted file mode 100644 index 6b483c9..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorApplication.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright 2018 572682 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - ******************************************************************************/ -package us.dot.its.jpo.deduplicator; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.MBeanRegistrationException; -import javax.management.MalformedObjectNameException; -import javax.management.NotCompliantMBeanException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; - -@SpringBootApplication -@EnableConfigurationProperties(DeduplicatorProperties.class) -public class DeduplicatorApplication { - - private static final Logger logger = LoggerFactory.getLogger(DeduplicatorApplication.class); - - static final int DEFAULT_NO_THREADS = 10; - static final String DEFAULT_SCHEMA = "default"; - - public static void main(String[] args) throws MalformedObjectNameException, InterruptedException, - InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException { - - logger.info("Starting Message Deduplicator"); - SpringApplication.run(DeduplicatorApplication.class, args); - // MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - // SystemConfig mBean = new SystemConfig(DEFAULT_NO_THREADS, DEFAULT_SCHEMA); - // ObjectName name = new ObjectName("us.dot.its.jpo.geojson:type=SystemConfig"); - // mbs.registerMBean(mBean, name); - logger.info("Message Deduplicator has started"); - - } - - @Bean - CommandLineRunner init(DeduplicatorProperties geojsonProperties) { - return args -> { - }; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorProperties.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorProperties.java deleted file mode 100644 index c60f522..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/DeduplicatorProperties.java +++ /dev/null @@ -1,444 +0,0 @@ -/******************************************************************************* - * Copyright 2018 572682 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - ******************************************************************************/ -package us.dot.its.jpo.deduplicator; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Properties; -import java.util.UUID; - -import jakarta.annotation.PostConstruct; - -import org.apache.commons.lang3.SystemUtils; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.StreamsConfig; -import org.apache.kafka.streams.errors.LogAndContinueExceptionHandler; -import org.apache.kafka.streams.processor.LogAndSkipOnInvalidTimestamp; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.info.BuildProperties; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; - -import lombok.Getter; -import lombok.Setter; -import lombok.AccessLevel; -import us.dot.its.jpo.conflictmonitor.AlwaysContinueProductionExceptionHandler; -import us.dot.its.jpo.ode.eventlog.EventLogger; -import us.dot.its.jpo.ode.util.CommonUtils; - -// import us.dot.its.jpo.conflictmonitor.AlwaysContinueProductionExceptionHandler; - -@Getter -@Setter -@ConfigurationProperties -public class DeduplicatorProperties implements EnvironmentAware { - - private static final Logger logger = LoggerFactory.getLogger(DeduplicatorProperties.class); - - // Processed Map Configuration - private String kafkaTopicProcessedMap; - private String kafkaTopicDeduplicatedProcessedMap; - private boolean enableProcessedMapDeduplication; - private String kafkaStateStoreProcessedMapName = "ProcessedMap-store"; - - // Processed Map WKT Configuration - private String kafkaTopicProcessedMapWKT; - private String kafkaTopicDeduplicatedProcessedMapWKT; - private boolean enableProcessedMapWktDeduplication; - private String kafkaStateStoreProcessedMapWKTName = "ProcessedMapWKT-store"; - - // Ode Map Json Configuration - private String kafkaTopicOdeMapJson; - private String kafkaTopicDeduplicatedOdeMapJson; - private boolean enableOdeMapDeduplication; - private String kafkaStateStoreOdeMapJsonName = "OdeMapJson-store"; - - // Ode Tim Json Configuration - private String kafkaTopicOdeTimJson; - private String kafkaTopicDeduplicatedOdeTimJson; - private boolean enableOdeTimDeduplication; - private String kafkaStateStoreOdeTimJsonName = "OdeTimJson-store"; - - // Ode Raw Encoded Tim Json Configuration - private String kafkaTopicOdeRawEncodedTimJson; - private String kafkaTopicDeduplicatedOdeRawEncodedTimJson; - private boolean enableOdeRawEncodedTimDeduplication; - private String kafkaStateStoreOdeRawEncodedTimJsonName = "OdeRawEncodedTimJson-store"; - - //Ode BsmJson Configuration - private String kafkaTopicOdeBsmJson; - private String kafkaTopicDeduplicatedOdeBsmJson; - private boolean enableOdeBsmDeduplication; - private long odeBsmMaximumTimeDelta; - private double odeBsmMaximumPositionDelta; - private double odeBsmAlwaysIncludeAtSpeed; - private String kafkaStateStoreOdeBsmJsonName = "OdeBsmJson-store"; - - // Confluent Properties - private boolean confluentCloudEnabled = false; - private String confluentKey = null; - private String confluentSecret = null; - - // Processed SPaT Configuration - private String kafkaTopicProcessedSpat; - private String kafkaTopicDeduplicatedProcessedSpat; - private boolean enableProcessedSpatDeduplication; - private String kafkaStateStoreProcessedSpatName = "ProcessedSpat-store"; - - - private int lingerMs = 0; - - - - @Autowired - @Setter(AccessLevel.NONE) - private Environment env; - - /* - * General Properties - */ - private String version; - // public static final int OUTPUT_SCHEMA_VERSION = 6; - - @Setter(AccessLevel.NONE) - private String kafkaBrokers = null; - - private static final String DEFAULT_KAFKA_PORT = "9092"; - private static final String DEFAULT_CONNECT_PORT = "8083"; - - @Setter(AccessLevel.NONE) - private String hostId; - - // @Setter(AccessLevel.NONE) - // private String connectURL = null; - - // @Setter(AccessLevel.NONE) - // private String dockerHostIP = null; - - @Setter(AccessLevel.NONE) - private String kafkaBrokerIP = null; - - - // @Setter(AccessLevel.NONE) - // private String dbHostIP = null; - - - @Setter(AccessLevel.NONE) - @Autowired - BuildProperties buildProperties; - - @PostConstruct - void initialize() { - setVersion(buildProperties.getVersion()); - logger.info("groupId: {}", buildProperties.getGroup()); - logger.info("artifactId: {}", buildProperties.getArtifact()); - logger.info("version: {}", version); - //OdeMsgMetadata.setStaticSchemaVersion(OUTPUT_SCHEMA_VERSION); - - - - String hostname; - try { - hostname = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - // Let's just use a random hostname - hostname = UUID.randomUUID().toString(); - logger.info("Unknown host error: {}, using random", e); - } - hostId = hostname; - logger.info("Host ID: {}", hostId); - EventLogger.logger.info("Initializing services on host {}", hostId); - - // if(dbHostIP == null){ - // String dbHost = CommonUtils.getEnvironmentVariable("MONGO_IP"); - - // if(dbHost == null){ - // logger.warn( - // "DB Host IP not defined, Defaulting to localhost."); - // dbHost = "localhost"; - // } - // dbHostIP = dbHost; - // } - - if (kafkaBrokers == null) { - - String kafkaBrokers = CommonUtils.getEnvironmentVariable("KAFKA_BOOTSTRAP_SERVERS"); - - logger.info("ode.kafkaBrokers property not defined. Will try KAFKA_BOOTSTRAP_SERVERS => {}", kafkaBrokers); - - if (kafkaBrokers == null) { - logger.warn( - "Neither ode.kafkaBrokers ode property nor KAFKA_BOOTSTRAP_SERVERS environment variable are defined. Defaulting to localhost:9092"); - kafkaBrokers = "localhost:9092"; - } - - } - - String kafkaType = CommonUtils.getEnvironmentVariable("KAFKA_TYPE"); - if (kafkaType != null) { - confluentCloudEnabled = kafkaType.equals("CONFLUENT"); - if (confluentCloudEnabled) { - - System.out.println("Enabling Confluent Cloud Integration"); - - confluentKey = CommonUtils.getEnvironmentVariable("CONFLUENT_KEY"); - confluentSecret = CommonUtils.getEnvironmentVariable("CONFLUENT_SECRET"); - } - } - - // Initialize the Kafka Connect URL - // if (connectURL == null) { - // String connectURL = CommonUtils.getEnvironmentVariable("CONNECT_URL"); - // if (connectURL == null) { - // connectURL = String.format("http://%s:%s", "localhost", DEFAULT_CONNECT_PORT); - // } - // } - - // List asList = Arrays.asList(this.getKafkaTopicsDisabled()); - // logger.info("Disabled Topics: {}", asList); - // kafkaTopicsDisabledSet.addAll(asList); - } - - public Properties createStreamProperties(String name) { - Properties streamProps = new Properties(); - streamProps.put(StreamsConfig.APPLICATION_ID_CONFIG, name); - - streamProps.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBrokers); - - streamProps.put(StreamsConfig.DEFAULT_DESERIALIZATION_EXCEPTION_HANDLER_CLASS_CONFIG, - LogAndContinueExceptionHandler.class.getName()); - - streamProps.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, - LogAndSkipOnInvalidTimestamp.class.getName()); - - streamProps.put(StreamsConfig.DEFAULT_PRODUCTION_EXCEPTION_HANDLER_CLASS_CONFIG, - AlwaysContinueProductionExceptionHandler.class.getName()); - - streamProps.put(StreamsConfig.NUM_STREAM_THREADS_CONFIG, 2); - - // streamProps.put(StreamsConfig.producerPrefix("acks"), "all"); - streamProps.put(StreamsConfig.producerPrefix(ProducerConfig.ACKS_CONFIG), "all"); - - // Reduce cache buffering per topology to 1MB - streamProps.put(StreamsConfig.STATESTORE_CACHE_MAX_BYTES_CONFIG, 1 * 1024 * 1024L); - - // Decrease default commit interval. Default for 'at least once' mode of 30000ms - // is too slow. - streamProps.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 100); - - // All the keys are Strings in this app - streamProps.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); - - // Configure the state store location - if (SystemUtils.IS_OS_LINUX) { - streamProps.put(StreamsConfig.STATE_DIR_CONFIG, "/var/lib/ode/kafka-streams"); - } else if (SystemUtils.IS_OS_WINDOWS) { - streamProps.put(StreamsConfig.STATE_DIR_CONFIG, "C:/temp/ode"); - } - // streamProps.put(StreamsConfig.STATE_DIR_CONFIG, "/var/lib/")\ - - // Increase max.block.ms and delivery.timeout.ms for streams - final int FIVE_MINUTES_MS = 5 * 60 * 1000; - streamProps.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, FIVE_MINUTES_MS); - streamProps.put(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, FIVE_MINUTES_MS); - - // Disable batching - // streamProps.put(ProducerConfig.BATCH_SIZE_CONFIG, 0); - - streamProps.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "zstd"); - streamProps.put(ProducerConfig.LINGER_MS_CONFIG, getKafkaLingerMs()); - - if (confluentCloudEnabled) { - streamProps.put("ssl.endpoint.identification.algorithm", "https"); - streamProps.put("security.protocol", "SASL_SSL"); - streamProps.put("sasl.mechanism", "PLAIN"); - - if (confluentKey != null && confluentSecret != null) { - String auth = "org.apache.kafka.common.security.plain.PlainLoginModule required " + - "username=\"" + confluentKey + "\" " + - "password=\"" + confluentSecret + "\";"; - streamProps.put("sasl.jaas.config", auth); - } - else { - logger.error("Environment variables CONFLUENT_KEY and CONFLUENT_SECRET are not set. Set these in the .env file to use Confluent Cloud"); - } - } - - - return streamProps; - } - - public String getProperty(String key) { - return env.getProperty(key); - } - - public String getProperty(String key, String defaultValue) { - return env.getProperty(key, defaultValue); - } - - public Object getProperty(String key, int i) { - return env.getProperty(key, Integer.class, i); - } - - public Boolean getConfluentCloudStatus() { - return confluentCloudEnabled; - } - - - @Value("${kafkaTopicProcessedMap}") - public void setKafkaTopicProcessedMap(String kafkaTopicProcessedMap) { - this.kafkaTopicProcessedMap = kafkaTopicProcessedMap; - } - - @Value("${kafkaTopicDeduplicatedProcessedMap}") - public void setKafkaTopicDeduplicatedProcessedMap(String kafkaTopicDeduplicatedProcessedMap) { - this.kafkaTopicDeduplicatedProcessedMap = kafkaTopicDeduplicatedProcessedMap; - } - - @Value("${enableProcessedMapDeduplication}") - public void setEnableProcessedMapDeduplication(boolean enableProcessedMapDeduplication) { - this.enableProcessedMapDeduplication = enableProcessedMapDeduplication; - } - - @Value("${kafkaTopicProcessedMapWKT}") - public void setKafkaTopicProcessedMapWKT(String kafkaTopicProcessedMapWKT) { - this.kafkaTopicProcessedMapWKT = kafkaTopicProcessedMapWKT; - } - - @Value("${kafkaTopicDeduplicatedProcessedMapWKT}") - public void setKafkaTopicDeduplicatedProcessedMapWKT(String kafkaTopicDeduplicatedProcessedMapWKT) { - this.kafkaTopicDeduplicatedProcessedMapWKT = kafkaTopicDeduplicatedProcessedMapWKT; - } - - @Value("${enableProcessedMapWktDeduplication}") - public void setEnableProcessedMapWktDeduplication(boolean enableProcessedMapWktDeduplication) { - this.enableProcessedMapWktDeduplication = enableProcessedMapWktDeduplication; - } - - @Value("${kafkaTopicOdeMapJson}") - public void setKafkaTopicOdeMapJson(String kafkaTopicOdeMapJson) { - this.kafkaTopicOdeMapJson = kafkaTopicOdeMapJson; - } - - @Value("${kafkaTopicDeduplicatedOdeMapJson}") - public void setKafkaTopicDeduplicatedOdeMapJson(String kafkaTopicDeduplicatedOdeMapJson) { - this.kafkaTopicDeduplicatedOdeMapJson = kafkaTopicDeduplicatedOdeMapJson; - } - - @Value("${enableOdeMapDeduplication}") - public void setEnableOdeMapDeduplication(boolean enableOdeMapDeduplication) { - this.enableOdeMapDeduplication = enableOdeMapDeduplication; - } - - @Value("${kafkaTopicOdeTimJson}") - public void setKafkaTopicOdeTimJson(String kafkaTopicOdeTimJson) { - this.kafkaTopicOdeTimJson = kafkaTopicOdeTimJson; - } - - @Value("${kafkaTopicDeduplicatedOdeTimJson}") - public void setKafkaTopicDeduplicatedOdeTimJson(String kafkaTopicDeduplicatedOdeTimJson) { - this.kafkaTopicDeduplicatedOdeTimJson = kafkaTopicDeduplicatedOdeTimJson; - } - - @Value("${enableOdeTimDeduplication}") - public void setEnableOdeTimDeduplication(boolean enableOdeTimDeduplication) { - this.enableOdeTimDeduplication = enableOdeTimDeduplication; - } - - @Value("${kafkaTopicOdeRawEncodedTimJson}") - public void setKafkaTopicOdeRawEncodedTimJson(String kafkaTopicOdeRawEncodedTimJson) { - this.kafkaTopicOdeRawEncodedTimJson = kafkaTopicOdeRawEncodedTimJson; - } - - @Value("${kafkaTopicDeduplicatedOdeRawEncodedTimJson}") - public void setKafkaTopicDeduplicatedOdeRawEncodedTimJson(String kafkaTopicDeduplicatedOdeRawEncodedTimJson) { - this.kafkaTopicDeduplicatedOdeRawEncodedTimJson = kafkaTopicDeduplicatedOdeRawEncodedTimJson; - } - - @Value("${enableOdeRawEncodedTimDeduplication}") - public void setEnableOdeRawEncodedTimDeduplication(boolean enableOdeRawEncodedTimDeduplication) { - this.enableOdeRawEncodedTimDeduplication = enableOdeRawEncodedTimDeduplication; - } - - @Value("${kafkaTopicOdeBsmJson}") - public void setkafkaTopicOdeBsmJson(String kafkaTopicOdeBsmJson) { - this.kafkaTopicOdeBsmJson = kafkaTopicOdeBsmJson; - } - - @Value("${kafkaTopicDeduplicatedOdeBsmJson}") - public void setkafkaTopicDeduplicatedOdeBsmJson(String kafkaTopicDeduplicatedOdeBsmJson) { - this.kafkaTopicDeduplicatedOdeBsmJson = kafkaTopicDeduplicatedOdeBsmJson; - } - - @Value("${enableOdeBsmDeduplication}") - public void setenableOdeBsmDeduplication(boolean enableOdeBsmDeduplication) { - this.enableOdeBsmDeduplication = enableOdeBsmDeduplication; - } - - @Value("${odeBsmMaximumTimeDelta}") - public void setMaximumTimeDelta(long maximumTimeDelta) { - this.odeBsmMaximumTimeDelta = maximumTimeDelta; - } - - @Value("${odeBsmMaximumPositionDelta}") - public void setMaximumPositionDelta(double maximumPositionDelta) { - this.odeBsmMaximumPositionDelta = maximumPositionDelta; - } - - @Value("${odeBsmAlwaysIncludeAtSpeed}") - public void setAlwaysIncludeAtSpeed(double alwaysIncludeAtSpeed) { - this.odeBsmAlwaysIncludeAtSpeed = alwaysIncludeAtSpeed; - } - - @Value("${spring.kafka.bootstrap-servers}") - public void setKafkaBrokers(String kafkaBrokers) { - this.kafkaBrokers = kafkaBrokers; - } - - @Value("${kafkaTopicProcessedSpat}") - public void setKafkaTopicProcessedSpat(String kafkaTopicProcessedSpat) { - this.kafkaTopicProcessedSpat = kafkaTopicProcessedSpat; - } - - @Value("${kafkaTopicDeduplicatedProcessedSpat}") - public void setKafkaTopicDeduplicatedProcessedSpat(String kafkaTopicDeduplicatedProcessedSpat) { - this.kafkaTopicDeduplicatedProcessedSpat = kafkaTopicDeduplicatedProcessedSpat; - } - - @Value("${enableProcessedSpatDeduplication}") - public void setEnableProcessedSpatDeduplication(boolean enableProcessedSpatDeduplication) { - this.enableProcessedSpatDeduplication = enableProcessedSpatDeduplication; - } - - @Override - public void setEnvironment(Environment environment) { - env = environment; - } - - @Value("${kafka.linger_ms}") - public void setKafkaLingerMs(int lingerMs) { - this.lingerMs = lingerMs; - } - - public int getKafkaLingerMs() { - return lingerMs; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/KafkaConfiguration.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/KafkaConfiguration.java deleted file mode 100644 index a5cac5f..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/KafkaConfiguration.java +++ /dev/null @@ -1,197 +0,0 @@ -package us.dot.its.jpo.deduplicator; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import org.apache.kafka.clients.admin.NewTopic; -import org.apache.kafka.common.serialization.StringSerializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.kafka.config.TopicBuilder; -import org.springframework.kafka.core.DefaultKafkaProducerFactory; -import org.springframework.kafka.core.KafkaAdmin; -import org.springframework.kafka.core.KafkaAdmin.NewTopics; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.kafka.core.ProducerFactory; -import org.springframework.stereotype.Component; -import org.apache.kafka.clients.producer.ProducerConfig; - -@Component -@ConfigurationProperties(prefix = "kafka.topics") -public class KafkaConfiguration { - - @Autowired - private DeduplicatorProperties properties; - - @Bean(name = "createKafkaTopics") - public KafkaAdmin.NewTopics createKafkaTopics() { - logger.info("createTopic"); - List newTopics = new ArrayList<>(); - - if(!properties.getConfluentCloudStatus()){ - try { - for(var propEntry : admin.getConfigurationProperties().entrySet()) { - logger.info("KafkaAdmin property {} = {}", propEntry.getKey(), propEntry.getValue()); - } - - if (!autoCreateTopics) { - logger.info("Auto create topics is disabled"); - return null; - } - - logger.info("Creating topics: {}", createTopics); - - - - List topicNames = new ArrayList<>(); - for (var topic : createTopics) { - - // Get the name and config settings for the topic - String topicName = (String)topic.getOrDefault("name", null); - if (topicName == null) { - logger.error("CreateTopic {} has no topic name", topic); - break; - } - topicNames.add(topicName); - - Map topicConfigs = new HashMap<>(); - String cleanupPolicy = (String)topic.getOrDefault("cleanupPolicy", null); - if (cleanupPolicy != null) { - topicConfigs.put("cleanup.policy", cleanupPolicy); - } - Integer retentionMs = (Integer)topic.getOrDefault("retentionMs", null); - if (retentionMs != null) { - topicConfigs.put("retention.ms", retentionMs.toString()); - } - - NewTopic newTopic = TopicBuilder - .name(topicName) - .partitions(numPartitions) - .replicas(numReplicas) - .configs(topicConfigs) - .build(); - newTopics.add(newTopic); - logger.info("New Topic: {}", newTopic); - } - - // Explicitly create the topics here to prevent error on first run - admin.initialize(); - admin.createOrModifyTopics(newTopics.toArray(new NewTopic[0])); - - // Check that topics were created - var topicDescMap = admin.describeTopics(topicNames.toArray(new String[0])); - for (var entry : topicDescMap.entrySet()) { - String topicName = entry.getKey(); - var desc = entry.getValue(); - logger.info("Created topic {}: {}", topicName, desc); - } - - - } catch (Exception e) { - logger.error("Exception in createKafkaTopics", e); - throw e; - } - } - - // List out existing topics - // Admin adminClient = Admin.create(properties.createStreamProperties("DeduplicatorAdminClient")); - // ListTopicsOptions listTopicsOptions = new ListTopicsOptions().listInternal(true); - // ListTopicsResult topicsResult = adminClient.listTopics(listTopicsOptions); - // KafkaFuture> topicsFuture = topicsResult.names(); - // try { - // List topicNames = new ArrayList<>(); - // for(String topicName: topicsFuture.get()){ - // logger.info("Found Topic: " + topicName); - // topicNames.add(topicName); - // } - - // } catch (InterruptedException e) { - // logger.error("Interruption Exception in createKafkaTopics. Unable to List existing Topics", e); - // } catch (ExecutionException e) { - // logger.error("Execution Exception in createKafkaTopics. Unable to List existing Topics", e); - // } - - - return new NewTopics(newTopics.toArray(NewTopic[]::new)); - } - - @Bean - public ProducerFactory producerFactory() { - Properties configProps = properties.createStreamProperties("Deduplicator-producer-factory"); - - Map map = new HashMap<>(); - - for (Map.Entry entry : configProps.entrySet()) { - String key = (String) entry.getKey(); - Object value = entry.getValue(); - map.put(key, value); - } - - map.put( - ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, - StringSerializer.class); - map.put( - ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, - StringSerializer.class); - - return new DefaultKafkaProducerFactory(map); - } - - @Bean - public KafkaTemplate kafkaTemplate() { - return new KafkaTemplate<>(producerFactory()); - } - - private static final Logger logger = LoggerFactory.getLogger(KafkaConfiguration.class); - - private boolean autoCreateTopics; - private int numPartitions; - private int numReplicas; - private List> createTopics; - - public boolean getAutoCreateTopics() { - return autoCreateTopics; - } - - public void setAutoCreateTopics(boolean autoCreateTopics) { - this.autoCreateTopics = autoCreateTopics; - } - - public int getNumPartitions() { - return numPartitions; - } - - public int getNumReplicas() { - return numReplicas; - } - - public List> getCreateTopics() { - return createTopics; - } - - public void setNumPartitions(int numPartitions) { - this.numPartitions = numPartitions; - logger.info("kafka.topics.numPartitions = {}", numPartitions); - } - - public void setNumReplicas(int numReplicas) { - this.numReplicas = numReplicas; - } - - public void setCreateTopics(List> createTopics) { - this.createTopics = createTopics; - } - - - - @Autowired - private KafkaAdmin admin; - - - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/StreamsExceptionHandler.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/StreamsExceptionHandler.java deleted file mode 100644 index 71132f3..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/StreamsExceptionHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -package us.dot.its.jpo.deduplicator; - -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.kafka.core.KafkaTemplate; - - - -/** - * Handler for unhandled exceptions thrown from Streams topologies that - * logs the exception to a topic, and allows choosing the shutdown behavior. - * - * See {@link https://cwiki.apache.org/confluence/display/KAFKA/KIP-671%3A+Introduce+Kafka+Streams+Specific+Uncaught+Exception+Handler} - * for a description of the options. - */ -public class StreamsExceptionHandler implements StreamsUncaughtExceptionHandler { - - final static Logger logger = LoggerFactory.getLogger(StreamsExceptionHandler.class); - - final KafkaTemplate kafkaTemplate; - final String topology; - final String notificationTopic; - - @Autowired - public StreamsExceptionHandler(KafkaTemplate kafkaTemplate, String topology, String notificationTopic) { - this.kafkaTemplate = kafkaTemplate; - this.topology = topology; - this.notificationTopic = notificationTopic; - } - - @Override - public StreamThreadExceptionResponse handle(Throwable exception) { - try { - logger.error(String.format("Uncaught exception in stream topology %s", topology), exception); - } catch (Exception ex) { - logger.error("Exception sending kafka streams error event", ex); - } - - - // SHUTDOWN_CLIENT option shuts down quickly. - return StreamThreadExceptionResponse.SHUTDOWN_CLIENT; - - // SHUTDOWN_APPLICATION shuts down more slowly, but cleans up more thoroughly - //return StreamThreadExceptionResponse.SHUTDOWN_APPLICATION; - - // "Replace Thread" mode can be used to keep the streams client alive, - // however if the cause of the error was not transient, but due to a code error processing - // a record, it can result in the record being repeatedly processed throwing the - // same error - // - //return StreamThreadExceptionResponse.REPLACE_THREAD; - } - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/DeduplicatorServiceController.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/DeduplicatorServiceController.java deleted file mode 100644 index bd38ab9..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/DeduplicatorServiceController.java +++ /dev/null @@ -1,114 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator; - -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.kafka.streams.KafkaStreams; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Profile; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.stereotype.Controller; - -import lombok.Getter; -import us.dot.its.jpo.conflictmonitor.monitor.MonitorServiceController; -import us.dot.its.jpo.conflictmonitor.monitor.algorithms.StreamsTopology; -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.BsmDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.MapDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.TimDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.OdeRawEncodedTimDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedMapDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedMapWktDeduplicatorTopology; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedSpatDeduplicatorTopology; - -@Controller -@DependsOn("createKafkaTopics") -@Profile("!test && !testConfig") -public class DeduplicatorServiceController { - - private static final Logger logger = LoggerFactory.getLogger(MonitorServiceController.class); - - // Temporary for KafkaStreams that don't implement the Algorithm interface - @Getter - final ConcurrentHashMap streamsMap = new ConcurrentHashMap(); - - @Getter - final ConcurrentHashMap algoMap = new ConcurrentHashMap(); - - - - @Autowired - public DeduplicatorServiceController(final DeduplicatorProperties props, - final KafkaTemplate kafkaTemplate) { - - - try { - - if(props.isEnableProcessedMapDeduplication()){ - logger.info("Starting Processed Map Deduplicator"); - ProcessedMapDeduplicatorTopology processedMapDeduplicatorTopology = new ProcessedMapDeduplicatorTopology( - props, - props.createStreamProperties("ProcessedMapDeduplicator") - ); - processedMapDeduplicatorTopology.start(); - } - - if(props.isEnableProcessedMapWktDeduplication()){ - logger.info("Starting Processed Map WKT Deduplicator"); - ProcessedMapWktDeduplicatorTopology processedMapWktDeduplicatorTopology = new ProcessedMapWktDeduplicatorTopology( - props, - props.createStreamProperties("ProcessedMapWKTdeduplicator") - ); - processedMapWktDeduplicatorTopology.start(); - } - - if(props.isEnableProcessedMapDeduplication()){ - logger.info("Starting Map Deduplicator"); - MapDeduplicatorTopology mapDeduplicatorTopology = new MapDeduplicatorTopology( - props, - props.createStreamProperties("MapDeduplicator") - ); - mapDeduplicatorTopology.start(); - } - - if(props.isEnableOdeTimDeduplication()){ - logger.info("Starting Tim Deduplicator"); - TimDeduplicatorTopology timDeduplicatorTopology = new TimDeduplicatorTopology( - props, - props.createStreamProperties("TimDeduplicator") - ); - timDeduplicatorTopology.start(); - } - - if(props.isEnableOdeRawEncodedTimDeduplication()){ - logger.info("Starting Raw Encoded TIM Deduplicator"); - OdeRawEncodedTimDeduplicatorTopology odeRawEncodedTimDeduplicatorTopology = new OdeRawEncodedTimDeduplicatorTopology( - props, - props.createStreamProperties("OdeRawEncodedTimDeduplicator") - ); - odeRawEncodedTimDeduplicatorTopology.start(); - } - - if(props.isEnableProcessedSpatDeduplication()){ - logger.info("Starting Processed Spat Deduplicator"); - ProcessedSpatDeduplicatorTopology processedSpatDeduplicatorTopology = new ProcessedSpatDeduplicatorTopology( - props, - props.createStreamProperties("ProcessedSpatDeduplicator") - ); - processedSpatDeduplicatorTopology.start(); - } - - if(props.isEnableOdeBsmDeduplication()){ - logger.info("Starting BSM Deduplicator"); - BsmDeduplicatorTopology bsmDeduplicatorTopology = new BsmDeduplicatorTopology(props); - bsmDeduplicatorTopology.start(); - } - - - } catch (Exception e) { - logger.error("Encountered issue with creating topologies", e); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/JsonPair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/JsonPair.java deleted file mode 100644 index d0f4377..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/JsonPair.java +++ /dev/null @@ -1,21 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import com.fasterxml.jackson.databind.JsonNode; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@NoArgsConstructor -@Setter -@Getter -public class JsonPair { - - public JsonNode message; - public boolean shouldSend; - - public JsonPair(JsonNode message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeBsmPair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeBsmPair.java deleted file mode 100644 index 208622b..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeBsmPair.java +++ /dev/null @@ -1,20 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import us.dot.its.jpo.ode.model.OdeBsmData; - -@NoArgsConstructor -@Setter -@Getter -public class OdeBsmPair { - - public OdeBsmData message; - public boolean shouldSend; - - public OdeBsmPair(OdeBsmData message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeMapPair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeMapPair.java deleted file mode 100644 index 24c265a..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/OdeMapPair.java +++ /dev/null @@ -1,20 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import us.dot.its.jpo.ode.model.OdeMapData; - -@NoArgsConstructor -@Setter -@Getter -public class OdeMapPair { - - public OdeMapData message; - public boolean shouldSend; - - public OdeMapPair(OdeMapData message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/Pair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/Pair.java deleted file mode 100644 index fd0ee44..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/Pair.java +++ /dev/null @@ -1,19 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@NoArgsConstructor -@Setter -@Getter -public class Pair { - - public T message; - public boolean shouldSend; - - public Pair(T message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapPair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapPair.java deleted file mode 100644 index b1400c5..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapPair.java +++ /dev/null @@ -1,21 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.LineString; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -@NoArgsConstructor -@Setter -@Getter -public class ProcessedMapPair { - - public ProcessedMap message; - public boolean shouldSend; - - public ProcessedMapPair(ProcessedMap message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapWktPair.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapWktPair.java deleted file mode 100644 index d6acaca..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/models/ProcessedMapWktPair.java +++ /dev/null @@ -1,20 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.models; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -@NoArgsConstructor -@Setter -@Getter -public class ProcessedMapWktPair { - - public ProcessedMap message; - public boolean shouldSend; - - public ProcessedMapWktPair(ProcessedMap message, boolean shouldSend){ - this.message = message; - this.shouldSend = shouldSend; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/DeduplicationProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/DeduplicationProcessor.java deleted file mode 100644 index 55b669c..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/DeduplicationProcessor.java +++ /dev/null @@ -1,69 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; - -import org.apache.kafka.streams.processor.PunctuationType; -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorContext; -import org.apache.kafka.streams.processor.api.Record; -import org.apache.kafka.streams.state.KeyValueStore; - -import org.apache.kafka.streams.state.KeyValueIterator; -import org.apache.kafka.streams.KeyValue; - -public abstract class DeduplicationProcessor implements Processor{ - - private ProcessorContext context; - private KeyValueStore store; - public String storeName; - - @Override - public void init(ProcessorContext context) { - this.context = context; - store = context.getStateStore(storeName); - this.context.schedule(Duration.ofHours(1), PunctuationType.WALL_CLOCK_TIME, this::cleanupOldKeys); - } - - @Override - public void process(Record record) { - - // Don't do anything if key is bad - if(record.key().equals("")){ - return; - } - - T lastRecord = store.get(record.key()); - if(lastRecord == null){ - store.put(record.key(), record.value()); - context.forward(record); - return; - } - - if(!isDuplicate(lastRecord, record.value())){ - store.put(record.key(), record.value()); - context.forward(record); - return; - } - } - - private void cleanupOldKeys(final long timestamp) { - try (KeyValueIterator iterator = store.all()) { - while (iterator.hasNext()) { - - KeyValue record = iterator.next(); - // Delete any record more than 2 hours old. - if(Instant.ofEpochMilli(timestamp).minusSeconds(2 * 60 * 60).isAfter(getMessageTime(record.value))){ - store.delete(record.key); - } - } - } - } - - // returns an instant representing the time of the message - public abstract Instant getMessageTime(T message); - - // returns if two messages are duplicates of one another - public abstract boolean isDuplicate(T lastMessage, T newMessage); - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeBsmJsonProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeBsmJsonProcessor.java deleted file mode 100644 index 2197b23..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeBsmJsonProcessor.java +++ /dev/null @@ -1,80 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - - -import java.time.Duration; -import java.time.Instant; -import java.time.format.DateTimeFormatter; - -import org.geotools.referencing.GeodeticCalculator; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.ode.model.OdeBsmData; -import us.dot.its.jpo.ode.model.OdeBsmMetadata; -import us.dot.its.jpo.ode.plugin.j2735.J2735Bsm; -import us.dot.its.jpo.ode.plugin.j2735.J2735BsmCoreData; - -public class OdeBsmJsonProcessor extends DeduplicationProcessor{ - - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - DeduplicatorProperties props; - GeodeticCalculator calculator; - - public OdeBsmJsonProcessor(String storeName, DeduplicatorProperties props){ - this.storeName = storeName; - this.props = props; - calculator = new GeodeticCalculator(); - } - - - @Override - public Instant getMessageTime(OdeBsmData message) { - try { - String time = ((OdeBsmMetadata)message.getMetadata()).getOdeReceivedAt(); - return Instant.from(formatter.parse(time)); - } catch (Exception e) { - System.out.println("Failed to Parse Time"); - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(OdeBsmData lastMessage, OdeBsmData newMessage) { - Instant newValueTime = getMessageTime(newMessage); - Instant oldValueTime = getMessageTime(lastMessage); - - // If the messages are more than a certain time apart, forward the new message on - if(newValueTime.minus(Duration.ofMillis(props.getOdeBsmMaximumTimeDelta())).isAfter(oldValueTime)){ - return false; - } - - J2735BsmCoreData oldCore = ((J2735Bsm)lastMessage.getPayload().getData()).getCoreData(); - J2735BsmCoreData newCore = ((J2735Bsm)newMessage.getPayload().getData()).getCoreData(); - - - // If the Vehicle is moving, forward the message on - if(newCore.getSpeed().doubleValue() > props.getOdeBsmAlwaysIncludeAtSpeed()){ - return false; - } - - - double distance = calculateGeodeticDistance( - newCore.getPosition().getLatitude().doubleValue(), - newCore.getPosition().getLongitude().doubleValue(), - oldCore.getPosition().getLatitude().doubleValue(), - oldCore.getPosition().getLongitude().doubleValue() - ); - - // If the position delta between the messages is suitable large, forward the message on - if(distance > props.getOdeBsmMaximumPositionDelta()){ - return false; - } - - return true; - } - - public double calculateGeodeticDistance(double lat1, double lon1, double lat2, double lon2) { - calculator.setStartingGeographicPoint(lon1, lat1); - calculator.setDestinationGeographicPoint(lon2, lat2); - return calculator.getOrthodromicDistance(); - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeMapJsonProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeMapJsonProcessor.java deleted file mode 100644 index adaf6db..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeMapJsonProcessor.java +++ /dev/null @@ -1,70 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.Objects; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.ode.model.OdeMapData; -import us.dot.its.jpo.ode.model.OdeMapMetadata; -import us.dot.its.jpo.ode.model.OdeMapPayload; - -public class OdeMapJsonProcessor extends DeduplicationProcessor{ - - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - - DeduplicatorProperties props; - - public OdeMapJsonProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreOdeMapJsonName(); - } - - - @Override - public Instant getMessageTime(OdeMapData message) { - try { - String time = ((OdeMapMetadata)message.getMetadata()).getOdeReceivedAt(); - return Instant.from(formatter.parse(time)); - } catch (Exception e) { - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(OdeMapData lastMessage, OdeMapData newMessage) { - - Instant newValueTime = getMessageTime(newMessage); - Instant oldValueTime = getMessageTime(lastMessage); - - if(newValueTime.minus(Duration.ofHours(1)).isAfter(oldValueTime)){ - return false; - - }else{ - OdeMapPayload oldPayload = (OdeMapPayload)lastMessage.getPayload(); - OdeMapPayload newPayload = (OdeMapPayload)newMessage.getPayload(); - - Integer oldTimestamp = oldPayload.getMap().getTimeStamp(); - Integer newTimestamp = newPayload.getMap().getTimeStamp(); - - - newPayload.getMap().setTimeStamp(oldTimestamp); - - int oldHash = hashMapMessage(lastMessage); - int newhash = hashMapMessage(newMessage); - - if(oldHash != newhash){ - newPayload.getMap().setTimeStamp(newTimestamp); - return false; - } - } - return true; - } - - public int hashMapMessage(OdeMapData map){ - OdeMapPayload payload = (OdeMapPayload)map.getPayload(); - return Objects.hash(payload.toJson()); - - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeRawEncodedTimJsonProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeRawEncodedTimJsonProcessor.java deleted file mode 100644 index cca49a7..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeRawEncodedTimJsonProcessor.java +++ /dev/null @@ -1,43 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; -import java.time.format.DateTimeFormatter; - -import com.fasterxml.jackson.databind.JsonNode; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; - -public class OdeRawEncodedTimJsonProcessor extends DeduplicationProcessor{ - - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - - DeduplicatorProperties props; - - public OdeRawEncodedTimJsonProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreOdeRawEncodedTimJsonName(); - } - - - @Override - public Instant getMessageTime(JsonNode message) { - try { - String time = message.get("metadata").get("odeReceivedAt").asText(); - return Instant.from(formatter.parse(time)); - } catch (Exception e) { - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(JsonNode lastMessage, JsonNode newMessage) { - Instant oldValueTime = getMessageTime(lastMessage); - Instant newValueTime = getMessageTime(newMessage); - - if(newValueTime.minus(Duration.ofHours(1)).isAfter(oldValueTime)){ - return false; - } - return true; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeTimJsonProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeTimJsonProcessor.java deleted file mode 100644 index 9a117b3..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/OdeTimJsonProcessor.java +++ /dev/null @@ -1,43 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; -import java.time.format.DateTimeFormatter; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.ode.model.OdeTimData; -import us.dot.its.jpo.ode.model.OdeTimMetadata; - -public class OdeTimJsonProcessor extends DeduplicationProcessor{ - - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - - DeduplicatorProperties props; - public OdeTimJsonProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreOdeTimJsonName(); - } - - - @Override - public Instant getMessageTime(OdeTimData message) { - try { - // String time = message.get("metadata").get("odeReceivedAt").asText(); - String time = ((OdeTimMetadata)message.getMetadata()).getOdeReceivedAt(); - return Instant.from(formatter.parse(time)); - } catch (Exception e) { - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(OdeTimData lastMessage, OdeTimData newMessage) { - Instant oldValueTime = getMessageTime(lastMessage); - Instant newValueTime = getMessageTime(newMessage); - - if(newValueTime.minus(Duration.ofHours(1)).isAfter(oldValueTime)){ - return false; - } - return true; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapProcessor.java deleted file mode 100644 index 35e2c2f..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapProcessor.java +++ /dev/null @@ -1,57 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; -import java.time.ZonedDateTime; -import java.util.Objects; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.LineString; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -public class ProcessedMapProcessor extends DeduplicationProcessor>{ - - DeduplicatorProperties props; - - public ProcessedMapProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreProcessedMapName(); - } - - - @Override - public Instant getMessageTime(ProcessedMap message) { - try { - return message.getProperties().getOdeReceivedAt().toInstant(); - } catch (Exception e) { - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(ProcessedMap lastMessage, ProcessedMap newMessage) { - - Instant newValueTime = getMessageTime(newMessage); - Instant oldValueTime = getMessageTime(lastMessage); - - if(newValueTime.minus(Duration.ofHours(1)).isAfter(oldValueTime)){ - return false; - }else{ - ZonedDateTime newValueTimestamp = newMessage.getProperties().getTimeStamp(); - ZonedDateTime newValueOdeReceivedAt = newMessage.getProperties().getOdeReceivedAt(); - - newMessage.getProperties().setTimeStamp(lastMessage.getProperties().getTimeStamp()); - newMessage.getProperties().setOdeReceivedAt(lastMessage.getProperties().getOdeReceivedAt()); - - int oldHash = Objects.hash(lastMessage.toString()); - int newHash = Objects.hash(newMessage.toString()); - - if(oldHash != newHash){ - newMessage.getProperties().setTimeStamp(newValueTimestamp); - newMessage.getProperties().setOdeReceivedAt(newValueOdeReceivedAt); - return false; - } - } - return true; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapWktProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapWktProcessor.java deleted file mode 100644 index 7556060..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedMapWktProcessor.java +++ /dev/null @@ -1,55 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - -import java.time.Duration; -import java.time.Instant; -import java.time.ZonedDateTime; -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -public class ProcessedMapWktProcessor extends DeduplicationProcessor>{ - - DeduplicatorProperties props; - - public ProcessedMapWktProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreProcessedMapWKTName(); - } - - - @Override - public Instant getMessageTime(ProcessedMap message) { - try { - return message.getProperties().getOdeReceivedAt().toInstant(); - } catch (Exception e) { - return Instant.ofEpochMilli(0); - } - } - - @Override - public boolean isDuplicate(ProcessedMap lastMessage, ProcessedMap newMessage) { - - Instant newValueTime = newMessage.getProperties().getTimeStamp().toInstant(); - Instant oldValueTime = lastMessage.getProperties().getTimeStamp().toInstant(); - - if(newValueTime.minus(Duration.ofHours(1)).isAfter(oldValueTime)){ - return false; - }else{ - ZonedDateTime newValueTimestamp = newMessage.getProperties().getTimeStamp(); - ZonedDateTime newValueOdeReceivedAt = newMessage.getProperties().getOdeReceivedAt(); - - newMessage.getProperties().setTimeStamp(lastMessage.getProperties().getTimeStamp()); - newMessage.getProperties().setOdeReceivedAt(lastMessage.getProperties().getOdeReceivedAt()); - - int oldHash = lastMessage.getProperties().hashCode(); - int newhash = newMessage.getProperties().hashCode(); - - if(oldHash != newhash){ - newMessage.getProperties().setTimeStamp(newValueTimestamp); - newMessage.getProperties().setOdeReceivedAt(newValueOdeReceivedAt); - return false; - } - } - - return true; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedSpatProcessor.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedSpatProcessor.java deleted file mode 100644 index 2cc58af..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/ProcessedSpatProcessor.java +++ /dev/null @@ -1,64 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors; - - -import java.time.Duration; -import java.time.Instant; -import java.util.HashMap; -import java.util.List; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.geojsonconverter.pojos.spat.MovementEvent; -import us.dot.its.jpo.geojsonconverter.pojos.spat.MovementState; -import us.dot.its.jpo.geojsonconverter.pojos.spat.ProcessedSpat; - -public class ProcessedSpatProcessor extends DeduplicationProcessor{ - - DeduplicatorProperties props; - - public ProcessedSpatProcessor(DeduplicatorProperties props){ - this.props = props; - this.storeName = props.getKafkaStateStoreProcessedSpatName(); - } - - - @Override - public Instant getMessageTime(ProcessedSpat message) { - return message.getUtcTimeStamp().toInstant(); - } - - @Override - public boolean isDuplicate(ProcessedSpat lastMessage, ProcessedSpat newMessage) { - - Instant newValueTime = getMessageTime(newMessage); - Instant oldValueTime = getMessageTime(lastMessage); - - if(newValueTime.minus(Duration.ofMinutes(1)).isAfter(oldValueTime)){ - return false; - }else{ - HashMap> lastMessageStates = new HashMap<>(); - for(MovementState state: lastMessage.getStates()){ - lastMessageStates.put(state.getSignalGroup(), state.getStateTimeSpeed()); - } - - if(lastMessageStates.size() != newMessage.getStates().size()){ - return false; // message cannot be duplicate if the signal groups have a different number of signal groups - } - - for(MovementState state: newMessage.getStates()){ - List lastMessageState = lastMessageStates.get(state.getSignalGroup()); - - if(lastMessageState == null){ - return false; // messages cannot be duplicates if they have different signal groups - } - - - for(int i=0; i< state.getStateTimeSpeed().size(); i++){ - if(state.getStateTimeSpeed().get(i).getEventState() != lastMessageState.get(i).getEventState()){ - return false; // Some signal group light has changed. Therefore the SPaTs are different - } - } - } - } - return true; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeBsmJsonProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeBsmJsonProcessorSupplier.java deleted file mode 100644 index 6b08b9f..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeBsmJsonProcessorSupplier.java +++ /dev/null @@ -1,26 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import java.time.format.DateTimeFormatter; -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.OdeBsmJsonProcessor; -import us.dot.its.jpo.ode.model.OdeBsmData; - -public class OdeBsmJsonProcessorSupplier implements ProcessorSupplier { - - String storeName; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - DeduplicatorProperties props; - - public OdeBsmJsonProcessorSupplier(String storeName, DeduplicatorProperties props){ - this.storeName = storeName; - this.props = props; - } - - @Override - public Processor get() { - return new OdeBsmJsonProcessor(storeName, props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeMapJsonProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeMapJsonProcessorSupplier.java deleted file mode 100644 index 829af13..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeMapJsonProcessorSupplier.java +++ /dev/null @@ -1,22 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.OdeMapJsonProcessor; -import us.dot.its.jpo.ode.model.OdeMapData; - -public class OdeMapJsonProcessorSupplier implements ProcessorSupplier { - - DeduplicatorProperties props; - - public OdeMapJsonProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor get() { - return new OdeMapJsonProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeRawEncodedTimProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeRawEncodedTimProcessorSupplier.java deleted file mode 100644 index ef0ebb7..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeRawEncodedTimProcessorSupplier.java +++ /dev/null @@ -1,22 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; -import com.fasterxml.jackson.databind.JsonNode; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.OdeRawEncodedTimJsonProcessor; - -public class OdeRawEncodedTimProcessorSupplier implements ProcessorSupplier { - - DeduplicatorProperties props; - - public OdeRawEncodedTimProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor get() { - return new OdeRawEncodedTimJsonProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeTimJsonProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeTimJsonProcessorSupplier.java deleted file mode 100644 index 0c07e30..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/OdeTimJsonProcessorSupplier.java +++ /dev/null @@ -1,22 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.OdeTimJsonProcessor; -import us.dot.its.jpo.ode.model.OdeTimData; - -public class OdeTimJsonProcessorSupplier implements ProcessorSupplier { - - String storeName; - DeduplicatorProperties props; - public OdeTimJsonProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor get() { - return new OdeTimJsonProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapProcessorSupplier.java deleted file mode 100644 index 9e45cd0..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapProcessorSupplier.java +++ /dev/null @@ -1,23 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.ProcessedMapProcessor; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.LineString; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -public class ProcessedMapProcessorSupplier implements ProcessorSupplier, String, ProcessedMap> { - - DeduplicatorProperties props; - - public ProcessedMapProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor, String, ProcessedMap> get() { - return new ProcessedMapProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapWktProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapWktProcessorSupplier.java deleted file mode 100644 index 3dbaa8c..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedMapWktProcessorSupplier.java +++ /dev/null @@ -1,22 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.ProcessedMapWktProcessor; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; - -public class ProcessedMapWktProcessorSupplier implements ProcessorSupplier, String, ProcessedMap> { - - DeduplicatorProperties props; - - public ProcessedMapWktProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor, String, ProcessedMap> get() { - return new ProcessedMapWktProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedSpatProcessorSupplier.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedSpatProcessorSupplier.java deleted file mode 100644 index e6661ac..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/processors/suppliers/ProcessedSpatProcessorSupplier.java +++ /dev/null @@ -1,22 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers; - -import org.apache.kafka.streams.processor.api.Processor; -import org.apache.kafka.streams.processor.api.ProcessorSupplier; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.ProcessedSpatProcessor; -import us.dot.its.jpo.geojsonconverter.pojos.spat.ProcessedSpat; - -public class ProcessedSpatProcessorSupplier implements ProcessorSupplier { - - DeduplicatorProperties props; - - public ProcessedSpatProcessorSupplier(DeduplicatorProperties props){ - this.props = props; - } - - @Override - public Processor get() { - return new ProcessedSpatProcessor(props); - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/JsonSerdes.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/JsonSerdes.java deleted file mode 100644 index 29c9778..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/JsonSerdes.java +++ /dev/null @@ -1,24 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.serialization; - -import org.apache.kafka.common.serialization.Serde; -import org.apache.kafka.common.serialization.Serdes; - -import com.fasterxml.jackson.databind.JsonNode; - -import us.dot.its.jpo.geojsonconverter.serialization.deserializers.JsonDeserializer; -import us.dot.its.jpo.geojsonconverter.serialization.serializers.JsonSerializer; -import us.dot.its.jpo.ode.model.OdeTimData; - -public class JsonSerdes { - public static Serde OdeTim() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(OdeTimData.class)); - } - - public static Serde JSON(){ - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(JsonNode.class)); - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/PairSerdes.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/PairSerdes.java deleted file mode 100644 index e509fa0..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/serialization/PairSerdes.java +++ /dev/null @@ -1,52 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.serialization; - -import org.apache.kafka.common.serialization.Serde; -import org.apache.kafka.common.serialization.Serdes; - -import us.dot.its.jpo.deduplicator.deduplicator.models.ProcessedMapPair; -import us.dot.its.jpo.deduplicator.deduplicator.models.ProcessedMapWktPair; -import us.dot.its.jpo.deduplicator.deduplicator.models.OdeMapPair; -import us.dot.its.jpo.deduplicator.deduplicator.models.OdeBsmPair; -import us.dot.its.jpo.deduplicator.deduplicator.models.JsonPair; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.DeserializedRawMap; -import us.dot.its.jpo.geojsonconverter.serialization.deserializers.JsonDeserializer; -import us.dot.its.jpo.geojsonconverter.serialization.serializers.JsonSerializer; - - -public class PairSerdes { - public static Serde ProcessedMapPair() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(ProcessedMapPair.class)); - } - - public static Serde ProcessedMapWktPair() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(ProcessedMapWktPair.class)); - } - - public static Serde OdeMapPair() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(OdeMapPair.class)); - } - - public static Serde OdeBsmPair() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(OdeBsmPair.class)); - } - - public static Serde RawMap() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(DeserializedRawMap.class)); - } - - public static Serde JsonPair() { - return Serdes.serdeFrom( - new JsonSerializer(), - new JsonDeserializer<>(JsonPair.class)); - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/BsmDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/BsmDeduplicatorTopology.java deleted file mode 100644 index 6b26d67..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/BsmDeduplicatorTopology.java +++ /dev/null @@ -1,125 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.conflictmonitor.monitor.serialization.JsonSerdes; -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.ode.model.OdeBsmData; -import us.dot.its.jpo.ode.model.OdeBsmMetadata; -import us.dot.its.jpo.ode.model.OdeMapData; -import us.dot.its.jpo.ode.model.OdeMapPayload; -import us.dot.its.jpo.ode.plugin.j2735.J2735Bsm; -import us.dot.its.jpo.ode.plugin.j2735.J2735BsmCoreData; -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.geotools.referencing.GeodeticCalculator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.Objects; - -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.OdeBsmJsonProcessorSupplier; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; - -public class BsmDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(BsmDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - DeduplicatorProperties props; - ObjectMapper objectMapper; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - GeodeticCalculator calculator; - - - - public BsmDeduplicatorTopology(DeduplicatorProperties props){ - this.props = props; - this.objectMapper = DateJsonMapper.getInstance(); - calculator = new GeodeticCalculator(); - } - - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, props.createStreamProperties("BsmDeduplicator")); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Bsm Deduplicator Topology"); - streams.start(); - } - - public Instant getInstantFromBsm(OdeBsmData bsm){ - String time = ((OdeBsmMetadata)bsm.getMetadata()).getOdeReceivedAt(); - - return Instant.from(formatter.parse(time)); - } - - public int hashMapMessage(OdeMapData map){ - OdeMapPayload payload = (OdeMapPayload)map.getPayload(); - return Objects.hash(payload.toJson()); - - } - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream inputStream = builder.stream(this.props.getKafkaTopicOdeBsmJson(), Consumed.with(Serdes.Void(), JsonSerdes.OdeBsm())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreOdeBsmJsonName()), - Serdes.String(), JsonSerdes.OdeBsm())); - - KStream bsmRekeyedStream = inputStream.selectKey((key, value)->{ - J2735BsmCoreData core = ((J2735Bsm)value.getPayload().getData()).getCoreData(); - return core.getId(); - }).repartition(Repartitioned.with(Serdes.String(), JsonSerdes.OdeBsm())); - - KStream deduplicatedStream = bsmRekeyedStream.process(new OdeBsmJsonProcessorSupplier(props.getKafkaStateStoreOdeBsmJsonName(), props), props.getKafkaStateStoreOdeBsmJsonName()); - - - deduplicatedStream.to(this.props.getKafkaTopicDeduplicatedOdeBsmJson(), Produced.with(Serdes.String(), JsonSerdes.OdeBsm())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Bsm deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Bsm deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - - public double calculateGeodeticDistance(double lat1, double lon1, double lat2, double lon2) { - calculator.setStartingGeographicPoint(lon1, lat1); - calculator.setDestinationGeographicPoint(lon2, lat2); - return calculator.getOrthodromicDistance(); - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/MapDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/MapDeduplicatorTopology.java deleted file mode 100644 index c8ac7f6..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/MapDeduplicatorTopology.java +++ /dev/null @@ -1,121 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.OdeMapJsonProcessorSupplier; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; -import us.dot.its.jpo.geojsonconverter.partitioner.RsuIntersectionKey; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import us.dot.its.jpo.ode.model.OdeMapData; -import us.dot.its.jpo.ode.model.OdeMapMetadata; -import us.dot.its.jpo.ode.model.OdeMapPayload; -import us.dot.its.jpo.ode.plugin.j2735.J2735IntersectionReferenceID; - -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.Objects; -import java.util.Properties; - -public class MapDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(MapDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - String inputTopic; - String outputTopic; - Properties streamsProperties; - ObjectMapper objectMapper; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - DeduplicatorProperties props; - - - public MapDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties){ - this.props = props; - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - } - - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Map Deduplicator Topology"); - streams.start(); - } - - public Instant getInstantFromMap(OdeMapData map){ - String time = ((OdeMapMetadata)map.getMetadata()).getOdeReceivedAt(); - - return Instant.from(formatter.parse(time)); - } - - public int hashMapMessage(OdeMapData map){ - OdeMapPayload payload = (OdeMapPayload)map.getPayload(); - return Objects.hash(payload.toJson()); - - } - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream inputStream = builder.stream(props.getKafkaTopicOdeMapJson(), Consumed.with(Serdes.Void(), JsonSerdes.OdeMap())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreOdeMapJsonName()), - Serdes.String(), JsonSerdes.OdeMap())); - - KStream mapRekeyedStream = inputStream.selectKey((key, value)->{ - J2735IntersectionReferenceID intersectionId = ((OdeMapPayload)value.getPayload()).getMap().getIntersections().getIntersections().get(0).getId(); - RsuIntersectionKey newKey = new RsuIntersectionKey(); - newKey.setRsuId(((OdeMapMetadata)value.getMetadata()).getOriginIp()); - newKey.setIntersectionReferenceID(intersectionId); - return newKey.toString(); - }).repartition(Repartitioned.with(Serdes.String(), JsonSerdes.OdeMap())); - - KStream deduplicatedStream = mapRekeyedStream.process(new OdeMapJsonProcessorSupplier(props), props.getKafkaStateStoreOdeMapJsonName()); - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedOdeMapJson(), Produced.with(Serdes.String(), JsonSerdes.OdeMap())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Map Deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Map Deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/OdeRawEncodedTimDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/OdeRawEncodedTimDeduplicatorTopology.java deleted file mode 100644 index 975c85b..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/OdeRawEncodedTimDeduplicatorTopology.java +++ /dev/null @@ -1,130 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.serialization.JsonSerdes; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; - -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.util.Objects; -import java.util.Properties; - -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.OdeRawEncodedTimProcessorSupplier; - -public class OdeRawEncodedTimDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(OdeRawEncodedTimDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - String inputTopic; - String outputTopic; - Properties streamsProperties; - ObjectMapper objectMapper; - DeduplicatorProperties props; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - - public OdeRawEncodedTimDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties){ - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - this.props = props; - } - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Tim Deduplicator Topology"); - streams.start(); - } - - public JsonNode genJsonNode(){ - return objectMapper.createObjectNode(); - } - - public Instant getInstantFromJsonTim(JsonNode tim){ - try{ - String time = tim.get("metadata").get("odeReceivedAt").asText(); - return Instant.from(formatter.parse(time)); - }catch(Exception e){ - System.out.println("Failed to parse time"); - return Instant.ofEpochMilli(0); - } - } - - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream inputStream = builder.stream(props.getKafkaTopicOdeRawEncodedTimJson(), Consumed.with(Serdes.Void(), JsonSerdes.JSON())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreOdeRawEncodedTimJsonName()), - Serdes.String(), JsonSerdes.JSON())); - - KStream timRekeyedStream = inputStream.selectKey((key, value)->{ - try{ - String messageBytes = value.get("payload") - .get("data") - .get("bytes").asText(); - - int hash = Objects.hash(messageBytes); - - String rsuIP = value.get("metadata").get("originIp").asText(); - - String newKey = rsuIP + "_" + hash; - return newKey; - }catch(Exception e){ - return ""; - } - }).repartition(Repartitioned.with(Serdes.String(), JsonSerdes.JSON())); - - - - KStream deduplicatedStream = timRekeyedStream.process(new OdeRawEncodedTimProcessorSupplier(props), props.getKafkaStateStoreOdeRawEncodedTimJsonName()); - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedOdeRawEncodedTimJson(), Produced.with(Serdes.String(), JsonSerdes.JSON())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping OdeRawEncodedTim Deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped OdeRawEncodedTim Deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapDeduplicatorTopology.java deleted file mode 100644 index 5f9da3d..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapDeduplicatorTopology.java +++ /dev/null @@ -1,92 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.ProcessedMapProcessorSupplier; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.LineString; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - - -import java.util.Properties; - -public class ProcessedMapDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(MapDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - Properties streamsProperties; - ObjectMapper objectMapper; - DeduplicatorProperties props; - - public ProcessedMapDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties){ - this.props = props; - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - } - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Processed Map Deduplicator Topology"); - streams.start(); - } - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream> inputStream = builder.stream(props.getKafkaTopicProcessedMap(), Consumed.with(Serdes.String(), JsonSerdes.ProcessedMapGeoJson())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreProcessedMapName()), - Serdes.String(), JsonSerdes.ProcessedMapGeoJson())); - - KStream> deduplicatedStream = inputStream.process(new ProcessedMapProcessorSupplier(props), props.getKafkaStateStoreProcessedMapName()); - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedProcessedMap(), Produced.with(Serdes.String(), JsonSerdes.ProcessedMapGeoJson())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Processed Map deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Processed Map deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - - - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapWktDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapWktDeduplicatorTopology.java deleted file mode 100644 index 872e66f..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedMapWktDeduplicatorTopology.java +++ /dev/null @@ -1,93 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.ProcessedMapWktProcessorSupplier; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; - -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.util.Properties; - -public class ProcessedMapWktDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(MapDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - String inputTopic; - String outputTopic; - Properties streamsProperties; - ObjectMapper objectMapper; - DeduplicatorProperties props; - - public ProcessedMapWktDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties){ - this.props = props; - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - } - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Processed Map WKT Deduplicator Topology"); - streams.start(); - } - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream> inputStream = builder.stream(props.getKafkaTopicProcessedMapWKT(), Consumed.with(Serdes.String(), JsonSerdes.ProcessedMapWKT())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreProcessedMapWKTName()), - Serdes.String(), JsonSerdes.ProcessedMapWKT())); - - KStream> deduplicatedStream = inputStream.process(new ProcessedMapWktProcessorSupplier(props), props.getKafkaStateStoreProcessedMapWKTName()); - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedProcessedMapWKT(), Produced.with(Serdes.String(), JsonSerdes.ProcessedMapWKT())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Processed Map deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Processed Map deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - - - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedSpatDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedSpatDeduplicatorTopology.java deleted file mode 100644 index 6f55329..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/ProcessedSpatDeduplicatorTopology.java +++ /dev/null @@ -1,96 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.ProcessedSpatProcessorSupplier; -import us.dot.its.jpo.geojsonconverter.pojos.spat.ProcessedSpat; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; - -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.time.format.DateTimeFormatter; -import java.util.Properties; - -public class ProcessedSpatDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(ProcessedSpatDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - String inputTopic; - String outputTopic; - Properties streamsProperties; - ObjectMapper objectMapper; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - DeduplicatorProperties props; - - - public ProcessedSpatDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties){ - this.props = props; - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - } - - - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) streams.setStateListener(stateListener); - logger.info("Starting Map Deduplicator Topology"); - streams.start(); - } - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream inputStream = builder.stream(props.getKafkaTopicProcessedSpat(), Consumed.with(Serdes.String(), JsonSerdes.ProcessedSpat())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreProcessedSpatName()), - Serdes.String(), JsonSerdes.ProcessedSpat())); - - KStream deduplicatedStream = inputStream.process(new ProcessedSpatProcessorSupplier(props), props.getKafkaStateStoreProcessedSpatName()); - - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedProcessedSpat(), Produced.with(Serdes.String(), JsonSerdes.ProcessedSpat())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Processed SPaT deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Processed SPaT deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/TimDeduplicatorTopology.java b/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/TimDeduplicatorTopology.java deleted file mode 100644 index b0a7f50..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/java/us/dot/its/jpo/deduplicator/deduplicator/topologies/TimDeduplicatorTopology.java +++ /dev/null @@ -1,128 +0,0 @@ -package us.dot.its.jpo.deduplicator.deduplicator.topologies; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.StreamsBuilder; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.KafkaStreams.StateListener; -import org.apache.kafka.streams.errors.StreamsUncaughtExceptionHandler; - -import us.dot.its.jpo.geojsonconverter.DateJsonMapper; -import us.dot.its.jpo.ode.model.OdeTimData; -import us.dot.its.jpo.ode.model.OdeTimMetadata; -import us.dot.its.jpo.ode.model.OdeTimPayload; -import us.dot.its.jpo.ode.plugin.j2735.OdeTravelerInformationMessage; -import us.dot.its.jpo.ode.plugin.j2735.travelerinformation.TravelerInformation; - -import org.apache.kafka.streams.kstream.*; -import org.apache.kafka.streams.state.Stores; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.time.format.DateTimeFormatter; -import java.util.Properties; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.processors.suppliers.OdeTimJsonProcessorSupplier; -import us.dot.its.jpo.deduplicator.deduplicator.serialization.JsonSerdes; - - -public class TimDeduplicatorTopology { - - private static final Logger logger = LoggerFactory.getLogger(TimDeduplicatorTopology.class); - - Topology topology; - KafkaStreams streams; - Properties streamsProperties; - ObjectMapper objectMapper; - DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; - DeduplicatorProperties props; - - public TimDeduplicatorTopology(DeduplicatorProperties props, Properties streamsProperties) { - this.props = props; - this.streamsProperties = streamsProperties; - this.objectMapper = DateJsonMapper.getInstance(); - } - - public void start() { - if (streams != null && streams.state().isRunningOrRebalancing()) { - throw new IllegalStateException("Start called while streams is already running."); - } - Topology topology = buildTopology(); - streams = new KafkaStreams(topology, streamsProperties); - if (exceptionHandler != null) - streams.setUncaughtExceptionHandler(exceptionHandler); - if (stateListener != null) - streams.setStateListener(stateListener); - logger.info("Starting Tim Deduplicator Topology"); - streams.start(); - } - - public JsonNode genJsonNode() { - return objectMapper.createObjectNode(); - } - - - - public Topology buildTopology() { - StreamsBuilder builder = new StreamsBuilder(); - - KStream inputStream = builder.stream(props.getKafkaTopicOdeTimJson(), - Consumed.with(Serdes.String(), JsonSerdes.OdeTim())); - - builder.addStateStore(Stores.keyValueStoreBuilder(Stores.persistentKeyValueStore(props.getKafkaStateStoreOdeTimJsonName()), - Serdes.String(), JsonSerdes.OdeTim())); - - KStream timRekeyedStream = inputStream.selectKey((key, value) -> { - try { - - TravelerInformation travellerInformation = (TravelerInformation)value.getPayload().getData(); - - - String rsuIP = ((OdeTimMetadata)value.getMetadata()).getOriginIp(); - // String packetId = ((OdeTimPayload)value.getPayload()).getData();// .get("packetID").asText(); - String packetId = travellerInformation.getPacketID().toString(); - int msgCnt = travellerInformation.getMsgCnt().intValue(); - - String newKey = rsuIP + "_" + packetId + "_" + msgCnt; - return newKey; - } catch (Exception e) { - System.out.println(e); - return ""; - } - }).repartition(Repartitioned.with(Serdes.String(), JsonSerdes.OdeTim())); - - KStream deduplicatedStream = timRekeyedStream.process(new OdeTimJsonProcessorSupplier(props), props.getKafkaStateStoreOdeTimJsonName()); - - deduplicatedStream.to(props.getKafkaTopicDeduplicatedOdeTimJson(), Produced.with(Serdes.String(), JsonSerdes.OdeTim())); - - return builder.build(); - - } - - public void stop() { - logger.info("Stopping Tim deduplicator Socket Broadcast Topology."); - if (streams != null) { - streams.close(); - streams.cleanUp(); - streams = null; - } - logger.info("Stopped Tim deduplicator Socket Broadcast Topology."); - } - - StateListener stateListener; - - public void registerStateListener(StateListener stateListener) { - this.stateListener = stateListener; - } - - StreamsUncaughtExceptionHandler exceptionHandler; - - public void registerUncaughtExceptionHandler(StreamsUncaughtExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/resources/application.yaml b/jpo-deduplicator/jpo-deduplicator/src/main/resources/application.yaml deleted file mode 100644 index 1b3a6b0..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/resources/application.yaml +++ /dev/null @@ -1,96 +0,0 @@ -#General Properties -#================== -groupId: ^project.groupId^ -artifactId: ^project.artifactId^ -version: ^project.version^ -server.port: 8085 - -# Kafka properties -spring.kafka.bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:localhost:9092} -logging.level.org.apache.kafka: INFO -logging.level: INFO -log4j.logger.kafka: OFF -log4j.logger.org.apache.kafka: OFF - - - -# Processed Map Configuration -kafkaTopicProcessedMap: topic.ProcessedMap -kafkaTopicDeduplicatedProcessedMap: topic.DeduplicatedProcessedMap -enableProcessedMapDeduplication: true - -# Processed Map WKT Configuration -kafkaTopicProcessedMapWKT: topic.ProcessedMapWKT -kafkaTopicDeduplicatedProcessedMapWKT: topic.DeduplicatedProcessedMapWKT -enableProcessedMapWktDeduplication: true - -# Ode Map Json Configuration -kafkaTopicOdeMapJson: topic.OdeMapJson -kafkaTopicDeduplicatedOdeMapJson: topic.DeduplicatedOdeMapJson -enableOdeMapDeduplication: true - -# Ode Tim Json Configuration -kafkaTopicOdeTimJson: topic.OdeTimJson -kafkaTopicDeduplicatedOdeTimJson: topic.DeduplicatedOdeTimJson -enableOdeTimDeduplication: true - -# Ode Raw Encoded Tim Json Configuration -kafkaTopicOdeRawEncodedTimJson: topic.OdeRawEncodedTIMJson -kafkaTopicDeduplicatedOdeRawEncodedTimJson: topic.DeduplicatedOdeRawEncodedTIMJson -enableOdeRawEncodedTimDeduplication: true - -# Ode Bsm Json Configuration -kafkaTopicOdeBsmJson: topic.OdeBsmJson -kafkaTopicDeduplicatedOdeBsmJson: topic.DeduplicatedOdeBsmJson -enableOdeBsmDeduplication: true -odeBsmMaximumTimeDelta: 10000 # Milliseconds -odeBsmMaximumPositionDelta: 1 # Meter -odeBsmAlwaysIncludeAtSpeed: 1 # Meter / Second - -# Processed Map Configuration -kafkaTopicProcessedSpat: topic.ProcessedSpat -kafkaTopicDeduplicatedProcessedSpat: topic.DeduplicatedProcessedSpat -enableProcessedSpatDeduplication: true - - -# Amount of time to wait to try and increase batching -kafka.linger_ms: 50 - -# Custom kafka properties -kafka.topics: - autoCreateTopics: true # Override auto-create in test properties - numPartitions: 1 - numReplicas: 1 - createTopics: - - name: ${kafkaTopicProcessedMap} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicDeduplicatedProcessedMap} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicProcessedMapWKT} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicDeduplicatedProcessedMapWKT} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicOdeMapJson} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicDeduplicatedOdeMapJson} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicOdeTimJson} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicDeduplicatedOdeTimJson} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicProcessedSpat} - cleanupPolicy: delete - retentionMs: 300000 - - name: ${kafkaTopicDeduplicatedProcessedSpat} - cleanupPolicy: delete - retentionMs: 300000 - - \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/main/resources/logback.xml b/jpo-deduplicator/jpo-deduplicator/src/main/resources/logback.xml deleted file mode 100644 index 860df15..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/main/resources/logback.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - %date{"yyyy-MM-dd HH:mm:ss", UTC} [%thread] %-5level %logger{0} - %msg %n - - - - - - - - - - - - - diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/BsmDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/BsmDeduplicatorTopologyTest.java deleted file mode 100644 index 98d6204..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/BsmDeduplicatorTopologyTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package deduplicator; - - - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import us.dot.its.jpo.conflictmonitor.monitor.serialization.JsonSerdes; -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.BsmDeduplicatorTopology; -import us.dot.its.jpo.ode.model.OdeBsmData; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class BsmDeduplicatorTopologyTest { - - String inputTopic = "topic.OdeBsmJson"; - String outputTopic = "topic.DeduplicatedOdeBsmJson"; - ObjectMapper objectMapper; - - String inputBsm1 = "{\"metadata\":{\"bsmSource\":\"RV\",\"logFileName\":\"\",\"recordType\":\"bsmTx\",\"securityResultCode\":\"success\",\"receivedMessageDetails\":{\"locationData\":{\"latitude\":\"\",\"longitude\":\"\",\"elevation\":\"\",\"speed\":\"\",\"heading\":\"\"},\"rxSource\":\"RV\"},\"encodings\":null,\"payloadType\":\"us.dot.its.jpo.ode.model.OdeBsmPayload\",\"serialId\":{\"streamId\":\"f1bfed26-d986-4a0c-b8a4-68b1e5ac1348\",\"bundleSize\":1,\"bundleId\":0,\"recordId\":0,\"serialNumber\":0},\"odeReceivedAt\":\"2024-07-01T15:00:52.597Z\",\"schemaVersion\":6,\"maxDurationTime\":0,\"recordGeneratedAt\":\"\",\"recordGeneratedBy\":null,\"sanitized\":false,\"odePacketID\":\"\",\"odeTimStartDateTime\":\"\",\"originIp\":\"10.164.6.18\"},\"payload\":{\"data\":{\"coreData\":{\"msgCnt\":7,\"id\":\"E79423A3\",\"secMark\":52597,\"position\":{\"latitude\":40.2970849,\"longitude\":-111.6956069,\"elevation\":1439},\"accelSet\":{\"accelLat\":2001,\"accelLong\":0,\"accelVert\":-127,\"accelYaw\":0},\"accuracy\":{\"semiMajor\":2,\"semiMinor\":2,\"orientation\":44.49530799},\"transmission\":\"FORWARDGEARS\",\"speed\":0,\"heading\":24.2,\"angle\":0,\"brakes\":{\"wheelBrakes\":{\"leftFront\":true,\"rightFront\":true,\"unavailable\":false,\"leftRear\":true,\"rightRear\":true},\"traction\":\"on\",\"abs\":\"on\",\"scs\":\"on\",\"brakeBoost\":\"off\",\"auxBrakes\":\"unavailable\"},\"size\":{\"width\":230,\"length\":500}},\"partII\":[{\"id\":\"VehicleSafetyExtensions\",\"value\":{\"events\":null,\"pathHistory\":{\"initialPosition\":null,\"currGNSSstatus\":null,\"crumbData\":[{\"elevationOffset\":-0.5,\"heading\":null,\"latOffset\":0.0000038,\"lonOffset\":0.0001137,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":31.41},{\"elevationOffset\":-0.4,\"heading\":null,\"latOffset\":0.0000339,\"lonOffset\":0.0001695,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":32.05},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.000184,\"lonOffset\":0.0002106,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":36.29},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.0003092,\"lonOffset\":0.0003081,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":37.22},{\"elevationOffset\":0.4,\"heading\":null,\"latOffset\":0.0004354,\"lonOffset\":0.0003906,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":38.15},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0007727,\"lonOffset\":0.0004391,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":40.39},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.00084,\"lonOffset\":0.0004778,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":41.61},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0008649,\"lonOffset\":0.0005765,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":43.48},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0008086,\"lonOffset\":0.0015482,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":68.53},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0007738,\"lonOffset\":0.0015944,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":72.09},{\"elevationOffset\":2.1,\"heading\":null,\"latOffset\":0.0007349,\"lonOffset\":0.0015747,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":76.97}]},\"pathPrediction\":{\"confidence\":100,\"radiusOfCurve\":0},\"lights\":null}},{\"id\":\"SupplementalVehicleExtensions\",\"value\":{\"classification\":66,\"classDetails\":{\"fuelType\":null,\"hpmsType\":\"none\",\"iso3883\":null,\"keyType\":66,\"responderType\":null,\"responseEquip\":null,\"role\":null,\"vehicleType\":null},\"vehicleData\":{\"bumpers\":null,\"height\":1.8,\"mass\":2800,\"trailerWeight\":null},\"weatherReport\":{\"friction\":null,\"isRaining\":\"ERROR\",\"precipSituation\":\"UNKNOWN\",\"rainRate\":null,\"roadFriction\":0,\"solarRadiation\":null},\"weatherProbe\":{\"airPressure\":860,\"airTemp\":71,\"rainRates\":null},\"obstacle\":null,\"status\":null,\"speedProfile\":null,\"theRTCM\":null}}]},\"dataType\":\"us.dot.its.jpo.ode.plugin.j2735.J2735Bsm\"}}"; - - // Same as BSM 1 - No Message should be generated - String inputBsm2 = "{\"metadata\":{\"bsmSource\":\"RV\",\"logFileName\":\"\",\"recordType\":\"bsmTx\",\"securityResultCode\":\"success\",\"receivedMessageDetails\":{\"locationData\":{\"latitude\":\"\",\"longitude\":\"\",\"elevation\":\"\",\"speed\":\"\",\"heading\":\"\"},\"rxSource\":\"RV\"},\"encodings\":null,\"payloadType\":\"us.dot.its.jpo.ode.model.OdeBsmPayload\",\"serialId\":{\"streamId\":\"f1bfed26-d986-4a0c-b8a4-68b1e5ac1348\",\"bundleSize\":1,\"bundleId\":0,\"recordId\":0,\"serialNumber\":0},\"odeReceivedAt\":\"2024-07-01T15:00:52.697Z\",\"schemaVersion\":6,\"maxDurationTime\":0,\"recordGeneratedAt\":\"\",\"recordGeneratedBy\":null,\"sanitized\":false,\"odePacketID\":\"\",\"odeTimStartDateTime\":\"\",\"originIp\":\"10.164.6.18\"},\"payload\":{\"data\":{\"coreData\":{\"msgCnt\":7,\"id\":\"E79423A3\",\"secMark\":52597,\"position\":{\"latitude\":40.2970849,\"longitude\":-111.6956069,\"elevation\":1439},\"accelSet\":{\"accelLat\":2001,\"accelLong\":0,\"accelVert\":-127,\"accelYaw\":0},\"accuracy\":{\"semiMajor\":2,\"semiMinor\":2,\"orientation\":44.49530799},\"transmission\":\"FORWARDGEARS\",\"speed\":0,\"heading\":24.2,\"angle\":0,\"brakes\":{\"wheelBrakes\":{\"leftFront\":true,\"rightFront\":true,\"unavailable\":false,\"leftRear\":true,\"rightRear\":true},\"traction\":\"on\",\"abs\":\"on\",\"scs\":\"on\",\"brakeBoost\":\"off\",\"auxBrakes\":\"unavailable\"},\"size\":{\"width\":230,\"length\":500}},\"partII\":[{\"id\":\"VehicleSafetyExtensions\",\"value\":{\"events\":null,\"pathHistory\":{\"initialPosition\":null,\"currGNSSstatus\":null,\"crumbData\":[{\"elevationOffset\":-0.5,\"heading\":null,\"latOffset\":0.0000038,\"lonOffset\":0.0001137,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":31.41},{\"elevationOffset\":-0.4,\"heading\":null,\"latOffset\":0.0000339,\"lonOffset\":0.0001695,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":32.05},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.000184,\"lonOffset\":0.0002106,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":36.29},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.0003092,\"lonOffset\":0.0003081,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":37.22},{\"elevationOffset\":0.4,\"heading\":null,\"latOffset\":0.0004354,\"lonOffset\":0.0003906,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":38.15},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0007727,\"lonOffset\":0.0004391,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":40.39},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.00084,\"lonOffset\":0.0004778,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":41.61},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0008649,\"lonOffset\":0.0005765,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":43.48},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0008086,\"lonOffset\":0.0015482,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":68.53},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0007738,\"lonOffset\":0.0015944,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":72.09},{\"elevationOffset\":2.1,\"heading\":null,\"latOffset\":0.0007349,\"lonOffset\":0.0015747,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":76.97}]},\"pathPrediction\":{\"confidence\":100,\"radiusOfCurve\":0},\"lights\":null}},{\"id\":\"SupplementalVehicleExtensions\",\"value\":{\"classification\":66,\"classDetails\":{\"fuelType\":null,\"hpmsType\":\"none\",\"iso3883\":null,\"keyType\":66,\"responderType\":null,\"responseEquip\":null,\"role\":null,\"vehicleType\":null},\"vehicleData\":{\"bumpers\":null,\"height\":1.8,\"mass\":2800,\"trailerWeight\":null},\"weatherReport\":{\"friction\":null,\"isRaining\":\"ERROR\",\"precipSituation\":\"UNKNOWN\",\"rainRate\":null,\"roadFriction\":0,\"solarRadiation\":null},\"weatherProbe\":{\"airPressure\":860,\"airTemp\":71,\"rainRates\":null},\"obstacle\":null,\"status\":null,\"speedProfile\":null,\"theRTCM\":null}}]},\"dataType\":\"us.dot.its.jpo.ode.plugin.j2735.J2735Bsm\"}}"; - - // Increase Time from Bsm 1 - String inputBsm3 = "{\"metadata\":{\"bsmSource\":\"RV\",\"logFileName\":\"\",\"recordType\":\"bsmTx\",\"securityResultCode\":\"success\",\"receivedMessageDetails\":{\"locationData\":{\"latitude\":\"\",\"longitude\":\"\",\"elevation\":\"\",\"speed\":\"\",\"heading\":\"\"},\"rxSource\":\"RV\"},\"encodings\":null,\"payloadType\":\"us.dot.its.jpo.ode.model.OdeBsmPayload\",\"serialId\":{\"streamId\":\"f1bfed26-d986-4a0c-b8a4-68b1e5ac1348\",\"bundleSize\":1,\"bundleId\":0,\"recordId\":0,\"serialNumber\":0},\"odeReceivedAt\":\"2024-07-01T15:01:02.797Z\",\"schemaVersion\":6,\"maxDurationTime\":0,\"recordGeneratedAt\":\"\",\"recordGeneratedBy\":null,\"sanitized\":false,\"odePacketID\":\"\",\"odeTimStartDateTime\":\"\",\"originIp\":\"10.164.6.18\"},\"payload\":{\"data\":{\"coreData\":{\"msgCnt\":7,\"id\":\"E79423A3\",\"secMark\":52597,\"position\":{\"latitude\":40.2970849,\"longitude\":-111.6956069,\"elevation\":1439},\"accelSet\":{\"accelLat\":2001,\"accelLong\":0,\"accelVert\":-127,\"accelYaw\":0},\"accuracy\":{\"semiMajor\":2,\"semiMinor\":2,\"orientation\":44.49530799},\"transmission\":\"FORWARDGEARS\",\"speed\":0,\"heading\":24.2,\"angle\":0,\"brakes\":{\"wheelBrakes\":{\"leftFront\":true,\"rightFront\":true,\"unavailable\":false,\"leftRear\":true,\"rightRear\":true},\"traction\":\"on\",\"abs\":\"on\",\"scs\":\"on\",\"brakeBoost\":\"off\",\"auxBrakes\":\"unavailable\"},\"size\":{\"width\":230,\"length\":500}},\"partII\":[{\"id\":\"VehicleSafetyExtensions\",\"value\":{\"events\":null,\"pathHistory\":{\"initialPosition\":null,\"currGNSSstatus\":null,\"crumbData\":[{\"elevationOffset\":-0.5,\"heading\":null,\"latOffset\":0.0000038,\"lonOffset\":0.0001137,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":31.41},{\"elevationOffset\":-0.4,\"heading\":null,\"latOffset\":0.0000339,\"lonOffset\":0.0001695,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":32.05},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.000184,\"lonOffset\":0.0002106,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":36.29},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.0003092,\"lonOffset\":0.0003081,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":37.22},{\"elevationOffset\":0.4,\"heading\":null,\"latOffset\":0.0004354,\"lonOffset\":0.0003906,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":38.15},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0007727,\"lonOffset\":0.0004391,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":40.39},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.00084,\"lonOffset\":0.0004778,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":41.61},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0008649,\"lonOffset\":0.0005765,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":43.48},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0008086,\"lonOffset\":0.0015482,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":68.53},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0007738,\"lonOffset\":0.0015944,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":72.09},{\"elevationOffset\":2.1,\"heading\":null,\"latOffset\":0.0007349,\"lonOffset\":0.0015747,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":76.97}]},\"pathPrediction\":{\"confidence\":100,\"radiusOfCurve\":0},\"lights\":null}},{\"id\":\"SupplementalVehicleExtensions\",\"value\":{\"classification\":66,\"classDetails\":{\"fuelType\":null,\"hpmsType\":\"none\",\"iso3883\":null,\"keyType\":66,\"responderType\":null,\"responseEquip\":null,\"role\":null,\"vehicleType\":null},\"vehicleData\":{\"bumpers\":null,\"height\":1.8,\"mass\":2800,\"trailerWeight\":null},\"weatherReport\":{\"friction\":null,\"isRaining\":\"ERROR\",\"precipSituation\":\"UNKNOWN\",\"rainRate\":null,\"roadFriction\":0,\"solarRadiation\":null},\"weatherProbe\":{\"airPressure\":860,\"airTemp\":71,\"rainRates\":null},\"obstacle\":null,\"status\":null,\"speedProfile\":null,\"theRTCM\":null}}]},\"dataType\":\"us.dot.its.jpo.ode.plugin.j2735.J2735Bsm\"}}"; - - // Vehicle Speed not 0 - String inputBsm4 = "{\"metadata\":{\"bsmSource\":\"RV\",\"logFileName\":\"\",\"recordType\":\"bsmTx\",\"securityResultCode\":\"success\",\"receivedMessageDetails\":{\"locationData\":{\"latitude\":\"\",\"longitude\":\"\",\"elevation\":\"\",\"speed\":\"\",\"heading\":\"\"},\"rxSource\":\"RV\"},\"encodings\":null,\"payloadType\":\"us.dot.its.jpo.ode.model.OdeBsmPayload\",\"serialId\":{\"streamId\":\"f1bfed26-d986-4a0c-b8a4-68b1e5ac1348\",\"bundleSize\":1,\"bundleId\":0,\"recordId\":0,\"serialNumber\":0},\"odeReceivedAt\":\"2024-07-01T15:01:02.897Z\",\"schemaVersion\":6,\"maxDurationTime\":0,\"recordGeneratedAt\":\"\",\"recordGeneratedBy\":null,\"sanitized\":false,\"odePacketID\":\"\",\"odeTimStartDateTime\":\"\",\"originIp\":\"10.164.6.18\"},\"payload\":{\"data\":{\"coreData\":{\"msgCnt\":7,\"id\":\"E79423A3\",\"secMark\":52597,\"position\":{\"latitude\":40.2970849,\"longitude\":-111.6956069,\"elevation\":1439},\"accelSet\":{\"accelLat\":2001,\"accelLong\":0,\"accelVert\":-127,\"accelYaw\":0},\"accuracy\":{\"semiMajor\":2,\"semiMinor\":2,\"orientation\":44.49530799},\"transmission\":\"FORWARDGEARS\",\"speed\":10,\"heading\":24.2,\"angle\":0,\"brakes\":{\"wheelBrakes\":{\"leftFront\":true,\"rightFront\":true,\"unavailable\":false,\"leftRear\":true,\"rightRear\":true},\"traction\":\"on\",\"abs\":\"on\",\"scs\":\"on\",\"brakeBoost\":\"off\",\"auxBrakes\":\"unavailable\"},\"size\":{\"width\":230,\"length\":500}},\"partII\":[{\"id\":\"VehicleSafetyExtensions\",\"value\":{\"events\":null,\"pathHistory\":{\"initialPosition\":null,\"currGNSSstatus\":null,\"crumbData\":[{\"elevationOffset\":-0.5,\"heading\":null,\"latOffset\":0.0000038,\"lonOffset\":0.0001137,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":31.41},{\"elevationOffset\":-0.4,\"heading\":null,\"latOffset\":0.0000339,\"lonOffset\":0.0001695,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":32.05},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.000184,\"lonOffset\":0.0002106,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":36.29},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.0003092,\"lonOffset\":0.0003081,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":37.22},{\"elevationOffset\":0.4,\"heading\":null,\"latOffset\":0.0004354,\"lonOffset\":0.0003906,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":38.15},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0007727,\"lonOffset\":0.0004391,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":40.39},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.00084,\"lonOffset\":0.0004778,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":41.61},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0008649,\"lonOffset\":0.0005765,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":43.48},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0008086,\"lonOffset\":0.0015482,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":68.53},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0007738,\"lonOffset\":0.0015944,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":72.09},{\"elevationOffset\":2.1,\"heading\":null,\"latOffset\":0.0007349,\"lonOffset\":0.0015747,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":76.97}]},\"pathPrediction\":{\"confidence\":100,\"radiusOfCurve\":0},\"lights\":null}},{\"id\":\"SupplementalVehicleExtensions\",\"value\":{\"classification\":66,\"classDetails\":{\"fuelType\":null,\"hpmsType\":\"none\",\"iso3883\":null,\"keyType\":66,\"responderType\":null,\"responseEquip\":null,\"role\":null,\"vehicleType\":null},\"vehicleData\":{\"bumpers\":null,\"height\":1.8,\"mass\":2800,\"trailerWeight\":null},\"weatherReport\":{\"friction\":null,\"isRaining\":\"ERROR\",\"precipSituation\":\"UNKNOWN\",\"rainRate\":null,\"roadFriction\":0,\"solarRadiation\":null},\"weatherProbe\":{\"airPressure\":860,\"airTemp\":71,\"rainRates\":null},\"obstacle\":null,\"status\":null,\"speedProfile\":null,\"theRTCM\":null}}]},\"dataType\":\"us.dot.its.jpo.ode.plugin.j2735.J2735Bsm\"}}"; - - // Vehicle Position has changed - String inputBsm5 = "{\"metadata\":{\"bsmSource\":\"RV\",\"logFileName\":\"\",\"recordType\":\"bsmTx\",\"securityResultCode\":\"success\",\"receivedMessageDetails\":{\"locationData\":{\"latitude\":\"\",\"longitude\":\"\",\"elevation\":\"\",\"speed\":\"\",\"heading\":\"\"},\"rxSource\":\"RV\"},\"encodings\":null,\"payloadType\":\"us.dot.its.jpo.ode.model.OdeBsmPayload\",\"serialId\":{\"streamId\":\"f1bfed26-d986-4a0c-b8a4-68b1e5ac1348\",\"bundleSize\":1,\"bundleId\":0,\"recordId\":0,\"serialNumber\":0},\"odeReceivedAt\":\"2024-07-01T15:01:02.997Z\",\"schemaVersion\":6,\"maxDurationTime\":0,\"recordGeneratedAt\":\"\",\"recordGeneratedBy\":null,\"sanitized\":false,\"odePacketID\":\"\",\"odeTimStartDateTime\":\"\",\"originIp\":\"10.164.6.18\"},\"payload\":{\"data\":{\"coreData\":{\"msgCnt\":7,\"id\":\"E79423A3\",\"secMark\":52597,\"position\":{\"latitude\":40.2970949,\"longitude\":-111.6956169,\"elevation\":1439},\"accelSet\":{\"accelLat\":2001,\"accelLong\":0,\"accelVert\":-127,\"accelYaw\":0},\"accuracy\":{\"semiMajor\":2,\"semiMinor\":2,\"orientation\":44.49530799},\"transmission\":\"FORWARDGEARS\",\"speed\":0,\"heading\":24.2,\"angle\":0,\"brakes\":{\"wheelBrakes\":{\"leftFront\":true,\"rightFront\":true,\"unavailable\":false,\"leftRear\":true,\"rightRear\":true},\"traction\":\"on\",\"abs\":\"on\",\"scs\":\"on\",\"brakeBoost\":\"off\",\"auxBrakes\":\"unavailable\"},\"size\":{\"width\":230,\"length\":500}},\"partII\":[{\"id\":\"VehicleSafetyExtensions\",\"value\":{\"events\":null,\"pathHistory\":{\"initialPosition\":null,\"currGNSSstatus\":null,\"crumbData\":[{\"elevationOffset\":-0.5,\"heading\":null,\"latOffset\":0.0000038,\"lonOffset\":0.0001137,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":31.41},{\"elevationOffset\":-0.4,\"heading\":null,\"latOffset\":0.0000339,\"lonOffset\":0.0001695,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":32.05},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.000184,\"lonOffset\":0.0002106,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":36.29},{\"elevationOffset\":0,\"heading\":null,\"latOffset\":0.0003092,\"lonOffset\":0.0003081,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":37.22},{\"elevationOffset\":0.4,\"heading\":null,\"latOffset\":0.0004354,\"lonOffset\":0.0003906,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":38.15},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0007727,\"lonOffset\":0.0004391,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":40.39},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.00084,\"lonOffset\":0.0004778,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":41.61},{\"elevationOffset\":1.4,\"heading\":null,\"latOffset\":0.0008649,\"lonOffset\":0.0005765,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":43.48},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0008086,\"lonOffset\":0.0015482,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":68.53},{\"elevationOffset\":1.7,\"heading\":null,\"latOffset\":0.0007738,\"lonOffset\":0.0015944,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":72.09},{\"elevationOffset\":2.1,\"heading\":null,\"latOffset\":0.0007349,\"lonOffset\":0.0015747,\"posAccuracy\":null,\"speed\":null,\"timeOffset\":76.97}]},\"pathPrediction\":{\"confidence\":100,\"radiusOfCurve\":0},\"lights\":null}},{\"id\":\"SupplementalVehicleExtensions\",\"value\":{\"classification\":66,\"classDetails\":{\"fuelType\":null,\"hpmsType\":\"none\",\"iso3883\":null,\"keyType\":66,\"responderType\":null,\"responseEquip\":null,\"role\":null,\"vehicleType\":null},\"vehicleData\":{\"bumpers\":null,\"height\":1.8,\"mass\":2800,\"trailerWeight\":null},\"weatherReport\":{\"friction\":null,\"isRaining\":\"ERROR\",\"precipSituation\":\"UNKNOWN\",\"rainRate\":null,\"roadFriction\":0,\"solarRadiation\":null},\"weatherProbe\":{\"airPressure\":860,\"airTemp\":71,\"rainRates\":null},\"obstacle\":null,\"status\":null,\"speedProfile\":null,\"theRTCM\":null}}]},\"dataType\":\"us.dot.its.jpo.ode.plugin.j2735.J2735Bsm\"}}"; - - - @Autowired - DeduplicatorProperties props; - - - - @Test - public void testTopology() { - - - - - - props = new DeduplicatorProperties(); - props.setAlwaysIncludeAtSpeed(1); - props.setenableOdeBsmDeduplication(true); - props.setMaximumPositionDelta(1); - props.setMaximumTimeDelta(10000); - props.setkafkaTopicOdeBsmJson(inputTopic); - props.setkafkaTopicDeduplicatedOdeBsmJson(outputTopic); - - BsmDeduplicatorTopology bsmDeduplicatorTopology = new BsmDeduplicatorTopology(props); - Topology topology = bsmDeduplicatorTopology.buildTopology(); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputOdeBsmData = driver.createInputTopic( - inputTopic, - Serdes.Void().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic outputOdeBsmData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - JsonSerdes.OdeBsm().deserializer()); - - inputOdeBsmData.pipeInput(null, inputBsm1); - inputOdeBsmData.pipeInput(null, inputBsm2); - inputOdeBsmData.pipeInput(null, inputBsm3); - inputOdeBsmData.pipeInput(null, inputBsm4); - inputOdeBsmData.pipeInput(null, inputBsm5); - - List> bsmDeduplicationResults = outputOdeBsmData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(4, bsmDeduplicationResults.size()); - - objectMapper = new ObjectMapper(); - OdeBsmData bsm1 = objectMapper.readValue(inputBsm1, OdeBsmData.class); - OdeBsmData bsm3 = objectMapper.readValue(inputBsm3, OdeBsmData.class); - OdeBsmData bsm4 = objectMapper.readValue(inputBsm4, OdeBsmData.class); - OdeBsmData bsm5 = objectMapper.readValue(inputBsm5, OdeBsmData.class); - - - assertEquals(bsm1.getMetadata().getOdeReceivedAt(), bsmDeduplicationResults.get(0).value.getMetadata().getOdeReceivedAt()); - assertEquals(bsm3.getMetadata().getOdeReceivedAt(), bsmDeduplicationResults.get(1).value.getMetadata().getOdeReceivedAt()); - assertEquals(bsm4.getMetadata().getOdeReceivedAt(), bsmDeduplicationResults.get(2).value.getMetadata().getOdeReceivedAt()); - assertEquals(bsm5.getMetadata().getOdeReceivedAt(), bsmDeduplicationResults.get(3).value.getMetadata().getOdeReceivedAt()); - - } catch (JsonMappingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (JsonProcessingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/MapDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/MapDeduplicatorTopologyTest.java deleted file mode 100644 index d3f88fc..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/MapDeduplicatorTopologyTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package deduplicator; - - - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.MapDeduplicatorTopology; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import us.dot.its.jpo.ode.model.OdeMapData; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class MapDeduplicatorTopologyTest { - - String inputTopic = "topic.OdeMapJson"; - String outputTopic = "topic.DeduplicatedOdeMapJson"; - ObjectMapper objectMapper; - - // Reference MAP - String inputMap1 = "{\"metadata\": {\"logFileName\": \"\",\"recordType\": \"mapTx\",\"securityResultCode\": \"success\",\"receivedMessageDetails\": {\"rxSource\": \"NA\"},\"payloadType\": \"us.dot.its.jpo.ode.model.OdeMapPayload\",\"serialId\": {\"streamId\": \"c495510d-c87b-4eb8-a413-a5f91e8ac026\",\"bundleSize\": 1,\"bundleId\": 0,\"recordId\": 0,\"serialNumber\": 0},\"odeReceivedAt\": \"2024-12-23T18:59:44.341Z\",\"schemaVersion\": 7,\"maxDurationTime\": 0,\"recordGeneratedAt\": \"\",\"recordGeneratedBy\": \"RSU\",\"sanitized\": false,\"odePacketID\": \"\",\"odeTimStartDateTime\": \"\",\"asn1\": \"001283C138003000205E9C014D3EAB092CA624B5518202DC3658042800000400023622C60CA009F66D48ABFAF81388D8AD18070027D9B2FFCFE9804F13667B1FFD009EC2C76E3FFC82C4E0001004B00C5000000800066C4574101813ECD8B757FAE027D9B30E6FF5604EC363561FE7809EC6CD69BFEC813C4D8A617FC9027D9B2147008604FB163666000016250000802580228000001000096229E1309B51A6FE4204DD361CF1FE5009F6018E1000096020A00000080004D88A57F84027D9B3827002804EC36087600A009F62C289407282C310001C0440188800000006C46DBE02813EC5816D800710052200000001B11B6FAD404FB16054A0000401C8800000006C47B3D24813EC5816D801B100C4200000000AF890F12C580007E87100D4200000008AF4C0F12C580077E7A2C0004000160002001CB028D000000800052C160BC40B5FFFD8A9409D86BFEBB5B40141457FEF53B76C008B467014145800080002BFFCBFFC82C6A0001804B024D000000800036C2213C3B013ECD80096D64027D9AFFD8CDFC04F635FF7983BC09F66C0082AA2014280B1B80006012C0B3400000100004B02BCF0F6D7FE065D602788B0138EB900B1240001012C083400000080009B0C2AF0B804FB15FE6DE171AFFF6C63E04EC15FE1DE670060E40002581EA8000004000135DA6DF0180A0A6ADC2C00D0143CD51897FDA028C8ABB25001A0B0680008012C105400000200009AEDBEFAE005053540EE003C0A326A9CF3FED8143C5667780010582C0004009608AA00000080004D76DE7EE402829ABA88FFDC050F354525FFF80A322BCF23FA602C690000C04B0395000000200016BB4FBD4E01414D3215800802940AB108FFF2030D2000110126200000001AEE5103BE050A15F6F1FFC8404D8800000006BB97C18E0142857DFA800010146200000001AEE89099A050A15F8720000B05DD000000800046BE3743B781428D80E1B00002879B00514B4404F63600827D8C09E22C000400015FFE6007016190000402582CE8000004000135ECEE1DE80A146C02E54758143CD8059AD3E027B1B00613DD004F102C360000804B055D000000200046BCC7C3C781428D80108C6E02829B002B2ECE050A16019A4B29B00AB5C3604F136004E410409EC018A10000960C3A00000080004D7DE9878602851B003923CC05053601623B440A0A6BFB8C3A5014140B0640005012C197400000100005AFE570EF2050A36003A47C80A0A6BFD2C45F014140B054000501101A8200000001B05A90EDC050535FFE605800A0A101B8200000001B08A30EC0050535FFE605300A0A101C8200000005B0C6F0EA4050515FFCA0568B0001000E00\",\"mapSource\": \"RSU\",\"originIp\": \"172.24.0.1\"},\"payload\": {\"data\": {\"msgIssueRevision\": 0,\"layerType\": \"intersectionData\",\"layerID\": 0,\"intersections\": {\"intersectionGeometry\": [{\"id\": {\"id\": 12110},\"revision\": 0,\"refPoint\": {\"latitude\": 39.5952649,\"longitude\": -105.0914122,\"elevation\": 1677.0},\"laneWidth\": 366,\"laneSet\": {\"GenericLane\": [{\"laneID\": 2,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2225,\"y\": 808}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 10517,\"y\": -161}},\"attributes\": {\"dElevation\": -60}},{\"delta\": {\"nodeXY6\": {\"x\": 2769,\"y\": 112}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6142,\"y\": -180}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 6636,\"y\": -12}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 3804,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 19,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 3,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2222,\"y\": 515}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 2933,\"y\": -82}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6259,\"y\": -85}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 3416,\"y\": -98}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 6867,\"y\": -39}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 2657,\"y\": -55}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 4259,\"y\": 67}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 3481,\"y\": 0}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 1,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2215,\"y\": 1218}}},{\"delta\": {\"nodeXY6\": {\"x\": 10451,\"y\": -223}},\"attributes\": {\"dElevation\": -70}},{\"delta\": {\"nodeXY6\": {\"x\": 1852,\"y\": -108}},\"attributes\": {\"dElevation\": -10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 28,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 4,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2213,\"y\": -124}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 7187,\"y\": 20}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 541,\"y\": 40}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 1298,\"y\": 229}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 7,\"connectionID\": 1}]}},{\"laneID\": 6,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -1019}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 7}}}]}},{\"laneID\": 5,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -662}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 338,\"y\": 0}}}]}},{\"laneID\": 7,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2294,\"y\": -1463}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 27}}}]}},{\"laneID\": 12,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -952,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": -377}}}]}},{\"laneID\": 13,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1440,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 7,\"y\": -390}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}},{\"laneID\": 10,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 705,\"y\": -1919}}},{\"delta\": {\"nodeXY6\": {\"x\": -1,\"y\": -7515}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -41,\"y\": -5272}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -17,\"y\": -11337}}},{\"delta\": {\"nodeXY6\": {\"x\": 17,\"y\": -5938}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 9,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1090,\"y\": -1930}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 9,\"y\": -4764}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -20,\"y\": -6402}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": -34,\"y\": -7953}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": -10940}},\"attributes\": {\"dElevation\": 20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 27,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 11,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 350,\"y\": -1925}}},{\"delta\": {\"nodeXY6\": {\"x\": -32,\"y\": -6698}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 156,\"y\": -2616}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 1,\"connectionID\": 1}]}},{\"laneID\": 8,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1557,\"y\": -1956}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -101,\"y\": -1956}}},{\"delta\": {\"nodeXY6\": {\"x\": -5,\"y\": -7393}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -121,\"y\": -1636}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 7,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 15,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2405,\"y\": -1018}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -9339,\"y\": 26}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11895,\"y\": -38}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -8814,\"y\": 13}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 16,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2337,\"y\": -656}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -12229,\"y\": 15}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -11362,\"y\": -37}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -6537,\"y\": 1}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 17,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2338,\"y\": -284}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -8892,\"y\": -18}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11959,\"y\": -2}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -1564,\"y\": -180}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 3,\"connectionID\": 1}]}},{\"laneID\": 14,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2401,\"y\": -1380}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -19947,\"y\": 8}},\"attributes\": {\"dElevation\": 80}},{\"delta\": {\"nodeXY6\": {\"x\": -10108,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 18,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2264,\"y\": 479}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -580,\"y\": -14}}}]}},{\"laneID\": 19,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2257,\"y\": 796}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -518,\"y\": 0}}}]}},{\"laneID\": 20,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2236,\"y\": 1229}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -484,\"y\": 0}}}]}},{\"laneID\": 23,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -914,\"y\": 1903}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 225,\"y\": 12288}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 40,\"y\": 9634}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 32,\"y\": 8035}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 28}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 22,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1221,\"y\": 1914}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 92,\"y\": 10475}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 89,\"y\": 11582}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 48,\"y\": 7912}},\"attributes\": {\"dElevation\": -30}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 21,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1649,\"y\": 1935}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": 3182}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 21,\"y\": 5991}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 102,\"y\": 4810}}},{\"delta\": {\"nodeXY6\": {\"x\": 85,\"y\": 11803}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 19,\"y\": 4161}},\"attributes\": {\"dElevation\": -20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 20,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 24,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -535,\"y\": 1926}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 28,\"y\": 4582}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 88,\"y\": 3793}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -143,\"y\": 1866}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 25,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -213,\"y\": 1913}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 14,\"y\": 4594}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -91,\"y\": 2238}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 26,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 724,\"y\": 1902}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 352}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 27,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1105,\"y\": 1888}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 332}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 28,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1591,\"y\": 1874}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -14,\"y\": 346}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}}]}}]}},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.J2735MAP\"}}"; - - // Duplicate of Number 1 - String inputMap2 = "{\"metadata\": {\"logFileName\": \"\",\"recordType\": \"mapTx\",\"securityResultCode\": \"success\",\"receivedMessageDetails\": {\"rxSource\": \"NA\"},\"payloadType\": \"us.dot.its.jpo.ode.model.OdeMapPayload\",\"serialId\": {\"streamId\": \"c495510d-c87b-4eb8-a413-a5f91e8ac026\",\"bundleSize\": 1,\"bundleId\": 0,\"recordId\": 0,\"serialNumber\": 0},\"odeReceivedAt\": \"2024-12-23T18:59:44.341Z\",\"schemaVersion\": 7,\"maxDurationTime\": 0,\"recordGeneratedAt\": \"\",\"recordGeneratedBy\": \"RSU\",\"sanitized\": false,\"odePacketID\": \"\",\"odeTimStartDateTime\": \"\",\"asn1\": \"001283C138003000205E9C014D3EAB092CA624B5518202DC3658042800000400023622C60CA009F66D48ABFAF81388D8AD18070027D9B2FFCFE9804F13667B1FFD009EC2C76E3FFC82C4E0001004B00C5000000800066C4574101813ECD8B757FAE027D9B30E6FF5604EC363561FE7809EC6CD69BFEC813C4D8A617FC9027D9B2147008604FB163666000016250000802580228000001000096229E1309B51A6FE4204DD361CF1FE5009F6018E1000096020A00000080004D88A57F84027D9B3827002804EC36087600A009F62C289407282C310001C0440188800000006C46DBE02813EC5816D800710052200000001B11B6FAD404FB16054A0000401C8800000006C47B3D24813EC5816D801B100C4200000000AF890F12C580007E87100D4200000008AF4C0F12C580077E7A2C0004000160002001CB028D000000800052C160BC40B5FFFD8A9409D86BFEBB5B40141457FEF53B76C008B467014145800080002BFFCBFFC82C6A0001804B024D000000800036C2213C3B013ECD80096D64027D9AFFD8CDFC04F635FF7983BC09F66C0082AA2014280B1B80006012C0B3400000100004B02BCF0F6D7FE065D602788B0138EB900B1240001012C083400000080009B0C2AF0B804FB15FE6DE171AFFF6C63E04EC15FE1DE670060E40002581EA8000004000135DA6DF0180A0A6ADC2C00D0143CD51897FDA028C8ABB25001A0B0680008012C105400000200009AEDBEFAE005053540EE003C0A326A9CF3FED8143C5667780010582C0004009608AA00000080004D76DE7EE402829ABA88FFDC050F354525FFF80A322BCF23FA602C690000C04B0395000000200016BB4FBD4E01414D3215800802940AB108FFF2030D2000110126200000001AEE5103BE050A15F6F1FFC8404D8800000006BB97C18E0142857DFA800010146200000001AEE89099A050A15F8720000B05DD000000800046BE3743B781428D80E1B00002879B00514B4404F63600827D8C09E22C000400015FFE6007016190000402582CE8000004000135ECEE1DE80A146C02E54758143CD8059AD3E027B1B00613DD004F102C360000804B055D000000200046BCC7C3C781428D80108C6E02829B002B2ECE050A16019A4B29B00AB5C3604F136004E410409EC018A10000960C3A00000080004D7DE9878602851B003923CC05053601623B440A0A6BFB8C3A5014140B0640005012C197400000100005AFE570EF2050A36003A47C80A0A6BFD2C45F014140B054000501101A8200000001B05A90EDC050535FFE605800A0A101B8200000001B08A30EC0050535FFE605300A0A101C8200000005B0C6F0EA4050515FFCA0568B0001000E00\",\"mapSource\": \"RSU\",\"originIp\": \"172.24.0.1\"},\"payload\": {\"data\": {\"msgIssueRevision\": 0,\"layerType\": \"intersectionData\",\"layerID\": 0,\"intersections\": {\"intersectionGeometry\": [{\"id\": {\"id\": 12110},\"revision\": 0,\"refPoint\": {\"latitude\": 39.5952649,\"longitude\": -105.0914122,\"elevation\": 1677.0},\"laneWidth\": 366,\"laneSet\": {\"GenericLane\": [{\"laneID\": 2,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2225,\"y\": 808}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 10517,\"y\": -161}},\"attributes\": {\"dElevation\": -60}},{\"delta\": {\"nodeXY6\": {\"x\": 2769,\"y\": 112}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6142,\"y\": -180}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 6636,\"y\": -12}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 3804,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 19,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 3,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2222,\"y\": 515}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 2933,\"y\": -82}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6259,\"y\": -85}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 3416,\"y\": -98}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 6867,\"y\": -39}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 2657,\"y\": -55}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 4259,\"y\": 67}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 3481,\"y\": 0}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 1,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2215,\"y\": 1218}}},{\"delta\": {\"nodeXY6\": {\"x\": 10451,\"y\": -223}},\"attributes\": {\"dElevation\": -70}},{\"delta\": {\"nodeXY6\": {\"x\": 1852,\"y\": -108}},\"attributes\": {\"dElevation\": -10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 28,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 4,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2213,\"y\": -124}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 7187,\"y\": 20}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 541,\"y\": 40}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 1298,\"y\": 229}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 7,\"connectionID\": 1}]}},{\"laneID\": 6,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -1019}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 7}}}]}},{\"laneID\": 5,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -662}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 338,\"y\": 0}}}]}},{\"laneID\": 7,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2294,\"y\": -1463}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 27}}}]}},{\"laneID\": 12,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -952,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": -377}}}]}},{\"laneID\": 13,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1440,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 7,\"y\": -390}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}},{\"laneID\": 10,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 705,\"y\": -1919}}},{\"delta\": {\"nodeXY6\": {\"x\": -1,\"y\": -7515}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -41,\"y\": -5272}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -17,\"y\": -11337}}},{\"delta\": {\"nodeXY6\": {\"x\": 17,\"y\": -5938}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 9,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1090,\"y\": -1930}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 9,\"y\": -4764}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -20,\"y\": -6402}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": -34,\"y\": -7953}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": -10940}},\"attributes\": {\"dElevation\": 20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 27,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 11,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 350,\"y\": -1925}}},{\"delta\": {\"nodeXY6\": {\"x\": -32,\"y\": -6698}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 156,\"y\": -2616}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 1,\"connectionID\": 1}]}},{\"laneID\": 8,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1557,\"y\": -1956}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -101,\"y\": -1956}}},{\"delta\": {\"nodeXY6\": {\"x\": -5,\"y\": -7393}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -121,\"y\": -1636}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 7,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 15,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2405,\"y\": -1018}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -9339,\"y\": 26}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11895,\"y\": -38}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -8814,\"y\": 13}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 16,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2337,\"y\": -656}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -12229,\"y\": 15}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -11362,\"y\": -37}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -6537,\"y\": 1}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 17,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2338,\"y\": -284}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -8892,\"y\": -18}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11959,\"y\": -2}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -1564,\"y\": -180}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 3,\"connectionID\": 1}]}},{\"laneID\": 14,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2401,\"y\": -1380}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -19947,\"y\": 8}},\"attributes\": {\"dElevation\": 80}},{\"delta\": {\"nodeXY6\": {\"x\": -10108,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 18,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2264,\"y\": 479}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -580,\"y\": -14}}}]}},{\"laneID\": 19,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2257,\"y\": 796}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -518,\"y\": 0}}}]}},{\"laneID\": 20,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2236,\"y\": 1229}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -484,\"y\": 0}}}]}},{\"laneID\": 23,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -914,\"y\": 1903}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 225,\"y\": 12288}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 40,\"y\": 9634}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 32,\"y\": 8035}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 28}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 22,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1221,\"y\": 1914}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 92,\"y\": 10475}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 89,\"y\": 11582}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 48,\"y\": 7912}},\"attributes\": {\"dElevation\": -30}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 21,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1649,\"y\": 1935}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": 3182}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 21,\"y\": 5991}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 102,\"y\": 4810}}},{\"delta\": {\"nodeXY6\": {\"x\": 85,\"y\": 11803}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 19,\"y\": 4161}},\"attributes\": {\"dElevation\": -20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 20,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 24,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -535,\"y\": 1926}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 28,\"y\": 4582}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 88,\"y\": 3793}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -143,\"y\": 1866}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 25,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -213,\"y\": 1913}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 14,\"y\": 4594}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -91,\"y\": 2238}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 26,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 724,\"y\": 1902}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 352}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 27,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1105,\"y\": 1888}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 332}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 28,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1591,\"y\": 1874}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -14,\"y\": 346}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}}]}}]}},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.J2735MAP\"}}"; - - // A different Message entirely - String inputMap3 = "{\"metadata\": {\"logFileName\": \"\",\"recordType\": \"mapTx\",\"securityResultCode\": \"success\",\"receivedMessageDetails\": {\"rxSource\": \"NA\"},\"payloadType\": \"us.dot.its.jpo.ode.model.OdeMapPayload\",\"serialId\": {\"streamId\": \"c495510d-c87b-4eb8-a413-a5f91e8ac026\",\"bundleSize\": 1,\"bundleId\": 0,\"recordId\": 0,\"serialNumber\": 0},\"odeReceivedAt\": \"2024-12-23T18:59:44.341Z\",\"schemaVersion\": 7,\"maxDurationTime\": 0,\"recordGeneratedAt\": \"\",\"recordGeneratedBy\": \"RSU\",\"sanitized\": false,\"odePacketID\": \"\",\"odeTimStartDateTime\": \"\",\"asn1\": \"001283C138003000205E9C014D3EAB092CA624B5518202DC3658042800000400023622C60CA009F66D48ABFAF81388D8AD18070027D9B2FFCFE9804F13667B1FFD009EC2C76E3FFC82C4E0001004B00C5000000800066C4574101813ECD8B757FAE027D9B30E6FF5604EC363561FE7809EC6CD69BFEC813C4D8A617FC9027D9B2147008604FB163666000016250000802580228000001000096229E1309B51A6FE4204DD361CF1FE5009F6018E1000096020A00000080004D88A57F84027D9B3827002804EC36087600A009F62C289407282C310001C0440188800000006C46DBE02813EC5816D800710052200000001B11B6FAD404FB16054A0000401C8800000006C47B3D24813EC5816D801B100C4200000000AF890F12C580007E87100D4200000008AF4C0F12C580077E7A2C0004000160002001CB028D000000800052C160BC40B5FFFD8A9409D86BFEBB5B40141457FEF53B76C008B467014145800080002BFFCBFFC82C6A0001804B024D000000800036C2213C3B013ECD80096D64027D9AFFD8CDFC04F635FF7983BC09F66C0082AA2014280B1B80006012C0B3400000100004B02BCF0F6D7FE065D602788B0138EB900B1240001012C083400000080009B0C2AF0B804FB15FE6DE171AFFF6C63E04EC15FE1DE670060E40002581EA8000004000135DA6DF0180A0A6ADC2C00D0143CD51897FDA028C8ABB25001A0B0680008012C105400000200009AEDBEFAE005053540EE003C0A326A9CF3FED8143C5667780010582C0004009608AA00000080004D76DE7EE402829ABA88FFDC050F354525FFF80A322BCF23FA602C690000C04B0395000000200016BB4FBD4E01414D3215800802940AB108FFF2030D2000110126200000001AEE5103BE050A15F6F1FFC8404D8800000006BB97C18E0142857DFA800010146200000001AEE89099A050A15F8720000B05DD000000800046BE3743B781428D80E1B00002879B00514B4404F63600827D8C09E22C000400015FFE6007016190000402582CE8000004000135ECEE1DE80A146C02E54758143CD8059AD3E027B1B00613DD004F102C360000804B055D000000200046BCC7C3C781428D80108C6E02829B002B2ECE050A16019A4B29B00AB5C3604F136004E410409EC018A10000960C3A00000080004D7DE9878602851B003923CC05053601623B440A0A6BFB8C3A5014140B0640005012C197400000100005AFE570EF2050A36003A47C80A0A6BFD2C45F014140B054000501101A8200000001B05A90EDC050535FFE605800A0A101B8200000001B08A30EC0050535FFE605300A0A101C8200000005B0C6F0EA4050515FFCA0568B0001000E00\",\"mapSource\": \"RSU\",\"originIp\": \"172.24.0.1\"},\"payload\": {\"data\": {\"msgIssueRevision\": 0,\"layerType\": \"intersectionData\",\"layerID\": 0,\"intersections\": {\"intersectionGeometry\": [{\"id\": {\"id\": 12109},\"revision\": 0,\"refPoint\": {\"latitude\": 39.5952649,\"longitude\": -105.0914122,\"elevation\": 1677.0},\"laneWidth\": 366,\"laneSet\": {\"GenericLane\": [{\"laneID\": 2,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2225,\"y\": 808}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 10517,\"y\": -161}},\"attributes\": {\"dElevation\": -60}},{\"delta\": {\"nodeXY6\": {\"x\": 2769,\"y\": 112}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6142,\"y\": -180}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 6636,\"y\": -12}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 3804,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 19,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 3,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2222,\"y\": 515}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 2933,\"y\": -82}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6259,\"y\": -85}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 3416,\"y\": -98}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 6867,\"y\": -39}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 2657,\"y\": -55}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 4259,\"y\": 67}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 3481,\"y\": 0}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 1,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2215,\"y\": 1218}}},{\"delta\": {\"nodeXY6\": {\"x\": 10451,\"y\": -223}},\"attributes\": {\"dElevation\": -70}},{\"delta\": {\"nodeXY6\": {\"x\": 1852,\"y\": -108}},\"attributes\": {\"dElevation\": -10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 28,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 4,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2213,\"y\": -124}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 7187,\"y\": 20}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 541,\"y\": 40}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 1298,\"y\": 229}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 7,\"connectionID\": 1}]}},{\"laneID\": 6,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -1019}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 7}}}]}},{\"laneID\": 5,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -662}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 338,\"y\": 0}}}]}},{\"laneID\": 7,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2294,\"y\": -1463}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 27}}}]}},{\"laneID\": 12,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -952,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": -377}}}]}},{\"laneID\": 13,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1440,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 7,\"y\": -390}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}},{\"laneID\": 10,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 705,\"y\": -1919}}},{\"delta\": {\"nodeXY6\": {\"x\": -1,\"y\": -7515}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -41,\"y\": -5272}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -17,\"y\": -11337}}},{\"delta\": {\"nodeXY6\": {\"x\": 17,\"y\": -5938}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 9,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1090,\"y\": -1930}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 9,\"y\": -4764}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -20,\"y\": -6402}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": -34,\"y\": -7953}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": -10940}},\"attributes\": {\"dElevation\": 20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 27,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 11,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 350,\"y\": -1925}}},{\"delta\": {\"nodeXY6\": {\"x\": -32,\"y\": -6698}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 156,\"y\": -2616}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 1,\"connectionID\": 1}]}},{\"laneID\": 8,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1557,\"y\": -1956}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -101,\"y\": -1956}}},{\"delta\": {\"nodeXY6\": {\"x\": -5,\"y\": -7393}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -121,\"y\": -1636}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 7,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 15,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2405,\"y\": -1018}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -9339,\"y\": 26}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11895,\"y\": -38}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -8814,\"y\": 13}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 16,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2337,\"y\": -656}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -12229,\"y\": 15}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -11362,\"y\": -37}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -6537,\"y\": 1}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 17,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2338,\"y\": -284}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -8892,\"y\": -18}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11959,\"y\": -2}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -1564,\"y\": -180}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 3,\"connectionID\": 1}]}},{\"laneID\": 14,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2401,\"y\": -1380}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -19947,\"y\": 8}},\"attributes\": {\"dElevation\": 80}},{\"delta\": {\"nodeXY6\": {\"x\": -10108,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 18,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2264,\"y\": 479}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -580,\"y\": -14}}}]}},{\"laneID\": 19,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2257,\"y\": 796}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -518,\"y\": 0}}}]}},{\"laneID\": 20,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2236,\"y\": 1229}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -484,\"y\": 0}}}]}},{\"laneID\": 23,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -914,\"y\": 1903}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 225,\"y\": 12288}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 40,\"y\": 9634}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 32,\"y\": 8035}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 28}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 22,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1221,\"y\": 1914}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 92,\"y\": 10475}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 89,\"y\": 11582}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 48,\"y\": 7912}},\"attributes\": {\"dElevation\": -30}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 21,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1649,\"y\": 1935}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": 3182}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 21,\"y\": 5991}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 102,\"y\": 4810}}},{\"delta\": {\"nodeXY6\": {\"x\": 85,\"y\": 11803}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 19,\"y\": 4161}},\"attributes\": {\"dElevation\": -20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 20,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 24,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -535,\"y\": 1926}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 28,\"y\": 4582}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 88,\"y\": 3793}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -143,\"y\": 1866}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 25,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -213,\"y\": 1913}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 14,\"y\": 4594}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -91,\"y\": 2238}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 26,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 724,\"y\": 1902}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 352}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 27,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1105,\"y\": 1888}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 332}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 28,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1591,\"y\": 1874}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -14,\"y\": 346}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}}]}}]}},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.J2735MAP\"}}"; - - // Message 1 but 1 hour later - String inputMap4 = "{\"metadata\": {\"logFileName\": \"\",\"recordType\": \"mapTx\",\"securityResultCode\": \"success\",\"receivedMessageDetails\": {\"rxSource\": \"NA\"},\"payloadType\": \"us.dot.its.jpo.ode.model.OdeMapPayload\",\"serialId\": {\"streamId\": \"c495510d-c87b-4eb8-a413-a5f91e8ac026\",\"bundleSize\": 1,\"bundleId\": 0,\"recordId\": 0,\"serialNumber\": 0},\"odeReceivedAt\": \"2024-12-23T20:00:00.341Z\",\"schemaVersion\": 7,\"maxDurationTime\": 0,\"recordGeneratedAt\": \"\",\"recordGeneratedBy\": \"RSU\",\"sanitized\": false,\"odePacketID\": \"\",\"odeTimStartDateTime\": \"\",\"asn1\": \"001283C138003000205E9C014D3EAB092CA624B5518202DC3658042800000400023622C60CA009F66D48ABFAF81388D8AD18070027D9B2FFCFE9804F13667B1FFD009EC2C76E3FFC82C4E0001004B00C5000000800066C4574101813ECD8B757FAE027D9B30E6FF5604EC363561FE7809EC6CD69BFEC813C4D8A617FC9027D9B2147008604FB163666000016250000802580228000001000096229E1309B51A6FE4204DD361CF1FE5009F6018E1000096020A00000080004D88A57F84027D9B3827002804EC36087600A009F62C289407282C310001C0440188800000006C46DBE02813EC5816D800710052200000001B11B6FAD404FB16054A0000401C8800000006C47B3D24813EC5816D801B100C4200000000AF890F12C580007E87100D4200000008AF4C0F12C580077E7A2C0004000160002001CB028D000000800052C160BC40B5FFFD8A9409D86BFEBB5B40141457FEF53B76C008B467014145800080002BFFCBFFC82C6A0001804B024D000000800036C2213C3B013ECD80096D64027D9AFFD8CDFC04F635FF7983BC09F66C0082AA2014280B1B80006012C0B3400000100004B02BCF0F6D7FE065D602788B0138EB900B1240001012C083400000080009B0C2AF0B804FB15FE6DE171AFFF6C63E04EC15FE1DE670060E40002581EA8000004000135DA6DF0180A0A6ADC2C00D0143CD51897FDA028C8ABB25001A0B0680008012C105400000200009AEDBEFAE005053540EE003C0A326A9CF3FED8143C5667780010582C0004009608AA00000080004D76DE7EE402829ABA88FFDC050F354525FFF80A322BCF23FA602C690000C04B0395000000200016BB4FBD4E01414D3215800802940AB108FFF2030D2000110126200000001AEE5103BE050A15F6F1FFC8404D8800000006BB97C18E0142857DFA800010146200000001AEE89099A050A15F8720000B05DD000000800046BE3743B781428D80E1B00002879B00514B4404F63600827D8C09E22C000400015FFE6007016190000402582CE8000004000135ECEE1DE80A146C02E54758143CD8059AD3E027B1B00613DD004F102C360000804B055D000000200046BCC7C3C781428D80108C6E02829B002B2ECE050A16019A4B29B00AB5C3604F136004E410409EC018A10000960C3A00000080004D7DE9878602851B003923CC05053601623B440A0A6BFB8C3A5014140B0640005012C197400000100005AFE570EF2050A36003A47C80A0A6BFD2C45F014140B054000501101A8200000001B05A90EDC050535FFE605800A0A101B8200000001B08A30EC0050535FFE605300A0A101C8200000005B0C6F0EA4050515FFCA0568B0001000E00\",\"mapSource\": \"RSU\",\"originIp\": \"172.24.0.1\"},\"payload\": {\"data\": {\"msgIssueRevision\": 0,\"layerType\": \"intersectionData\",\"layerID\": 0,\"intersections\": {\"intersectionGeometry\": [{\"id\": {\"id\": 12110},\"revision\": 0,\"refPoint\": {\"latitude\": 39.5952649,\"longitude\": -105.0914122,\"elevation\": 1677.0},\"laneWidth\": 366,\"laneSet\": {\"GenericLane\": [{\"laneID\": 2,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2225,\"y\": 808}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 10517,\"y\": -161}},\"attributes\": {\"dElevation\": -60}},{\"delta\": {\"nodeXY6\": {\"x\": 2769,\"y\": 112}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6142,\"y\": -180}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 6636,\"y\": -12}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 3804,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 19,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 3,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2222,\"y\": 515}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 2933,\"y\": -82}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 6259,\"y\": -85}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 3416,\"y\": -98}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 6867,\"y\": -39}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 2657,\"y\": -55}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 4259,\"y\": 67}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 3481,\"y\": 0}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 4,\"connectionID\": 1}]}},{\"laneID\": 1,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2215,\"y\": 1218}}},{\"delta\": {\"nodeXY6\": {\"x\": 10451,\"y\": -223}},\"attributes\": {\"dElevation\": -70}},{\"delta\": {\"nodeXY6\": {\"x\": 1852,\"y\": -108}},\"attributes\": {\"dElevation\": -10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 28,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 4,\"ingressApproach\": 1,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2213,\"y\": -124}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 7187,\"y\": 20}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": 541,\"y\": 40}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 1298,\"y\": 229}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 7,\"connectionID\": 1}]}},{\"laneID\": 6,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -1019}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 7}}}]}},{\"laneID\": 5,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2267,\"y\": -662}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 338,\"y\": 0}}}]}},{\"laneID\": 7,\"egressApproach\": 2,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 2294,\"y\": -1463}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 365,\"y\": 27}}}]}},{\"laneID\": 12,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -952,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": -377}}}]}},{\"laneID\": 13,\"egressApproach\": 4,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1440,\"y\": -1898}}},{\"delta\": {\"nodeXY6\": {\"x\": 7,\"y\": -390}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}},{\"laneID\": 10,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 705,\"y\": -1919}}},{\"delta\": {\"nodeXY6\": {\"x\": -1,\"y\": -7515}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -41,\"y\": -5272}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -17,\"y\": -11337}}},{\"delta\": {\"nodeXY6\": {\"x\": 17,\"y\": -5938}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 9,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1090,\"y\": -1930}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 9,\"y\": -4764}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -20,\"y\": -6402}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": -34,\"y\": -7953}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": -10940}},\"attributes\": {\"dElevation\": 20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 27,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 6,\"connectionID\": 1}]}},{\"laneID\": 11,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 350,\"y\": -1925}}},{\"delta\": {\"nodeXY6\": {\"x\": -32,\"y\": -6698}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 156,\"y\": -2616}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 18,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 1,\"connectionID\": 1}]}},{\"laneID\": 8,\"ingressApproach\": 3,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1557,\"y\": -1956}},\"attributes\": {\"dElevation\": -10}},{\"delta\": {\"nodeXY6\": {\"x\": -101,\"y\": -1956}}},{\"delta\": {\"nodeXY6\": {\"x\": -5,\"y\": -7393}},\"attributes\": {\"dElevation\": -40}},{\"delta\": {\"nodeXY6\": {\"x\": -121,\"y\": -1636}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 7,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 15,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2405,\"y\": -1018}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -9339,\"y\": 26}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11895,\"y\": -38}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -8814,\"y\": 13}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 16,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2337,\"y\": -656}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -12229,\"y\": 15}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -11362,\"y\": -37}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -6537,\"y\": 1}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 8,\"connectionID\": 1}]}},{\"laneID\": 17,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2338,\"y\": -284}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -8892,\"y\": -18}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": -11959,\"y\": -2}},\"attributes\": {\"dElevation\": 50}},{\"delta\": {\"nodeXY6\": {\"x\": -1564,\"y\": -180}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 26,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 3,\"connectionID\": 1}]}},{\"laneID\": 14,\"ingressApproach\": 5,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2401,\"y\": -1380}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -19947,\"y\": 8}},\"attributes\": {\"dElevation\": 80}},{\"delta\": {\"nodeXY6\": {\"x\": -10108,\"y\": -7}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 18,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2264,\"y\": 479}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -580,\"y\": -14}}}]}},{\"laneID\": 19,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2257,\"y\": 796}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -518,\"y\": 0}}}]}},{\"laneID\": 20,\"egressApproach\": 6,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -2236,\"y\": 1229}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": -484,\"y\": 0}}}]}},{\"laneID\": 23,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -914,\"y\": 1903}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 225,\"y\": 12288}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 40,\"y\": 9634}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 32,\"y\": 8035}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 0}}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 28}}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 12,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 22,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1221,\"y\": 1914}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 92,\"y\": 10475}},\"attributes\": {\"dElevation\": 30}},{\"delta\": {\"nodeXY6\": {\"x\": 89,\"y\": 11582}},\"attributes\": {\"dElevation\": -20}},{\"delta\": {\"nodeXY6\": {\"x\": 48,\"y\": 7912}},\"attributes\": {\"dElevation\": -30}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 13,\"maneuver\": {\"maneuverStraightAllowed\": true,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 2,\"connectionID\": 1}]}},{\"laneID\": 21,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -1649,\"y\": 1935}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 16,\"y\": 3182}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 21,\"y\": 5991}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 102,\"y\": 4810}}},{\"delta\": {\"nodeXY6\": {\"x\": 85,\"y\": 11803}},\"attributes\": {\"dElevation\": -30}},{\"delta\": {\"nodeXY6\": {\"x\": 19,\"y\": 4161}},\"attributes\": {\"dElevation\": -20}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 20,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": false,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": true,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"connectionID\": 1}]}},{\"laneID\": 24,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -535,\"y\": 1926}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 28,\"y\": 4582}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": 88,\"y\": 3793}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -143,\"y\": 1866}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 6,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 25,\"ingressApproach\": 7,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": true,\"egressPath\": false},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"maneuvers\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": -213,\"y\": 1913}},\"attributes\": {\"dElevation\": 20}},{\"delta\": {\"nodeXY6\": {\"x\": 14,\"y\": 4594}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -91,\"y\": 2238}},\"attributes\": {\"dElevation\": 10}}]},\"connectsTo\": {\"connectsTo\": [{\"connectingLane\": {\"lane\": 5,\"maneuver\": {\"maneuverStraightAllowed\": false,\"maneuverNoStoppingAllowed\": false,\"goWithHalt\": false,\"maneuverLeftAllowed\": true,\"maneuverUTurnAllowed\": false,\"maneuverLeftTurnOnRedAllowed\": false,\"reserved1\": false,\"maneuverRightAllowed\": false,\"maneuverLaneChangeAllowed\": false,\"yieldAllwaysRequired\": false,\"maneuverRightTurnOnRedAllowed\": false,\"caution\": false}},\"signalGroup\": 5,\"connectionID\": 1}]}},{\"laneID\": 26,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 724,\"y\": 1902}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 352}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 27,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1105,\"y\": 1888}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -7,\"y\": 332}},\"attributes\": {\"dElevation\": 10}}]}},{\"laneID\": 28,\"egressApproach\": 8,\"laneAttributes\": {\"directionalUse\": {\"ingressPath\": false,\"egressPath\": true},\"shareWith\": {\"busVehicleTraffic\": false,\"trackedVehicleTraffic\": false,\"individualMotorizedVehicleTraffic\": false,\"taxiVehicleTraffic\": false,\"overlappingLaneDescriptionProvided\": false,\"cyclistVehicleTraffic\": false,\"otherNonMotorizedTrafficTypes\": false,\"multipleLanesTreatedAsOneLane\": false,\"pedestrianTraffic\": false,\"pedestriansTraffic\": false},\"laneType\": {\"vehicle\": {\"isVehicleRevocableLane\": false,\"isVehicleFlyOverLane\": false,\"permissionOnRequest\": false,\"hasIRbeaconCoverage\": false,\"restrictedToBusUse\": false,\"restrictedToTaxiUse\": false,\"restrictedFromPublicUse\": false,\"hovLaneUseOnly\": false}}},\"nodeList\": {\"nodes\": [{\"delta\": {\"nodeXY6\": {\"x\": 1591,\"y\": 1874}},\"attributes\": {\"dElevation\": 10}},{\"delta\": {\"nodeXY6\": {\"x\": -14,\"y\": 346}}},{\"delta\": {\"nodeXY6\": {\"x\": 0,\"y\": 7}}}]}}]}}]}},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.J2735MAP\"}}"; - - @Autowired - DeduplicatorProperties props; - - - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicOdeMapJson(inputTopic); - props.setKafkaTopicDeduplicatedOdeMapJson(outputTopic); - - MapDeduplicatorTopology mapDeduplicatorTopology = new MapDeduplicatorTopology(props, null); - - Topology topology = mapDeduplicatorTopology.buildTopology(); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputOdeMapData = driver.createInputTopic( - inputTopic, - Serdes.Void().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic outputOdeMapData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - JsonSerdes.OdeMap().deserializer()); - - inputOdeMapData.pipeInput(null, inputMap1); - inputOdeMapData.pipeInput(null, inputMap2); - inputOdeMapData.pipeInput(null, inputMap3); - inputOdeMapData.pipeInput(null, inputMap4); - - List> mapDeduplicationResults = outputOdeMapData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(3, mapDeduplicationResults.size()); - - objectMapper = new ObjectMapper(); - OdeMapData map1 = objectMapper.readValue(inputMap1, OdeMapData.class); - OdeMapData map3 = objectMapper.readValue(inputMap3, OdeMapData.class); - OdeMapData map4 = objectMapper.readValue(inputMap4, OdeMapData.class); - - - assertEquals(map1.getMetadata().getOdeReceivedAt(), mapDeduplicationResults.get(0).value.getMetadata().getOdeReceivedAt()); - assertEquals(map3.getMetadata().getOdeReceivedAt(), mapDeduplicationResults.get(1).value.getMetadata().getOdeReceivedAt()); - assertEquals(map4.getMetadata().getOdeReceivedAt(), mapDeduplicationResults.get(2).value.getMetadata().getOdeReceivedAt()); - - } catch (JsonMappingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (JsonProcessingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/OdeRawEncodedTimDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/OdeRawEncodedTimDeduplicatorTopologyTest.java deleted file mode 100644 index 4b618d9..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/OdeRawEncodedTimDeduplicatorTopologyTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package deduplicator; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.OdeRawEncodedTimDeduplicatorTopology; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class OdeRawEncodedTimDeduplicatorTopologyTest { - - String inputTopic = "topic.OdeRawEncodedTIMJson"; - String outputTopic = "topic.DeduplicatedOdeRawEncodedTIMJson"; - - ObjectMapper objectMapper = new ObjectMapper(); - - // Original Message - String inputTim1 = "{ \"metadata\": { \"securityResultCode\": \"success\", \"recordGeneratedBy\": \"RSU\", \"schemaVersion\": 6, \"payloadType\": \"us.dot.its.jpo.ode.model.OdeAsn1Payload\", \"serialId\": { \"recordId\": 0, \"serialNumber\": 0, \"streamId\": \"5f470323-7770-4810-b225-8c45aa672103\", \"bundleSize\": 1, \"bundleId\": 0 }, \"sanitized\": false, \"recordType\": \"timMsg\", \"maxDurationTime\": 0, \"odeReceivedAt\": \"2024-07-22T23:23:29.553Z\", \"originIp\": \"10.16.28.53\" }, \"payload\": { \"data\": { \"bytes\": \"001F63701409FF38D05CD47AF567A4570F775D9B0301C269D16DD9656F9637FFF93F421D3B001EA007F99937E1CF5AD1BB0BF4A9D5BEC5BB25CC5B2E64E173162DA00000000269D16DD9656F9631388C100021000EBF7272441F8CFDED60004008027BBAECD8A1A81EF1C153853DD08B394DDCE85F7F4F2222BE087C98000801004F775D9B002F378A81FD1358540F893502C0B711D815FF7883E0A9AACF804536FC9E2A39A67D4289155859ABA8ACBD4997855D345BA429991568E1CA702BA1D8ADFF4805456C0A46862B7F41BE614A122DFB8B0FA019FC52FC8AFF62A7DA3D3F1C9A00BC220AA6B0DC20571A23C142A8C0368F14D181D9B8E2FA859714531606FF8197DC2D81469C97540A33D8D25850D7CA7E82916C1F82142D3A8A20A4884311C320C8EB2290AD1BAC0C84856E8A1B1D760C51BE458B8189591FF0C64E68D0004008027BBAECD8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" }, \"dataType\": \"us.dot.its.jpo.ode.model.OdeHexByteArray\" }}"; - - // Shifted Forward .1 seconds - Should be deduplicated - String inputTim2 = "{ \"metadata\": { \"securityResultCode\": \"success\", \"recordGeneratedBy\": \"RSU\", \"schemaVersion\": 6, \"payloadType\": \"us.dot.its.jpo.ode.model.OdeAsn1Payload\", \"serialId\": { \"recordId\": 0, \"serialNumber\": 0, \"streamId\": \"5f470323-7770-4810-b225-8c45aa672103\", \"bundleSize\": 1, \"bundleId\": 0 }, \"sanitized\": false, \"recordType\": \"timMsg\", \"maxDurationTime\": 0, \"odeReceivedAt\": \"2024-07-22T23:23:29.653Z\", \"originIp\": \"10.16.28.53\" }, \"payload\": { \"data\": { \"bytes\": \"001F63701409FF38D05CD47AF567A4570F775D9B0301C269D16DD9656F9637FFF93F421D3B001EA007F99937E1CF5AD1BB0BF4A9D5BEC5BB25CC5B2E64E173162DA00000000269D16DD9656F9631388C100021000EBF7272441F8CFDED60004008027BBAECD8A1A81EF1C153853DD08B394DDCE85F7F4F2222BE087C98000801004F775D9B002F378A81FD1358540F893502C0B711D815FF7883E0A9AACF804536FC9E2A39A67D4289155859ABA8ACBD4997855D345BA429991568E1CA702BA1D8ADFF4805456C0A46862B7F41BE614A122DFB8B0FA019FC52FC8AFF62A7DA3D3F1C9A00BC220AA6B0DC20571A23C142A8C0368F14D181D9B8E2FA859714531606FF8197DC2D81469C97540A33D8D25850D7CA7E82916C1F82142D3A8A20A4884311C320C8EB2290AD1BAC0C84856E8A1B1D760C51BE458B8189591FF0C64E68D0004008027BBAECD8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" }, \"dataType\": \"us.dot.its.jpo.ode.model.OdeHexByteArray\" }}"; - - // Shifted Forward 1 hour Should be allowed to pass through - String inputTim3 = "{ \"metadata\": { \"securityResultCode\": \"success\", \"recordGeneratedBy\": \"RSU\", \"schemaVersion\": 6, \"payloadType\": \"us.dot.its.jpo.ode.model.OdeAsn1Payload\", \"serialId\": { \"recordId\": 0, \"serialNumber\": 0, \"streamId\": \"5f470323-7770-4810-b225-8c45aa672103\", \"bundleSize\": 1, \"bundleId\": 0 }, \"sanitized\": false, \"recordType\": \"timMsg\", \"maxDurationTime\": 0, \"odeReceivedAt\": \"2024-07-23T00:23:29.653Z\", \"originIp\": \"10.16.28.53\" }, \"payload\": { \"data\": { \"bytes\": \"001F63701409FF38D05CD47AF567A4570F775D9B0301C269D16DD9656F9637FFF93F421D3B001EA007F99937E1CF5AD1BB0BF4A9D5BEC5BB25CC5B2E64E173162DA00000000269D16DD9656F9631388C100021000EBF7272441F8CFDED60004008027BBAECD8A1A81EF1C153853DD08B394DDCE85F7F4F2222BE087C98000801004F775D9B002F378A81FD1358540F893502C0B711D815FF7883E0A9AACF804536FC9E2A39A67D4289155859ABA8ACBD4997855D345BA429991568E1CA702BA1D8ADFF4805456C0A46862B7F41BE614A122DFB8B0FA019FC52FC8AFF62A7DA3D3F1C9A00BC220AA6B0DC20571A23C142A8C0368F14D181D9B8E2FA859714531606FF8197DC2D81469C97540A33D8D25850D7CA7E82916C1F82142D3A8A20A4884311C320C8EB2290AD1BAC0C84856E8A1B1D760C51BE458B8189591FF0C64E68D0004008027BBAECD8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" }, \"dataType\": \"us.dot.its.jpo.ode.model.OdeHexByteArray\" }}"; - - // Has a different payload ID. Should be allowed through - String inputTim4 = "{ \"metadata\": { \"securityResultCode\": \"success\", \"recordGeneratedBy\": \"RSU\", \"schemaVersion\": 6, \"payloadType\": \"us.dot.its.jpo.ode.model.OdeAsn1Payload\", \"serialId\": { \"recordId\": 0, \"serialNumber\": 0, \"streamId\": \"5f470323-7770-4810-b225-8c45aa672103\", \"bundleSize\": 1, \"bundleId\": 0 }, \"sanitized\": false, \"recordType\": \"timMsg\", \"maxDurationTime\": 0, \"odeReceivedAt\": \"2024-07-22T23:23:29.553Z\", \"originIp\": \"10.16.28.53\" }, \"payload\": { \"data\": { \"bytes\": \"001F63701409FF38D05CD47AF567A4570F775D9B0301C269D16DD9656F9637FFF93F421D3B001EA007F99937E1CF5AD1BB0BF4A9D5BEC5BB25CC5B2E64E173162DA00000000269D16DD9656F9631388C100021000EBF7272441F8CFDED60004008027BBAECD8A1A81EF1C153853DD08B394DDCE85F7F4F2222BE087C98000801004F775D9B002F378A81FD1358540F893502C0B711D815FF7883E0A9AACF804536FC9E2A39A67D4289155859ABA8ACBD4997855D345BA429991568E1CA702BA1D8ADFF4805456C0A46862B7F41BE614A122DFB8B0FA019FC52FC8AFF62A7DA3D3F1C9A00BC220AA6B0DC20571A23C142A8C0368F14D181D9B8E2FA859714531606FF8197DC2D81469C97540A33D8D25850D7CA7E82916C1F82142D3A8A20A4884311C320C8EB2290AD1BAC0C84856E8A1B1D760C51BE458B8189591FF0C64E68D0004008027BBAECD9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" }, \"dataType\": \"us.dot.its.jpo.ode.model.OdeHexByteArray\" }}"; - - @Autowired - DeduplicatorProperties props; - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicOdeRawEncodedTimJson(inputTopic); - props.setKafkaTopicDeduplicatedOdeRawEncodedTimJson(outputTopic); - - OdeRawEncodedTimDeduplicatorTopology TimDeduplicatorTopology = new OdeRawEncodedTimDeduplicatorTopology(props, null); - - Topology topology = TimDeduplicatorTopology.buildTopology(); - objectMapper.registerModule(new JavaTimeModule()); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputTimData = driver.createInputTopic( - inputTopic, - Serdes.Void().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic outputTimData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - Serdes.String().deserializer()); - - inputTimData.pipeInput(null, inputTim1); - inputTimData.pipeInput(null, inputTim2); - inputTimData.pipeInput(null, inputTim3); - inputTimData.pipeInput(null, inputTim4); - - List> timDeduplicatedResults = outputTimData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(3, timDeduplicatedResults.size()); - inputTim1 = inputTim1.strip(); - - assertEquals(inputTim1.replace(" ", ""), timDeduplicatedResults.get(0).value.replace(" ", "")); - assertEquals(inputTim3.replace(" ", ""), timDeduplicatedResults.get(1).value.replace(" ", "")); - assertEquals(inputTim4.replace(" ", ""), timDeduplicatedResults.get(2).value.replace(" ", "")); - - }catch(Exception e){ - e.printStackTrace(); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapDeduplicatorTopologyTest.java deleted file mode 100644 index 331bfdc..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapDeduplicatorTopologyTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package deduplicator; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedMapDeduplicatorTopology; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.LineString; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class ProcessedMapDeduplicatorTopologyTest { - - String inputTopic = "topic.ProcessedMap"; - String outputTopic = "topic.DeduplicatedProcessedMap"; - - - TypeReference> typeReference = new TypeReference<>(){}; - ObjectMapper objectMapper = new ObjectMapper(); - - String inputProcessedMap1 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0906245,39.5876246],[-105.0905203,39.587281],[-105.0904383,39.5870554],[-105.0903588,39.5868383],[-105.0902622,39.5865865],[-105.0901249,39.5862612],[-105.0900451,39.5860819],[-105.0899283,39.5858283],[-105.0898739,39.5857117],[-105.0895814,39.5851569],[-105.0888764,39.5839527]]},\"properties\":{\"nodes\":[{\"delta\":[1511,-1514]},{\"delta\":[723,-3116],\"delevation\":10},{\"delta\":[892,-3818],\"delevation\":20},{\"delta\":[702,-2507],\"delevation\":20},{\"delta\":[681,-2412],\"delevation\":10},{\"delta\":[827,-2798],\"delevation\":10},{\"delta\":[1176,-3614],\"delevation\":20},{\"delta\":[683,-1992]},{\"delta\":[1000,-2818],\"delevation\":10},{\"delta\":[466,-1295],\"delevation\":20},{\"delta\":[2505,-6164],\"delevation\":20},{\"delta\":[6037,-13380],\"delevation\":70}],\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.090652,39.5875596],[-105.090534,39.5871793],[-105.0903457,39.5866864],[-105.0902123,39.5863581],[-105.0900802,39.5860572],[-105.0898164,39.5855019],[-105.0895409,39.5849856],[-105.088922,39.5839259]]},\"properties\":{\"nodes\":[{\"delta\":[1192,-1619]},{\"delta\":[807,-3733],\"delevation\":30},{\"delta\":[1010,-4226],\"delevation\":10},{\"delta\":[1612,-5477],\"delevation\":30},{\"delta\":[1142,-3648],\"delevation\":20},{\"delta\":[1131,-3343],\"delevation\":10},{\"delta\":[2259,-6170],\"delevation\":30},{\"delta\":[2359,-5737],\"delevation\":30},{\"delta\":[5300,-11774],\"delevation\":50}],\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.090747,39.5877247],[-105.0906498,39.5874141],[-105.0906262,39.5873356],[-105.0905865,39.5872922]]},\"properties\":{\"nodes\":[{\"delta\":[805,-1704],\"delevation\":10},{\"delta\":[380,-1813]},{\"delta\":[832,-3451],\"delevation\":30},{\"delta\":[202,-872]},{\"delta\":[340,-482],\"delevation\":-10}],\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910008,39.5878477],[-105.0909927,39.5878181]]},\"properties\":{\"nodes\":[{\"delta\":[-988,-2151],\"delevation\":20},{\"delta\":[69,-329]}],\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090959,39.5878557],[-105.0909501,39.5878218]]},\"properties\":{\"nodes\":[{\"delta\":[-630,-2062],\"delevation\":10},{\"delta\":[76,-377],\"delevation\":10}],\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090914,39.5878612],[-105.0909051,39.5878298]]},\"properties\":{\"nodes\":[{\"delta\":[-245,-2001],\"delevation\":10},{\"delta\":[76,-349]}],\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911626,39.5880622],[-105.0912043,39.5880536]]},\"properties\":{\"nodes\":[{\"delta\":[-2374,232],\"delevation\":10},{\"delta\":[-357,-96]}],\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0914565,39.5879427],[-105.0917937,39.5879029],[-105.0922121,39.5878724],[-105.0926509,39.5878748],[-105.0930303,39.5879073],[-105.0932697,39.5879503],[-105.0937243,39.5880569],[-105.0940309,39.5881258],[-105.0943257,39.5881804],[-105.094592,39.5882097]]},\"properties\":{\"nodes\":[{\"delta\":[-2246,-514],\"delevation\":10},{\"delta\":[-2644,-581]},{\"delta\":[-2887,-442],\"delevation\":10},{\"delta\":[-3583,-339],\"delevation\":10},{\"delta\":[-3757,27]},{\"delta\":[-3249,361],\"delevation\":-10},{\"delta\":[-2050,478]},{\"delta\":[-3893,1184]},{\"delta\":[-2625,766],\"delevation\":-10},{\"delta\":[-2524,607],\"delevation\":10},{\"delta\":[-2280,325],\"delevation\":10}],\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0914154,39.5879165],[-105.0916346,39.5878851],[-105.0918433,39.5878639],[-105.0921546,39.5878547]]},\"properties\":{\"nodes\":[{\"delta\":[-2216,-915],\"delevation\":10},{\"delta\":[-2322,-471]},{\"delta\":[-1877,-349],\"delevation\":10},{\"delta\":[-1787,-235]},{\"delta\":[-2666,-102],\"delevation\":10}],\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.091436,39.5879812],[-105.0916658,39.5879507],[-105.091881,39.5879277],[-105.0921287,39.5878972]]},\"properties\":{\"nodes\":[{\"delta\":[-2295,-169],\"delevation\":10},{\"delta\":[-2420,-499]},{\"delta\":[-1968,-339],\"delevation\":10},{\"delta\":[-1843,-256]},{\"delta\":[-2121,-339]}],\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.0911481,39.5886317],[-105.091196,39.588862],[-105.0912349,39.5890282],[-105.0912722,39.5893202],[-105.0913306,39.5897261],[-105.0913695,39.5900324],[-105.0914008,39.5903008],[-105.0914893,39.5913099],[-105.091527,39.5923157]]},\"properties\":{\"nodes\":[{\"delta\":[-1364,1705],\"delevation\":10},{\"delta\":[-885,4854],\"delevation\":-30},{\"delta\":[-410,2559],\"delevation\":10},{\"delta\":[-333,1847],\"delevation\":-10},{\"delta\":[-319,3244],\"delevation\":-20},{\"delta\":[-500,4510]},{\"delta\":[-333,3403],\"delevation\":-30},{\"delta\":[-268,2982]},{\"delta\":[-758,11212],\"delevation\":-30},{\"delta\":[-323,11176],\"delevation\":-70}],\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.0911059,39.5886309],[-105.091144,39.5888313],[-105.0911829,39.5890442],[-105.0912308,39.5893169],[-105.0912689,39.5895877],[-105.0913005,39.5898143],[-105.0913313,39.5900714],[-105.0913597,39.5902968],[-105.0914461,39.5913017],[-105.0914756,39.592324]]},\"properties\":{\"nodes\":[{\"delta\":[-992,1735],\"delevation\":10},{\"delta\":[-896,4816],\"delevation\":-30},{\"delta\":[-326,2227],\"delevation\":10},{\"delta\":[-333,2366]},{\"delta\":[-410,3030],\"delevation\":-20},{\"delta\":[-326,3009],\"delevation\":-10},{\"delta\":[-271,2518],\"delevation\":-10},{\"delta\":[-264,2857],\"delevation\":-20},{\"delta\":[-243,2504]},{\"delta\":[-740,11165],\"delevation\":-30},{\"delta\":[-253,11359],\"delevation\":-70}],\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911549,39.5884681],[-105.091196,39.5886783],[-105.091222,39.5888049],[-105.0912401,39.5889649]]},\"properties\":{\"nodes\":[{\"delta\":[-1744,1607],\"delevation\":10},{\"delta\":[-563,3136],\"delevation\":-20},{\"delta\":[-352,2336],\"delevation\":-10},{\"delta\":[-223,1407],\"delevation\":10},{\"delta\":[-155,1778]}],\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0908389,39.5882151],[-105.0908478,39.5882471]]},\"properties\":{\"nodes\":[{\"delta\":[398,1931],\"delevation\":-10},{\"delta\":[-76,356]}],\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907875,39.58822],[-105.0907979,39.5882514]]},\"properties\":{\"nodes\":[{\"delta\":[838,1985],\"delevation\":-20},{\"delta\":[-89,349]}],\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.0911626,39.5880622]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0910008,39.5878477]]},\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.090959,39.5878557]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.090914,39.5878612]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911626,39.5880622]]},\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-02-22T23:26:21.06Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].id.region: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].id.region\",\"schemaPath\":\"#/$defs/J2735RoadRegulatorID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits\",\"schemaPath\":\"#/$defs/J2735SpeedLimitList_Wrapper/type\"}],\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-02-22T23:26:21.06Z\"}}"; - String inputProcessedMap2 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0906245,39.5876246],[-105.0905203,39.587281],[-105.0904383,39.5870554],[-105.0903588,39.5868383],[-105.0902622,39.5865865],[-105.0901249,39.5862612],[-105.0900451,39.5860819],[-105.0899283,39.5858283],[-105.0898739,39.5857117],[-105.0895814,39.5851569],[-105.0888764,39.5839527]]},\"properties\":{\"nodes\":[{\"delta\":[1511,-1514]},{\"delta\":[723,-3116],\"delevation\":10},{\"delta\":[892,-3818],\"delevation\":20},{\"delta\":[702,-2507],\"delevation\":20},{\"delta\":[681,-2412],\"delevation\":10},{\"delta\":[827,-2798],\"delevation\":10},{\"delta\":[1176,-3614],\"delevation\":20},{\"delta\":[683,-1992]},{\"delta\":[1000,-2818],\"delevation\":10},{\"delta\":[466,-1295],\"delevation\":20},{\"delta\":[2505,-6164],\"delevation\":20},{\"delta\":[6037,-13380],\"delevation\":70}],\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.090652,39.5875596],[-105.090534,39.5871793],[-105.0903457,39.5866864],[-105.0902123,39.5863581],[-105.0900802,39.5860572],[-105.0898164,39.5855019],[-105.0895409,39.5849856],[-105.088922,39.5839259]]},\"properties\":{\"nodes\":[{\"delta\":[1192,-1619]},{\"delta\":[807,-3733],\"delevation\":30},{\"delta\":[1010,-4226],\"delevation\":10},{\"delta\":[1612,-5477],\"delevation\":30},{\"delta\":[1142,-3648],\"delevation\":20},{\"delta\":[1131,-3343],\"delevation\":10},{\"delta\":[2259,-6170],\"delevation\":30},{\"delta\":[2359,-5737],\"delevation\":30},{\"delta\":[5300,-11774],\"delevation\":50}],\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.090747,39.5877247],[-105.0906498,39.5874141],[-105.0906262,39.5873356],[-105.0905865,39.5872922]]},\"properties\":{\"nodes\":[{\"delta\":[805,-1704],\"delevation\":10},{\"delta\":[380,-1813]},{\"delta\":[832,-3451],\"delevation\":30},{\"delta\":[202,-872]},{\"delta\":[340,-482],\"delevation\":-10}],\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910008,39.5878477],[-105.0909927,39.5878181]]},\"properties\":{\"nodes\":[{\"delta\":[-988,-2151],\"delevation\":20},{\"delta\":[69,-329]}],\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090959,39.5878557],[-105.0909501,39.5878218]]},\"properties\":{\"nodes\":[{\"delta\":[-630,-2062],\"delevation\":10},{\"delta\":[76,-377],\"delevation\":10}],\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090914,39.5878612],[-105.0909051,39.5878298]]},\"properties\":{\"nodes\":[{\"delta\":[-245,-2001],\"delevation\":10},{\"delta\":[76,-349]}],\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911626,39.5880622],[-105.0912043,39.5880536]]},\"properties\":{\"nodes\":[{\"delta\":[-2374,232],\"delevation\":10},{\"delta\":[-357,-96]}],\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0914565,39.5879427],[-105.0917937,39.5879029],[-105.0922121,39.5878724],[-105.0926509,39.5878748],[-105.0930303,39.5879073],[-105.0932697,39.5879503],[-105.0937243,39.5880569],[-105.0940309,39.5881258],[-105.0943257,39.5881804],[-105.094592,39.5882097]]},\"properties\":{\"nodes\":[{\"delta\":[-2246,-514],\"delevation\":10},{\"delta\":[-2644,-581]},{\"delta\":[-2887,-442],\"delevation\":10},{\"delta\":[-3583,-339],\"delevation\":10},{\"delta\":[-3757,27]},{\"delta\":[-3249,361],\"delevation\":-10},{\"delta\":[-2050,478]},{\"delta\":[-3893,1184]},{\"delta\":[-2625,766],\"delevation\":-10},{\"delta\":[-2524,607],\"delevation\":10},{\"delta\":[-2280,325],\"delevation\":10}],\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0914154,39.5879165],[-105.0916346,39.5878851],[-105.0918433,39.5878639],[-105.0921546,39.5878547]]},\"properties\":{\"nodes\":[{\"delta\":[-2216,-915],\"delevation\":10},{\"delta\":[-2322,-471]},{\"delta\":[-1877,-349],\"delevation\":10},{\"delta\":[-1787,-235]},{\"delta\":[-2666,-102],\"delevation\":10}],\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.091436,39.5879812],[-105.0916658,39.5879507],[-105.091881,39.5879277],[-105.0921287,39.5878972]]},\"properties\":{\"nodes\":[{\"delta\":[-2295,-169],\"delevation\":10},{\"delta\":[-2420,-499]},{\"delta\":[-1968,-339],\"delevation\":10},{\"delta\":[-1843,-256]},{\"delta\":[-2121,-339]}],\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.0911481,39.5886317],[-105.091196,39.588862],[-105.0912349,39.5890282],[-105.0912722,39.5893202],[-105.0913306,39.5897261],[-105.0913695,39.5900324],[-105.0914008,39.5903008],[-105.0914893,39.5913099],[-105.091527,39.5923157]]},\"properties\":{\"nodes\":[{\"delta\":[-1364,1705],\"delevation\":10},{\"delta\":[-885,4854],\"delevation\":-30},{\"delta\":[-410,2559],\"delevation\":10},{\"delta\":[-333,1847],\"delevation\":-10},{\"delta\":[-319,3244],\"delevation\":-20},{\"delta\":[-500,4510]},{\"delta\":[-333,3403],\"delevation\":-30},{\"delta\":[-268,2982]},{\"delta\":[-758,11212],\"delevation\":-30},{\"delta\":[-323,11176],\"delevation\":-70}],\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.0911059,39.5886309],[-105.091144,39.5888313],[-105.0911829,39.5890442],[-105.0912308,39.5893169],[-105.0912689,39.5895877],[-105.0913005,39.5898143],[-105.0913313,39.5900714],[-105.0913597,39.5902968],[-105.0914461,39.5913017],[-105.0914756,39.592324]]},\"properties\":{\"nodes\":[{\"delta\":[-992,1735],\"delevation\":10},{\"delta\":[-896,4816],\"delevation\":-30},{\"delta\":[-326,2227],\"delevation\":10},{\"delta\":[-333,2366]},{\"delta\":[-410,3030],\"delevation\":-20},{\"delta\":[-326,3009],\"delevation\":-10},{\"delta\":[-271,2518],\"delevation\":-10},{\"delta\":[-264,2857],\"delevation\":-20},{\"delta\":[-243,2504]},{\"delta\":[-740,11165],\"delevation\":-30},{\"delta\":[-253,11359],\"delevation\":-70}],\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911549,39.5884681],[-105.091196,39.5886783],[-105.091222,39.5888049],[-105.0912401,39.5889649]]},\"properties\":{\"nodes\":[{\"delta\":[-1744,1607],\"delevation\":10},{\"delta\":[-563,3136],\"delevation\":-20},{\"delta\":[-352,2336],\"delevation\":-10},{\"delta\":[-223,1407],\"delevation\":10},{\"delta\":[-155,1778]}],\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0908389,39.5882151],[-105.0908478,39.5882471]]},\"properties\":{\"nodes\":[{\"delta\":[398,1931],\"delevation\":-10},{\"delta\":[-76,356]}],\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907875,39.58822],[-105.0907979,39.5882514]]},\"properties\":{\"nodes\":[{\"delta\":[838,1985],\"delevation\":-20},{\"delta\":[-89,349]}],\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.0911626,39.5880622]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0910008,39.5878477]]},\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.090959,39.5878557]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.090914,39.5878612]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911626,39.5880622]]},\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-02-22T23:26:22.074Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].id.region: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].id.region\",\"schemaPath\":\"#/$defs/J2735RoadRegulatorID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits\",\"schemaPath\":\"#/$defs/J2735SpeedLimitList_Wrapper/type\"}],\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-02-22T23:26:22.074Z\"}}"; - String inputProcessedMap3 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0906245,39.5876246],[-105.0905203,39.587281],[-105.0904383,39.5870554],[-105.0903588,39.5868383],[-105.0902622,39.5865865],[-105.0901249,39.5862612],[-105.0900451,39.5860819],[-105.0899283,39.5858283],[-105.0898739,39.5857117],[-105.0895814,39.5851569],[-105.0888764,39.5839527]]},\"properties\":{\"nodes\":[{\"delta\":[1511,-1514]},{\"delta\":[723,-3116],\"delevation\":10},{\"delta\":[892,-3818],\"delevation\":20},{\"delta\":[702,-2507],\"delevation\":20},{\"delta\":[681,-2412],\"delevation\":10},{\"delta\":[827,-2798],\"delevation\":10},{\"delta\":[1176,-3614],\"delevation\":20},{\"delta\":[683,-1992]},{\"delta\":[1000,-2818],\"delevation\":10},{\"delta\":[466,-1295],\"delevation\":20},{\"delta\":[2505,-6164],\"delevation\":20},{\"delta\":[6037,-13380],\"delevation\":70}],\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.090652,39.5875596],[-105.090534,39.5871793],[-105.0903457,39.5866864],[-105.0902123,39.5863581],[-105.0900802,39.5860572],[-105.0898164,39.5855019],[-105.0895409,39.5849856],[-105.088922,39.5839259]]},\"properties\":{\"nodes\":[{\"delta\":[1192,-1619]},{\"delta\":[807,-3733],\"delevation\":30},{\"delta\":[1010,-4226],\"delevation\":10},{\"delta\":[1612,-5477],\"delevation\":30},{\"delta\":[1142,-3648],\"delevation\":20},{\"delta\":[1131,-3343],\"delevation\":10},{\"delta\":[2259,-6170],\"delevation\":30},{\"delta\":[2359,-5737],\"delevation\":30},{\"delta\":[5300,-11774],\"delevation\":50}],\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.090747,39.5877247],[-105.0906498,39.5874141],[-105.0906262,39.5873356],[-105.0905865,39.5872922]]},\"properties\":{\"nodes\":[{\"delta\":[805,-1704],\"delevation\":10},{\"delta\":[380,-1813]},{\"delta\":[832,-3451],\"delevation\":30},{\"delta\":[202,-872]},{\"delta\":[340,-482],\"delevation\":-10}],\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910008,39.5878477],[-105.0909927,39.5878181]]},\"properties\":{\"nodes\":[{\"delta\":[-988,-2151],\"delevation\":20},{\"delta\":[69,-329]}],\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090959,39.5878557],[-105.0909501,39.5878218]]},\"properties\":{\"nodes\":[{\"delta\":[-630,-2062],\"delevation\":10},{\"delta\":[76,-377],\"delevation\":10}],\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090914,39.5878612],[-105.0909051,39.5878298]]},\"properties\":{\"nodes\":[{\"delta\":[-245,-2001],\"delevation\":10},{\"delta\":[76,-349]}],\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911626,39.5880622],[-105.0912043,39.5880536]]},\"properties\":{\"nodes\":[{\"delta\":[-2374,232],\"delevation\":10},{\"delta\":[-357,-96]}],\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0914565,39.5879427],[-105.0917937,39.5879029],[-105.0922121,39.5878724],[-105.0926509,39.5878748],[-105.0930303,39.5879073],[-105.0932697,39.5879503],[-105.0937243,39.5880569],[-105.0940309,39.5881258],[-105.0943257,39.5881804],[-105.094592,39.5882097]]},\"properties\":{\"nodes\":[{\"delta\":[-2246,-514],\"delevation\":10},{\"delta\":[-2644,-581]},{\"delta\":[-2887,-442],\"delevation\":10},{\"delta\":[-3583,-339],\"delevation\":10},{\"delta\":[-3757,27]},{\"delta\":[-3249,361],\"delevation\":-10},{\"delta\":[-2050,478]},{\"delta\":[-3893,1184]},{\"delta\":[-2625,766],\"delevation\":-10},{\"delta\":[-2524,607],\"delevation\":10},{\"delta\":[-2280,325],\"delevation\":10}],\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0914154,39.5879165],[-105.0916346,39.5878851],[-105.0918433,39.5878639],[-105.0921546,39.5878547]]},\"properties\":{\"nodes\":[{\"delta\":[-2216,-915],\"delevation\":10},{\"delta\":[-2322,-471]},{\"delta\":[-1877,-349],\"delevation\":10},{\"delta\":[-1787,-235]},{\"delta\":[-2666,-102],\"delevation\":10}],\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.091436,39.5879812],[-105.0916658,39.5879507],[-105.091881,39.5879277],[-105.0921287,39.5878972]]},\"properties\":{\"nodes\":[{\"delta\":[-2295,-169],\"delevation\":10},{\"delta\":[-2420,-499]},{\"delta\":[-1968,-339],\"delevation\":10},{\"delta\":[-1843,-256]},{\"delta\":[-2121,-339]}],\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.0911481,39.5886317],[-105.091196,39.588862],[-105.0912349,39.5890282],[-105.0912722,39.5893202],[-105.0913306,39.5897261],[-105.0913695,39.5900324],[-105.0914008,39.5903008],[-105.0914893,39.5913099],[-105.091527,39.5923157]]},\"properties\":{\"nodes\":[{\"delta\":[-1364,1705],\"delevation\":10},{\"delta\":[-885,4854],\"delevation\":-30},{\"delta\":[-410,2559],\"delevation\":10},{\"delta\":[-333,1847],\"delevation\":-10},{\"delta\":[-319,3244],\"delevation\":-20},{\"delta\":[-500,4510]},{\"delta\":[-333,3403],\"delevation\":-30},{\"delta\":[-268,2982]},{\"delta\":[-758,11212],\"delevation\":-30},{\"delta\":[-323,11176],\"delevation\":-70}],\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.0911059,39.5886309],[-105.091144,39.5888313],[-105.0911829,39.5890442],[-105.0912308,39.5893169],[-105.0912689,39.5895877],[-105.0913005,39.5898143],[-105.0913313,39.5900714],[-105.0913597,39.5902968],[-105.0914461,39.5913017],[-105.0914756,39.592324]]},\"properties\":{\"nodes\":[{\"delta\":[-992,1735],\"delevation\":10},{\"delta\":[-896,4816],\"delevation\":-30},{\"delta\":[-326,2227],\"delevation\":10},{\"delta\":[-333,2366]},{\"delta\":[-410,3030],\"delevation\":-20},{\"delta\":[-326,3009],\"delevation\":-10},{\"delta\":[-271,2518],\"delevation\":-10},{\"delta\":[-264,2857],\"delevation\":-20},{\"delta\":[-243,2504]},{\"delta\":[-740,11165],\"delevation\":-30},{\"delta\":[-253,11359],\"delevation\":-70}],\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911549,39.5884681],[-105.091196,39.5886783],[-105.091222,39.5888049],[-105.0912401,39.5889649]]},\"properties\":{\"nodes\":[{\"delta\":[-1744,1607],\"delevation\":10},{\"delta\":[-563,3136],\"delevation\":-20},{\"delta\":[-352,2336],\"delevation\":-10},{\"delta\":[-223,1407],\"delevation\":10},{\"delta\":[-155,1778]}],\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0908389,39.5882151],[-105.0908478,39.5882471]]},\"properties\":{\"nodes\":[{\"delta\":[398,1931],\"delevation\":-10},{\"delta\":[-76,356]}],\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907875,39.58822],[-105.0907979,39.5882514]]},\"properties\":{\"nodes\":[{\"delta\":[838,1985],\"delevation\":-20},{\"delta\":[-89,349]}],\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.0911626,39.5880622]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0910008,39.5878477]]},\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.090959,39.5878557]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.090914,39.5878612]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911626,39.5880622]]},\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-02-22T23:26:25.107Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1500},\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].id.region: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].id.region\",\"schemaPath\":\"#/$defs/J2735RoadRegulatorID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits\",\"schemaPath\":\"#/$defs/J2735SpeedLimitList_Wrapper/type\"}],\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-02-22T23:26:25.107Z\"}}"; - String inputProcessedMap4 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0906245,39.5876246],[-105.0905203,39.587281],[-105.0904383,39.5870554],[-105.0903588,39.5868383],[-105.0902622,39.5865865],[-105.0901249,39.5862612],[-105.0900451,39.5860819],[-105.0899283,39.5858283],[-105.0898739,39.5857117],[-105.0895814,39.5851569],[-105.0888764,39.5839527]]},\"properties\":{\"nodes\":[{\"delta\":[1511,-1514]},{\"delta\":[723,-3116],\"delevation\":10},{\"delta\":[892,-3818],\"delevation\":20},{\"delta\":[702,-2507],\"delevation\":20},{\"delta\":[681,-2412],\"delevation\":10},{\"delta\":[827,-2798],\"delevation\":10},{\"delta\":[1176,-3614],\"delevation\":20},{\"delta\":[683,-1992]},{\"delta\":[1000,-2818],\"delevation\":10},{\"delta\":[466,-1295],\"delevation\":20},{\"delta\":[2505,-6164],\"delevation\":20},{\"delta\":[6037,-13380],\"delevation\":70}],\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.090652,39.5875596],[-105.090534,39.5871793],[-105.0903457,39.5866864],[-105.0902123,39.5863581],[-105.0900802,39.5860572],[-105.0898164,39.5855019],[-105.0895409,39.5849856],[-105.088922,39.5839259]]},\"properties\":{\"nodes\":[{\"delta\":[1192,-1619]},{\"delta\":[807,-3733],\"delevation\":30},{\"delta\":[1010,-4226],\"delevation\":10},{\"delta\":[1612,-5477],\"delevation\":30},{\"delta\":[1142,-3648],\"delevation\":20},{\"delta\":[1131,-3343],\"delevation\":10},{\"delta\":[2259,-6170],\"delevation\":30},{\"delta\":[2359,-5737],\"delevation\":30},{\"delta\":[5300,-11774],\"delevation\":50}],\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.090747,39.5877247],[-105.0906498,39.5874141],[-105.0906262,39.5873356],[-105.0905865,39.5872922]]},\"properties\":{\"nodes\":[{\"delta\":[805,-1704],\"delevation\":10},{\"delta\":[380,-1813]},{\"delta\":[832,-3451],\"delevation\":30},{\"delta\":[202,-872]},{\"delta\":[340,-482],\"delevation\":-10}],\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910008,39.5878477],[-105.0909927,39.5878181]]},\"properties\":{\"nodes\":[{\"delta\":[-988,-2151],\"delevation\":20},{\"delta\":[69,-329]}],\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090959,39.5878557],[-105.0909501,39.5878218]]},\"properties\":{\"nodes\":[{\"delta\":[-630,-2062],\"delevation\":10},{\"delta\":[76,-377],\"delevation\":10}],\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090914,39.5878612],[-105.0909051,39.5878298]]},\"properties\":{\"nodes\":[{\"delta\":[-245,-2001],\"delevation\":10},{\"delta\":[76,-349]}],\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911626,39.5880622],[-105.0912043,39.5880536]]},\"properties\":{\"nodes\":[{\"delta\":[-2374,232],\"delevation\":10},{\"delta\":[-357,-96]}],\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0914565,39.5879427],[-105.0917937,39.5879029],[-105.0922121,39.5878724],[-105.0926509,39.5878748],[-105.0930303,39.5879073],[-105.0932697,39.5879503],[-105.0937243,39.5880569],[-105.0940309,39.5881258],[-105.0943257,39.5881804],[-105.094592,39.5882097]]},\"properties\":{\"nodes\":[{\"delta\":[-2246,-514],\"delevation\":10},{\"delta\":[-2644,-581]},{\"delta\":[-2887,-442],\"delevation\":10},{\"delta\":[-3583,-339],\"delevation\":10},{\"delta\":[-3757,27]},{\"delta\":[-3249,361],\"delevation\":-10},{\"delta\":[-2050,478]},{\"delta\":[-3893,1184]},{\"delta\":[-2625,766],\"delevation\":-10},{\"delta\":[-2524,607],\"delevation\":10},{\"delta\":[-2280,325],\"delevation\":10}],\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0914154,39.5879165],[-105.0916346,39.5878851],[-105.0918433,39.5878639],[-105.0921546,39.5878547]]},\"properties\":{\"nodes\":[{\"delta\":[-2216,-915],\"delevation\":10},{\"delta\":[-2322,-471]},{\"delta\":[-1877,-349],\"delevation\":10},{\"delta\":[-1787,-235]},{\"delta\":[-2666,-102],\"delevation\":10}],\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.091436,39.5879812],[-105.0916658,39.5879507],[-105.091881,39.5879277],[-105.0921287,39.5878972]]},\"properties\":{\"nodes\":[{\"delta\":[-2295,-169],\"delevation\":10},{\"delta\":[-2420,-499]},{\"delta\":[-1968,-339],\"delevation\":10},{\"delta\":[-1843,-256]},{\"delta\":[-2121,-339]}],\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.0911481,39.5886317],[-105.091196,39.588862],[-105.0912349,39.5890282],[-105.0912722,39.5893202],[-105.0913306,39.5897261],[-105.0913695,39.5900324],[-105.0914008,39.5903008],[-105.0914893,39.5913099],[-105.091527,39.5923157]]},\"properties\":{\"nodes\":[{\"delta\":[-1364,1705],\"delevation\":10},{\"delta\":[-885,4854],\"delevation\":-30},{\"delta\":[-410,2559],\"delevation\":10},{\"delta\":[-333,1847],\"delevation\":-10},{\"delta\":[-319,3244],\"delevation\":-20},{\"delta\":[-500,4510]},{\"delta\":[-333,3403],\"delevation\":-30},{\"delta\":[-268,2982]},{\"delta\":[-758,11212],\"delevation\":-30},{\"delta\":[-323,11176],\"delevation\":-70}],\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.0911059,39.5886309],[-105.091144,39.5888313],[-105.0911829,39.5890442],[-105.0912308,39.5893169],[-105.0912689,39.5895877],[-105.0913005,39.5898143],[-105.0913313,39.5900714],[-105.0913597,39.5902968],[-105.0914461,39.5913017],[-105.0914756,39.592324]]},\"properties\":{\"nodes\":[{\"delta\":[-992,1735],\"delevation\":10},{\"delta\":[-896,4816],\"delevation\":-30},{\"delta\":[-326,2227],\"delevation\":10},{\"delta\":[-333,2366]},{\"delta\":[-410,3030],\"delevation\":-20},{\"delta\":[-326,3009],\"delevation\":-10},{\"delta\":[-271,2518],\"delevation\":-10},{\"delta\":[-264,2857],\"delevation\":-20},{\"delta\":[-243,2504]},{\"delta\":[-740,11165],\"delevation\":-30},{\"delta\":[-253,11359],\"delevation\":-70}],\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911549,39.5884681],[-105.091196,39.5886783],[-105.091222,39.5888049],[-105.0912401,39.5889649]]},\"properties\":{\"nodes\":[{\"delta\":[-1744,1607],\"delevation\":10},{\"delta\":[-563,3136],\"delevation\":-20},{\"delta\":[-352,2336],\"delevation\":-10},{\"delta\":[-223,1407],\"delevation\":10},{\"delta\":[-155,1778]}],\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0908389,39.5882151],[-105.0908478,39.5882471]]},\"properties\":{\"nodes\":[{\"delta\":[398,1931],\"delevation\":-10},{\"delta\":[-76,356]}],\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907875,39.58822],[-105.0907979,39.5882514]]},\"properties\":{\"nodes\":[{\"delta\":[838,1985],\"delevation\":-20},{\"delta\":[-89,349]}],\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.0911626,39.5880622]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0910008,39.5878477]]},\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.090959,39.5878557]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.090914,39.5878612]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911626,39.5880622]]},\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-02-22T23:26:26.114Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].id.region: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].id.region\",\"schemaPath\":\"#/$defs/J2735RoadRegulatorID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits\",\"schemaPath\":\"#/$defs/J2735SpeedLimitList_Wrapper/type\"}],\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-02-22T23:26:26.114Z\"}}"; - - - String key = "{\"rsuId\":\"10.11.81.12\",\"intersectionId\":12109,\"region\":-1}"; - - @Autowired - DeduplicatorProperties props; - - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicProcessedMap(inputTopic); - props.setKafkaTopicDeduplicatedProcessedMap(outputTopic); - - ProcessedMapDeduplicatorTopology processedMapDeduplicatorTopology = new ProcessedMapDeduplicatorTopology(props, null); - - Topology topology = processedMapDeduplicatorTopology.buildTopology(); - objectMapper.registerModule(new JavaTimeModule()); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputProcessedMapData = driver.createInputTopic( - inputTopic, - Serdes.String().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic> outputProcessedMapData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - JsonSerdes.ProcessedMapGeoJson().deserializer()); - - inputProcessedMapData.pipeInput(key, inputProcessedMap1); - inputProcessedMapData.pipeInput(key, inputProcessedMap2); - inputProcessedMapData.pipeInput(key, inputProcessedMap3); - inputProcessedMapData.pipeInput(key, inputProcessedMap4); - - List>> mapDeduplicatorResults = outputProcessedMapData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(3, mapDeduplicatorResults.size()); - - ProcessedMap map1 = objectMapper.readValue(inputProcessedMap1, typeReference); - ProcessedMap map3 = objectMapper.readValue(inputProcessedMap3, typeReference); - ProcessedMap map4 = objectMapper.readValue(inputProcessedMap4, typeReference); - - assertEquals(map1.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(0).value.getProperties().getOdeReceivedAt()); - assertEquals(map3.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(1).value.getProperties().getOdeReceivedAt()); - assertEquals(map4.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(2).value.getProperties().getOdeReceivedAt()); - - } catch (JsonMappingException e) { - e.printStackTrace(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapWktDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapWktDeduplicatorTopologyTest.java deleted file mode 100644 index 7b1d2fb..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedMapWktDeduplicatorTopologyTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package deduplicator; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedMapWktDeduplicatorTopology; -import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - -public class ProcessedMapWktDeduplicatorTopologyTest { - - String inputTopic = "topic.ProcessedMapWKT"; - String outputTopic = "topic.DeduplicatedProcessedMapWKT"; - - - TypeReference> typeReference = new TypeReference<>(){}; - ObjectMapper objectMapper = new ObjectMapper(); - - String inputProcessedMapWkt1 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0906245 39.5876246, -105.0905203 39.587281, -105.0904383 39.5870554, -105.0903588 39.5868383, -105.0902622 39.5865865, -105.0901249 39.5862612, -105.0900451 39.5860819, -105.0899283 39.5858283, -105.0898739 39.5857117, -105.0895814 39.5851569, -105.0888764 39.5839527)\",\"properties\":{\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.090652 39.5875596, -105.090534 39.5871793, -105.0903457 39.5866864, -105.0902123 39.5863581, -105.0900802 39.5860572, -105.0898164 39.5855019, -105.0895409 39.5849856, -105.088922 39.5839259)\",\"properties\":{\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.090747 39.5877247, -105.0906498 39.5874141, -105.0906262 39.5873356, -105.0905865 39.5872922)\",\"properties\":{\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":\"LINESTRING (-105.0910008 39.5878477, -105.0909927 39.5878181)\",\"properties\":{\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":\"LINESTRING (-105.090959 39.5878557, -105.0909501 39.5878218)\",\"properties\":{\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":\"LINESTRING (-105.090914 39.5878612, -105.0909051 39.5878298)\",\"properties\":{\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":\"LINESTRING (-105.0911626 39.5880622, -105.0912043 39.5880536)\",\"properties\":{\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0914565 39.5879427, -105.0917937 39.5879029, -105.0922121 39.5878724, -105.0926509 39.5878748, -105.0930303 39.5879073, -105.0932697 39.5879503, -105.0937243 39.5880569, -105.0940309 39.5881258, -105.0943257 39.5881804, -105.094592 39.5882097)\",\"properties\":{\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0914154 39.5879165, -105.0916346 39.5878851, -105.0918433 39.5878639, -105.0921546 39.5878547)\",\"properties\":{\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.091436 39.5879812, -105.0916658 39.5879507, -105.091881 39.5879277, -105.0921287 39.5878972)\",\"properties\":{\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.0911481 39.5886317, -105.091196 39.588862, -105.0912349 39.5890282, -105.0912722 39.5893202, -105.0913306 39.5897261, -105.0913695 39.5900324, -105.0914008 39.5903008, -105.0914893 39.5913099, -105.091527 39.5923157)\",\"properties\":{\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.0911059 39.5886309, -105.091144 39.5888313, -105.0911829 39.5890442, -105.0912308 39.5893169, -105.0912689 39.5895877, -105.0913005 39.5898143, -105.0913313 39.5900714, -105.0913597 39.5902968, -105.0914461 39.5913017, -105.0914756 39.592324)\",\"properties\":{\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911549 39.5884681, -105.091196 39.5886783, -105.091222 39.5888049, -105.0912401 39.5889649)\",\"properties\":{\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":\"LINESTRING (-105.0908389 39.5882151, -105.0908478 39.5882471)\",\"properties\":{\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":\"LINESTRING (-105.0907875 39.58822, -105.0907979 39.5882514)\",\"properties\":{\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.0911626 39.5880622)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0910008 39.5878477)\",\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.090959 39.5878557)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.090914 39.5878612)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911626 39.5880622)\",\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-05-06T21:35:21.713Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1500},\"cti4501Conformant\":false,\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-05-06T21:35:21.713Z\"}}"; - - - //String inputProcessedMapWkt1 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0906245,39.5876246],[-105.0905203,39.587281],[-105.0904383,39.5870554],[-105.0903588,39.5868383],[-105.0902622,39.5865865],[-105.0901249,39.5862612],[-105.0900451,39.5860819],[-105.0899283,39.5858283],[-105.0898739,39.5857117],[-105.0895814,39.5851569],[-105.0888764,39.5839527]]},\"properties\":{\"nodes\":[{\"delta\":[1511,-1514]},{\"delta\":[723,-3116],\"delevation\":10},{\"delta\":[892,-3818],\"delevation\":20},{\"delta\":[702,-2507],\"delevation\":20},{\"delta\":[681,-2412],\"delevation\":10},{\"delta\":[827,-2798],\"delevation\":10},{\"delta\":[1176,-3614],\"delevation\":20},{\"delta\":[683,-1992]},{\"delta\":[1000,-2818],\"delevation\":10},{\"delta\":[466,-1295],\"delevation\":20},{\"delta\":[2505,-6164],\"delevation\":20},{\"delta\":[6037,-13380],\"delevation\":70}],\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.090652,39.5875596],[-105.090534,39.5871793],[-105.0903457,39.5866864],[-105.0902123,39.5863581],[-105.0900802,39.5860572],[-105.0898164,39.5855019],[-105.0895409,39.5849856],[-105.088922,39.5839259]]},\"properties\":{\"nodes\":[{\"delta\":[1192,-1619]},{\"delta\":[807,-3733],\"delevation\":30},{\"delta\":[1010,-4226],\"delevation\":10},{\"delta\":[1612,-5477],\"delevation\":30},{\"delta\":[1142,-3648],\"delevation\":20},{\"delta\":[1131,-3343],\"delevation\":10},{\"delta\":[2259,-6170],\"delevation\":30},{\"delta\":[2359,-5737],\"delevation\":30},{\"delta\":[5300,-11774],\"delevation\":50}],\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.090747,39.5877247],[-105.0906498,39.5874141],[-105.0906262,39.5873356],[-105.0905865,39.5872922]]},\"properties\":{\"nodes\":[{\"delta\":[805,-1704],\"delevation\":10},{\"delta\":[380,-1813]},{\"delta\":[832,-3451],\"delevation\":30},{\"delta\":[202,-872]},{\"delta\":[340,-482],\"delevation\":-10}],\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910008,39.5878477],[-105.0909927,39.5878181]]},\"properties\":{\"nodes\":[{\"delta\":[-988,-2151],\"delevation\":20},{\"delta\":[69,-329]}],\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090959,39.5878557],[-105.0909501,39.5878218]]},\"properties\":{\"nodes\":[{\"delta\":[-630,-2062],\"delevation\":10},{\"delta\":[76,-377],\"delevation\":10}],\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.090914,39.5878612],[-105.0909051,39.5878298]]},\"properties\":{\"nodes\":[{\"delta\":[-245,-2001],\"delevation\":10},{\"delta\":[76,-349]}],\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911626,39.5880622],[-105.0912043,39.5880536]]},\"properties\":{\"nodes\":[{\"delta\":[-2374,232],\"delevation\":10},{\"delta\":[-357,-96]}],\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0914565,39.5879427],[-105.0917937,39.5879029],[-105.0922121,39.5878724],[-105.0926509,39.5878748],[-105.0930303,39.5879073],[-105.0932697,39.5879503],[-105.0937243,39.5880569],[-105.0940309,39.5881258],[-105.0943257,39.5881804],[-105.094592,39.5882097]]},\"properties\":{\"nodes\":[{\"delta\":[-2246,-514],\"delevation\":10},{\"delta\":[-2644,-581]},{\"delta\":[-2887,-442],\"delevation\":10},{\"delta\":[-3583,-339],\"delevation\":10},{\"delta\":[-3757,27]},{\"delta\":[-3249,361],\"delevation\":-10},{\"delta\":[-2050,478]},{\"delta\":[-3893,1184]},{\"delta\":[-2625,766],\"delevation\":-10},{\"delta\":[-2524,607],\"delevation\":10},{\"delta\":[-2280,325],\"delevation\":10}],\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0914154,39.5879165],[-105.0916346,39.5878851],[-105.0918433,39.5878639],[-105.0921546,39.5878547]]},\"properties\":{\"nodes\":[{\"delta\":[-2216,-915],\"delevation\":10},{\"delta\":[-2322,-471]},{\"delta\":[-1877,-349],\"delevation\":10},{\"delta\":[-1787,-235]},{\"delta\":[-2666,-102],\"delevation\":10}],\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.091436,39.5879812],[-105.0916658,39.5879507],[-105.091881,39.5879277],[-105.0921287,39.5878972]]},\"properties\":{\"nodes\":[{\"delta\":[-2295,-169],\"delevation\":10},{\"delta\":[-2420,-499]},{\"delta\":[-1968,-339],\"delevation\":10},{\"delta\":[-1843,-256]},{\"delta\":[-2121,-339]}],\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.0911481,39.5886317],[-105.091196,39.588862],[-105.0912349,39.5890282],[-105.0912722,39.5893202],[-105.0913306,39.5897261],[-105.0913695,39.5900324],[-105.0914008,39.5903008],[-105.0914893,39.5913099],[-105.091527,39.5923157]]},\"properties\":{\"nodes\":[{\"delta\":[-1364,1705],\"delevation\":10},{\"delta\":[-885,4854],\"delevation\":-30},{\"delta\":[-410,2559],\"delevation\":10},{\"delta\":[-333,1847],\"delevation\":-10},{\"delta\":[-319,3244],\"delevation\":-20},{\"delta\":[-500,4510]},{\"delta\":[-333,3403],\"delevation\":-30},{\"delta\":[-268,2982]},{\"delta\":[-758,11212],\"delevation\":-30},{\"delta\":[-323,11176],\"delevation\":-70}],\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.0911059,39.5886309],[-105.091144,39.5888313],[-105.0911829,39.5890442],[-105.0912308,39.5893169],[-105.0912689,39.5895877],[-105.0913005,39.5898143],[-105.0913313,39.5900714],[-105.0913597,39.5902968],[-105.0914461,39.5913017],[-105.0914756,39.592324]]},\"properties\":{\"nodes\":[{\"delta\":[-992,1735],\"delevation\":10},{\"delta\":[-896,4816],\"delevation\":-30},{\"delta\":[-326,2227],\"delevation\":10},{\"delta\":[-333,2366]},{\"delta\":[-410,3030],\"delevation\":-20},{\"delta\":[-326,3009],\"delevation\":-10},{\"delta\":[-271,2518],\"delevation\":-10},{\"delta\":[-264,2857],\"delevation\":-20},{\"delta\":[-243,2504]},{\"delta\":[-740,11165],\"delevation\":-30},{\"delta\":[-253,11359],\"delevation\":-70}],\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911549,39.5884681],[-105.091196,39.5886783],[-105.091222,39.5888049],[-105.0912401,39.5889649]]},\"properties\":{\"nodes\":[{\"delta\":[-1744,1607],\"delevation\":10},{\"delta\":[-563,3136],\"delevation\":-20},{\"delta\":[-352,2336],\"delevation\":-10},{\"delta\":[-223,1407],\"delevation\":10},{\"delta\":[-155,1778]}],\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0908389,39.5882151],[-105.0908478,39.5882471]]},\"properties\":{\"nodes\":[{\"delta\":[398,1931],\"delevation\":-10},{\"delta\":[-76,356]}],\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907875,39.58822],[-105.0907979,39.5882514]]},\"properties\":{\"nodes\":[{\"delta\":[838,1985],\"delevation\":-20},{\"delta\":[-89,349]}],\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907089,39.587905],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907462,39.5878956],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0907914,39.5878879],[-105.0911626,39.5880622]]},\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911477,39.587995],[-105.0907875,39.58822]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911442,39.5879589],[-105.0910008,39.5878477]]},\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0911534,39.5880261],[-105.0908389,39.5882151]]},\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910447,39.5881948],[-105.090959,39.5878557]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910013,39.5881975],[-105.090914,39.5878612]]},\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[-105.0910891,39.5881859],[-105.0911626,39.5880622]]},\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-02-22T23:26:26.114Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].id.region: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].id.region\",\"schemaPath\":\"#/$defs/J2735RoadRegulatorID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[3].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[4].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[5].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[6].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[8].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup: null found, integer expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[12].connectsTo.connectsTo[0].signalGroup\",\"schemaPath\":\"#/$defs/J2735SignalGroupID/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[13].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].connectsTo\",\"schemaPath\":\"#/$defs/J2735ConnectsToList_Wrapper/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].laneSet.GenericLane[14].maneuvers\",\"schemaPath\":\"#/$defs/J2735AllowedManeuvers/type\"},{\"message\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits: null found, object expected\",\"jsonPath\":\"$.payload.data.intersections.intersectionGeometry[0].speedLimits\",\"schemaPath\":\"#/$defs/J2735SpeedLimitList_Wrapper/type\"}],\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-02-22T23:26:26.114Z\"}}"; - String inputProcessedMapWkt2 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0906245 39.5876246, -105.0905203 39.587281, -105.0904383 39.5870554, -105.0903588 39.5868383, -105.0902622 39.5865865, -105.0901249 39.5862612, -105.0900451 39.5860819, -105.0899283 39.5858283, -105.0898739 39.5857117, -105.0895814 39.5851569, -105.0888764 39.5839527)\",\"properties\":{\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.090652 39.5875596, -105.090534 39.5871793, -105.0903457 39.5866864, -105.0902123 39.5863581, -105.0900802 39.5860572, -105.0898164 39.5855019, -105.0895409 39.5849856, -105.088922 39.5839259)\",\"properties\":{\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.090747 39.5877247, -105.0906498 39.5874141, -105.0906262 39.5873356, -105.0905865 39.5872922)\",\"properties\":{\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":\"LINESTRING (-105.0910008 39.5878477, -105.0909927 39.5878181)\",\"properties\":{\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":\"LINESTRING (-105.090959 39.5878557, -105.0909501 39.5878218)\",\"properties\":{\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":\"LINESTRING (-105.090914 39.5878612, -105.0909051 39.5878298)\",\"properties\":{\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":\"LINESTRING (-105.0911626 39.5880622, -105.0912043 39.5880536)\",\"properties\":{\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0914565 39.5879427, -105.0917937 39.5879029, -105.0922121 39.5878724, -105.0926509 39.5878748, -105.0930303 39.5879073, -105.0932697 39.5879503, -105.0937243 39.5880569, -105.0940309 39.5881258, -105.0943257 39.5881804, -105.094592 39.5882097)\",\"properties\":{\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0914154 39.5879165, -105.0916346 39.5878851, -105.0918433 39.5878639, -105.0921546 39.5878547)\",\"properties\":{\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.091436 39.5879812, -105.0916658 39.5879507, -105.091881 39.5879277, -105.0921287 39.5878972)\",\"properties\":{\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.0911481 39.5886317, -105.091196 39.588862, -105.0912349 39.5890282, -105.0912722 39.5893202, -105.0913306 39.5897261, -105.0913695 39.5900324, -105.0914008 39.5903008, -105.0914893 39.5913099, -105.091527 39.5923157)\",\"properties\":{\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.0911059 39.5886309, -105.091144 39.5888313, -105.0911829 39.5890442, -105.0912308 39.5893169, -105.0912689 39.5895877, -105.0913005 39.5898143, -105.0913313 39.5900714, -105.0913597 39.5902968, -105.0914461 39.5913017, -105.0914756 39.592324)\",\"properties\":{\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911549 39.5884681, -105.091196 39.5886783, -105.091222 39.5888049, -105.0912401 39.5889649)\",\"properties\":{\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":\"LINESTRING (-105.0908389 39.5882151, -105.0908478 39.5882471)\",\"properties\":{\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":\"LINESTRING (-105.0907875 39.58822, -105.0907979 39.5882514)\",\"properties\":{\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.0911626 39.5880622)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0910008 39.5878477)\",\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.090959 39.5878557)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.090914 39.5878612)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911626 39.5880622)\",\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-05-03T20:58:48.748Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-05-03T20:58:48.748Z\"}}"; - String inputProcessedMapWkt3 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0906245 39.5876246, -105.0905203 39.587281, -105.0904383 39.5870554, -105.0903588 39.5868383, -105.0902622 39.5865865, -105.0901249 39.5862612, -105.0900451 39.5860819, -105.0899283 39.5858283, -105.0898739 39.5857117, -105.0895814 39.5851569, -105.0888764 39.5839527)\",\"properties\":{\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.090652 39.5875596, -105.090534 39.5871793, -105.0903457 39.5866864, -105.0902123 39.5863581, -105.0900802 39.5860572, -105.0898164 39.5855019, -105.0895409 39.5849856, -105.088922 39.5839259)\",\"properties\":{\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.090747 39.5877247, -105.0906498 39.5874141, -105.0906262 39.5873356, -105.0905865 39.5872922)\",\"properties\":{\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":\"LINESTRING (-105.0910008 39.5878477, -105.0909927 39.5878181)\",\"properties\":{\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":\"LINESTRING (-105.090959 39.5878557, -105.0909501 39.5878218)\",\"properties\":{\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":\"LINESTRING (-105.090914 39.5878612, -105.0909051 39.5878298)\",\"properties\":{\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":\"LINESTRING (-105.0911626 39.5880622, -105.0912043 39.5880536)\",\"properties\":{\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0914565 39.5879427, -105.0917937 39.5879029, -105.0922121 39.5878724, -105.0926509 39.5878748, -105.0930303 39.5879073, -105.0932697 39.5879503, -105.0937243 39.5880569, -105.0940309 39.5881258, -105.0943257 39.5881804, -105.094592 39.5882097)\",\"properties\":{\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0914154 39.5879165, -105.0916346 39.5878851, -105.0918433 39.5878639, -105.0921546 39.5878547)\",\"properties\":{\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.091436 39.5879812, -105.0916658 39.5879507, -105.091881 39.5879277, -105.0921287 39.5878972)\",\"properties\":{\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.0911481 39.5886317, -105.091196 39.588862, -105.0912349 39.5890282, -105.0912722 39.5893202, -105.0913306 39.5897261, -105.0913695 39.5900324, -105.0914008 39.5903008, -105.0914893 39.5913099, -105.091527 39.5923157)\",\"properties\":{\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.0911059 39.5886309, -105.091144 39.5888313, -105.0911829 39.5890442, -105.0912308 39.5893169, -105.0912689 39.5895877, -105.0913005 39.5898143, -105.0913313 39.5900714, -105.0913597 39.5902968, -105.0914461 39.5913017, -105.0914756 39.592324)\",\"properties\":{\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911549 39.5884681, -105.091196 39.5886783, -105.091222 39.5888049, -105.0912401 39.5889649)\",\"properties\":{\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":\"LINESTRING (-105.0908389 39.5882151, -105.0908478 39.5882471)\",\"properties\":{\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":\"LINESTRING (-105.0907875 39.58822, -105.0907979 39.5882514)\",\"properties\":{\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.0911626 39.5880622)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0910008 39.5878477)\",\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.090959 39.5878557)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.090914 39.5878612)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911626 39.5880622)\",\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-05-03T20:58:48.748Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-05-03T20:59:48.748Z\"}}"; - String inputProcessedMapWkt4 = "{\"mapFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":1,\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0906245 39.5876246, -105.0905203 39.587281, -105.0904383 39.5870554, -105.0903588 39.5868383, -105.0902622 39.5865865, -105.0901249 39.5862612, -105.0900451 39.5860819, -105.0899283 39.5858283, -105.0898739 39.5857117, -105.0895814 39.5851569, -105.0888764 39.5839527)\",\"properties\":{\"laneId\":1,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":2,\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.090652 39.5875596, -105.090534 39.5871793, -105.0903457 39.5866864, -105.0902123 39.5863581, -105.0900802 39.5860572, -105.0898164 39.5855019, -105.0895409 39.5849856, -105.088922 39.5839259)\",\"properties\":{\"laneId\":2,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":3,\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.090747 39.5877247, -105.0906498 39.5874141, -105.0906262 39.5873356, -105.0905865 39.5872922)\",\"properties\":{\"laneId\":3,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":1,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":2,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":6,\"geometry\":\"LINESTRING (-105.0910008 39.5878477, -105.0909927 39.5878181)\",\"properties\":{\"laneId\":6,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":5,\"geometry\":\"LINESTRING (-105.090959 39.5878557, -105.0909501 39.5878218)\",\"properties\":{\"laneId\":5,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":4,\"geometry\":\"LINESTRING (-105.090914 39.5878612, -105.0909051 39.5878298)\",\"properties\":{\"laneId\":4,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":2,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":10,\"geometry\":\"LINESTRING (-105.0911626 39.5880622, -105.0912043 39.5880536)\",\"properties\":{\"laneId\":10,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":4,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":8,\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0914565 39.5879427, -105.0917937 39.5879029, -105.0922121 39.5878724, -105.0926509 39.5878748, -105.0930303 39.5879073, -105.0932697 39.5879503, -105.0937243 39.5880569, -105.0940309 39.5881258, -105.0943257 39.5881804, -105.094592 39.5882097)\",\"properties\":{\"laneId\":8,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":15,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":7,\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0914154 39.5879165, -105.0916346 39.5878851, -105.0918433 39.5878639, -105.0921546 39.5878547)\",\"properties\":{\"laneId\":7,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":6,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":9,\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.091436 39.5879812, -105.0916658 39.5879507, -105.091881 39.5879277, -105.0921287 39.5878972)\",\"properties\":{\"laneId\":9,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":3,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":14,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":true,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":4,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":12,\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.0911481 39.5886317, -105.091196 39.588862, -105.0912349 39.5890282, -105.0912722 39.5893202, -105.0913306 39.5897261, -105.0913695 39.5900324, -105.0914008 39.5903008, -105.0914893 39.5913099, -105.091527 39.5923157)\",\"properties\":{\"laneId\":12,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":5,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":13,\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.0911059 39.5886309, -105.091144 39.5888313, -105.0911829 39.5890442, -105.0912308 39.5893169, -105.0912689 39.5895877, -105.0913005 39.5898143, -105.0913313 39.5900714, -105.0913597 39.5902968, -105.0914461 39.5913017, -105.0914756 39.592324)\",\"properties\":{\"laneId\":13,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":4,\"maneuver\":{\"maneuverStraightAllowed\":true,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":false,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"signalGroup\":6,\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":11,\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911549 39.5884681, -105.091196 39.5886783, -105.091222 39.5888049, -105.0912401 39.5889649)\",\"properties\":{\"laneId\":11,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":0,\"ingressApproach\":5,\"ingressPath\":true,\"egressPath\":false,\"maneuvers\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false},\"connectsTo\":[{\"connectingLane\":{\"lane\":10,\"maneuver\":{\"maneuverStraightAllowed\":false,\"maneuverNoStoppingAllowed\":false,\"goWithHalt\":false,\"maneuverLeftAllowed\":false,\"maneuverUTurnAllowed\":false,\"maneuverLeftTurnOnRedAllowed\":false,\"reserved1\":false,\"maneuverRightAllowed\":true,\"maneuverLaneChangeAllowed\":false,\"yieldAllwaysRequired\":false,\"maneuverRightTurnOnRedAllowed\":false,\"caution\":false}},\"connectionID\":1}]}},{\"type\":\"Feature\",\"id\":14,\"geometry\":\"LINESTRING (-105.0908389 39.5882151, -105.0908478 39.5882471)\",\"properties\":{\"laneId\":14,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}},{\"type\":\"Feature\",\"id\":15,\"geometry\":\"LINESTRING (-105.0907875 39.58822, -105.0907979 39.5882514)\",\"properties\":{\"laneId\":15,\"laneType\":{\"vehicle\":{\"isVehicleRevocableLane\":false,\"isVehicleFlyOverLane\":false,\"permissionOnRequest\":false,\"hasIRbeaconCoverage\":false,\"restrictedToBusUse\":false,\"restrictedToTaxiUse\":false,\"restrictedFromPublicUse\":false,\"hovLaneUseOnly\":false}},\"sharedWith\":{\"busVehicleTraffic\":false,\"trackedVehicleTraffic\":false,\"individualMotorizedVehicleTraffic\":false,\"taxiVehicleTraffic\":false,\"overlappingLaneDescriptionProvided\":false,\"cyclistVehicleTraffic\":false,\"otherNonMotorizedTrafficTypes\":false,\"multipleLanesTreatedAsOneLane\":false,\"pedestrianTraffic\":false,\"pedestriansTraffic\":false},\"egressApproach\":6,\"ingressApproach\":0,\"ingressPath\":false,\"egressPath\":true}}]},\"connectingLanesFeatureCollection\":{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"id\":\"1-15\",\"geometry\":\"LINESTRING (-105.0907089 39.587905, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":1,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"2-14\",\"geometry\":\"LINESTRING (-105.0907462 39.5878956, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":2,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"3-10\",\"geometry\":\"LINESTRING (-105.0907914 39.5878879, -105.0911626 39.5880622)\",\"properties\":{\"signalGroupId\":2,\"ingressLaneId\":3,\"egressLaneId\":10}},{\"type\":\"Feature\",\"id\":\"8-15\",\"geometry\":\"LINESTRING (-105.0911477 39.587995, -105.0907875 39.58822)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":8,\"egressLaneId\":15}},{\"type\":\"Feature\",\"id\":\"7-6\",\"geometry\":\"LINESTRING (-105.0911442 39.5879589, -105.0910008 39.5878477)\",\"properties\":{\"ingressLaneId\":7,\"egressLaneId\":6}},{\"type\":\"Feature\",\"id\":\"9-14\",\"geometry\":\"LINESTRING (-105.0911534 39.5880261, -105.0908389 39.5882151)\",\"properties\":{\"signalGroupId\":4,\"ingressLaneId\":9,\"egressLaneId\":14}},{\"type\":\"Feature\",\"id\":\"12-5\",\"geometry\":\"LINESTRING (-105.0910447 39.5881948, -105.090959 39.5878557)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":12,\"egressLaneId\":5}},{\"type\":\"Feature\",\"id\":\"13-4\",\"geometry\":\"LINESTRING (-105.0910013 39.5881975, -105.090914 39.5878612)\",\"properties\":{\"signalGroupId\":6,\"ingressLaneId\":13,\"egressLaneId\":4}},{\"type\":\"Feature\",\"id\":\"11-10\",\"geometry\":\"LINESTRING (-105.0910891 39.5881859, -105.0911626 39.5880622)\",\"properties\":{\"ingressLaneId\":11,\"egressLaneId\":10}}]},\"properties\":{\"messageType\":\"MAP\",\"odeReceivedAt\":\"2024-05-03T20:58:48.748Z\",\"originIp\":\"10.11.81.12\",\"intersectionId\":12109,\"msgIssueRevision\":2,\"revision\":2,\"refPoint\":{\"latitude\":39.5880413,\"longitude\":-105.0908854,\"elevation\":1691},\"cti4501Conformant\":false,\"laneWidth\":366,\"mapSource\":\"RSU\",\"timeStamp\":\"2024-05-03T22:00:48.748Z\"}}"; - - String key = "{\"rsuId\":\"10.11.81.12\",\"intersectionId\":12109,\"region\":-1}"; - - @Autowired - DeduplicatorProperties props; - - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicProcessedMapWKT(inputTopic); - props.setKafkaTopicDeduplicatedProcessedMapWKT(outputTopic); - - ProcessedMapWktDeduplicatorTopology processedMapDeduplicatorTopology = new ProcessedMapWktDeduplicatorTopology(props, null); - - Topology topology = processedMapDeduplicatorTopology.buildTopology(); - objectMapper.registerModule(new JavaTimeModule()); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputProcessedMapData = driver.createInputTopic( - inputTopic, - Serdes.String().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic> outputProcessedMapData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - JsonSerdes.ProcessedMapWKT().deserializer()); - - inputProcessedMapData.pipeInput(key, inputProcessedMapWkt1); - inputProcessedMapData.pipeInput(key, inputProcessedMapWkt2); - inputProcessedMapData.pipeInput(key, inputProcessedMapWkt3); - inputProcessedMapData.pipeInput(key, inputProcessedMapWkt4); - - List>> mapDeduplicatorResults = outputProcessedMapData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(3, mapDeduplicatorResults.size()); - - ProcessedMap map1 = objectMapper.readValue(inputProcessedMapWkt1, typeReference); - ProcessedMap map2 = objectMapper.readValue(inputProcessedMapWkt2, typeReference); - ProcessedMap map4 = objectMapper.readValue(inputProcessedMapWkt4, typeReference); - - assertEquals(map1.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(0).value.getProperties().getOdeReceivedAt()); - assertEquals(map2.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(1).value.getProperties().getOdeReceivedAt()); - assertEquals(map4.getProperties().getOdeReceivedAt(), mapDeduplicatorResults.get(2).value.getProperties().getOdeReceivedAt()); - - - - } catch (JsonMappingException e) { - e.printStackTrace(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedSpatDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedSpatDeduplicatorTopologyTest.java deleted file mode 100644 index 96fd914..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/ProcessedSpatDeduplicatorTopologyTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package deduplicator; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.ProcessedSpatDeduplicatorTopology; -import us.dot.its.jpo.geojsonconverter.pojos.spat.ProcessedSpat; -import us.dot.its.jpo.geojsonconverter.serialization.JsonSerdes; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class ProcessedSpatDeduplicatorTopologyTest { - - String inputTopic = "topic.ProcessedSpat"; - String outputTopic = "topic.DeduplicatedProcessedSpat"; - - - TypeReference typeReference = new TypeReference<>(){}; - ObjectMapper objectMapper = new ObjectMapper(); - - String inputProcessedSpat1 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:49:05.278Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":7,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]},{\"signalGroup\":8,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]}]}"; - String inputProcessedSpat2 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:49:05.378Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":7,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]},{\"signalGroup\":8,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]}]}"; - String inputProcessedSpat3 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:50:05.478Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":7,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]},{\"signalGroup\":8,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]}]}"; - String inputProcessedSpat4 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:50:05.578Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"PROTECTED_MOVEMENT_ALLOWED\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":7,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]},{\"signalGroup\":8,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]}]}"; - String inputProcessedSpat5 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:50:05.678Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"PROTECTED_MOVEMENT_ALLOWED\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":7,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]}]}"; - String inputProcessedSpat6 = "{\"schemaVersion\":-1,\"messageType\":\"SPAT\",\"odeReceivedAt\":\"2024-11-01T15:49:05.278Z\",\"originIp\":\"10.164.6.16\",\"name\":\"N State St & E Center St\",\"intersectionId\":6311,\"cti4501Conformant\":false,\"validationMessages\":[{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id.region: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].id\",\"schemaPath\":\"#/$defs/J2735IntersectionReferenceID/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[0].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[1].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[2].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[3].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[4].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[5].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.maxEndTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[6].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.startTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"},{\"message\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing.nextTime: is missing but it is required\",\"jsonPath\":\"$.payload.data.intersectionStateList.intersectionStatelist[0].states.movementList[7].state_time_speed.movementEventList[0].timing\",\"schemaPath\":\"#/$defs/J2735TimeChangeDetails/required\"}],\"revision\":102,\"status\":{\"manualControlIsEnabled\":false,\"stopTimeIsActivated\":false,\"failureFlash\":false,\"preemptIsActive\":false,\"signalPriorityIsActive\":false,\"fixedTimeOperation\":false,\"trafficDependentOperation\":false,\"standbyOperation\":false,\"failureMode\":false,\"off\":false,\"recentMAPmessageUpdate\":true,\"recentChangeInMAPassignedLanesIDsUsed\":true,\"noValidMAPisAvailableAtThisTime\":false,\"noValidSPATisAvailableAtThisTime\":false},\"utcTimeStamp\":\"2024-11-01T15:50:05.778Z\",\"enabledLanes\":[],\"states\":[{\"signalGroup\":1,\"stateTimeSpeed\":[{\"eventState\":\"PROTECTED_MOVEMENT_ALLOWED\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:04.237Z\",\"maxEndTime\":\"2024-11-01T15:50:04.237Z\"}}]},{\"signalGroup\":2,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":3,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:50:24.237Z\",\"maxEndTime\":\"2024-11-01T15:50:24.237Z\"}}]},{\"signalGroup\":4,\"stateTimeSpeed\":[{\"eventState\":\"PERMISSIVE_CLEARANCE\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:06.137Z\",\"maxEndTime\":\"2024-11-01T15:49:06.137Z\"}}]},{\"signalGroup\":5,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:08.337Z\",\"maxEndTime\":\"2024-11-01T15:49:08.337Z\"}}]},{\"signalGroup\":6,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:44.237Z\",\"maxEndTime\":\"2024-11-01T15:49:44.237Z\"}}]},{\"signalGroup\":9,\"stateTimeSpeed\":[{\"eventState\":\"STOP_AND_REMAIN\",\"timing\":{\"minEndTime\":\"2024-11-01T15:49:05.237Z\"}}]}]}"; - - String key = "{\"rsuId\": \"10.164.6.16\", \"intersectionId\": 6311, \"region\": -1}"; - - @Autowired - DeduplicatorProperties props; - - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicProcessedSpat(inputTopic); - props.setKafkaTopicDeduplicatedProcessedSpat(outputTopic); - - ProcessedSpatDeduplicatorTopology processedSpatDeduplicatorTopology = new ProcessedSpatDeduplicatorTopology(props, null); - - Topology topology = processedSpatDeduplicatorTopology.buildTopology(); - objectMapper.registerModule(new JavaTimeModule()); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputProcessedSpatData = driver.createInputTopic( - inputTopic, - Serdes.String().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic outputProcessedSpatData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - JsonSerdes.ProcessedSpat().deserializer()); - - inputProcessedSpatData.pipeInput(key, inputProcessedSpat1); - inputProcessedSpatData.pipeInput(key, inputProcessedSpat2); - inputProcessedSpatData.pipeInput(key, inputProcessedSpat3); - inputProcessedSpatData.pipeInput(key, inputProcessedSpat4); - inputProcessedSpatData.pipeInput(key, inputProcessedSpat5); - inputProcessedSpatData.pipeInput(key, inputProcessedSpat6); - - List> spatDeduplicatorResults = outputProcessedSpatData.readKeyValuesToList(); - - // validate that only 5 messages make it through - assertEquals(5, spatDeduplicatorResults.size()); - - ProcessedSpat spat1 = objectMapper.readValue(inputProcessedSpat1, typeReference); - ProcessedSpat spat3 = objectMapper.readValue(inputProcessedSpat3, typeReference); // forwarded because the time on the message changes by 1 minute - ProcessedSpat spat4 = objectMapper.readValue(inputProcessedSpat4, typeReference); // forwarded because the signal state changes - ProcessedSpat spat5 = objectMapper.readValue(inputProcessedSpat5, typeReference); // forwarded because the number of signal groups changed - ProcessedSpat spat6 = objectMapper.readValue(inputProcessedSpat6, typeReference); // forwarded because a signal group ID changed - - assertEquals(spat1.getUtcTimeStamp(), spatDeduplicatorResults.get(0).value.getUtcTimeStamp()); - assertEquals(spat3.getUtcTimeStamp(), spatDeduplicatorResults.get(1).value.getUtcTimeStamp()); - assertEquals(spat4.getUtcTimeStamp(), spatDeduplicatorResults.get(2).value.getUtcTimeStamp()); - assertEquals(spat5.getUtcTimeStamp(), spatDeduplicatorResults.get(3).value.getUtcTimeStamp()); - assertEquals(spat6.getUtcTimeStamp(), spatDeduplicatorResults.get(4).value.getUtcTimeStamp()); - - - } catch (JsonMappingException e) { - e.printStackTrace(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/TimDeduplicatorTopologyTest.java b/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/TimDeduplicatorTopologyTest.java deleted file mode 100644 index 018db4f..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/java/deduplicator/TimDeduplicatorTopologyTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package deduplicator; - -import org.apache.kafka.common.serialization.Serdes; -import org.apache.kafka.streams.KeyValue; -import org.apache.kafka.streams.TestInputTopic; -import org.apache.kafka.streams.TestOutputTopic; -import org.apache.kafka.streams.Topology; -import org.apache.kafka.streams.TopologyTestDriver; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import us.dot.its.jpo.deduplicator.DeduplicatorProperties; -import us.dot.its.jpo.deduplicator.deduplicator.topologies.TimDeduplicatorTopology; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.List; - - -public class TimDeduplicatorTopologyTest { - - String inputTopic = "topic.OdeTimJson"; - String outputTopic = "topic.DeduplicatedOdeTimJson"; - - ObjectMapper objectMapper = new ObjectMapper(); - - //Original Message - String inputTim1 = "{\"metadata\": {\"payloadType\": \"us.dot.its.jpo.ode.model.OdeTimPayload\",\"serialId\": {\"streamId\": \"a9012e0d-7acc-48b3-981e-aed4b4d180aa\",\"bundleSize\": 1,\"bundleId\": 113,\"recordId\": 0,\"serialNumber\": 113},\"odeReceivedAt\": \"2025-01-20T23:00:18.065Z\",\"schemaVersion\": 8,\"maxDurationTime\": 30,\"recordGeneratedAt\": \"2025-01-16T23:15:09.000Z\",\"recordGeneratedBy\": \"TMC\",\"sanitized\": false,\"odePacketID\": \"2D815A64F19A75534B\",\"odeTimStartDateTime\": \"2025-01-20T23:00:15.802Z\"},\"payload\": {\"data\": {\"msgCnt\": 1,\"timeStamp\": 22995,\"packetID\": \"2D815A64F19A75534B\",\"urlB\": \"null\",\"dataFrames\": [{\"frameType\": \"advisory\",\"msgId\": {\"roadSignID\": {\"position\": {\"lat\": 398784622,\"long\": -1050251574},\"viewAngle\": {\"from000-0to022-5degrees\": true,\"from022-5to045-0degrees\": true,\"from045-0to067-5degrees\": true,\"from067-5to090-0degrees\": true,\"from090-0to112-5degrees\": true,\"from112-5to135-0degrees\": true,\"from135-0to157-5degrees\": true,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": true,\"from225-0to247-5degrees\": true,\"from247-5to270-0degrees\": true,\"from270-0to292-5degrees\": true,\"from292-5to315-0degrees\": true,\"from315-0to337-5degrees\": true,\"from337-5to360-0degrees\": true},\"mutcdCode\": \"warning\"}},\"startYear\": 2025,\"startTime\": 28740,\"durationTime\": 30,\"priority\": 5,\"regions\": [{\"name\": \"I_US-287_SAT_1A97342A\",\"id\": {\"region\": 0,\"id\": 0},\"anchor\": {\"lat\": 398784622,\"long\": -1050251574},\"laneWidth\": 5000,\"directionality\": \"both\",\"closedPath\": false,\"direction\": {\"from000-0to022-5degrees\": false,\"from022-5to045-0degrees\": false,\"from045-0to067-5degrees\": false,\"from067-5to090-0degrees\": false,\"from090-0to112-5degrees\": false,\"from112-5to135-0degrees\": false,\"from135-0to157-5degrees\": false,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": false,\"from225-0to247-5degrees\": false,\"from247-5to270-0degrees\": false,\"from270-0to292-5degrees\": false,\"from292-5to315-0degrees\": false,\"from315-0to337-5degrees\": false,\"from337-5to360-0degrees\": false},\"description\": {\"path\": {\"scale\": 0,\"offset\": {\"ll\": {\"nodes\": [{\"delta\": {\"node-LL1\": {\"lon\": -3,\"lat\": -1349}}},{\"delta\": {\"node-LL1\": {\"lon\": 0,\"lat\": -164}}},{\"delta\": {\"node-LL4\": {\"lon\": -79,\"lat\": -36171}}},{\"delta\": {\"node-LL3\": {\"lon\": -52,\"lat\": -23867}}},{\"delta\": {\"node-LL2\": {\"lon\": 150,\"lat\": -7144}}},{\"delta\": {\"node-LL2\": {\"lon\": 936,\"lat\": -7633}}},{\"delta\": {\"node-LL3\": {\"lon\": 130,\"lat\": -15274}}},{\"delta\": {\"node-LL3\": {\"lon\": 114,\"lat\": -22432}}},{\"delta\": {\"node-LL4\": {\"lon\": -122,\"lat\": -35545}}},{\"delta\": {\"node-LL3\": {\"lon\": 378,\"lat\": -8947}}},{\"delta\": {\"node-LL3\": {\"lon\": 75,\"lat\": -9416}}}]}}}}}],\"content\": {\"workZone\": [{\"item\": {\"itis\": 1025}}]},\"url\": \"null\"}]},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.travelerinformation.TravelerInformation\"}}"; - - // Shifted Forward 1 seconds - Should be deduplicated - String inputTim2 = "{\"metadata\": {\"payloadType\": \"us.dot.its.jpo.ode.model.OdeTimPayload\",\"serialId\": {\"streamId\": \"a9012e0d-7acc-48b3-981e-aed4b4d180aa\",\"bundleSize\": 1,\"bundleId\": 113,\"recordId\": 0,\"serialNumber\": 113},\"odeReceivedAt\": \"2025-01-20T23:00:19.065Z\",\"schemaVersion\": 8,\"maxDurationTime\": 30,\"recordGeneratedAt\": \"2025-01-16T23:15:09.000Z\",\"recordGeneratedBy\": \"TMC\",\"sanitized\": false,\"odePacketID\": \"2D815A64F19A75534B\",\"odeTimStartDateTime\": \"2025-01-20T23:00:15.802Z\"},\"payload\": {\"data\": {\"msgCnt\": 1,\"timeStamp\": 22995,\"packetID\": \"2D815A64F19A75534B\",\"urlB\": \"null\",\"dataFrames\": [{\"frameType\": \"advisory\",\"msgId\": {\"roadSignID\": {\"position\": {\"lat\": 398784622,\"long\": -1050251574},\"viewAngle\": {\"from000-0to022-5degrees\": true,\"from022-5to045-0degrees\": true,\"from045-0to067-5degrees\": true,\"from067-5to090-0degrees\": true,\"from090-0to112-5degrees\": true,\"from112-5to135-0degrees\": true,\"from135-0to157-5degrees\": true,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": true,\"from225-0to247-5degrees\": true,\"from247-5to270-0degrees\": true,\"from270-0to292-5degrees\": true,\"from292-5to315-0degrees\": true,\"from315-0to337-5degrees\": true,\"from337-5to360-0degrees\": true},\"mutcdCode\": \"warning\"}},\"startYear\": 2025,\"startTime\": 28740,\"durationTime\": 30,\"priority\": 5,\"regions\": [{\"name\": \"I_US-287_SAT_1A97342A\",\"id\": {\"region\": 0,\"id\": 0},\"anchor\": {\"lat\": 398784622,\"long\": -1050251574},\"laneWidth\": 5000,\"directionality\": \"both\",\"closedPath\": false,\"direction\": {\"from000-0to022-5degrees\": false,\"from022-5to045-0degrees\": false,\"from045-0to067-5degrees\": false,\"from067-5to090-0degrees\": false,\"from090-0to112-5degrees\": false,\"from112-5to135-0degrees\": false,\"from135-0to157-5degrees\": false,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": false,\"from225-0to247-5degrees\": false,\"from247-5to270-0degrees\": false,\"from270-0to292-5degrees\": false,\"from292-5to315-0degrees\": false,\"from315-0to337-5degrees\": false,\"from337-5to360-0degrees\": false},\"description\": {\"path\": {\"scale\": 0,\"offset\": {\"ll\": {\"nodes\": [{\"delta\": {\"node-LL1\": {\"lon\": -3,\"lat\": -1349}}},{\"delta\": {\"node-LL1\": {\"lon\": 0,\"lat\": -164}}},{\"delta\": {\"node-LL4\": {\"lon\": -79,\"lat\": -36171}}},{\"delta\": {\"node-LL3\": {\"lon\": -52,\"lat\": -23867}}},{\"delta\": {\"node-LL2\": {\"lon\": 150,\"lat\": -7144}}},{\"delta\": {\"node-LL2\": {\"lon\": 936,\"lat\": -7633}}},{\"delta\": {\"node-LL3\": {\"lon\": 130,\"lat\": -15274}}},{\"delta\": {\"node-LL3\": {\"lon\": 114,\"lat\": -22432}}},{\"delta\": {\"node-LL4\": {\"lon\": -122,\"lat\": -35545}}},{\"delta\": {\"node-LL3\": {\"lon\": 378,\"lat\": -8947}}},{\"delta\": {\"node-LL3\": {\"lon\": 75,\"lat\": -9416}}}]}}}}}],\"content\": {\"workZone\": [{\"item\": {\"itis\": 1025}}]},\"url\": \"null\"}]},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.travelerinformation.TravelerInformation\"}}"; - - // Shifted Forward 1 hour Should be allowed to pass through - String inputTim3 = "{\"metadata\": {\"payloadType\": \"us.dot.its.jpo.ode.model.OdeTimPayload\",\"serialId\": {\"streamId\": \"a9012e0d-7acc-48b3-981e-aed4b4d180aa\",\"bundleSize\": 1,\"bundleId\": 113,\"recordId\": 0,\"serialNumber\": 113},\"odeReceivedAt\": \"2025-01-21T00:00:19.065Z\",\"schemaVersion\": 8,\"maxDurationTime\": 30,\"recordGeneratedAt\": \"2025-01-16T23:15:09.000Z\",\"recordGeneratedBy\": \"TMC\",\"sanitized\": false,\"odePacketID\": \"2D815A64F19A75534B\",\"odeTimStartDateTime\": \"2025-01-20T23:00:15.802Z\"},\"payload\": {\"data\": {\"msgCnt\": 1,\"timeStamp\": 22995,\"packetID\": \"2D815A64F19A75534B\",\"urlB\": \"null\",\"dataFrames\": [{\"frameType\": \"advisory\",\"msgId\": {\"roadSignID\": {\"position\": {\"lat\": 398784622,\"long\": -1050251574},\"viewAngle\": {\"from000-0to022-5degrees\": true,\"from022-5to045-0degrees\": true,\"from045-0to067-5degrees\": true,\"from067-5to090-0degrees\": true,\"from090-0to112-5degrees\": true,\"from112-5to135-0degrees\": true,\"from135-0to157-5degrees\": true,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": true,\"from225-0to247-5degrees\": true,\"from247-5to270-0degrees\": true,\"from270-0to292-5degrees\": true,\"from292-5to315-0degrees\": true,\"from315-0to337-5degrees\": true,\"from337-5to360-0degrees\": true},\"mutcdCode\": \"warning\"}},\"startYear\": 2025,\"startTime\": 28740,\"durationTime\": 30,\"priority\": 5,\"regions\": [{\"name\": \"I_US-287_SAT_1A97342A\",\"id\": {\"region\": 0,\"id\": 0},\"anchor\": {\"lat\": 398784622,\"long\": -1050251574},\"laneWidth\": 5000,\"directionality\": \"both\",\"closedPath\": false,\"direction\": {\"from000-0to022-5degrees\": false,\"from022-5to045-0degrees\": false,\"from045-0to067-5degrees\": false,\"from067-5to090-0degrees\": false,\"from090-0to112-5degrees\": false,\"from112-5to135-0degrees\": false,\"from135-0to157-5degrees\": false,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": false,\"from225-0to247-5degrees\": false,\"from247-5to270-0degrees\": false,\"from270-0to292-5degrees\": false,\"from292-5to315-0degrees\": false,\"from315-0to337-5degrees\": false,\"from337-5to360-0degrees\": false},\"description\": {\"path\": {\"scale\": 0,\"offset\": {\"ll\": {\"nodes\": [{\"delta\": {\"node-LL1\": {\"lon\": -3,\"lat\": -1349}}},{\"delta\": {\"node-LL1\": {\"lon\": 0,\"lat\": -164}}},{\"delta\": {\"node-LL4\": {\"lon\": -79,\"lat\": -36171}}},{\"delta\": {\"node-LL3\": {\"lon\": -52,\"lat\": -23867}}},{\"delta\": {\"node-LL2\": {\"lon\": 150,\"lat\": -7144}}},{\"delta\": {\"node-LL2\": {\"lon\": 936,\"lat\": -7633}}},{\"delta\": {\"node-LL3\": {\"lon\": 130,\"lat\": -15274}}},{\"delta\": {\"node-LL3\": {\"lon\": 114,\"lat\": -22432}}},{\"delta\": {\"node-LL4\": {\"lon\": -122,\"lat\": -35545}}},{\"delta\": {\"node-LL3\": {\"lon\": 378,\"lat\": -8947}}},{\"delta\": {\"node-LL3\": {\"lon\": 75,\"lat\": -9416}}}]}}}}}],\"content\": {\"workZone\": [{\"item\": {\"itis\": 1025}}]},\"url\": \"null\"}]},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.travelerinformation.TravelerInformation\"}}"; - - // Has a different payload ID. Should be allowed through - String inputTim4 = "{\"metadata\": {\"payloadType\": \"us.dot.its.jpo.ode.model.OdeTimPayload\",\"serialId\": {\"streamId\": \"a9012e0d-7acc-48b3-981e-aed4b4d180aa\",\"bundleSize\": 1,\"bundleId\": 113,\"recordId\": 0,\"serialNumber\": 113},\"odeReceivedAt\": \"2025-01-20T23:00:18.065Z\",\"schemaVersion\": 8,\"maxDurationTime\": 30,\"recordGeneratedAt\": \"2025-01-16T23:15:09.000Z\",\"recordGeneratedBy\": \"TMC\",\"sanitized\": false,\"odePacketID\": \"2D815A64F19A75534B\",\"odeTimStartDateTime\": \"2025-01-20T23:00:15.802Z\"},\"payload\": {\"data\": {\"msgCnt\": 1,\"timeStamp\": 22995,\"packetID\": \"051F23D9B7C23CF677\",\"urlB\": \"null\",\"dataFrames\": [{\"frameType\": \"advisory\",\"msgId\": {\"roadSignID\": {\"position\": {\"lat\": 398784622,\"long\": -1050251574},\"viewAngle\": {\"from000-0to022-5degrees\": true,\"from022-5to045-0degrees\": true,\"from045-0to067-5degrees\": true,\"from067-5to090-0degrees\": true,\"from090-0to112-5degrees\": true,\"from112-5to135-0degrees\": true,\"from135-0to157-5degrees\": true,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": true,\"from225-0to247-5degrees\": true,\"from247-5to270-0degrees\": true,\"from270-0to292-5degrees\": true,\"from292-5to315-0degrees\": true,\"from315-0to337-5degrees\": true,\"from337-5to360-0degrees\": true},\"mutcdCode\": \"warning\"}},\"startYear\": 2025,\"startTime\": 28740,\"durationTime\": 30,\"priority\": 5,\"regions\": [{\"name\": \"I_US-287_SAT_1A97342A\",\"id\": {\"region\": 0,\"id\": 0},\"anchor\": {\"lat\": 398784622,\"long\": -1050251574},\"laneWidth\": 5000,\"directionality\": \"both\",\"closedPath\": false,\"direction\": {\"from000-0to022-5degrees\": false,\"from022-5to045-0degrees\": false,\"from045-0to067-5degrees\": false,\"from067-5to090-0degrees\": false,\"from090-0to112-5degrees\": false,\"from112-5to135-0degrees\": false,\"from135-0to157-5degrees\": false,\"from157-5to180-0degrees\": true,\"from180-0to202-5degrees\": true,\"from202-5to225-0degrees\": false,\"from225-0to247-5degrees\": false,\"from247-5to270-0degrees\": false,\"from270-0to292-5degrees\": false,\"from292-5to315-0degrees\": false,\"from315-0to337-5degrees\": false,\"from337-5to360-0degrees\": false},\"description\": {\"path\": {\"scale\": 0,\"offset\": {\"ll\": {\"nodes\": [{\"delta\": {\"node-LL1\": {\"lon\": -3,\"lat\": -1349}}},{\"delta\": {\"node-LL1\": {\"lon\": 0,\"lat\": -164}}},{\"delta\": {\"node-LL4\": {\"lon\": -79,\"lat\": -36171}}},{\"delta\": {\"node-LL3\": {\"lon\": -52,\"lat\": -23867}}},{\"delta\": {\"node-LL2\": {\"lon\": 150,\"lat\": -7144}}},{\"delta\": {\"node-LL2\": {\"lon\": 936,\"lat\": -7633}}},{\"delta\": {\"node-LL3\": {\"lon\": 130,\"lat\": -15274}}},{\"delta\": {\"node-LL3\": {\"lon\": 114,\"lat\": -22432}}},{\"delta\": {\"node-LL4\": {\"lon\": -122,\"lat\": -35545}}},{\"delta\": {\"node-LL3\": {\"lon\": 378,\"lat\": -8947}}},{\"delta\": {\"node-LL3\": {\"lon\": 75,\"lat\": -9416}}}]}}}}}],\"content\": {\"workZone\": [{\"item\": {\"itis\": 1025}}]},\"url\": \"null\"}]},\"dataType\": \"us.dot.its.jpo.ode.plugin.j2735.travelerinformation.TravelerInformation\"}}"; - - @Autowired - DeduplicatorProperties props; - - @Test - public void testTopology() { - - props = new DeduplicatorProperties(); - props.setKafkaTopicOdeTimJson(inputTopic); - props.setKafkaTopicDeduplicatedOdeTimJson(outputTopic); - - TimDeduplicatorTopology TimDeduplicatorTopology = new TimDeduplicatorTopology(props, null); - - Topology topology = TimDeduplicatorTopology.buildTopology(); - objectMapper.registerModule(new JavaTimeModule()); - - try (TopologyTestDriver driver = new TopologyTestDriver(topology)) { - - - TestInputTopic inputTimData = driver.createInputTopic( - inputTopic, - Serdes.Void().serializer(), - Serdes.String().serializer()); - - - TestOutputTopic outputTimData = driver.createOutputTopic( - outputTopic, - Serdes.String().deserializer(), - Serdes.String().deserializer()); - - inputTimData.pipeInput(null, inputTim1); - inputTimData.pipeInput(null, inputTim2); - inputTimData.pipeInput(null, inputTim3); - inputTimData.pipeInput(null, inputTim4); - - List> timDeduplicatedResults = outputTimData.readKeyValuesToList(); - - // validate that only 3 messages make it through - assertEquals(3, timDeduplicatedResults.size()); - inputTim1 = inputTim1.strip(); - - assertEquals(inputTim1.replace(" ", ""), timDeduplicatedResults.get(0).value.replace(" ", "")); - assertEquals(inputTim3.replace(" ", ""), timDeduplicatedResults.get(1).value.replace(" ", "")); - assertEquals(inputTim4.replace(" ", ""), timDeduplicatedResults.get(2).value.replace(" ", "")); - - }catch(Exception e){ - e.printStackTrace(); - } - } -} diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/resources/application-testConfig.yaml b/jpo-deduplicator/jpo-deduplicator/src/test/resources/application-testConfig.yaml deleted file mode 100644 index 4f102d0..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/resources/application-testConfig.yaml +++ /dev/null @@ -1 +0,0 @@ -spring.kafka.bootstrap-servers: localhost:10093 \ No newline at end of file diff --git a/jpo-deduplicator/jpo-deduplicator/src/test/resources/logback-test.xml b/jpo-deduplicator/jpo-deduplicator/src/test/resources/logback-test.xml deleted file mode 100644 index cd07f49..0000000 --- a/jpo-deduplicator/jpo-deduplicator/src/test/resources/logback-test.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - %msg%n - - - - - - - \ No newline at end of file diff --git a/sample.env b/sample.env index feca26b..2237c0c 100644 --- a/sample.env +++ b/sample.env @@ -25,8 +25,6 @@ RESTART_POLICY="on-failure:3" # - kafka_connect # - kafka_connect # - kafka_connect_setup -# - deduplicator -# - deduplicator # EXAMPLE: COMPOSE_PROFILES=kafka_connect_standalone,kafka_ui,mongo_express COMPOSE_PROFILES=all @@ -49,8 +47,8 @@ KAFKA_TOPIC_DELETE_RETENTION_MS=3600000 KAFKA_TOPIC_CREATE_ODE=true # Create topics for ODE KAFKA_TOPIC_CREATE_GEOJSONCONVERTER=true # Create topics for GeoJSON Converter KAFKA_TOPIC_CREATE_CONFLICTMONITOR=true # Create topics for Conflict Monitor -KAFKA_TOPIC_CREATE_DEDUPLICATOR=true # Create topics for Deduplicator -KAFKA_TOPIC_CREATE_MECDEPOSIT=true # Create topics for MecDeposit +KAFKA_TOPIC_CREATE_DEDUPLICATOR=false # Create topics for Deduplicator +KAFKA_TOPIC_CREATE_MECDEPOSIT=false # Create topics for MecDeposit # Relative path to the Kafka topic yaml configuration script, upper level directories are supported # NOTE: This script is used to create kafka topics KAFKA_TOPIC_CONFIG_RELATIVE_PATH="./jikkou/kafka-topics-values.yaml" @@ -63,7 +61,7 @@ MONGO_DB_NAME=CV # Generate a random string for the MongoDB keyfile using the following command: # $ openssl rand -base64 32 -MONGO_DB_KEYFILE_STRING=replace_me +MONGO_DB_KEYFILE_STRING=replacethisstring MONGO_ADMIN_DB_USER=admin MONGO_ADMIN_DB_PASS=replace_me @@ -117,31 +115,10 @@ CONNECT_TASKS_MAX=1 # Number of concurrent tasks to configur CONNECT_CREATE_ODE=true # Create kafka connectors to MongoDB for ODE CONNECT_CREATE_GEOJSONCONVERTER=true # Create kafka connectors to MongoDB for GeoJSON Converter CONNECT_CREATE_CONFLICTMONITOR=true # Create kafka connectors to MongoDB for Conflict Monitor -CONNECT_CREATE_DEDUPLICATOR=true # Create kafka connectors to MongoDB for Deduplicator -CONNECT_CREATE_MECDEPOSIT=true # Create kafka connectors to MongoDB for MecDeposit +CONNECT_CREATE_DEDUPLICATOR=false # Create kafka connectors to MongoDB for Deduplicator +CONNECT_CREATE_MECDEPOSIT=false # Create kafka connectors to MongoDB for MecDeposit # Relative path to the Kafka Connector yaml configuration script, upper level directories are supported # NOTE: This script is used to create kafka connectors CONNECT_CONFIG_RELATIVE_PATH="./jikkou/kafka-connectors-values.yaml" -### Kafka connect variables - END ### - -### DEDUPLICATOR variables - START ### - -# Required for building the deduplicator. Documentation: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry#authenticating-to-github-packages -MAVEN_GITHUB_TOKEN= -MAVEN_GITHUB_ORG=usdot-jpo-ode - -ENABLE_PROCESSED_MAP_DEDUPLICATION=${KAFKA_TOPIC_CREATE_GEOJSONCONVERTER} -ENABLE_PROCESSED_MAP_WKT_DEDUPLICATION=${KAFKA_TOPIC_CREATE_GEOJSONCONVERTER} -ENABLE_ODE_MAP_DEDUPLICATION=${KAFKA_TOPIC_CREATE_ODE} -ENABLE_ODE_TIM_DEDUPLICATION=${KAFKA_TOPIC_CREATE_ODE} -ENABLE_ODE_RAW_ENCODED_TIM_DEDUPLICATION=${KAFKA_TOPIC_CREATE_ODE} -ENABLE_PROCESSED_SPAT_DEDUPLICATION=${KAFKA_TOPIC_CREATE_GEOJSONCONVERTER} -ENABLE_ODE_BSM_DEDUPLICATION=${KAFKA_TOPIC_CREATE_ODE} - - - -### DEDUPLICATOR variables - END ### - - - +### Kafka connect variables - END ### \ No newline at end of file