diff --git a/.github/workflows/continuous-integration-secure.yml b/.github/workflows/continuous-integration-secure.yml deleted file mode 100644 index d9e00451..00000000 --- a/.github/workflows/continuous-integration-secure.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: Continuous Integration Secure -# Secure execution of continuous integration jobs -# which are performed upon completion of the -# "Continuous Integration" workflow -# https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ -on: - workflow_run: - workflows: ['Continuous Integration'] - types: [completed] - -permissions: - deployments: write - packages: write - pull-requests: write - -jobs: - preview-image: - runs-on: ubuntu-latest - if: > - github.event.workflow_run.conclusion == 'success' && ( - github.event.workflow_run.event == 'pull_request' || ( - github.event.workflow_run.event == 'push' && - github.event.workflow_run.head_branch == 'main' - ) - ) - env: - PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0] != null && github.event.workflow_run.pull_requests[0].number || '' }} - IMAGE_REPO: ghcr.io/${{ github.repository }}-preview - steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - with: - name: build - path: dist/netzgrafik-frontend/ - run-id: ${{ github.event.workflow_run.id }} - # TODO: Create GH_ACTIONS_ARTIFACT_DOWNLOAD secret - github-token: ${{ secrets.GH_ACTIONS_ARTIFACT_DOWNLOAD }} - - name: Remove files without allowed extensions - uses: actions/github-script@v7 - with: - script: | - const fs = require('fs'), - path = require('path'), - allowedExtensions = - /^\.(s?css|html?|m?js|json|ts|map|ico|jpe?g|png|svg|woff2|txt|gitignore|gitkeep|stackblitzrc)$/, - distDir = path.resolve('dist/netzgrafik-frontend'); - - // Removes all files not matching allowed extensions from given directory. - fs.readdirSync(distDir, { withFileTypes: true, recursive: true }) - .filter((d) => d.isFile() && !allowedExtensions.test(path.extname(d.name))) - .forEach((d) => { - console.log(`Removing ${path.join(d.path, d.name)}`); - fs.unlinkSync(path.join(d.path, d.name)); - }); - - - name: Create GitHub Deployment - id: tag-name - uses: actions/github-script@v7 - with: - script: | - const environment = process.env.PR_NUMBER ? `pr${process.env.PR_NUMBER}` : 'main'; - const payload = { owner: context.repo.owner, repo: context.repo.repo, environment }; - const { data: deployment } = await github.rest.repos.createDeployment({ - ...payload, - ref: context.payload.workflow_run.head_sha, - auto_merge: false, - required_contexts: ['integrity', 'build', 'test', 'lint'] - }); - await github.rest.repos.createDeploymentStatus({ - ...payload, - deployment_id: deployment.id, - state: 'in_progress', - environment_url: `https://${context.repo.repo}-${environment}.app.sbb.ch`, - }); - return environment; - result-encoding: string - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to GitHub Container Repository - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v5 - with: - push: true - tags: $IMAGE_REPO:${{ steps.tag-name.outputs.result }} - - - name: "Add 'preview-available' label" - if: env.PR_NUMBER != '' - # This label is used for filtering deployments in ArgoCD - run: gh issue edit "$NUMBER" --add-label "preview-available" - env: - NUMBER: ${{ env.PR_NUMBER }} diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index d45da47a..43697250 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -1,5 +1,5 @@ name: Continuous Integration -on: [push, pull_request] +on: [push] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -11,6 +11,7 @@ permissions: jobs: lint: runs-on: ubuntu-latest + continue-on-error: true steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -48,3 +49,60 @@ jobs: with: name: build path: dist/netzgrafik-frontend/ + + build-standalone: + runs-on: ubuntu-latest + needs: lint + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + - run: npm clean-install + - run: npm run build:standalone + - name: Store build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-standalone + path: dist/netzgrafik-frontend/ + + build-standalonedemo: + runs-on: ubuntu-latest + needs: lint + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + - run: npm clean-install + - run: npm run build:standalonedemo + - name: Store build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-standalone-demo + path: dist/netzgrafik-frontend/ + + publish: + runs-on: ubuntu-latest + needs: build-standalone + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: build-standalone + path: dist/netzgrafik-frontend/ + - uses: actions/setup-node@v4 + with: + registry-url: 'https://registry.npmjs.org' + - run: npm pkg set name="@osrd-project/netzgrafik-frontend" + - run: npm version --no-git-tag-version "0.0.0-snapshot.$GITHUB_SHA" + - run: npm pkg delete dependencies optionalDependencies devDependencies + - run: npm publish --provenance --access public --tag snapshot + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/deploy-standalone-github.yml b/.github/workflows/deploy-standalone-github.yml new file mode 100644 index 00000000..69b3ffbe --- /dev/null +++ b/.github/workflows/deploy-standalone-github.yml @@ -0,0 +1,32 @@ +name: Deploy static content to GitHub Pages + +on: + push: + branches: ['main'] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: 'pages' + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - id: build-publish + uses: bitovi/github-actions-angular-to-github-pages@v1.0.0 + with: + path: dist/netzgrafik-frontend + build_command: npm run build:standalonedemo -- --base-href=netzgrafik-frontend diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 8a7ee217..2dabd9a5 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -1,3 +1,7 @@ +# This action automates the creation of releases and changelogs for the project. +# +# https://github.com/marketplace/actions/release-please-action +# on: push: branches: @@ -6,14 +10,70 @@ on: permissions: contents: write pull-requests: write + packages: write name: release-please jobs: release-please: + outputs: + release_created: ${{ steps.release.outputs.release_created }} + major: ${{ steps.release.outputs.major }} + minor: ${{ steps.release.outputs.minor }} + patch: ${{ steps.release.outputs.patch }} runs-on: ubuntu-latest steps: - - uses: google-github-actions/release-please-action@v4 + - uses: googleapis/release-please-action@v4 id: release + + release: + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + runs-on: ubuntu-latest + steps: + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.repository }} + tags: | + type=raw,value=${{ needs.release-please.outputs.major }}.${{ needs.release-please.outputs.minor }}.${{ needs.release-please.outputs.patch }} + type=raw,value=latest + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Repository + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + release-npm-package: + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - release-type: node + node-version-file: '.nvmrc' + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + - run: npm clean-install + - run: npm run build:standalone + - run: npm pkg delete dependencies optionalDependencies devDependencies + - run: npm publish --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index ba31e60f..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,40 +0,0 @@ -on: - push: - tags: - - v** - -permissions: - packages: write - -name: release - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.repository }} - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to GitHub Container Repository - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v5 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..4c1d523d --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "2.9.11" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index b5576fb3..455c06f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,314 @@ # Changelog +## [2.9.11](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.10...netzgrafik-frontend-v2.9.11) (2024-11-28) + + +### Bug Fixes + +* correct connections->transfers naming for O/D matrix ([#365](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/365)) ([454c201](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/454c201abf3228dacecb8685f80545ef13eea554)) +* documentation for 3rd party import ([#367](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/367)) ([53ee469](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/53ee469b7cbba5042530d6436f1dbfaa447a1285)) + +## [2.9.10](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.9...netzgrafik-frontend-v2.9.10) (2024-11-22) + + +### Bug Fixes + +* warn users when having unsymmetric times ([#359](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/359)) ([9923567](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/992356722772db594e48a1f7aa8511b904a62c79)) + +## [2.9.9](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.8...netzgrafik-frontend-v2.9.9) (2024-11-14) + + +### Bug Fixes + +* performance opt / refactored ([#356](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/356)) ([f939df6](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/f939df6640159e868802de80f12a40469bf8d943)) + +## [2.9.8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.7...netzgrafik-frontend-v2.9.8) (2024-11-14) + + +### Bug Fixes + +* performance issue fixed (part 2) ([#354](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/354)) ([c8eb613](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/c8eb61364b7cf5ab8d41a2a04eba3e9d35c46562)) + +## [2.9.7](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.6...netzgrafik-frontend-v2.9.7) (2024-11-14) + + +### Bug Fixes + +* 350 bug delete node or trainrunsections cause low performance ([#351](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/351)) ([72f8599](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/72f859920ac425668356fcb095f2ef49f019421f)) + +## [2.9.6](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.5...netzgrafik-frontend-v2.9.6) (2024-11-13) + + +### Bug Fixes + +* 346 bug importing 3rd party json misses detecting non stop transitions ([#347](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/347)) ([9d71b4a](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9d71b4aa9608eaec4d50f7f13178693305ea4a3c)) + +## [2.9.5](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.4...netzgrafik-frontend-v2.9.5) (2024-11-11) + + +### Bug Fixes + +* CSV base data export ([#343](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/343)) ([2d75f2d](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/2d75f2da23d63a87638bac8ba3f1551f54054b9c)) +* Simplified third-party JSON import (no port alignment/path precalculation required) ([#341](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/341)) ([d7d1776](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/d7d1776e7bb9fd4872821d315f9a81a8c2313c4d)) + +## [2.9.4](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.3...netzgrafik-frontend-v2.9.4) (2024-11-06) + + +### Bug Fixes + +* 334 bug archived read mode allows to move nodes but not persisted ([#336](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/336)) ([6275ae1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/6275ae17929fbf564b7419896ad11946b90c20b1)) + +## [2.9.3](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.2...netzgrafik-frontend-v2.9.3) (2024-11-05) + + +### Bug Fixes + +* fix O/D Matrix for trainrun 0 ([#337](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/337)) ([28a6d3a](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/28a6d3ae56c436a40e06eed54a3bbc117b97bdb7)) + +## [2.9.2](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.1...netzgrafik-frontend-v2.9.2) (2024-11-04) + + +### Bug Fixes + +* While combining two trainruns the first trainrun will "survive" and the second one will be deleted. If the trainrun which will be deleted consists of more than one trainrun segment (connected paths) the reported issue will be generated. (Test added) ([c55388b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/c55388b2d58efd788d64f745560c4b37c5d227e9)) + +## [2.9.1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.9.0...netzgrafik-frontend-v2.9.1) (2024-10-28) + + +### Bug Fixes + +* 320 bug graphical timetable streckengrafik renders only one trainrun segement ([#325](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/325)) ([790f53b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/790f53b7f7493cc7204719643dd368eccad89d16)) + +## [2.9.0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.8.0...netzgrafik-frontend-v2.9.0) (2024-10-24) + + +### Features + +* migrate originDestination connectionPenalty to netzgrafikDto ([#314](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/314)) ([ce3f90d](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/ce3f90d73784fabb49f29ac3625b142ceaa4134f)) +* optimize originDestination graph ([#316](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/316)) ([83895a1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/83895a153bcbc83cbbb692f48b8df196a56a9467)) + + +### Bug Fixes + +* fix O/D Matrix for unordered trainruns ([#321](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/321)) ([3d9644f](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/3d9644fbe94ea0a11a5403b798ea5634481166fa)) + +## [2.8.0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.17...netzgrafik-frontend-v2.8.0) (2024-10-10) + + +### Features + +* Implement Origin/Destination matrix ([#301](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/301)) ([383c99d](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/383c99d9e2081c1587bf36aa71dcb7ee6e73c7d9)) + +## [2.7.17](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.16...netzgrafik-frontend-v2.7.17) (2024-10-03) + + +### Bug Fixes + +* Documentation enhanced and standalone application deployed to github pages ([#304](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/304)) ([bee16d2](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/bee16d216a980bb32fdd0e6427d90c775bcd4292)) + +## [2.7.16](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.15...netzgrafik-frontend-v2.7.16) (2024-09-26) + + +### Bug Fixes + +* some translations ([#299](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/299)) ([c29c93f](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/c29c93f2e48fb294484d31e7238da637620c6e43)) + +## [2.7.15](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.14...netzgrafik-frontend-v2.7.15) (2024-09-19) + + +### Bug Fixes + +* doc: Split_Combine_Trainruns.md grammar ([#293](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/293)) ([ae64d44](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/ae64d446ca979db5b95601dbd414a3c9d6e6419f)) +* doc: STANDALONE.md grammar ([#292](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/292)) ([22f4f87](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/22f4f87074faa9b9a06a7b482ffb9a0d7312303d)) +* doc: USERMANUAL.md spelling grammar punctuation ([#294](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/294)) ([6a402c8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/6a402c87322bac3daedadf7bc359c2875f7b31c1)) + +## [2.7.14](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.13...netzgrafik-frontend-v2.7.14) (2024-09-16) + + +### Bug Fixes + +* doc: DATA_MODEL_JSON.md, spelling ([#276](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/276)) ([f504f0d](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/f504f0d40a4269fb4ab5a47ce6797e43c1564d32)) +* doc: Graphic_Timetable.md, spelling, grammar ([#277](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/277)) ([853b80f](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/853b80fa30b4e2119a919787f2b22bd4f4ac2600)) + +## [2.7.13](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.12...netzgrafik-frontend-v2.7.13) (2024-08-29) + + +### Bug Fixes + +* Bug archived read only mode variants are editable even tho not persisted ([#257](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/257)) ([9472a89](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9472a89c445e3473877e7fe80add5f5e3cc37863)) + +## [2.7.12](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.11...netzgrafik-frontend-v2.7.12) (2024-08-29) + + +### Bug Fixes + +* Technical improvement: replace hard-coded styles with CSS class for sbb-icon-sidebar-container. This improves maintainability and reusability of styles. ([#273](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/273)) ([b505d03](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/b505d03f4296809fe5e53c7ad216ca006bb234cc)) + +## [2.7.11](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.10...netzgrafik-frontend-v2.7.11) (2024-08-28) + + +### Bug Fixes + +* doc: CREATE_TRAINRUN.md, spelling, grammar ([#267](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/267)) ([a9e1747](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/a9e1747f7b9dcdb4c5cee2a3e52be7426b526ad4)) + +## [2.7.10](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.9...netzgrafik-frontend-v2.7.10) (2024-08-26) + + +### Bug Fixes + +* Update de.json, en.jason, spelling ([#259](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/259)) ([a166d83](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/a166d83a4689864410715949da01df04524e3d26)) + +## [2.7.9](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.8...netzgrafik-frontend-v2.7.9) (2024-08-26) + + +### Bug Fixes + +* doc: CREATE_NODES.md, spelling ([#264](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/264)) ([30cf1d7](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/30cf1d73dda29cb153fd04354c2ec1bb912b1758)) + +## [2.7.8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.7...netzgrafik-frontend-v2.7.8) (2024-08-24) + + +### Bug Fixes + +* doc: Update CREATE_FILTERS.md, spelling ([#258](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/258)) ([e0eb559](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e0eb5592b3e0a9cd25f74ffacfe411b4f73d1369)) + +## [2.7.7](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.6...netzgrafik-frontend-v2.7.7) (2024-08-20) + +### Bug Fixes +* Long email addresses cause incorrect formatting of the left sidebar change history ([#243](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/243)) ([dd0fda5](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/dd0fda51f8ada14e340ae6e821e153aeac42ad7a)) +* Viewport Not Centering on Bounding Box When Reloading/Opening Netzgrafik ([#244](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/244)) ([9e5e2fd](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9e5e2fdf85ff2c8eec9a568c2af656744f0d69af)) +* Translation is not working for variant when archived ([#249](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/249)) ([e313580](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e3135804cf93a47a35162ab82554507d9e8b3403)) +* The menubar has a visual "thick" separator in between variant/project name and the filter symbol ([#252](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/252)) ([3496d0a](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/3496d0a2dcb7b960d14c49e15abcfd2034f65d99)) + +## [2.7.6](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.5...netzgrafik-frontend-v2.7.6) (2024-08-19) + + +### Bug Fixes + +* use change event instead of keyup for node name change ([#248](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/248)) ([1e1177b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/1e1177b3f382f10e36deb8f9080b6c58522a43bc)) + +## [2.7.5](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.4...netzgrafik-frontend-v2.7.5) (2024-08-08) + + +### Features + +* add AppComponent inputs/outputs ([#166](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/166)) ([9d2c6ee](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9d2c6eee74f94912b68ec8b3375dc53e21a5ecdc)) +* introduce standalone mode ([#162](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/162)) ([cc4c56b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/cc4c56b25aa2d978ebd70fbf34dc129f36b776b2)) +* **pr-template:** add pull request template ([89b4d61](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89b4d61954382c45ffd20ac54137d1faf2f0c5f9)) +* publish package on NPM ([#172](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/172)) ([1692d55](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/1692d5561f8e1fd8b00a60b673b7567d81d83aef)) + + +### Bug Fixes + +* align theme color picker with buttons ([#198](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/198)) ([e3a8798](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e3a87989ea28a04a4a0bb9cee825825bb1b97d7b)) +* disable environment header in standalone mode ([#230](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/230)) ([e25887e](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e25887eb11ab36ce84756e92344bc63cdeb9b1a4)) +* disable links section in node sidebar ([2554094](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/255409410aa2552dfc1155bf89e7afce78dc17bc)) +* disable notes in filter sidebar in standalone mode ([#211](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/211)) ([df335ef](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/df335ef9aede8c47064655f3dbcc5723c2a89f1a)) +* enable output hashing by default ([#174](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/174)) ([8ac67b8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/8ac67b807db1e0fc418d4bacddabfabcb80620f4)) +* issue I. + typo ([#72](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/72)) ([deb7cd1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/deb7cd1514a320ca14d53bdd26cdbdeff6005c79)) +* use light theme for sbb-esta ([#176](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/176)) ([89aaae0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89aaae004170b59649b0856f14de1d31e86a6e18)) + + +### Miscellaneous Chores + +* release 2.5.0 ([00e6836](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/00e68365b1401d0af211cf6f9cd3184ed61fa102)) +* release 2.7.3 ([f06b8ff](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/f06b8ff117a30c4ed0a2084c6a75dfd4e72d254b)) +* release 2.7.3 ([484e008](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/484e0081b69b59c0f41857bab66ac8b024d95e86)) +* release 2.7.5 ([f69edec](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/f69edecca48480cd1f4483cd8d9b655ef7cfd512)) + +## [2.7.4](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/v2.7.3...v2.7.4) (2024-08-08) + + +### Bug Fixes + +* disable environment header in standalone mode ([#230](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/230)) ([e25887e](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e25887eb11ab36ce84756e92344bc63cdeb9b1a4)) + +## [2.7.3](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/v2.7.2...v2.7.3) (2024-08-06) + + +### Features + +* add AppComponent inputs/outputs ([#166](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/166)) ([9d2c6ee](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9d2c6eee74f94912b68ec8b3375dc53e21a5ecdc)) +* introduce standalone mode ([#162](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/162)) ([cc4c56b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/cc4c56b25aa2d978ebd70fbf34dc129f36b776b2)) +* **pr-template:** add pull request template ([89b4d61](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89b4d61954382c45ffd20ac54137d1faf2f0c5f9)) +* publish package on NPM ([#172](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/172)) ([1692d55](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/1692d5561f8e1fd8b00a60b673b7567d81d83aef)) + + +### Bug Fixes + +* align theme color picker with buttons ([#198](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/198)) ([e3a8798](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e3a87989ea28a04a4a0bb9cee825825bb1b97d7b)) +* disable links section in node sidebar ([2554094](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/255409410aa2552dfc1155bf89e7afce78dc17bc)) +* disable notes in filter sidebar in standalone mode ([#211](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/211)) ([df335ef](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/df335ef9aede8c47064655f3dbcc5723c2a89f1a)) +* enable output hashing by default ([#174](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/174)) ([8ac67b8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/8ac67b807db1e0fc418d4bacddabfabcb80620f4)) +* issue I. + typo ([#72](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/72)) ([deb7cd1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/deb7cd1514a320ca14d53bdd26cdbdeff6005c79)) +* use light theme for sbb-esta ([#176](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/176)) ([89aaae0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89aaae004170b59649b0856f14de1d31e86a6e18)) + + +### Miscellaneous Chores + +* release 2.5.0 ([00e6836](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/00e68365b1401d0af211cf6f9cd3184ed61fa102)) +* release 2.7.3 ([f06b8ff](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/f06b8ff117a30c4ed0a2084c6a75dfd4e72d254b)) +* release 2.7.3 ([484e008](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/484e0081b69b59c0f41857bab66ac8b024d95e86)) + +## [2.7.2](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.2...netzgrafik-frontend-v2.7.2) (2024-08-06) + + +### Bug Fixes + +* disable notes in filter sidebar in standalone mode ([#211](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/211)) ([df335ef](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/df335ef9aede8c47064655f3dbcc5723c2a89f1a)) + +## [2.7.2](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/netzgrafik-frontend-v2.7.2...netzgrafik-frontend-v2.7.2) (2024-08-06) + + +### Bug Fixes + +* disable notes in filter sidebar in standalone mode ([#211](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/211)) ([df335ef](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/df335ef9aede8c47064655f3dbcc5723c2a89f1a)) + +## 2.7.2 (2024-08-06) + + +### Features + +* add AppComponent inputs/outputs ([#166](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/166)) ([9d2c6ee](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9d2c6eee74f94912b68ec8b3375dc53e21a5ecdc)) +* introduce standalone mode ([#162](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/162)) ([cc4c56b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/cc4c56b25aa2d978ebd70fbf34dc129f36b776b2)) +* **pr-template:** add pull request template ([89b4d61](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89b4d61954382c45ffd20ac54137d1faf2f0c5f9)) +* publish package on NPM ([#172](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/172)) ([1692d55](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/1692d5561f8e1fd8b00a60b673b7567d81d83aef)) + + +### Bug Fixes + +* align theme color picker with buttons ([#198](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/198)) ([e3a8798](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e3a87989ea28a04a4a0bb9cee825825bb1b97d7b)) +* enable output hashing by default ([#174](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/174)) ([8ac67b8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/8ac67b807db1e0fc418d4bacddabfabcb80620f4)) +* issue I. + typo ([#72](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/72)) ([deb7cd1](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/deb7cd1514a320ca14d53bdd26cdbdeff6005c79)) +* use light theme for sbb-esta ([#176](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/176)) ([89aaae0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89aaae004170b59649b0856f14de1d31e86a6e18)) + + +### Miscellaneous Chores + +* release 2.5.0 ([00e6836](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/00e68365b1401d0af211cf6f9cd3184ed61fa102)) + +## 2.7.1 Manually edited version number (preparation automatic release building) + + +### Bug Fixes + +* align theme color picker with buttons ([#198](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/198)) ([e3a8798](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/e3a87989ea28a04a4a0bb9cee825825bb1b97d7b)) + +## [2.6.0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/v2.5.0...v2.6.0) (2024-07-22) + + +### Features + +* add AppComponent inputs/outputs ([#166](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/166)) ([9d2c6ee](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/9d2c6eee74f94912b68ec8b3375dc53e21a5ecdc)) +* introduce standalone mode ([#162](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/162)) ([cc4c56b](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/cc4c56b25aa2d978ebd70fbf34dc129f36b776b2)) +* publish package on NPM ([#172](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/172)) ([1692d55](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/1692d5561f8e1fd8b00a60b673b7567d81d83aef)) + + +### Bug Fixes + +* enable output hashing by default ([#174](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/174)) ([8ac67b8](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/8ac67b807db1e0fc418d4bacddabfabcb80620f4)) +* use light theme for sbb-esta ([#176](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/176)) ([89aaae0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/commit/89aaae004170b59649b0856f14de1d31e86a6e18)) + ## [2.5.0](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/v2.5.0...v2.5.0) (2024-04-22) diff --git a/CI.md b/CI.md new file mode 100644 index 00000000..2fd67ad0 --- /dev/null +++ b/CI.md @@ -0,0 +1,19 @@ +# Continuous Integration + +This repository uses [release-please](https://github.com/googleapis/release-please) for CHANGELOG generation, the creation of GitHub releases, and version bumps +for your projects. + +It maintains [Release PRs](https://github.com/googleapis/release-please?tab=readme-ov-file#whats-a-release-pr). + +We use [Manifest Driven release-please](https://github.com/googleapis/release-please/blob/main/docs/manifest-releaser.md). +It uses source-controlled files containing + +* releaser specific configuration ([release-please-config.json](release-please-config.json)) +* package version tracking ([.release-please-manifest.json](.release-please-manifest.json)). + +See [release-please CLI documentation](https://github.com/googleapis/release-please/blob/main/docs/cli.md) for more details. + +### FAQ + +* [How do I change the version number?](https://github.com/googleapis/release-please?tab=readme-ov-file#how-do-i-change-the-version-number) + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4798a8f..0f5ec470 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,8 @@ We appreciate all kinds of contributions. The following is a set of guidelines for contributing to this repository on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. +By submitting a contribution to this repository you agree that you do this under the [license](LICENSE) of the repository and certify that you have all the rights to do so. + #### Table Of Contents [Code of Conduct](#code-of-conduct) @@ -135,6 +137,19 @@ This project uses [Conventional Commits](https://www.conventionalcommits.org/) t As an example, please refer to: https://github.com/sbb-design-systems/sbb-angular + +### How should I write my commits? + +The project is using [Release please](https://github.com/googleapis/release-please?tab=readme-ov-file#how-should-i-write-my-commits) + +The most important prefixes you should have in mind are: + +* `fix:` which represents bug fixes, and correlates to a [SemVer](https://semver.org/) + patch. +* `feat:` which represents a new feature, and correlates to a SemVer minor. +* `feat!:`, or `fix!:`, `refactor!:`, etc., which represent a breaking change + (indicated by the `!`) and will result in a SemVer major. + ## Your First Code Contribution Unsure where to begin contributing to Atom? You can start by looking through these `beginner` and `help-wanted` issues: diff --git a/README.md b/README.md index 91d31bba..5eb5af58 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,68 @@ +# Netzgrafik-Editor's OSRD fork + +Our fork uses the branch `standalone`, regularily rebased onto the base +repository's `main` branch. We try to keep the list of patches applied on top +of the base repository as small as possible, ideally upstreaming them little by +little when it makes sense. The list of patches can be viewed here: +https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/compare/main...osrd-project:netzgrafik-editor-frontend:standalone + +A new NPM package is automatically published on all pushes to any branch of the +fork. The list of versions can be seen here: +https://www.npmjs.com/package/@osrd-project/netzgrafik-frontend?activeTab=versions + +## Initial setup + +Clone the base repository, add OSRD's fork as a separate remote, checkout the +fork's branch: + +```sh +git clone git@github.com:SchweizerischeBundesbahnen/netzgrafik-editor-frontend.git +cd netzgrafik-editor-frontend +git remote add osrd-project git@github.com:osrd-project/netzgrafik-editor-frontend.git +git fetch osrd-project +git checkout standalone +``` + +## Pulling in changes from the base repository + +Fetch changes from the base repository and rebase our fork: + +```sh +git fetch --all +git checkout standalone +git reset --hard osrd-project/standalone +git rebase origin/main +git push --force-with-lease +``` + +## Making changes to fork patches + +Sometimes it's necessary to make a change to one of our fork's patches (as +opposed to one of the commits present in the base repository). + +First switch to the `standalone` branch and identify the commit you want to +edit. Then create a new working branch, make the changes to the source files, +and create a fixup commit: + +```sh +git checkout standalone +git checkout -b emersion/fix-all-the-bugs +# edit source files, work work work +git commit -a --fixup +git push osrd-project +``` + +A pull request can then be opened and the changes can be reviewed. Once the PR +is merged, the fixup can be squashed into its original commit: + +```sh +git fetch --all +git checkout standalone +git reset --hard osrd-project/standalone +git rebase --autosquash --keep-base origin/main +git push --force-with-lease +``` + # Netzgrafik-Editor
@@ -26,7 +91,6 @@ The product vision is to accelerate the planning and sizing of transport systems
- ## Introduction The Netzgrafik-Editor is a powerful software that enables the creation, modification, and analysis @@ -150,6 +214,11 @@ Get an insight into the plan and future [ROADMAP.md](ROADMAP.md). The user manual can be found here [USERMANUAL.md](documentation/USERMANUAL.md) +## Online Demo +[Standalone Demo](https://schweizerischebundesbahnen.github.io/netzgrafik-editor-frontend/) ( [Sample Netzgrafik](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/src/app/sample-netzgrafik/Demo_Netzgrafik_Fernverkehr_2024.json) - [How to Import JSON](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md) ) + +[Extern: nge.flatland.cloud](https://nge.flatland.cloud) - powered by [Flatland Association](https://www.flatland-association.org/) + ## Getting-Started ### Development setup @@ -263,3 +332,8 @@ Many thanks to all contributors for their engagement and contribution, without w would not have been possible. Thank you for your current and future contribution! [CREDITS.md](CREDITS.md) + +## Continuous Integration + +This repository uses [release-please](https://github.com/googleapis/release-please) for CHANGELOG generation, the creation of GitHub releases, and version bumps for your projects. +See [CI.md](CI.md) for details. diff --git a/angular.json b/angular.json index d548e192..8145c845 100644 --- a/angular.json +++ b/angular.json @@ -4,26 +4,6 @@ "newProjectRoot": "projects", "projects": { "netzgrafik-frontend": { - "i18n": { - "locales": { - "de": { - "translation": "src/i18n/messages.de-CH.xlf", - "baseHref": "/de/" - }, - "fr": { - "translation": "src/i18n/messages.fr-CH.xlf", - "baseHref": "/fr/" - }, - "it": { - "translation": "src/i18n/messages.it-CH.xlf", - "baseHref": "/it/" - } - }, - "sourceLocale": { - "code": "en", - "baseHref": "/en/" - } - }, "projectType": "application", "schematics": { "@schematics/angular:component": { @@ -37,12 +17,6 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "localize": [ - "en", - "de", - "it", - "fr" - ], "outputPath": "dist/netzgrafik-frontend", "index": "src/index.html", "main": "src/main.ts", @@ -59,6 +33,7 @@ "scripts": [], "vendorChunk": true, "extractLicenses": false, + "outputHashing": "all", "buildOptimizer": false, "sourceMap": true, "optimization": false, @@ -70,7 +45,6 @@ }, "configurations": { "production": { - "localize": true, "outputPath": "dist", "fileReplacements": [ { @@ -79,7 +53,6 @@ } ], "optimization": true, - "outputHashing": "all", "sourceMap": false, "namedChunks": false, "extractLicenses": true, @@ -107,7 +80,25 @@ }, "es5": { "tsConfig": "tsconfig.app.es5.json" - } + }, + "standalone": { + "outputHashing": "none", + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.standalone.ts" + } + ] + }, + "standalonedemo": { + "outputHashing": "none", + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.standalonedemo.ts" + } + ] + }, }, "defaultConfiguration": "" }, @@ -125,14 +116,21 @@ }, "es5": { "buildTarget": "netzgrafik-frontend:build:es5" + }, + "standalone": { + "buildTarget": "netzgrafik-frontend:build:standalone" + }, + "standalonedemo": { + "buildTarget": "netzgrafik-frontend:build:standalonedemo" } } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { - "format": "xlf", - "outputPath": "src/i18n", + "format": "json", + "outputPath": "src/assets/i18n/", + "outFile": "locale.json", "buildTarget": "netzgrafik-frontend:build" } }, @@ -207,14 +205,6 @@ "buildTarget": "netzgrafik-frontend:build:production" } } - }, - "t9n": { - "builder": "angular-t9n:t9n", - "options": { - "translationFile": "src/i18n/messages.xlf", - "targetTranslationPath": "src/i18n", - "includeContextInTarget": false - } } } } diff --git a/docker/nginx-angular.conf b/docker/nginx-angular.conf index 7d4dcb8d..a2f51e62 100644 --- a/docker/nginx-angular.conf +++ b/docker/nginx-angular.conf @@ -6,18 +6,18 @@ server { error_page 500 502 503 504 /50x.html; - location ~* \.(?:.css|.js)$ { + location ~* \.(js|jpg|png|css)$ { expires 1y; } location = / { - index /en/index.html; + index /index.html; } location ~ /(?!nginx_nr_agent_stub_status)([\w-]+) { expires -1; add_header Pragma "no-cache"; add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; - try_files $uri $uri/ /$1/index.html =404; + try_files $uri $uri/ /index.html =404; } } diff --git a/documentation/AdvancedEditingShortcuts.md b/documentation/AdvancedEditingShortcuts.md index f053605d..53f0dd76 100644 --- a/documentation/AdvancedEditingShortcuts.md +++ b/documentation/AdvancedEditingShortcuts.md @@ -1,11 +1,11 @@ ## Advanced editing short-cuts -Users can perform advanced editing operation short-cuts such as copy (ctrl+c), paste (ctrl+v), -duplicate (ctrl+d), delete ('delete') and undo (ctrl+z) in multiple steps - either using the -standard (ctrl+z) key command or with help of the version history. These editing functions make it +Users can perform advanced editing operation short-cuts such as copy `ctrl`+`c`, paste `ctrl`+`v`, +duplicate `ctrl`+`d`, delete `delete` and undo `ctrl`+`z` in multiple steps - either using the +standard `ctrl`+`z` key command or with help of the version history. These editing functions make it easier to manage and edit complex network structures. -> User don't need to explicitly save the latest changes. The system save it automatically. There is +> Users don't need to explicitly save the latest changes. The system saves it automatically. There is > therefore no shortcut for saving changes. ### Short-cuts @@ -13,38 +13,38 @@ easier to manage and edit complex network structures. | Keyboard | description | |:----------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| | | | -| 'delete' | Delete nodes, comments, and selected trainruns. | -| ctrl+d / 'insert' | Duplicate nodes, comments, and selected trainruns (if multiple nodes are selected, trains including nodes will be duplicated). | -| 'insert' | Add new nodes under the mouse on the drawing area. | -| 'escape' | Select trainruns / In multi-node move mode, all selected nodes will be unselected. | -| shift + left mouse button pressed and move (or alternatively with the right mouse button pressed and move) | Multi-select nodes and notes for subsequent moving or delete all selected elements by using "Delete". | -| ctrl+z | Undo - Reverse the previous action. | -| ctrl+c | Copy the currently visible trainruns. The copied content remains in the browser's memory/cache and can be pasted into different variants (even after closing the browser, the data remains saved). | -| ctrl+v | Paste the copied trainruns. | -| ctrl+a | Select all. | +| `delete` | Delete nodes, comments, and selected trainruns. | +| `ctrl`+`d` / `insert` | Duplicate nodes, comments, and selected trainruns (if multiple nodes are selected, trains including nodes will be duplicated). | +| `insert` | Add new nodes under the mouse on the drawing area. | +| `escape` | Select trainruns / In multi-node move mode, all selected nodes will be unselected. | +| `shift` + `left mouse button` pressed and move (or alternatively with the `right mouse button` pressed and move) | Multi-select nodes and notes for subsequent moving or delete all selected elements by using `Delete`. | +| `ctrl`+`z` | Undo - Reverse the previous action. | +| `ctrl`+`c` | Copy the currently visible trainruns. The copied content remains in the browser's memory/cache and can be pasted into different variants (even after closing the browser, the data remains saved). | +| `ctrl`+`v` | Paste the copied trainruns. | +| `ctrl`+`a` | Select all. | ### Duplicate -To duplicate one or many elements - use *shift + left mouse button pressed* to select several -elements and press (ctrl+d). +To duplicate one or many elements - use `shift` + `left` mouse button pressed* to select several +elements and press `ctrl`+`d`. If more than one node is selected, all train sections that are connected to two selected nodes are also duplicated. If further notes are selected, the notes are duplicated in the same way as the nodes. > If in the menu the *Knoten-Positionierungswerkzeug* is activated, you can *multi-select* nodes and -> notes by clicking. If you use shift + right mouse press +> notes by clicking. If you use `shift` + `right mouse button pressed` #### Duplicate trainrun To duplicate a train in the project, follow these steps: - Select the train: Use the left mouse click to select the train that you want to duplicate. -- Duplicate the train: Once the train is selected, press (ctrl+d) on your keyboard to duplicate +- Duplicate the train: Once the train is selected, press `ctrl`+`d` on your keyboard to duplicate it. This action will create an identical copy of the selected train. - > There are alternative editing path to process duplication: Use the copy-past idea: Select the - train und press (ctrl+c) then (ctrl+v) + > There are alternative editing path to process duplication: Use the copy-paste idea: Select the + train und press `ctrl`+`c` then `ctrl`+`v` - Edit the train name: Click on the train name with the left mouse button, and a dialog window will open, allowing you to edit the train's details. Make the necessary changes to the train name or @@ -57,17 +57,17 @@ To duplicate a train in the project, follow these steps: #### Duplicate nodes To duplicate a node, ensure there is no trainrun selected. Move with the mouse pointer over the node -to duplicate and press (ctrl+d). +to duplicate and press `ctrl`+`d`. #### Duplicate notes To duplicate a note, ensure there is no trainrun selected. Move with the mouse pointer over the note -to duplicate and press (ctrl+d). +to duplicate and press `ctrl`+`d`. ### Delete -To delete one or many elements - use *shift + left mouse button pressed* to select several elements -and press 'delete'. +To delete one or many elements - use `shift` + `left mouse button pressed` to select several elements +and press `delete`. #### Delete trainrun @@ -77,15 +77,15 @@ To delete a train in the project, follow these steps: - Delete the train: Once the train is selected, press 'delete' on your keyboard to delete it. This action will create an identical copy of the selected train. - > There are alternative editing path to process duplication: Use the copy-past idea: Select - the train und press (ctrl+c) then (ctrl+v). + > There are alternative editing path to process duplication: Use the copy-paste idea: Select + the train and press `ctrl`+`c` then `ctrl`+`v`. #### Delete nodes To delete a node, ensure there is no trainrun selected. Move with the mouse pointer over the node -to delete and press 'delete'. Deleting a node causes all train sections connected to the node to be deleted. +to delete and press `delete`. Deleting a node causes all train sections connected to the node to be deleted. #### Delete notes To delete a note, ensure there is no trainrun selected. Move with the mouse pointer over the note -to delete and press 'delete'. +to delete and press `delete`. diff --git a/documentation/CREATE_CONNECTIONS.md b/documentation/CREATE_CONNECTIONS.md index 12f17311..fa9ce0e0 100644 --- a/documentation/CREATE_CONNECTIONS.md +++ b/documentation/CREATE_CONNECTIONS.md @@ -1,4 +1,4 @@ -## Conncetions +## Connections ![Editing_Connections](./images/Editing_Connections.png) @@ -30,7 +30,7 @@ can see all the connections for a selected train. To delete a connection, follow - In the Perlenkette, locate the connections for the selected train that you want to delete. - Click on the connections to mark them. (Clicking again removes the marking.) -- Once the connections are marked, press the "Delete" key ('delete') to delete all the marked +- Once the connections are marked, press `Delete` to delete all the marked connections. [2024-1-25_DeleteConnections_Perlenkette_select_delete-002.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/7307f446-fc05-41c3-8c1c-a18d04a7dea2) diff --git a/documentation/CREATE_FILTERS.md b/documentation/CREATE_FILTERS.md index ac4b464c..c2f6ef40 100644 --- a/documentation/CREATE_FILTERS.md +++ b/documentation/CREATE_FILTERS.md @@ -59,9 +59,9 @@ apply the label globally or to all nodes, trains, or notes. - Rename: Allows you to change the name of the label. - Delete: Removes the label globally, means it will be removed from all visible elements, such as - nodes, trains, or notes. (If filtering is active the label might be still in use in unvisible + nodes, trains, or notes. (If filtering is active the label might be still in use in invisible elements therefore it can not be deleted.) -- Apply: Transfers the label to all visble elements such as nodes, trains, or notes. This means that +- Apply: Transfers the label to all visible elements such as nodes, trains, or notes. This means that the label will be added to all visible nodes, trains, or notes. These functions provide flexibility in managing and customizing labels according to your needs. diff --git a/documentation/CREATE_NODES.md b/documentation/CREATE_NODES.md index 4f60921c..d5da13d0 100644 --- a/documentation/CREATE_NODES.md +++ b/documentation/CREATE_NODES.md @@ -12,7 +12,7 @@ Whenever you need to create a new node. You should follow these steps: [29-01-2024-005-create_nodes.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/8ba6957c-de8e-467c-b7ae-c71b451d014e) -### Import nodes from a semicolon-seperate-value file (CSV) +### Import nodes from a semicolon-separate-value file (CSV) Nodes can be imported using a predefined **semicolon-separated file** (CSV). This allows creating very quickly the required nodes and the defaults used for planning. In addition to node @@ -28,7 +28,7 @@ so that the layout comes directly from the import. | | BP | Bahnhof | Kategorie | Region | Fahrgastwechselzeit_IPV | Fahrgastwechselzeit_A | Fahrgastwechselzeit_B | Fahrgastwechselzeit_C | Fahrgastwechselzeit_D | ZAZ | Umsteigezeit | Labels | X | Y | Erstellen | |:----------------:|:--------------------------------------------:|:------------------------------------------------:|:--------------:|:-------------:|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:-------------:|:--------------------------------:|:--------------------------------:|:-----------------:|:-------------------:|:---------------------------------------------------------------:| | Datatype | string | string | string | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | nummeric | 'JA' or empty | -| Description | id | full name | category label | region number | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | no implemened | min. connectiontime - Default: 2 | comma separated filerable labels | vertical position | horizontal position | if 'JA' missing nodes gets created, otherwise just updated (ID) | +| Description | id | full name | category label | region number | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | if <= 0 -> non stop, otherwise > default stop time | no implemened | min. connectiontime - Default: 2 | comma separated filterable labels | vertical position | horizontal position | if 'JA' missing nodes gets created, otherwise just updated (ID) | | More information | this is a unique identifier
(non-empty) | full name of the station (node)
(non-empty) | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | empty allowed | **category label:** If the node gets created or updated the category labels gets added as filterable @@ -92,7 +92,7 @@ If you want to move a node process as follows: ##### Single trainrun This example shows how a trainrun is aligned to a node. The outgoing/incoming edge (trainrun -sections) depends on the node position to where the trainrun section is algined to. +sections) depends on the node position to where the trainrun section is aligned to. [29-01-2024-006-move-nodes-reroute_trainrun.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/9ffb18c9-3f47-4bec-b7da-6368037b6a5f) @@ -100,7 +100,7 @@ sections) depends on the node position to where the trainrun section is algined ##### Multiple trainruns outgoing/ingoing ports order (positions) -The outgoing/incoming edge alginment depends strongly on the position of the node. +The outgoing/incoming edge alignment depends strongly on the position of the node. If two or more trainrun have at least one identical node (start/end does not matter), the trainrun are sorted according to the position of the branching node - from top to bottom or diff --git a/documentation/CREATE_PROJECT.md b/documentation/CREATE_PROJECT.md index 3cf45cb1..776e9a8b 100644 --- a/documentation/CREATE_PROJECT.md +++ b/documentation/CREATE_PROJECT.md @@ -17,6 +17,24 @@ description. Now you have created a first project that can contain multiple vari [29-01-2024-001-Create_new_project.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/4e34d3a2-5291-4193-ac88-5e522f6223f7) +#### Share a project +Users can share their projects with other employees and assign different access rights. There are two options: +- write access +- read access. + +#### With write access, +... the employee with whom the project is shared can edit the project, make changes to it, or delete it, including creating, deleting, and archiving variants. + + +#### With read access, +... the employee can only view and read the project, but cannot make any changes to it (cannot save). + +The choice between write access and read access depends on the desired level of collaboration and contribution from the employees to the project. + +#### Example +![image](https://github.com/user-attachments/assets/cc925325-1925-4256-a654-3216c13412d5) + + ### Create a new Variant within a project To create a new variant of a project, simply click on the "+" symbol and enter a name. As soon as @@ -31,18 +49,18 @@ created a new variant in the project, the editor will open automatically. The editor opens the newly created Netzgrafik. The new Netzgrafik contains some initially created nodes from which users can draw trainruns with their sections. In most projects these nodes are not -required. If so press (ctrl+a) to select all elements of the current Netzgrafik and press 'delete' +required. If so, press `ctrl`+`a` to select all elements of the current Netzgrafik and press `delete` to remove them. [29-01-2024-003-clear_variant_data.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/47c7a9e5-5c4a-4159-a7fa-141347dae264) #### Create/import nodes -For mor details have a look into [create and modifiy nodes](CREATE_NODES.md). +For more details have a look into [create and modifiy nodes](CREATE_NODES.md). #### Create trainruns -For mor details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). +For more details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). ## Basic Concept: Project / Variants @@ -158,7 +176,7 @@ prevent projects or variants from being accidentally deleted. > If a project is deleted, all of its variants will also be deleted. -### Visiblity of versions +### Visibility of versions It is important to understand that the projects and variants are available to all users with read or write access. The snapshot versions are only visible to the respective editing user and are no diff --git a/documentation/CREATE_TRAINRUN.md b/documentation/CREATE_TRAINRUN.md index 518c94b5..146b5d38 100644 --- a/documentation/CREATE_TRAINRUN.md +++ b/documentation/CREATE_TRAINRUN.md @@ -11,26 +11,26 @@ With the help of the left mouse button and keyboard you can create or modify any the trainrun category and name. When a new trainrun gets created the system opens a dialog window where you can enter all -information about the new created trainrun, such a trainrun category and name. Then click outside -the window or press 'ESC' to close the dialog window. +information about the newly created trainrun, such as trainrun category and name. Then click outside +the window or press `ESC` to close the dialog window. > - If you like to (re)open the dialog windows just click on the trainrun name in the editor or click any number (time). The dialog window is displayed again with the clicked data input field in focus. -> - If you click on the trainrun - its gets selected and you can modify it. +> - If you click on the trainrun - it gets selected and you can modify it. > - Click for a second time the Perlenkette gets opened. [29-01-2024-005-start-creating_trainrun.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/bc23f079-3aa6-4725-af6f-da4a53627ca3) -For mor details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). +For more details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). #### Create new trainrun section - step by step To create a new train or adding new trainrun section to an existing trainrun, proceed as follows: -- Move with the mouse pointer to the (inner) node: Press the left mouse button on the inner node +- Move with the mouse pointer to the (inner) node: Press the `left mouse button` on the inner node from which you want to start the trainrun section. -- Hold pressed the left mouse button and drag the line to the other node. The line displays visually +- Hold pressed the `left mouse button` and drag the line to the other node. The line displays visually the trainrun section you want to create. - Configure the train route: Give the new train an appropriate name and specify the necessary details, such as train number or other relevant information. @@ -49,7 +49,7 @@ Currently, following different heuristics are available: - The **default method** (heuristic) assumes a constant travel time per section, with a default setting of 1 minute per section. This means that regardless of the distance or other factors, each section has a fixed travel time of 1 minute. This heuristic can be helpful as it generates obviously unusable travel times, prompting the user to address the travel time. The -1 minute is very clear that this time has to manually adapted. +1 minute is very clear that this time has to be manually adapted. - A more complex method (heuristic) can be set to **derive the travel time from existing ones**. The travel time heuristic searches for other trains of the same category on the section. If there are other trains, the longest travel @@ -74,7 +74,7 @@ To reroute a train, follow these steps: node to reroute them. > If you drag the hexagon button outside the node it generates an intermediate stop if there was a stopping transition or it just removed the non-stop transition. For both cases it reroutes the - trainrun by removing the node alginment where the hexagon/transition was. + trainrun by removing the node alignment where the hexagon/transition was. [2024-1-25-Rerouting_extend_remove_trainrunsections-001.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/d697594c-57a8-4159-b44f-8a9f804f297f) @@ -87,7 +87,7 @@ To delete a trainrun section, process as follows: - Click the trainrun to modify (select the trainrun) - Move with the mouse pointer to one of the two pins (cricle) where the trainrun section is aligned to the node -- Press left mouse button and drag the pin (trainrun section). Instead of reassign to another or +- Press `left mouse button` and drag the pin (trainrun section). Instead of reassign to another or same node, just release it outside the node ### Toggle stop / non-stop at node (trainrun transition) @@ -103,6 +103,34 @@ To switch a train from a stop to a non-stop at a node, follow these steps: ### Split / Combine two trainruns and merge Netzgrafik -For mor details have a look into +For more details have a look into - [Split/Combine two trainruns](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/Split_Combine_Trainruns.md) - [Merge Netzgrafik](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/Merge_Netzgrafik.md) + +## Special cases + +### Trainrun path with "holes" (missing sections) + +![image](https://github.com/user-attachments/assets/d87b842c-7696-4e81-aa78-75cc966b5306) +*Example Netzgrafik with missing sections (See the cargo trainrun GTwo_Part_trainrun)* + + +When creating a trainrun, the trairnun path should connect all nodes from start to destination using trainrun sections. +However, it can happen during the creation that not all trainrun sections have been drawn in the meantime. +Gaps may occur along the trainrun path where at least one trainrun section is missing. +These “holes” usually occur if the trainrun path has not yet been drawn completely or correctly. +For example, a trainrun path could look like this with a "hole" in the middle, + +A - B - C ---- (missing section) ---- E - F - G + +The trainrun section between C and E is missing here. However, these gaps can also occur if a partial cancelation is made for a train run. + +![image](https://github.com/user-attachments/assets/5d1ef657-e421-41ff-ae57-622eee82f295) +*Graphical timetable.* + + +In each of these cases, the trainrun has at least two parts, e.g. [(A B), (A C)] and [(E F)(F G)]. +In this case, the trainrun is interpreted as two separate trainruns. +The Netzgrafik has no information about whether the missing part could be closed between C - E, C - D - E or +another possible variant, therefore the assumption that there is an independent trainrun for each trainrun part is +the best assumption. This avoids many new problems. diff --git a/documentation/DATA_MODEL.md b/documentation/DATA_MODEL.md index e00ab568..067c27b5 100644 --- a/documentation/DATA_MODEL.md +++ b/documentation/DATA_MODEL.md @@ -41,6 +41,9 @@ trainrun routes and schedules. ### Technically orientated description +![image](https://github.com/user-attachments/assets/21fdb029-2a59-468a-ac93-11cf702536bd) + + Thus, the data model, consisting of TrainrunSection and nodes, forms a network of edges and nodes, similar to an undirected graph. The TrainrunSections represent the connections between the nodes and enable the representation and analysis of complex relationships in the model. @@ -181,6 +184,58 @@ More details can be found in the source code: - [TrainrunSection.routeEdgeAndPlaceText()](./../src/app/models/trainrunsection.model.ts#:~:text=routeEdgeAndPlaceText()%20{) - [TrainrunSectionService.initializeTrainrunSectionRouting()](./../src/app/services/data/trainrunsection.service.ts#:~:text=initializeTrainrunSectionRouting()%20{) +--- + +### Iterate through all train run sections (forward/backward) +To understand how the trainrun iteration has to work, please take another look at this illustration: +![image](https://github.com/user-attachments/assets/21fdb029-2a59-468a-ac93-11cf702536bd) + +#### General + +The [TrainrunIterator](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/d170955ecc466bfa9c10071927c63199eb7a86f7/src/app/services/util/trainrun.iterator.ts#L12) operates over a structure that can be conceptualized as an undirected acyclic graph (DAG), where each trainrun is a connected component. + + + +##### Structure + +- **TrainrunSection:** Each section has a source and a target node, analogous to an edge in a graph. The trainrun section is not directly connected to a node. It's connected via a port. +- **Node:** Nodes manage connections through ports, ports are effectively acting as a vertex within the graph. +- **Transition:** Transitions connect two train sections within a node with the help of ports. They can be interpreted as edges in the graph. + +##### Traversal +To initiate traversal, it is important to specify a location (node) where the traversal begins. To determine the traversal direction a trainrun section is required. The trainrun section must be connected to the node. Otherwise the traversal will fail. With the help of the trainrun section the traversal method determines the travel direction. Therefore, a tuple consisting of a node and a trainrun section is needed for each traversal. This tuple determines the directed edge in the directed graph. Each edge in a directed graph points to another node. For example, if the given node is the source node, the iterator moves towards the target node; if the node is the target node, the iterator moves towards the source node. This can be defined very simply using the tuple. + +Upon reaching a node, the transition is the object that determines the transition from the input port to the output port within the node. This is important to correctly determine the transition from the incoming trainrun section to the continuing trainrun section. Therefore, to continue traversing through the next section, a transition is needed. Once no transitions are available, the traversal stops. At that point, either the target node of the trainrun or, conversely, the starting node is found. + +The TrainrunIterator can effectively traverse through the trainrun sections by utilizing the source and target nodes of each section. This approach eliminates the need to explicitly maintain a direction in the data and is independent of the input (drawing direction). This allows everything to be kept very simple for the user. + +#### TrainrunIterator + +The TrainrunIterator is a concept aimed at iterating through the sections of a trainrun, similar to how one navigates through the edges of a graph. Here is a detailed description of how this iterator works and how it can be used: + +##### Structure of the Trainrun +- **Graph**: The entire graph is generally an undirected acyclic graph (DAG). Each trainrun (segment) represents a connected component. + +##### Traversal Logic +- **Starting Point**: Iteration begins with a given node and a specific trainrun section. +- **Section Connection**: The iterator moves through connected sections by utilizing the source and target nodes of each section. +- **Transitions**: When a transition is reached, the next connected section is followed through the corresponding port. +- **End of Traversal**: Iteration ends when no further sections or transitions are available. + +##### Example Application +- **Initialization**: The iterator is initialized with a start node ID and a specific trainrun section. +- **Forward Traversal**: The iterator moves from section to section by navigating from one node to the next. During traversal, the source and target nodes of the sections are used to determine the path. +- **Backward Traversal**: To traverse in the opposite direction, the iterator can be re-initialized with the end node ID of the current traversal and the corresponding trainrun section. This reverses the path and allows a return to the starting point. + +##### Detailed Steps +1. **Start with a Node ID and a Trainrun Section**: The iterator begins with a defined node ID and a specific trainrun section. This represents the starting point. +2. **Section-wise Traversal**: The iterator traverses the sections by using the connections between the nodes. It moves from the source node to the target node of a section. +3. **Handling Transitions**: When a transition within a node is reached, the iterator follows the transition to the next connected section. +4. **Traversal End**: Iteration ends when no further connected sections or transitions are available. This signals the end of the trainrun. + +The TrainrunIterator enables structured traversal through the sections of a trainrun by using both a node ID and a specific trainrun section as a starting point. This increases the precision and flexibility of the traversal. By utilizing the source and target nodes of each section and following transitions within the nodes, the iterator can efficiently navigate through the entire trainrun. This method is particularly useful for traversing complex trainrun paths and ensuring that the traversal logic is correctly understood and applied both forwards and backwards. + +If functionality should be initiated by providing a port ID, this could be a further extension allowing a start directly from a specific port. However, this functionality is not yet implemented. --- diff --git a/documentation/DATA_MODEL_JSON.md b/documentation/DATA_MODEL_JSON.md index 32128f80..77f078bc 100644 --- a/documentation/DATA_MODEL_JSON.md +++ b/documentation/DATA_MODEL_JSON.md @@ -9,6 +9,51 @@ understandable representation of data, which facilitates manual editing. [DATA MODEL](DATA_MODEL.md) +## Export/Import +![image](https://github.com/user-attachments/assets/df46327d-5a00-4510-ab8f-563292ce81f8) + +#### Export +To export the current Netzgrafik use the `Export netzgrafik as JSON` button. + +#### Import +The exported data in JSON format can be imported again using the `Import netzgrafik as JSON` button. + +##### JSON-Based Data Import from 3rd Party Data Providers +If nodes have no port objects or if no TrainrunSection has a defined path element, the import process will automatically adjust, +respectively create the required elements. This adjustment ensures that all nodes are created first, followed by the systematic +insertion of each train, section by section. Inserting each section by section ensures that the Netzgrafik drawing gets well routed. +This streamlines the import process, making the exchange of data much more straightforward and efficient. +The 3rd party has only to care about the nodes' position and ensure the trainrun sections are temporally sorted. The TrainrunSection routing gets computed while importing, +thus no complex calculation must be reimplemented by the 3rd party provider. + + +###### Detection of Third-Party Data +The function [detectNetzgrafikJSON3rdParty](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/src/app/view/editor-tools-view-component/editor-tools-view.component.ts#L580) checks if the imported data comes from a third party and if it needs to be adjusted accordingly. + +```typescript +private detectNetzgrafikJSON3rdParty(netzgrafikDto: NetzgrafikDto): boolean { + return netzgrafikDto.nodes.find((n: NodeDto) => + n.ports === undefined) !== undefined + || + netzgrafikDto.nodes.filter((n: NodeDto) => + n.ports?.length === 0).length === netzgrafikDto.nodes.length + || + netzgrafikDto.trainrunSections.find((ts: TrainrunSectionDto) => + ts.path === undefined || + ts.path?.path === undefined || + ts.path?.path?.length === 0 + ) !== undefined; + } + ``` +The function performs the following checks: +- Whether there are nodes without port objects. +- Whether all nodes have empty port lists. +- Whether there are trainrun sections without a defined path. +If any of these conditions are met, the import process is adjusted to automatically create the necessary elements. + +The JSON-based data import from third parties into the net graphic system is designed to simplify the process and ensure that all required elements are correctly created and inserted. This ensures efficient and error-free data transfer. + + ## JSON Description (basic data structure) ```json @@ -32,7 +77,7 @@ understandable representation of data, which facilitates manual editing. - **metadata**: Stores metadata information such as colors, train categories, etc. - **freeFloatingTexts**: Contains any freely placed texts in the Netzgrafik, notes. - **labels**: Represents labels associated with nodes or trainruns. -- **labelGroups**: Groups labels together for easier management and to classify the labels into trainrun labels, node labels and note labes,. +- **labelGroups**: Groups labels together for easier management and to classify the labels into trainrun labels, node labels and note labels,. - **filterData**: Contains data related to filtering the Netzgrafik. This is the basic data structure to represent the various elements in a JSON description. You can populate each element with the specific data relevant to your scenario. @@ -110,7 +155,7 @@ See also [DATA_MODEL.md : business orientated description](https://github.com/Sc - **trainrunCategoryHaltezeiten** : The stop time if the trainrun of product [A, B, C, D or IPV] have to do per default : trainrunCategoryHaltezeiten - **symmetryAxis** : Deprecated : null - **warnings**: If the business logic needs to notify the user about issues, a warning can be used in JSON format : Warning -- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Arrey of numeric +- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Array of numeric
@@ -355,7 +400,7 @@ More details about TimeLock - **categoryId**: Reference to the [trainrunCategories](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md#metadata) : numeric - **frequencyId**: Reference to the [trainrunFrequencies](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md#metadata) : numeric - **trainrunTimeCategoryId**: Reference to the [trainrunTimeCategories](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/DATA_MODEL_JSON.md#metadata) : numeric -- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Arrey of integer +- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Array of integer @@ -369,7 +414,8 @@ More details about TimeLock "netzgrafikColors": [], "trainrunCategories": [], "trainrunFrequencies": [], - "trainrunTimeCategories": [] + "trainrunTimeCategories": [], + "analyticsSettings": {} } ``` @@ -591,6 +637,26 @@ Define the dayTimeIntervalElement ``` - **from** : interval starts at time (include), in minute : numeric - **to** : interval ends at time (include), in minute : numeric +
+ +
+ +analyticsSettings: Contains settings for analytics features, such as originDestination matrix. + + + +```JSON +"analyticsSettings": { + "originDestinationSettings": { + "connectionPenalty": 5 + }, +} +``` + +- **connectionPenalty**: Cost to add for each connection, in minute : numeric + + +
--- @@ -621,5 +687,5 @@ Define the dayTimeIntervalElement - **text**: The text (description) of the node : string - **backgroundColor**: HTML color as HEX for the background: string - **textColor**: HTML color as HEX for the text: string -- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Arrey of integer +- **labelIds**: Filterable labels assigned to the node are stored in this array of label identifiers : Array of integer diff --git a/documentation/Graphic_Timetable.md b/documentation/Graphic_Timetable.md index 8ba299d7..efb80810 100644 --- a/documentation/Graphic_Timetable.md +++ b/documentation/Graphic_Timetable.md @@ -6,15 +6,14 @@ The graphic timetable (Streckengraphik) is a ***distance-time diagram***. This d representation which shows the relationship between the distance travelled and the time taken. The diagram shows the course of train journeys along a route corridor. -In the distance-time diagram, the horizontal axis (x-axis) represents the distance traveled a long +In the distance-time diagram, the horizontal axis (x-axis) represents the distance traveled along the corridor of interest, and the vertical axis (y-axis) represents time. The units on the time axis are given in minutes. Due to the unspecified distance in the previously designed Netzgrafik, the exact distance cannot be determined. To ensure readability, there are two different scaling heuristics: -- **Equal distances between the sections**: Each section has the same width, i.e. it has the same - number - of pixels. It is important to understand that the speed can only be compared within a section +- **Equal distances between the sections**: Each section has the same width, i.e., it has the same + number of pixels. It is important to understand that the speed can only be compared within a section based on the angles. Comparing two sections based on the angle is not very meaningful as the actual distance travelled can be very different. Therefore, the comparison cannot be made due to the lack of information. @@ -77,7 +76,7 @@ there must be future expand the node's capacity to run the concept smoothly. This information can help in efficient train planning and ensures that there is adequate infrastructure to accommodate trains during their scheduled stops. It enables better utilization of resources and facilitates smooth and reliable train processes. Further can this information help to -continue working on a variant or reject in a early phase. +continue working on a variant or reject in an early phase. When a train ends or starts at a node, track occupancy is more complicated. The track occupancy must take the turnaround into account. A simple turnaround is possible if the minimum dwell time for the @@ -98,9 +97,9 @@ Example #### Minimum number of tracks on sections The distance-time diagram provides a graphical overview of the entire corridor of interest and -reveal points of intersection or overlap between different train runs. These intersection points -indicate potential conflicts or temporal overlaps between trains. The temporal overlaps takes also -into account of the headway time which can be defined for each trainrun category seperatly. +reveals points of intersection or overlap between different train runs. These intersection points +indicate potential conflicts or temporal overlaps between trains. The temporal overlaps take also +into account the headway time which can be defined for each trainrun category separately. By analyzing these conflicting regions in the distance-time diagram, it is possible to estimate the minimum number of tracks needed to ensure smooth train operations. These projections can give @@ -117,6 +116,6 @@ working on the variant or reject it. Example -![minum number of tracks on sections](./images/Overview_Streckengrafik_Screenshot_003.png) +![minimum number of tracks on sections](./images/Overview_Streckengrafik_Screenshot_003.png) diff --git a/documentation/Merge_Netzgrafik.md b/documentation/Merge_Netzgrafik.md index 85ad21d2..f6030929 100644 --- a/documentation/Merge_Netzgrafik.md +++ b/documentation/Merge_Netzgrafik.md @@ -10,7 +10,7 @@ To merge two independent Netzgrafik, you can follow these steps: - (Optional) Create a new variant. - Copy the necessary elements from one Netzgrafik and paste them into the other Netzgrafik. - As long as complete trainruns are copied, i.e. including all trainrun sections from start to destination, there is no need to merge trainruns. If the Netzgrafiks to be merged consists of regions (or partial corridors) - or just trainrun sections that actually represent partial trainrun, these must be merged manually using the Combine function at the nodes where the parts of the trainrun meet. + or just trainrun sections that actually represent partial trainrun, these must be merged manually using the [combine function](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/Split_Combine_Trainruns.md#combine-two-trainruns) at the nodes where the parts of the trainrun meet. By following these steps, you can successfully merge two independent Netzgrafik. diff --git a/documentation/ORIGIN_DESTINATION_MATRIX.md b/documentation/ORIGIN_DESTINATION_MATRIX.md new file mode 100644 index 00000000..0f2a1ab2 --- /dev/null +++ b/documentation/ORIGIN_DESTINATION_MATRIX.md @@ -0,0 +1,13 @@ +# Origin Destination Matrix + +The Origin Destination Matrix shows the optimized travel time (total cost) between each pair of nodes. + +The optimized travel time includes a fixed penalty (5 minutes) for each transfer, but the Origin Destination Matrix also shows the corresponding effective travel time and number of transfers. + +## Filtering + +If some nodes are selected, then the Origin Destination Matrix will only show results between these nodes (but other nodes may be used to compute paths). + +The Origin Destination Matrix will only show results between visible nodes (but other nodes may be used to compute paths). + +The Origin Destination Matrix will only use visible trainruns to compute paths. diff --git a/documentation/STANDALONE.md b/documentation/STANDALONE.md new file mode 100644 index 00000000..3c87167c --- /dev/null +++ b/documentation/STANDALONE.md @@ -0,0 +1,96 @@ +# Operations + +## Angular EventEmitter + +The Angular EventEmitter is used to emit custom events in Angular applications. It is an essential part of Angular's event handling mechanism. + +[Angular EventEmitter Documentation](https://v17.angular.io/api/core/EventEmitter) + +## Design of Operation class + +The Operation class is designed to represent various operations performed on different entities within the application. Each operation has a type (create, update, delete), a payload (the entity being operated on), and optional parameters. This design allows for a standardized way to handle and emit changes to entities. The Operation class is an abstract class with the following properties: + +```txt +- type: The type of operation (create, update, delete). +- objectType: The type of object the operation is performed on (trainrun, node). +- object: The object on which the operation is performed. +``` + +## Why do we want to emit events about NGE change + +Emitting events about NGE changes is crucial for ensuring that all parts of the application are aware of modifications. This is especially useful when NGE is integrated into another application, as it allows for seamless updates and synchronization of state across different components. + +The emission of these events doesn't impact the general behavior of the application, and if the user doesn't need these events, the Operations can be simply ignored. + +## NGE Operations + +The operations related to the NGE framework are used to handle changes to Trainrun, Node and Label entities. These operations ensure that any modifications are properly tracked and emitted, allowing for real-time updates and consistency within the application. + +### Current list of actions available in NGE + +#### Trainrun + +- create Trainrun manually => TrainrunOperation(create) +- duplicate Trainrun (selection + CTRL-D key) => TrainrunOperation(create) +- duplicate Trainrun (trainrun window, Duplicate trainrun button) => TrainrunOperation(create) +- copy-paste a Trainrun (selection + CTRL-C key then CTRL-V key) => TODO: complicated -> works due to merge +- modify TrainrunSections manually (add trainrunSection manually from one node to another) => TrainrunOperation(update) +- modify TrainrunSections manually (modify a trainrunSection manually by reconnecting a port to another node) => TrainrunOperation(update) +- modify TrainrunSections manually (delete a trainrunSection manually by reconnecting a port to empty space) => TrainrunOperation(update) +- modify TrainrunSection sourceDeparture incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection sourceDeparture in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify TrainrunSection targetArrival incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection targetArrival in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify TrainrunSection targetDeparture incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection targetDeparture in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify TrainrunSection sourceArrival incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection sourceArrival in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify TrainrunSection travelTime incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection travelTime in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify TrainrunSection numberOfStops incrementally (trainrun window or Perlenkette, +/- button) => TrainrunOperation(update) +- modify TrainrunSection numberOfStops in one go (trainrun window or Perlenkette, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- modify Trainrun name (trainrun window or Perlenkette, fill in the box + ENTER key / click elsewhere) => TrainrunOperation(update) +- modify Trainrun category (trainrun window or Perlenkette, select another category) => TrainrunOperation(update) +- modify Trainrun frequency (trainrun window or Perlenkette, select another frequency) => TrainrunOperation(update) +- modify Trainrun timeCategory (trainrun window or Perlenkette, select another time range) => TrainrunOperation(update) +- modify Trainrun transition stop (main window or Perlenkette, click on the hexagon in the middle of a node) => TrainrunOperation(update) +- (if it does not exist, create and) add Trainrun label (trainrun window, fill in the box then ENTER key / click elsewhere) => TrainrunOperation(update) +- delete Trainrun label (trainrun window, delete label button) => TrainrunOperation(update) +- delete Trainrun (selection + DEL key) => TrainrunOperation(delete) +- delete Trainrun (trainrun window, Delete trainrun button) => TrainrunOperation(delete) +- delete Trainrun (if only one section, drag one of the points to empty space) => TrainrunOperation(delete) + +#### Node + +- create Node manually => NodeOperation(create) +- copy-paste one or more Nodes (selection + CTRL-C key then CTRL-V key) => n\*(NodeOperation(create)) +- duplicate one or more Nodes (selection + CTRL-D key) => n\*(NodeOperation(create)) +- modify Node name (node window, fill in the box then ENTER key / click elsewhere) => NodeOperation(update) / TODO: triggered on change (not great) +- modify Node betriebspunktName (node window, fill in the box then ENTER key / click elsewhere) => NodeOperation(update) / TODO: triggered on change (not great) +- modify Node connectionTime (node window, fill in the box then ENTER key / click elsewhere) => NodeOperation(update) +- modify Node capacity (node window, fill in the box then ENTER key / click elsewhere) => none (because it is just informative) +- modify Node IPV stoppingTime time (node window, fill in the box then ENTER key / click elsewhere) => none (disabled feature) +- modify Node IPV stoppingTime noStop (node window, tick button) => none (disabled feature) +- modify Node A stoppingTime time (node window, fill in the box then ENTER key / click elsewhere) => none (disabled feature) +- modify Node A stoppingTime noStop (node window, tick button) => none (disabled feature) +- modify Node B stoppingTime time (node window, fill in the box then ENTER key / click elsewhere) => none (disabled feature) +- modify Node B stoppingTime noStop (node window, tick button) => none (disabled feature) +- modify Node C stoppingTime time (node window, fill in the box then ENTER key / click elsewhere) => none (disabled feature) +- modify Node C stoppingTime noStop (node window, tick button) => none (disabled feature) +- modify Node D stoppingTime time (node window, fill in the box then ENTER key / click elsewhere) => none (disabled feature) +- modify Node D stoppingTime noStop (node window, tick button) => none (disabled feature) +- modify Node position (cross cursor + drag) => NodeOperation(update) +- modify Nodes positions (multi selection, cross cursor + drag) => n\*(NodeOperation(update)) +- (if it does not exist, create and) add Node label (node window, fill in the box then ENTER key / click elsewhere) => NodeOperation(update) +- delete Node label (node window, delete label button) => NodeOperation(update) +- delete Node (selection + DEL key) => NodeOperation(delete) +- delete Nodes (multi selection + DEL key) => n\*(NodeOperation(delete)) +- delete Node (node window, Delete node button) => NodeOperation(delete) + +#### Label + +- update Label (edit sidebar, Filterable labels / Trainruns, click on a label to edit it) => LabelOperation(update) + +## Future work + +The current design can be improved by providing more information in the event payload or making the framework more generic. New ideas and suggestions are welcome. Additionally, we will learn from the practical use of this framework and iterate on its design accordingly. diff --git a/documentation/Split_Combine_Trainruns.md b/documentation/Split_Combine_Trainruns.md index 03b3aa87..28b8d006 100644 --- a/documentation/Split_Combine_Trainruns.md +++ b/documentation/Split_Combine_Trainruns.md @@ -11,7 +11,7 @@ the trainrun has to have a transition. Press **CTRL key** and click with the mou #### Combine two trainruns To combine two trainruns, you have to select one of the two trains. Then you have to navigate to the node where the trainrun ends (or starts). Now you can draw -the new transition similar to creating a connection - but you have to press **CTRL key** and it must be hold pressed as long you are drawing a new transition. +the new transition similar to creating a connection - but you have to press **CTRL key** and it must be held pressed as long as you are drawing a new transition. Once you finish drawing the new transition, both trains will be combined to one single trainrun. Please have as well a look into [Create Connections](CREATE_CONNECTIONS.md). diff --git a/documentation/USERMANUAL.md b/documentation/USERMANUAL.md index c839e475..bbe7ead6 100644 --- a/documentation/USERMANUAL.md +++ b/documentation/USERMANUAL.md @@ -88,17 +88,17 @@ For more details and to create your first Netzgrafik have a look into [create a ## Nodes The nodes represent the specific locations, such as stations or stops, where a trainrun can have different actions or events associated with it. These nodes serve as key points in the trainrun's route, determining where it stops, passes through, or starts and ends ([see data model](DATA_MODEL.md)). -For mor details have a look into [create and modifiy nodes](CREATE_NODES.md). +For more details have a look into [create and modifiy nodes](CREATE_NODES.md). ## Trainruns -A trainrun consists out of one ore more trainrun sections. The trainrun section represents a specific segment or portion of a trainrun that connects two nodes. It encapsulates all the relevant information related to that particular section, including temporal details like departure and arrival times. Additionally, it also stores the journey time, which indicates the duration it takes for the train to run to move from one node to another. +A trainrun consists of one or more trainrun sections. The trainrun section represents a specific segment or portion of a trainrun that connects two nodes. It encapsulates all the relevant information related to that particular section, including temporal details like departure and arrival times. Additionally, it also stores the journey time, which indicates the duration it takes for the train to run to move from one node to another. A trainrun has references to behaviour-related abstractions such as -category (e.g. a regional train, an intercity train or a goods train), frequency (e.g. 1/4h, 1/2h or every hourand) time category (e.g. peak times or off-peak times or occasional), which define the behaviour of a trainrun ([see data model](DATA_MODEL.md)). +category (e.g., a regional train, an intercity train or a goods train), frequency (e.g., 1/4h, 1/2h or every hourand) time category (e.g., peak times or off-peak times or occasional), which define the behaviour of a trainrun ([see data model](DATA_MODEL.md)). -For mor details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). +For more details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.md). - [Split / Combine two trainruns](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/CREATE_TRAINRUN.md#split--combine-two-trainruns) - [Merge two indepandant Netzgrafik](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/CREATE_TRAINRUN.md#merge-two-indepandant-netzgrafik) @@ -109,7 +109,7 @@ For mor details have a look into [create and modifiy trainrun](CREATE_TRAINRUN.m ![Editing_Connections](./images/Editing_Connections.png) -For mor details have a look into [create and modifiy connections](CREATE_CONNECTIONS.md). +For more details have a look into [create and modifiy connections](CREATE_CONNECTIONS.md). --- @@ -117,7 +117,7 @@ For mor details have a look into [create and modifiy connections](CREATE_CONNECT ## Filters -For mor details have a look into [create and modifiy filters](CREATE_FILTERS.md). +For more details have a look into [create and modifiy filters](CREATE_FILTERS.md). --- @@ -137,7 +137,7 @@ For mor details have a look into [graphic timetable](Graphic_Timetable.md). The Perlenkette allows you to view and edit the entire trainrun from a vertical perspective. It is displayed on the right-hand side. In the upper part of the Perlenkette, the train information is displayed. -It can also be expanded to get more information. It also allows to edit the train name, category or +It can also be expanded to get more information. It also allows you to edit the train name, category or frequency. Between the title and the train route display, there is a sorted list of all the passed nodes. @@ -155,13 +155,13 @@ displaying the train's route as a vertical chain of nodes and trainrunsections. [2024-1-25_DeleteConnections-Perlenkette-Show_Connections.webm](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/assets/2674075/d272fc58-3f31-4427-aacf-cc3c50c03905) ### Change the time locks -The time can be locked so that no propagtion (automated update) will be done. Just click on the lock icon and the lock state switchs: On to off or vice-versa. +The time can be locked so that no propagation (automated update) will be done. Just click on the lock icon and the lock state switches: On to off or vice-versa. ### Toggle: show all locks / or only closed (default) In the Perlenkette view, you can click on the eye icon in the bottom left corner to display all locks. By default, only the locks that are closed are shown. This is visually visible with the disabled eye icon. When you click on the icon then the disable -eye icon switchs to the visible eye icon - or vive-versa. Visble eye means all locks are visible. +eye icon switches to the visible eye icon - or vice-versa. Visible eye means all locks are visible. --- @@ -178,3 +178,6 @@ creation of comprehensive and visually appealing network representations. ## Links - [Netzgrafik-Editor data export/import (JSON)](DATA_MODEL_JSON.md) - [DATA MODEL](DATA_MODEL.md) + +## Technical documentation +- [Trainrun iterator](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/technical/trainrun_iterations.md) diff --git a/documentation/technical/trainrun_iterations.md b/documentation/technical/trainrun_iterations.md new file mode 100644 index 00000000..ee70f63a --- /dev/null +++ b/documentation/technical/trainrun_iterations.md @@ -0,0 +1,103 @@ +# Trainrun iterator + +## Sample code + +https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/pull/325 + +### Simple trainrun iterator - just one trainrun part +To iterate starting from a node of interest with the orientation passed through the trainrun section, you can use the sample code (pattern) below. +The iteration will proceed along the trainrun. Be aware that this does not ensure traveling through the full train run. + +```typescript + + // create forward iterator + const iterator: TrainrunIterator = this.trainrunService.getIterator( + startForwardNode, + startTrainrunSection, + ); + while (iterator.hasNext()) { + // move iterator forward + const currentTrainrunSectionNodePair = iterator.next(); + + // get data + const trainrunSection = currentTrainrunSectionNodePair.trainrunSection; + const node = currentTrainrunSectionNodePair.node; + + ... + user + defined + data + processing + ... + + } +} +``` + +### Complete Train Run Iterator - Over All Train Run Parts +Iterator pattern for iterating through all train run parts separately. + +![image](https://github.com/user-attachments/assets/d87b842c-7696-4e81-aa78-75cc966b5306) +*Example Netzgrafik with missing sections (See the cargo trainrun GTwo_Part_trainrun)* + +[See also](https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/blob/main/documentation/CREATE_TRAINRUN.md#special-cases) + +```typescript +getForwardTrainrunPartIterator(trainrunSection : TrainrunSection) { + // find both start nodes ( N1 - N2 - N3 - N4 ) => N1 , N2 + const bothEndNodes = + this.trainrunService.getBothEndNodesFromTrainrunPart(trainrunSection); + + // get start / end node from Top/Left -> Botton / Right + const startForwardNode = GeneralViewFunctions.getLeftOrTopNode( + bothEndNodes.endNode1, + bothEndNodes.endNode2, + ); + + // get start trainrun section -> forward direction/orientation + const startTrainrunSection = startForwardNode.getStartTrainrunSection( + trainrun.getId(), + ); + + // create forward iterator + const iterator: TrainrunIterator = this.trainrunService.getIterator( + startForwardNode, + startTrainrunSection, + ); + return iterator; +} + +simpleTrainrunAllPartsIterator(trainrun: Trainrun) { + let alltrainrunsections = + this.trainrunSectionService + .getAllTrainrunSectionsForTrainrun(trainrun.getId()); + + while (alltrainrunsections.length > 0) { + // traverse over all trainrun parts + const iterator= getForwardTrainrunPartIterator(alltrainrunsections[0]); + + while (iterator.hasNext()) { + // move iterator forward + const currentTrainrunSectionNodePair = iterator.next(); + + // get data + const trainrunSection = currentTrainrunSectionNodePair.trainrunSection; + const node = currentTrainrunSectionNodePair.node; + + ... + user + defined + data + processing + ... + + // filter all still visited trainrun sections + alltrainrunsections = alltrainrunsections.filter(ts => + ts.getId() !== trainrunSection.getId() + ); + } + + + } + } +``` diff --git a/package-lock.json b/package-lock.json index aa82b7b0..c8042893 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,96 +1,84 @@ { "name": "netzgrafik-frontend", - "version": "2.5.0", + "version": "2.9.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "netzgrafik-frontend", - "version": "2.5.0", - "dependencies": { - "@angular/animations": "^17.0.5", - "@angular/cdk": "^17.0.1", - "@angular/common": "^17.0.5", - "@angular/compiler": "^17.0.5", - "@angular/core": "^17.0.5", - "@angular/forms": "^17.0.5", - "@angular/localize": "^17.0.5", - "@angular/platform-browser": "^17.0.5", - "@angular/platform-browser-dynamic": "^17.0.5", - "@angular/router": "^17.0.5", - "@sbb-esta/angular": "^17.5.1", + "version": "2.9.11", + "dependencies": { + "@angular/animations": "^17.0.9", + "@angular/cdk": "^17.0.6", + "@angular/common": "^17.0.9", + "@angular/compiler": "^17.0.9", + "@angular/core": "^17.0.9", + "@angular/elements": "^17.1.3", + "@angular/forms": "^17.0.9", + "@angular/localize": "^17.0.9", + "@angular/platform-browser": "^17.0.9", + "@angular/platform-browser-dynamic": "^17.0.9", + "@angular/router": "^17.0.9", + "@sbb-esta/angular": "^17.5.3", "angular-oauth2-oidc": "^15.0.1", - "angular-server-side-configuration": "^17.0.2", - "angular-t9n": "^17.0.0", + "angular-server-side-configuration": "^17.0.5", "d3": "^5.16.0", - "dom-to-svg": "^0.12.2", - "jspdf-yworks": "^2.1.1", + "extract-i18n": "^1.0.0", "ngx-editor": "^15.0.1", - "papaparse": "^5.3.0", - "rxjs": "~7.5.0", + "papaparse": "^5.3.2", + "rxjs": "~7.5.7", "save-svg-as-png": "^1.4.17", - "svg2pdf.js": "^2.2.1", - "tslib": "^2.5.0", - "uuid": "^8.3.0", - "zone.js": "~0.14.2" + "tslib": "^2.5.3", + "uuid": "^8.3.2", + "zone.js": "~0.14.10" }, "devDependencies": { - "@angular-devkit/architect": "^0.1700.5", - "@angular-devkit/build-angular": "^17.0.5", + "@angular-devkit/architect": "^0.1700.10", + "@angular-devkit/build-angular": "^17.3.9", "@angular-eslint/builder": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/schematics": "17.1.1", "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "^17.0.5", - "@angular/compiler-cli": "^17.0.5", - "@angular/language-service": "^17.0.5", + "@angular/cli": "^17.0.10", + "@angular/compiler-cli": "^17.0.9", + "@angular/language-service": "^17.0.9", "@openapitools/openapi-generator-cli": "^2.5.2", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^18.11.18", + "@types/jasmine": "~3.6.11", + "@types/jasminewd2": "~2.0.13", + "@types/node": "^18.11.19", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", - "browserstack-local": "^1.5.1", + "browserstack-local": "^1.5.5", "eslint": "^8.53.0", "eslint-config-prettier": "^8.10.0", - "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-deprecation": "^1.3.3", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-rxjs": "^5.0.2", - "jasmine-core": "^4.1.0", + "eslint-plugin-rxjs": "^5.0.3", + "jasmine-core": "^4.1.1", "jasmine-spec-reporter": "~7.0.0", - "karma": "^6.4.1", + "karma": "^6.4.4", "karma-browserstack-launcher": "^1.6.0", "karma-chrome-launcher": "^3.1.1", - "karma-coverage": "^2.2.0", - "karma-jasmine": "~5.0.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "~5.0.1", "karma-jasmine-html-reporter": "^1.7.0", "karma-sonarqube-reporter": "^1.4.0", "prettier": "3.2.5", - "protractor": "~7.0.0", - "ts-node": "~10.9.1", + "ts-node": "~10.9.2", "typescript": "~5.2.2" }, "optionalDependencies": { - "puppeteer": "^19.6.1" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "puppeteer": "^22.13.1" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -121,72 +109,71 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.1.0.tgz", - "integrity": "sha512-N9B2SlKewD48qKFgRPKDH1X2EvOGll1ocMlFxi95mT9aXuFd2d75JUYHzS1v3FQRU3peoAoFKxCV7OuIL/cmTA==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.9.tgz", + "integrity": "sha512-EuAPSC4c2DSJLlL4ieviKLx1faTyY+ymWycq6KFwoxu1FgWly/dqBeWyXccYinLhPVZmoh6+A/5S4YWXlOGSnA==", "dev": true, "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1701.0", - "@angular-devkit/build-webpack": "0.1701.0", - "@angular-devkit/core": "17.1.0", - "@babel/core": "7.23.7", + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.9", + "@angular-devkit/build-webpack": "0.1703.9", + "@angular-devkit/core": "17.3.9", + "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-transform-async-generator-functions": "7.23.7", + "@babel/plugin-transform-async-generator-functions": "7.23.9", "@babel/plugin-transform-async-to-generator": "7.23.3", - "@babel/plugin-transform-runtime": "7.23.7", - "@babel/preset-env": "7.23.7", - "@babel/runtime": "7.23.7", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.1.0", - "@vitejs/plugin-basic-ssl": "1.0.2", + "@ngtools/webpack": "17.3.9", + "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.16", + "autoprefixer": "10.4.18", "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.19.11", + "critters": "0.0.22", + "css-loader": "6.10.0", + "esbuild-wasm": "0.20.1", "fast-glob": "3.3.2", "http-proxy-middleware": "2.0.6", - "https-proxy-agent": "7.0.2", - "inquirer": "9.2.12", - "jsonc-parser": "3.2.0", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", "karma-source-map-support": "1.4.0", "less": "4.2.0", "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.30.5", - "mini-css-extract-plugin": "2.7.6", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", "mrmime": "2.0.0", "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "3.0.1", - "piscina": "4.2.1", - "postcss": "8.4.33", - "postcss-loader": "7.3.4", + "picomatch": "4.0.1", + "piscina": "4.4.0", + "postcss": "8.4.35", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.69.7", - "sass-loader": "13.3.3", - "semver": "7.5.4", + "sass": "1.71.1", + "sass-loader": "14.1.1", + "semver": "7.6.0", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.26.0", - "text-table": "0.2.0", + "terser": "5.29.1", "tree-kill": "1.2.2", "tslib": "2.6.2", - "undici": "6.2.1", - "vite": "5.0.11", + "undici": "6.11.1", + "vite": "5.1.7", "watchpack": "2.4.0", - "webpack": "5.89.0", - "webpack-dev-middleware": "6.1.1", + "webpack": "5.94.0", + "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.10.0", "webpack-subresource-integrity": "5.1.0" @@ -197,7 +184,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.19.11" + "esbuild": "0.20.1" }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", @@ -212,7 +199,7 @@ "ng-packagr": "^17.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.4" + "typescript": ">=5.2 <5.5" }, "peerDependenciesMeta": { "@angular/localize": { @@ -251,12 +238,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1701.0.tgz", - "integrity": "sha512-VP6mjptKFn0HO2dn4bH0mFMe4CrexlWlgnTHyAUbL7ZFaV9w4VQuE/vXr60wMlQ+83NIGUeJImjt1QVNlIjJnQ==", + "version": "0.1703.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.9.tgz", + "integrity": "sha512-kEPfTOVnzrJxPGTvaXy8653HU9Fucxttx9gVfQR1yafs+yIEGx3fKGKe89YPmaEay32bIm7ZUpxDF1FO14nkdQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", + "@angular-devkit/core": "17.3.9", "rxjs": "7.8.1" }, "engines": { @@ -266,15 +253,15 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.9.tgz", + "integrity": "sha512-/iKyn5YT7NW5ylrg9yufUydS8byExeQ2HHIwFC4Ebwb/JYYCz+k4tBf2LdP+zXpemDpLznXTQGWia0/yJjG8Vg==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -301,13 +288,19 @@ "tslib": "^2.1.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1701.0.tgz", - "integrity": "sha512-AUQbdnAXMdXKPj51RWr+0SusTh5M1EWEpXtEZgDSO5Vab6ak+xsX+k1IhjlEoliF0prHjD5WzBegr6WKCjZ30w==", + "version": "0.1703.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.9.tgz", + "integrity": "sha512-3b0LND39Nc+DwCQ0N7Tbsd7RAFWTeIc4VDwk/7RO8EMYTP5Kfgr/TK66nwTBypHsjmD69IMKHZZaZuiDfGfx2A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1701.0", + "@angular-devkit/architect": "0.1703.9", "rxjs": "7.8.1" }, "engines": { @@ -321,12 +314,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1701.0.tgz", - "integrity": "sha512-VP6mjptKFn0HO2dn4bH0mFMe4CrexlWlgnTHyAUbL7ZFaV9w4VQuE/vXr60wMlQ+83NIGUeJImjt1QVNlIjJnQ==", + "version": "0.1703.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.9.tgz", + "integrity": "sha512-kEPfTOVnzrJxPGTvaXy8653HU9Fucxttx9gVfQR1yafs+yIEGx3fKGKe89YPmaEay32bIm7ZUpxDF1FO14nkdQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", + "@angular-devkit/core": "17.3.9", "rxjs": "7.8.1" }, "engines": { @@ -336,15 +329,15 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.9.tgz", + "integrity": "sha512-/iKyn5YT7NW5ylrg9yufUydS8byExeQ2HHIwFC4Ebwb/JYYCz+k4tBf2LdP+zXpemDpLznXTQGWia0/yJjG8Vg==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -398,6 +391,24 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -408,14 +419,14 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.1.0.tgz", - "integrity": "sha512-7q4Bk3+ePBdzrmMWxWBnNdN4kmBe2jJwa3vAofaMqZiIBEor85YcOsrUJvcWM/3+/TusgZr4p/4+oJgiYDrj5A==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.5", + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -426,15 +437,15 @@ } }, "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -560,9 +571,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.1.0.tgz", - "integrity": "sha512-EzyJsla/CnRX4ARmHe9J1m3Pl+J4m5hznzeQFyZpJehikaHKAGGJTGM/+DFAX9TuR1ZpCmS0z0oWsYzag2Q7RA==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz", + "integrity": "sha512-9hsdWF4gRRcVJtPcCcYLaX1CIyM9wUu6r+xRl6zU5hq8qhl35hig6ounz7CXFAzLf0WDBdM16bPHouVGaG76lg==", "dependencies": { "tslib": "^2.3.0" }, @@ -570,13 +581,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0" + "@angular/core": "17.3.12" } }, "node_modules/@angular/cdk": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.1.0.tgz", - "integrity": "sha512-a2+uqr1s2pCStFs78BM1ViVqi0GnxFHGKHo58hiR9pDV/pyg9cvy+d+rsci1HkuF9AC/UqV5Y6rGLfwayO183g==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", + "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "dependencies": { "tslib": "^2.3.0" }, @@ -590,27 +601,27 @@ } }, "node_modules/@angular/cli": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.1.0.tgz", - "integrity": "sha512-mZh8ibV94CqHls+GTHok9rF78UvrtKZx+o1QOcG50ZM1L5O5s2NYrBhf+QXVeTTmzhSH1wXQb7ueyuLNLVB/eA==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.8.tgz", + "integrity": "sha512-X5ZOQ6ZTKVHjhIsfl32ZRqbs+FUoeHLbT7x4fh2Os/8ObDDwrUcCJPqxe2b2RB5E2d0vepYigknHeLE7gwzlNQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1701.0", - "@angular-devkit/core": "17.1.0", - "@angular-devkit/schematics": "17.1.0", - "@schematics/angular": "17.1.0", + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@schematics/angular": "17.3.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "9.2.12", - "jsonc-parser": "3.2.0", + "ini": "4.1.2", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", "npm-package-arg": "11.0.1", "npm-pick-manifest": "9.0.0", "open": "8.4.2", "ora": "5.4.1", - "pacote": "17.0.5", + "pacote": "17.0.6", "resolve": "1.22.8", - "semver": "7.5.4", + "semver": "7.6.0", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -624,12 +635,12 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1701.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1701.0.tgz", - "integrity": "sha512-VP6mjptKFn0HO2dn4bH0mFMe4CrexlWlgnTHyAUbL7ZFaV9w4VQuE/vXr60wMlQ+83NIGUeJImjt1QVNlIjJnQ==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.8.tgz", + "integrity": "sha512-lKxwG4/QABXZvJpqeSIn/kAwnY6MM9HdHZUV+o5o3UiTi+vO8rZApG4CCaITH3Bxebm7Nam7Xbk8RuukC5rq6g==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", + "@angular-devkit/core": "17.3.8", "rxjs": "7.8.1" }, "engines": { @@ -639,15 +650,15 @@ } }, "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -675,9 +686,9 @@ } }, "node_modules/@angular/common": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.1.0.tgz", - "integrity": "sha512-0Zg62iSynyRr2QslC8dVwSo46mkKrVENnwcBvsgTJ8rfGiuRdKMX8nWm5EUEm3ohKmYLfHvyEjsKDRn//UefVw==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz", + "integrity": "sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==", "dependencies": { "tslib": "^2.3.0" }, @@ -685,14 +696,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0", + "@angular/core": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.1.0.tgz", - "integrity": "sha512-gF4i/WtPSiSvT4YNasTNnckOxdxuSNwi0EsncrtewwveBcCatjqaXNssUCiF5TgxlC2sKTmsPcMqDJrfX2LMpw==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.12.tgz", + "integrity": "sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==", "dependencies": { "tslib": "^2.3.0" }, @@ -700,7 +711,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.1.0" + "@angular/core": "17.3.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -709,15 +720,15 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.1.0.tgz", - "integrity": "sha512-WDpO4WvC5ItjaRexnpFpKPpT+cu+5GYkWF8h74iHhfxOgU+gaQiMWERHylWCqF25AzmhKu0iI3ZZtaIJ6qqwog==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz", + "integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==", "dependencies": { - "@babel/core": "7.23.2", + "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" @@ -731,25 +742,25 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.1.0", - "typescript": ">=5.2 <5.4" + "@angular/compiler": "17.3.12", + "typescript": ">=5.2 <5.5" } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -778,9 +789,9 @@ } }, "node_modules/@angular/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.1.0.tgz", - "integrity": "sha512-9OvRRZq+46S+ICZLRYIGVU2pknuPz23B+5V3jz7cDA5V43GVcMnfmAbMClPQxm7kRGnqtQ+yzBjn+HubCerE6g==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.12.tgz", + "integrity": "sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==", "dependencies": { "tslib": "^2.3.0" }, @@ -792,10 +803,25 @@ "zone.js": "~0.14.0" } }, + "node_modules/@angular/elements": { + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.12.tgz", + "integrity": "sha512-rUfEaV+Ol0bxtcEfNuf/7aVe+3/hAVJMNF/DHG71BSekCxPSH5WR6wE0zsXmVoTBadj+TUDlsyju9o9n3+C5Vg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.12", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@angular/forms": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.1.0.tgz", - "integrity": "sha512-JD9IAxa5gQnjzxYJXm3H+lBuyv/dCnPHl6fpvb/JGrxY6xi4gfndyI8AkAb/wOAQgZDsIPaq5s4eWDjhr7CpyA==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.12.tgz", + "integrity": "sha512-tV6r12Q3yEUlXwpVko4E+XscunTIpPkLbaiDn/MTL3Vxi2LZnsLgHyd/i38HaHN+e/H3B0a1ToSOhV5wf3ay4Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -803,29 +829,29 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.1.0.tgz", - "integrity": "sha512-hR0m9lhCZV1KpXmOVWllpPL174EdOuuiXXuvMRGlM0Kru2CLxzrzgFHwgZEib5AywLxK7vPGi5hGHk/LtTawEA==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-17.3.12.tgz", + "integrity": "sha512-MVmEXonXwdhFtIpU4q8qbXHsrAsdTjZcPPuWCU0zXVQ+VaB/y6oF7BVpmBtfyBcBCums1guEncPP+AZVvulXmQ==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0" } }, "node_modules/@angular/localize": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.1.0.tgz", - "integrity": "sha512-GW+1F72lRnCwppu2GzGP04d3UhtdhqMHlCbBdZzQUbv8XQfU+22MOGZx/Ry8sXnanZDgH+u+2A4bvrKZPsVgZg==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.12.tgz", + "integrity": "sha512-b7J7zY/CgJhFVPtmu/pEjefU5SHuTy7lQgX6kTrJPaUSJ5i578R17xr4SwrWe7G4jzQwO6GXZZd17a62uNRyOA==", "dependencies": { - "@babel/core": "7.23.2", - "@types/babel__core": "7.20.2", - "fast-glob": "3.3.1", + "@babel/core": "7.23.9", + "@types/babel__core": "7.20.5", + "fast-glob": "3.3.2", "yargs": "^17.2.1" }, "bin": { @@ -837,25 +863,25 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.1.0", - "@angular/compiler-cli": "17.1.0" + "@angular/compiler": "17.3.12", + "@angular/compiler-cli": "17.3.12" } }, "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -875,21 +901,6 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, - "node_modules/@angular/localize/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/@angular/localize/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -899,9 +910,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.1.0.tgz", - "integrity": "sha512-Klq92ZUX0+ZsxLvbYtIEP3GtVEfMLYPxmBP0pWNZyYIeJCg/YxPS76QSvEhBaMqFelk4RzkDQEIfixC16UIgOA==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.12.tgz", + "integrity": "sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -909,9 +920,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.1.0", - "@angular/common": "17.1.0", - "@angular/core": "17.1.0" + "@angular/animations": "17.3.12", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -920,9 +931,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.1.0.tgz", - "integrity": "sha512-rqPRZZx6VcSx81HIQr1XMBgb7fYSj6pOZNTJGZkn2KNxrz6hyU3A3qaom1VSVRK5vvNb1cFn35mg/zyOIliTIg==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.12.tgz", + "integrity": "sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==", "dependencies": { "tslib": "^2.3.0" }, @@ -930,16 +941,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/compiler": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0" + "@angular/common": "17.3.12", + "@angular/compiler": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12" } }, "node_modules/@angular/router": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.1.0.tgz", - "integrity": "sha512-VDeVLiiS4iEwqwgsLyL9hqA1djFW3yveMnhZIwviJlnp9vG2r/ggMKhNmdP1Hb2iaNgflyhyhwafJ0gi9SLi5A==", + "version": "17.3.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.12.tgz", + "integrity": "sha512-dg7PHBSW9fmPKTVzwvHEeHZPZdpnUqW/U7kj8D29HTP9ur8zZnx9QcnbplwPeYb8yYa62JMnZSEel2X4PxdYBg==", "dependencies": { "tslib": "^2.3.0" }, @@ -947,53 +958,47 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.1.0", - "@angular/core": "17.1.0", - "@angular/platform-browser": "17.1.0", + "@angular/common": "17.3.12", + "@angular/core": "17.3.12", + "@angular/platform-browser": "17.3.12", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1048,25 +1053,26 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1083,19 +1089,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -1105,6 +1109,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1115,12 +1131,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -1131,6 +1147,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1141,9 +1169,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1157,69 +1185,51 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1229,35 +1239,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1266,15 +1276,27 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1284,23 +1306,25 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1310,6 +1334,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1318,73 +1343,76 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1393,12 +1421,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1408,14 +1436,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1425,13 +1453,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1516,12 +1544,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1531,12 +1559,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1688,12 +1716,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1703,9 +1731,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1738,12 +1766,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1753,12 +1781,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1768,13 +1796,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1784,13 +1812,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1801,18 +1829,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1822,14 +1848,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1839,12 +1877,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1854,13 +1892,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1870,12 +1908,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1885,12 +1923,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1901,13 +1939,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1917,12 +1955,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1933,13 +1971,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1949,14 +1987,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1966,12 +2004,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1982,12 +2020,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1997,12 +2035,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2013,12 +2051,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2028,13 +2066,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2044,14 +2082,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2061,15 +2099,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -2079,13 +2117,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2095,13 +2133,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2111,12 +2149,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2126,12 +2164,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2142,12 +2180,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2158,16 +2196,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2177,13 +2214,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2193,12 +2230,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2209,13 +2246,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -2226,12 +2263,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2241,13 +2278,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2257,14 +2294,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2274,13 +2311,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2290,12 +2339,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2306,12 +2355,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2321,16 +2370,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -2350,12 +2399,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2365,13 +2414,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2381,12 +2430,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2396,12 +2445,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2411,12 +2460,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2426,12 +2475,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2441,13 +2490,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2457,13 +2506,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2473,13 +2522,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2489,14 +2538,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", - "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -2521,13 +2570,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", @@ -2543,13 +2592,13 @@ "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", @@ -2569,9 +2618,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2612,9 +2661,10 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2623,31 +2673,28 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2655,13 +2702,27 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2681,7 +2742,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2693,7 +2753,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2719,41 +2778,393 @@ "node": ">=10.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2872,23 +3283,14 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@floating-ui/core": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.0.tgz", @@ -2906,6 +3308,7 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -2952,9 +3355,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@isaacs/cliui": { @@ -3084,71 +3488,71 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@ljharb/through": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", - "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -3158,202 +3562,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nestjs/axios": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.1.tgz", - "integrity": "sha512-VlOZhAGDmOoFdsmewn8AyClAdGpKXQQaY1+3PGB+g6ceurGIdTxZgRX3VXc1T6Zs60PedWjg3A82TDOB05mrzQ==", "dev": true, - "peerDependencies": { - "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", - "axios": "^1.3.1", - "reflect-metadata": "^0.1.12", - "rxjs": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/@nestjs/common": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.0.tgz", - "integrity": "sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==", - "dependencies": { - "iterare": "1.2.1", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.0.tgz", - "integrity": "sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==", - "hasInstallScript": true, - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.2.0", - "tslib": "2.6.2", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "reflect-metadata": "^0.1.12", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nestjs/platform-express": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.3.7.tgz", - "integrity": "sha512-noNJ+PyIxQJLCKfuXz0tcQtlVAynfLIuKy62g70lEZ86UrIqSrZFqvWs/rFUgkbT6J8H7Rmv11hASOnX+7M2rA==", - "dependencies": { - "body-parser": "1.20.2", - "cors": "2.8.5", - "express": "4.19.2", - "multer": "1.4.4-lts.1", - "tslib": "2.6.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" - } - }, - "node_modules/@nestjs/platform-ws": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/platform-ws/-/platform-ws-10.3.7.tgz", - "integrity": "sha512-lOvZ8u5UdL0FgAOdWosDXefVgDikPd4j5el81emkx+H0pFsysfHXSSoSvMLQijdhENqHSl3buRhO5n3M3uia1w==", - "dependencies": { - "tslib": "2.6.2", - "ws": "8.16.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "rxjs": "^7.1.0" - } - }, - "node_modules/@nestjs/platform-ws/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@nestjs/serve-static": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.2.tgz", - "integrity": "sha512-cT0vdWN5ar7jDI2NKbhf4LcwJzU4vS5sVpMkVrHuyLcltbrz6JdGi1TfIMMatP2pNiq5Ie/uUdPSFDVaZX/URQ==", - "dependencies": { - "path-to-regexp": "0.2.5" - }, - "peerDependencies": { - "@fastify/static": "^6.5.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", - "express": "^4.18.1", - "fastify": "^4.7.0" - }, - "peerDependenciesMeta": { - "@fastify/static": { - "optional": true - }, - "express": { - "optional": true - }, - "fastify": { - "optional": true - } - } - }, - "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", - "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" - }, - "node_modules/@nestjs/websockets": { - "version": "10.3.7", - "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-10.3.7.tgz", - "integrity": "sha512-iYdsWiRNPUy0XzPoW44bx2MW1griuraTr5fNhoe2rUSNO0mEW1aeXp4v56KeZDLAss31WbeckC5P3N223Fys5g==", - "dependencies": { - "iterare": "1.2.1", - "object-hash": "3.0.0", - "tslib": "2.6.2" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/platform-socket.io": "^10.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/platform-socket.io": { - "optional": true - } + "node": ">=8" } }, "node_modules/@ngtools/webpack": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.1.0.tgz", - "integrity": "sha512-FAp5Vh4Y4DFDnrxEitggEkeDwHCml7m6hZUgohvA6n6mwrMT0ZZXnk3MIrKRnT6A9cr1wcnxMW+jIXx/cJZGlw==", + "version": "17.3.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.9.tgz", + "integrity": "sha512-2+NvEQuYKRWdZaJbRJWEnR48tpW0uYbhwfHBHLDI9Kazb3mb0oAwYBVXdq+TtDLBypXnMsFpCewjRHTvkVx4/A==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -3362,7 +3579,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^17.0.0", - "typescript": ">=5.2 <5.4", + "typescript": ">=5.2 <5.5", "webpack": "^5.54.0" } }, @@ -3399,25 +3616,25 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dev": true, "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -3427,18 +3644,15 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -3448,15 +3662,16 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", - "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", @@ -3466,6 +3681,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@npmcli/git/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -3476,12 +3700,18 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@npmcli/git/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git/node_modules/which": { @@ -3500,16 +3730,16 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -3524,10 +3754,72 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", - "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, "dependencies": { "which": "^4.0.0" @@ -3560,16 +3852,25 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/redact": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-1.1.0.tgz", + "integrity": "sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/run-script": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.3.tgz", - "integrity": "sha512-ZMWGLHpzMq3rBGIwPyeaoaleaLMvrBrH8nugHxTi5ACkJZXTxXPtVuEH91ifgtss5hUwJQ2VDnzDBWPmz78rvg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", + "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", "dev": true, "dependencies": { "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", - "read-package-json-fast": "^3.0.0", "which": "^4.0.0" }, "engines": { @@ -3626,6 +3927,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "consola": "^2.15.0", @@ -3643,6 +3945,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3657,6 +3960,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3672,6 +3976,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3682,12 +3987,14 @@ "node_modules/@nuxtjs/opencollective/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/@nuxtjs/opencollective/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3696,6 +4003,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3915,17 +4223,17 @@ } }, "node_modules/@openapitools/openapi-generator-cli": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.9.0.tgz", - "integrity": "sha512-KQpftKeiMoH5aEI/amOVLFGkGeT3DyA7Atj7v7l8xT3O9xnIUpoDmMg0WBTEh+NHxEwEAITQNDzr+JLjkXVaKw==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.13.4.tgz", + "integrity": "sha512-4JKyrk55ohQK2FcuZbPdNvxdyXD14jjOIvE8hYjJ+E1cHbRbfXQXbYnjTODFE52Gx8eAxz8C9icuhDYDLn7nww==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nestjs/axios": "3.0.1", + "@nestjs/axios": "3.0.2", "@nestjs/common": "10.3.0", "@nestjs/core": "10.3.0", "@nuxtjs/opencollective": "0.3.2", - "axios": "1.6.5", + "axios": "1.6.8", "chalk": "4.1.2", "commander": "8.3.0", "compare-versions": "4.1.4", @@ -3933,6 +4241,7 @@ "console.table": "0.10.0", "fs-extra": "10.1.0", "glob": "7.2.3", + "https-proxy-agent": "7.0.4", "inquirer": "8.2.6", "lodash": "4.17.21", "reflect-metadata": "0.1.13", @@ -3950,19 +4259,97 @@ "url": "https://opencollective.com/openapi_generator" } }, - "node_modules/@openapitools/openapi-generator-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/axios": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", + "integrity": "sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "axios": "^1.3.1", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/common": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.0.tgz", + "integrity": "sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==", + "dev": true, + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.0.tgz", + "integrity": "sha512-N06P5ncknW/Pm8bj964WvLIZn2gNhHliCBoAO1LeBvNImYkecqKcrmLbY49Fa1rmMfEM3MuBHeDys3edeuYAOA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@openapitools/openapi-generator-cli/node_modules/chalk": { @@ -4008,21 +4395,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@openapitools/openapi-generator-cli/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@openapitools/openapi-generator-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4064,6 +4436,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", + "dev": true + }, "node_modules/@openapitools/openapi-generator-cli/node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -4100,6 +4478,12 @@ "node": ">=8" } }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4122,70 +4506,186 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz", - "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", "optional": true, "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=14.1.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@puppeteer/browsers/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/@puppeteer/browsers/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -4196,9 +4696,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -4208,10 +4708,49 @@ "linux" ] }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sbb-esta/angular": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/@sbb-esta/angular/-/angular-17.5.1.tgz", - "integrity": "sha512-wSw/5Ozz2GQAV6N1a5kll3vhxcfs6/7yLcinBWWjbsbW/jysUQJDW4g1nC27X/+2orMDqgSMK2Dg1iRtYbnzWw==", + "version": "17.8.2", + "resolved": "https://registry.npmjs.org/@sbb-esta/angular/-/angular-17.8.2.tgz", + "integrity": "sha512-vkWs/K+DVfiBnvCfo/6kgSejWQ2UfT6PbJzmn7jVqEL4/zBQsXWW30VR8F89h0QAh8HBvDf3jluYX/peup1kGQ==", "dependencies": { "@types/grecaptcha": "^2.0.36" }, @@ -4224,14 +4763,14 @@ } }, "node_modules/@schematics/angular": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.1.0.tgz", - "integrity": "sha512-u9pCesRWb6mVtLnFLSfZ8R21TDz8YCebAxViefWsJlb0+p0yknesVL1nG/Oi9tgfhczS991HGIVsLT41bZthUw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.8.tgz", + "integrity": "sha512-2g4OmSyE9YGq50Uj7fNI26P/TSAFJ7ZuirwTF2O7Xc4XRQ29/tYIIqhezpNlTb6rlYblcQuMcUZBrMfWJHcqJw==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.1.0", - "@angular-devkit/schematics": "17.1.0", - "jsonc-parser": "3.2.0" + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "jsonc-parser": "3.2.1" }, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -4240,15 +4779,15 @@ } }, "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.1.0.tgz", - "integrity": "sha512-w7HeJjyM6YtjXrwFdmFIsp9lzDPAFJov8hVCD18DZaCwryRixz+o8egfw2SkpI4L8kuGAiGxpaCTRsTQtmR4/w==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, @@ -4276,72 +4815,83 @@ } }, "node_modules/@sigstore/bundle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.1.tgz", - "integrity": "sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-0.2.0.tgz", - "integrity": "sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/sign": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.1.tgz", - "integrity": "sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "make-fetch-happen": "^13.0.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sigstore/tuf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.0.tgz", - "integrity": "sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.2.0" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/verify": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-0.1.0.tgz", - "integrity": "sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -4354,34 +4904,36 @@ "dev": true }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "optional": true + }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", @@ -4393,22 +4945,37 @@ } }, "node_modules/@tufjs/models": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", - "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" + "minimatch": "^9.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4435,9 +5002,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dependencies": { "@babel/types": "^7.20.7" } @@ -4496,25 +5063,17 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -4534,9 +5093,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -4567,9 +5126,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4628,10 +5187,9 @@ } }, "node_modules/@types/node": { - "version": "18.19.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.8.tgz", - "integrity": "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==", - "devOptional": true, + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", "dependencies": { "undici-types": "~5.26.4" } @@ -4645,25 +5203,12 @@ "@types/node": "*" } }, - "node_modules/@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", - "dev": true - }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, - "node_modules/@types/raf": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", - "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", - "optional": true, - "peer": true - }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", @@ -4676,16 +5221,10 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/selenium-webdriver": { - "version": "3.0.26", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz", - "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", - "dev": true - }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/send": { @@ -4708,14 +5247,14 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { @@ -4733,24 +5272,19 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "dev": true }, - "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" - }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -4772,16 +5306,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz", - "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/type-utils": "6.19.1", - "@typescript-eslint/utils": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -4807,13 +5341,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz", - "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/utils": "6.19.1", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -4834,17 +5368,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz", - "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -5000,15 +5534,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz", - "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -5028,13 +5562,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz", - "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5129,9 +5663,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz", - "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5142,13 +5676,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz", - "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5269,12 +5803,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz", - "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5292,9 +5826,9 @@ "dev": true }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz", - "integrity": "sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", "dev": true, "engines": { "node": ">=14.6.0" @@ -5304,9 +5838,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -5326,9 +5860,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -5349,15 +5883,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -5385,28 +5919,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -5414,24 +5948,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -5440,23 +5974,15 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5506,12 +6032,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -5525,6 +6045,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5534,29 +6055,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", - "dependencies": { - "acorn": "^2.1.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -5564,10 +6065,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -5583,10 +6084,12 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -5618,20 +6121,11 @@ "node": ">=8.9.0" } }, - "node_modules/adm-zip": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "4" }, @@ -5710,9 +6204,9 @@ } }, "node_modules/angular-server-side-configuration": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/angular-server-side-configuration/-/angular-server-side-configuration-17.0.2.tgz", - "integrity": "sha512-jzDG50RWkBloH3nNGFkG00BekjUbtlZp8gPuIImN7y4M7QDpckKYtnP5tIquj7TlSX2sitIE9eSmCYwHJHLrsA==", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/angular-server-side-configuration/-/angular-server-side-configuration-17.0.5.tgz", + "integrity": "sha512-iOPQ8UQxSZQMFL5eSYLC2FbRAQdrMVeMIumUIOGEGd5uxCfnhSYTekZZ2ptXdQBhswIPF+wdFWCY6eC62XBVSQ==", "dependencies": { "glob": "^10.0.0", "tslib": "^2.3.0" @@ -5723,54 +6217,36 @@ } }, "node_modules/angular-server-side-configuration/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/angular-t9n": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/angular-t9n/-/angular-t9n-17.0.0.tgz", - "integrity": "sha512-xcAcY1MHH0E8wkRCxScCgCfXP7+GViC1aY1OXJmLAU1125DCJicPXzyJ8dWL1wT3GpOsGU+a+4krWHbI+BRgNQ==", - "dependencies": { - "@nestjs/common": "^10.2.0", - "@nestjs/core": "^10.2.0", - "@nestjs/platform-express": "^10.2.0", - "@nestjs/platform-ws": "^10.2.0", - "@nestjs/serve-static": "^4.0.0", - "@nestjs/websockets": "^10.2.0", - "@xmldom/xmldom": "^0.8.10", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "js-levenshtein": "^1.1.6", - "reflect-metadata": "^0.1.13", - "rxjs": "~7.8.1" - }, - "bin": { - "ng-t9n": "bin/cli.js" - } - }, - "node_modules/angular-t9n/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/angular-server-side-configuration/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "tslib": "^2.1.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ansi-colors": { @@ -5851,16 +6327,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { "version": "1.0.10", @@ -5880,18 +6350,11 @@ "dequal": "^2.0.3" } }, - "node_modules/array-equal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", - "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/array-union": { "version": "2.1.0", @@ -5902,38 +6365,16 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "optional": true, "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "tslib": "^2.0.1" + }, "engines": { - "node": ">=0.8" + "node": ">=4" } }, "node_modules/async": { @@ -5945,23 +6386,13 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -5978,9 +6409,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -5995,26 +6426,13 @@ "postcss": "^8.1.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6028,6 +6446,12 @@ "dequal": "^2.0.3" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "optional": true + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -6062,13 +6486,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -6085,22 +6509,22 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -6125,17 +6549,66 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" } }, "node_modules/base64-js": { @@ -6167,20 +6640,21 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bent": { "version": "7.3.12", "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", @@ -6202,43 +6676,32 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "devOptional": true, + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "blocking-proxy": "built/lib/bin.js" - }, - "engines": { - "node": ">=6.9.x" - } - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -6248,7 +6711,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -6262,6 +6725,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -6269,7 +6733,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -6296,20 +6761,20 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -6325,10 +6790,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -6406,17 +6871,6 @@ "node": ">= 4.5.0" } }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "bin": { - "btoa": "bin/btoa.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -6453,32 +6907,14 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -6490,9 +6926,9 @@ "dev": true }, "node_modules/cacache": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", - "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -6513,44 +6949,60 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": "14 || >=16.14" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6575,9 +7027,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -6593,37 +7045,11 @@ } ] }, - "node_modules/canvg": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", - "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/canvg/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "optional": true, - "peer": true - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "node_modules/chalk": { "version": "2.4.2", @@ -6645,15 +7071,9 @@ "dev": true }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6666,6 +7086,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -6680,41 +7103,28 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" } }, "node_modules/chromium-bidi": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz", - "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", "optional": true, "dependencies": { - "mitt": "3.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, - "node_modules/class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, - "node_modules/class-validator": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", - "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", - "validator": "^13.9.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6913,6 +7323,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7013,49 +7424,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { "version": "6.5.1", @@ -7279,7 +7648,8 @@ "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true }, "node_modules/console.table": { "version": "0.10.0", @@ -7297,6 +7667,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -7308,6 +7679,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -7318,9 +7690,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "engines": { "node": ">= 0.6" @@ -7329,7 +7701,8 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true }, "node_modules/copy-anything": { "version": "2.0.6", @@ -7410,25 +7783,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-js": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", - "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", + "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -7436,14 +7797,16 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, "dependencies": { "object-assign": "^4", "vary": "^1" @@ -7453,15 +7816,15 @@ } }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "devOptional": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -7482,13 +7845,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "devOptional": true }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "devOptional": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7499,13 +7862,12 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -7514,7 +7876,7 @@ "domhandler": "^5.0.2", "htmlparser2": "^8.0.2", "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "postcss-media-query-parser": "^0.2.3" } }, "node_modules/critters/node_modules/ansi-styles": { @@ -7587,39 +7949,10 @@ "node": ">=8" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "optional": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7629,28 +7962,20 @@ "node": ">= 8" } }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", + "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -7660,7 +7985,16 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { @@ -7695,6 +8029,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -7702,19 +8037,6 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", - "dependencies": { - "cssom": "0.3.x" - } - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -8001,15 +8323,13 @@ "d3-transition": "1" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "optional": true, "engines": { - "node": ">=0.10" + "node": ">= 14" } }, "node_modules/date-fns": { @@ -8038,9 +8358,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -8068,7 +8388,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/default-gateway": { "version": "6.0.3", @@ -8095,16 +8416,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -8116,69 +8441,25 @@ "node": ">=8" } }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", - "dev": true, - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", - "dev": true, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "optional": true, "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node": ">= 14" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -8187,6 +8468,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -8204,6 +8486,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8216,9 +8499,9 @@ "dev": true }, "node_modules/devtools-protocol": { - "version": "0.0.1107588", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", - "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "optional": true }, "node_modules/di": { @@ -8231,7 +8514,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, "engines": { "node": ">=0.3.1" } @@ -8307,16 +8589,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-to-svg": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/dom-to-svg/-/dom-to-svg-0.12.2.tgz", - "integrity": "sha512-zVlswIYMj3669dUfErBszLcYOy+NzPEFhMezdzLVaqFcaj7VQecS0o8r9bqzBSczDtex2X/4HMZktFoj4EDqOA==", - "dependencies": { - "gradient-parser": "^1.0.2", - "postcss": "^8.2.9", - "postcss-value-parser": "^4.1.0" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -8344,13 +8616,6 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", - "optional": true, - "peer": true - }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -8406,19 +8671,11 @@ "wcwidth": ">=1.0.1" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/ejs": { "version": "3.1.10", @@ -8436,9 +8693,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.642", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.642.tgz", - "integrity": "sha512-M4+u22ZJGpk4RY7tne6W+APkZhnnhmAH48FNl8iEFK2lEgob+U5rUQsIqQhvAwCXYpfd3H20pHK/ENsCvwTbsA==" + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz", + "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -8464,6 +8721,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -8472,6 +8730,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -8481,6 +8740,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8499,9 +8759,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -8509,36 +8769,36 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -8550,9 +8810,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8575,10 +8835,16 @@ } }, "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/entities": { "version": "4.5.0", @@ -8596,7 +8862,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -8629,16 +8895,38 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true }, "node_modules/es6-promisify": { "version": "5.0.0", @@ -8650,11 +8938,12 @@ } }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", "dev": true, "hasInstallScript": true, + "optional": true, "bin": { "esbuild": "bin/esbuild" }, @@ -8662,35 +8951,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" } }, "node_modules/esbuild-wasm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.11.tgz", - "integrity": "sha512-MIhnpc1TxERUHomteO/ZZHp+kUawGEc03D/8vMHGzffLvbFLeDe6mwxqEZwlqBNY7SLWbyp6bBQAcCen8+wpjQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -8700,9 +8989,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -8710,7 +8999,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -8721,70 +9011,26 @@ } }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "optional": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8794,28 +9040,17 @@ "node": ">=0.10.0" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -9025,13 +9260,13 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "synckit": "^0.9.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9368,6 +9603,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "devOptional": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -9377,9 +9613,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -9404,7 +9640,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4.0" } @@ -9413,6 +9649,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -9421,6 +9658,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -9490,15 +9728,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -9506,36 +9735,37 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9547,9 +9777,10 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -9558,17 +9789,28 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9582,17 +9824,14 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -9600,7 +9839,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -9628,6 +9868,29 @@ "node": ">=0.6.0" } }, + "node_modules/extract-i18n": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-i18n/-/extract-i18n-1.0.0.tgz", + "integrity": "sha512-7+242dH+FCAwPwSXNladUcosPJjDqXLeM5SFqH24fUU022yyxHD4hpyeJY+9NuiVM7mxzRw41fKAHiJWDgfHHw==", + "dependencies": { + "lodash": "^4.17.21", + "shelljs": "^0.8.5", + "ts-node": "^10.8.1", + "typescript": "^4.7.4" + } + }, + "node_modules/extract-i18n/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -9648,18 +9911,11 @@ "@types/yauzl": "^2.9.1" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-diff": { "version": "1.3.0", @@ -9667,11 +9923,16 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "optional": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9686,22 +9947,25 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -9733,35 +9997,16 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "dev": true }, - "node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", - "peer": true - }, "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" + "escape-string-regexp": "^1.0.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9779,11 +10024,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-saver": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.1.tgz", - "integrity": "sha512-dCB3K7/BvAcUmtmh1DzFdv0eXSVJ9IAFt1mw3XZfAexodNRoE29l3xB2EX4wH2q8m/UTzwzEPq/ArYk98kUkBQ==" - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -9806,9 +10046,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9914,9 +10154,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/fn.name": { @@ -9945,15 +10185,10 @@ } } }, - "node_modules/font-family-papandreou": { - "version": "0.2.0-patch2", - "resolved": "https://registry.npmjs.org/font-family-papandreou/-/font-family-papandreou-0.2.0-patch2.tgz", - "integrity": "sha512-l/YiRdBSH/eWv6OF3sLGkwErL+n0MqCICi9mppTZBOCL5vixWGDqCYvRcuxB2h7RGCTzaTKOHT2caHvCXQPRlw==" - }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -9976,14 +10211,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -10002,6 +10229,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10023,6 +10251,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10037,7 +10266,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "devOptional": true + "dev": true }, "node_modules/fs-extra": { "version": "10.1.0", @@ -10066,16 +10295,28 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", @@ -10102,15 +10343,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10139,19 +10385,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "optional": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "optional": true, "dependencies": { - "assert-plus": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10188,7 +10455,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10198,7 +10464,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10238,6 +10503,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -10249,15 +10515,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/gradient-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-1.0.2.tgz", - "integrity": "sha512-gR6nY33xC9yJoH4wGLQtZQMXDi6RI3H37ERu7kQCVUzlXjNedpZM7xcA489Opwbq0BSGohtWGsWsntupmxelMg==", - "engines": { - "node": ">=0.10.0" - } + "devOptional": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -10271,68 +10529,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -10342,20 +10538,22 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10367,6 +10565,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10375,9 +10574,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -10385,27 +10584,10 @@ "node": ">= 0.4" } }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" @@ -10415,13 +10597,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -10466,9 +10645,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -10487,18 +10666,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -10534,6 +10701,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10549,6 +10717,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -10574,10 +10743,10 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "devOptional": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -10587,10 +10756,10 @@ } }, "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "devOptional": true, "dependencies": { "debug": "^4.3.4" }, @@ -10622,25 +10791,11 @@ } } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "devOptional": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -10650,10 +10805,10 @@ } }, "node_modules/https-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "devOptional": true, "dependencies": { "debug": "^4.3.4" }, @@ -10723,9 +10878,9 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -10747,16 +10902,10 @@ "node": ">=0.10.0" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true }, "node_modules/import-fresh": { @@ -10806,7 +10955,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10818,27 +10967,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/inquirer": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz", - "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==", + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", "dev": true, "dependencies": { - "@ljharb/through": "^2.3.11", + "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", - "figures": "^5.0.0", + "figures": "^3.2.0", "lodash": "^4.17.21", "mute-stream": "1.0.0", "ora": "^5.4.1", @@ -10849,7 +10998,7 @@ "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" } }, "node_modules/inquirer/node_modules/chalk": { @@ -10873,16 +11022,37 @@ "tslib": "^2.1.0" } }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "devOptional": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "devOptional": true }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { "node": ">= 10" @@ -10906,12 +11076,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10982,39 +11154,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -11075,18 +11214,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11113,7 +11247,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/isbinaryfile": { "version": "4.0.10", @@ -11141,11 +11276,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -11239,9 +11369,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -11255,20 +11385,18 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "dev": true, "engines": { "node": ">=6" } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -11277,9 +11405,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -11386,24 +11514,10 @@ "node": ">=8" } }, - "node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, "node_modules/jasmine-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", - "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true }, "node_modules/jasmine-spec-reporter": { @@ -11415,21 +11529,6 @@ "colors": "1.4.0" } }, - "node_modules/jasmine/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", - "dev": true - }, - "node_modules/jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", - "dev": true, - "engines": { - "node": ">= 6.9.x" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -11563,22 +11662,14 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11607,58 +11698,10 @@ } }, "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-8.5.0.tgz", - "integrity": "sha512-rvWfcn2O8SrXPaX5fTYIfPVwvnbU8DnZkjAXK305wfP67csyaJBhgg0F2aU6imqJ+lZmj9EmrBAXy6rWHf2/9Q==", - "dependencies": { - "abab": "^1.0.0", - "acorn": "^2.4.0", - "acorn-globals": "^1.0.4", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.0 < 0.4.0", - "cssstyle": ">= 0.2.34 < 0.3.0", - "escodegen": "^1.6.1", - "iconv-lite": "^0.4.13", - "nwmatcher": ">= 1.3.7 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.55.0", - "sax": "^1.1.4", - "symbol-tree": ">= 3.1.0 < 4.0.0", - "tough-cookie": "^2.2.0", - "webidl-conversions": "^3.0.1", - "whatwg-url": "^2.0.1", - "xml-name-validator": ">= 2.0.1 < 3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==" - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-2.0.1.tgz", - "integrity": "sha512-sX+FT4N6iR0ZiqGqyDEKklyfMGR99zvxZD+LQ8IGae5uVGswQ7DOeLPB5KgJY8FzkwSzwqOXLQeVQvtOTSQU9Q==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "devOptional": true }, "node_modules/jsesc": { "version": "2.5.2", @@ -11678,15 +11721,13 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "devOptional": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -11700,11 +11741,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11717,16 +11753,16 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "devOptional": true, "dependencies": { "universalify": "^2.0.0" }, @@ -11743,124 +11779,10 @@ "node >= 0.2.0" ] }, - "node_modules/jspdf": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", - "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.14.0", - "atob": "^2.1.2", - "btoa": "^1.2.1", - "fflate": "^0.4.8" - }, - "optionalDependencies": { - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "html2canvas": "^1.0.0-rc.5" - } - }, - "node_modules/jspdf-yworks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/jspdf-yworks/-/jspdf-yworks-2.1.1.tgz", - "integrity": "sha512-ZTUYUiL2YLCUZUvap38PlYaE9ZtyscxxgV5K+iLdx6qyOVTYJY+Tl2b6D7syUHeTJXdO8Ntw6hawNaXydcTLUA==", - "deprecated": "This fork is now obsolete. Use the regular jspdf (>=2.0.0) instead.", - "dependencies": { - "atob": "^2.1.2", - "btoa": "^1.2.1", - "canvg": "1.5.3", - "es6-promise": "^4.2.6", - "file-saver": "2.0.1", - "html2canvas": "^1.0.0-rc.1", - "omggif": "1.0.9", - "stackblur-canvas": "2.2.0" - }, - "bin": { - "jsPDF-makeFonts": "makeFonts.js" - } - }, - "node_modules/jspdf-yworks/node_modules/canvg": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-1.5.3.tgz", - "integrity": "sha512-7Gn2IuQzvUQWPIuZuFHrzsTM0gkPz2RRT9OcbdmA03jeKk8kltrD8gqUzNX15ghY/4PV5bbe5lmD6yDLDY6Ybg==", - "dependencies": { - "jsdom": "^8.1.0", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^1.4.1", - "xmldom": "^0.1.22" - } - }, - "node_modules/jspdf-yworks/node_modules/canvg/node_modules/stackblur-canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-1.4.1.tgz", - "integrity": "sha512-TfbTympL5C1K+F/RizDkMBqH18EkUKU8V+4PphIXR+fWhZwwRi3bekP04gy2TOwOT3R6rJQJXAXFrbcZde7wow==" - }, - "node_modules/jspdf-yworks/node_modules/stackblur-canvas": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.2.0.tgz", - "integrity": "sha512-5Gf8dtlf8k6NbLzuly2NkGrkS/Ahh+I5VUjO7TnFizdJtgpfpLLEdQlLe9umbcnZlitU84kfYjXE67xlSXfhfQ==" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "dependencies": { "@colors/colors": "1.5.0", @@ -11882,7 +11804,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.4.1", + "socket.io": "^4.7.2", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -12194,9 +12116,9 @@ "dev": true }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", + "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -12276,16 +12198,6 @@ "node": ">=4" } }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/less/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -12319,11 +12231,6 @@ "node": ">= 0.8.0" } }, - "node_modules/libphonenumber-js": { - "version": "1.10.54", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.54.tgz", - "integrity": "sha512-P+38dUgJsmh0gzoRDoM4F5jLbyfztkU6PY6eSK6S5HwTi/LPvnwXqVCQZlAy1FxZ5c48q25QhxGQ0pq+WQcSlQ==" - }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -12341,15 +12248,6 @@ } } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lines-and-columns": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", @@ -12392,8 +12290,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -12481,18 +12378,6 @@ "node": ">=8" } }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12522,9 +12407,9 @@ } }, "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", "dev": true, "dependencies": { "@colors/colors": "1.6.0", @@ -12556,9 +12441,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -12585,13 +12470,12 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dev": true, "dependencies": { "@npmcli/agent": "^2.0.0", @@ -12603,6 +12487,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -12610,6 +12495,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/make-fetch-happen/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -12620,6 +12514,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12637,9 +12532,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -12659,16 +12558,17 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -12702,6 +12602,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12710,6 +12611,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -12727,12 +12629,13 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -12755,6 +12658,7 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12769,14 +12673,15 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -12794,9 +12699,9 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -12841,9 +12746,9 @@ "dev": true }, "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", + "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", "dev": true, "dependencies": { "jsonparse": "^1.3.1", @@ -12960,15 +12865,16 @@ "dev": true }, "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "optional": true }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -12976,12 +12882,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "optional": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -12996,23 +12896,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -13039,6 +12922,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -13092,6 +12976,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13102,6 +12987,15 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/ngx-editor": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/ngx-editor/-/ngx-editor-15.3.0.tgz", @@ -13153,6 +13047,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -13178,9 +13073,9 @@ } }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -13189,9 +13084,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -13202,9 +13097,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "dev": true, "optional": true, "bin": { @@ -13214,23 +13109,21 @@ } }, "node_modules/node-gyp/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -13244,6 +13137,30 @@ "node": ">=16" } }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/node-gyp/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -13266,14 +13183,14 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "dependencies": { "abbrev": "^2.0.0" @@ -13286,13 +13203,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -13318,9 +13234,9 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" @@ -13393,23 +13309,33 @@ } }, "node_modules/npm-registry-fetch": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz", + "integrity": "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA==", "dev": true, "dependencies": { + "@npmcli/redact": "^1.1.0", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "proc-log": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -13434,11 +13360,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" - }, "node_modules/nx": { "version": "17.1.3", "resolved": "https://registry.npmjs.org/nx/-/nx-17.1.3.tgz", @@ -13576,21 +13497,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/nx/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/nx/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -13609,6 +13515,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -13643,6 +13550,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -13700,34 +13613,23 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13738,15 +13640,11 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/omggif": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", - "integrity": "sha512-VYAQRSZo7qoBcwB5G29YqVPLnxvDkWulE3x35kwH3bq4GdH/ZkHrcPPhxVfaOGYGZ5KV2/55UpcjcyNIO1qZoQ==" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -13767,7 +13665,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, "dependencies": { "wrappy": "1" } @@ -13814,17 +13711,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -13911,18 +13808,6 @@ "node": ">=8" } }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14022,10 +13907,72 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "optional": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "optional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "optional": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/pacote": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.5.tgz", - "integrity": "sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", + "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", "dev": true, "dependencies": { "@npmcli/git": "^5.0.0", @@ -14043,7 +13990,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -14054,12 +14001,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", @@ -14095,6 +14036,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "devOptional": true + }, "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -14152,6 +14099,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -14169,17 +14117,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -14191,42 +14132,39 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -14246,67 +14184,38 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "optional": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/piscina": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.2.1.tgz", - "integrity": "sha512-LShp0+lrO+WIzB9LXO+ZmO4zGHxtTJNZhEO56H9SSu+JPaUQb6oLcTCzWi5IL2DS8/vIkCE88ElahuSSw4TAkA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", "dev": true, - "dependencies": { - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, "optionalDependencies": { "nice-napi": "^1.0.2" } @@ -14397,9 +14306,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -14409,9 +14318,10 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -14436,31 +14346,46 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "dependencies": { - "cosmiconfig": "^8.3.5", + "cosmiconfig": "^9.0.0", "jiti": "^1.20.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -14470,9 +14395,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -14487,9 +14412,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -14517,9 +14442,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -14532,7 +14457,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -14570,18 +14496,6 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -14620,7 +14534,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/progress": { "version": "2.0.3", @@ -14730,11 +14645,19 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz", + "integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==", "dependencies": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-transform/node_modules/prosemirror-model": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz", + "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==", + "dependencies": { + "orderedmap": "^2.0.0" } }, "node_modules/prosemirror-view": { @@ -14747,220 +14670,66 @@ "prosemirror-transform": "^1.1.0" } }, - "node_modules/protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", - "dev": true, - "dependencies": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10.13.x" + "node": ">= 0.10" } }, - "node_modules/protractor/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/protractor/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/protractor/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/protractor/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/protractor/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/protractor/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/protractor/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "optional": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "optional": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.10" + "node": ">= 14" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "optional": true, "engines": { - "node": ">= 0.10" + "node": ">=12" } }, "node_modules/proxy-from-env": { @@ -14991,11 +14760,6 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -15007,125 +14771,51 @@ } }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/puppeteer": { - "version": "19.11.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.11.1.tgz", - "integrity": "sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g==", - "deprecated": "< 21.3.7 is no longer supported", + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", + "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", "hasInstallScript": true, "optional": true, "dependencies": { - "@puppeteer/browsers": "0.5.0", - "cosmiconfig": "8.1.3", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "19.11.1" - } - }, - "node_modules/puppeteer-core": { - "version": "19.11.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.1.tgz", - "integrity": "sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA==", - "optional": true, - "dependencies": { - "@puppeteer/browsers": "0.5.0", - "chromium-bidi": "0.4.7", - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1107588", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.13.0" + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.15.0" }, - "engines": { - "node": ">=14.14.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/puppeteer/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "optional": true - }, - "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "optional": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">=18" } }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", "optional": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/puppeteer/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "optional": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=18" } }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "engines": { "node": ">=0.6.0", @@ -15142,11 +14832,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15174,15 +14865,11 @@ } ] }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "optional": true, - "peer": true, - "dependencies": { - "performance-now": "^2.1.0" - } + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "optional": true }, "node_modules/randombytes": { "version": "2.1.0", @@ -15197,6 +14884,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15205,6 +14893,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15216,15 +14905,16 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/read-package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", - "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", + "integrity": "sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -15249,51 +14939,46 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15325,10 +15010,21 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, "node_modules/regenerate": { "version": "1.4.2", @@ -15351,7 +15047,8 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -15406,67 +15103,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15484,12 +15120,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -15509,7 +15139,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -15602,23 +15231,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, - "node_modules/rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "engines": { - "node": ">= 0.8.15" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -15631,9 +15253,9 @@ } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -15646,19 +15268,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -15803,6 +15428,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -15833,9 +15459,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -15850,29 +15476,29 @@ } }, "node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -15883,64 +15509,23 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, - "node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/saucelabs/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/saucelabs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/saucelabs/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/save-svg-as-png": { "version": "1.4.17", "resolved": "https://registry.npmjs.org/save-svg-as-png/-/save-svg-as-png-1.4.17.tgz", "integrity": "sha512-7QDaqJsVhdFPwviCxkgHiGm9omeaMBe1VKbHySWU6oFB2LtnGCcYS13eVoslUgq6VZC6Tjq/HddBd1K6p2PGpA==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true }, "node_modules/schema-utils": { "version": "4.2.0", @@ -15967,45 +15552,6 @@ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, - "node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/selenium-webdriver/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/selenium-webdriver/node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", @@ -16020,9 +15566,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16050,9 +15596,10 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -16076,6 +15623,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -16083,12 +15631,14 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -16099,12 +15649,14 @@ "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -16188,50 +15740,51 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { + "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -16273,14 +15826,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16293,17 +15867,17 @@ "dev": true }, "node_modules/sigstore": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.0.tgz", - "integrity": "sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.1", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^0.1.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -16343,23 +15917,23 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -16368,25 +15942,26 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "dependencies": { - "ws": "~8.11.0" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -16422,38 +15997,38 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "devOptional": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dev": true, + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "devOptional": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "devOptional": true, "dependencies": { "debug": "^4.3.4" }, @@ -16471,9 +16046,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16530,9 +16106,9 @@ } }, "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, "node_modules/spdx-correct": { @@ -16546,9 +16122,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -16562,9 +16138,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/spdy": { @@ -16597,14 +16173,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "bin": { - "specificity": "bin/specificity" - } - }, "node_modules/split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -16623,34 +16191,10 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -16668,16 +16212,6 @@ "node": "*" } }, - "node_modules/stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.14" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -16742,19 +16276,25 @@ "node": ">= 4.0.0" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "optional": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -16871,7 +16411,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -16879,38 +16418,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/svg2pdf.js": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/svg2pdf.js/-/svg2pdf.js-2.2.3.tgz", - "integrity": "sha512-PqOkKIy+zzU3DQQnPpzvwpjqtonCiPz8bAUVzXlz0f25p7pFvGTnj8IGwoFBV9bBlhLk50FABDzTW8JZNOyQaQ==", - "dependencies": { - "cssesc": "^3.0.0", - "font-family-papandreou": "^0.2.0-patch1", - "specificity": "^0.4.1", - "svgpath": "^2.3.0" - }, - "peerDependencies": { - "jspdf": "^2.0.0" - } - }, - "node_modules/svgpath": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", - "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", - "funding": { - "url": "https://github.com/fontello/svg2ttf?sponsor=1" - } - }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -16920,15 +16427,10 @@ "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, "dependencies": { "@pkgr/core": "^0.1.0", @@ -16951,9 +16453,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -16968,28 +16470,35 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "optional": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "optional": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "devOptional": true, + "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -17068,6 +16577,7 @@ "version": "2.5.4", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", "integrity": "sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.0.5" @@ -17077,9 +16587,9 @@ } }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -17219,20 +16729,21 @@ "node": "*" } }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "optional": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17286,26 +16797,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "engines": { "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/tree-kill": { "version": "1.2.2", @@ -17326,12 +16827,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -17341,7 +16842,6 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -17395,9 +16895,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17439,35 +16939,19 @@ "dev": true }, "node_modules/tuf-js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", - "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, "dependencies": { - "@tufjs/models": "2.0.0", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "make-fetch-happen": "^13.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -17496,6 +16980,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17510,11 +16995,6 @@ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -17528,9 +17008,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", "dev": true, "funding": [ { @@ -17554,6 +17034,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "dev": true, "dependencies": { "@lukeed/csprng": "^1.0.0" }, @@ -17572,13 +17053,10 @@ } }, "node_modules/undici": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.2.1.tgz", - "integrity": "sha512-7Wa9thEM6/LMnnKtxJHlc8SrTlDmxqJecgz1iy8KlsN0/iskQXOQCuPkrZLXbElPaSw5slFFyKIKXyJ3UtbApw==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", + "integrity": "sha512-KyhzaLJnV1qa3BSHdj4AZ2ndqI0QWPxYzaIOio0WzcEJB9gvuysprJSLtpvc2D9mhR9jPDUk7xlJlZbH2KR5iw==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { "node": ">=18.0" } @@ -17586,8 +17064,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "devOptional": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -17657,7 +17134,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 10.0.0" } @@ -17666,14 +17143,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -17689,8 +17167,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17703,31 +17181,41 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "optional": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, "engines": { "node": ">= 0.4.0" } }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -17736,122 +17224,504 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.7.tgz", + "integrity": "sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.10" + "node": ">=12" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, + "hasInstallScript": true, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=12" }, "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/void-elements": { @@ -17899,160 +17769,40 @@ "defaults": "^1.0.3" } }, - "node_modules/webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "dependencies": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", - "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", - "dev": true, - "dependencies": { - "adm-zip": "^0.5.2", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "bin": { - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webdriver-manager/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webdriver-manager/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -18072,9 +17822,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -18272,6 +18022,12 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -18296,6 +18052,19 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/webpack/node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -18323,6 +18092,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -18342,12 +18112,6 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -18355,35 +18119,35 @@ "dev": true }, "node_modules/winston": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", - "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.1.tgz", + "integrity": "sha512-CJi4Il/msz8HkdDfXOMu+r5Au/oyEjFiOZzbX2d23hRLY0narGjqfE5lFlrT5hfYJhPtM8b85/GNFsxIML/RVA==", "dev": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.6.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.7.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", - "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz", + "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==", "dev": true, "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.6.1", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { @@ -18403,6 +18167,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18504,13 +18269,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "devOptional": true, "engines": { "node": ">=10.0.0" @@ -18528,56 +18292,12 @@ } } }, - "node_modules/xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==" - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", "dev": true }, - "node_modules/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", - "engines": { - "node": ">=0.1" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -18630,7 +18350,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, "engines": { "node": ">=6" } @@ -18647,13 +18366,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zone.js": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.3.tgz", - "integrity": "sha512-jYoNqF046Q+JfcZSItRSt+oXFcpXL88yq7XAZjb/NKTS7w2hHpKjRJ3VlFD1k75wMaRRXNUt5vrZVlygiMyHbA==", - "dependencies": { - "tslib": "^2.3.0" + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zone.js": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==" } } } diff --git a/package.json b/package.json index bc1d4b7f..28cc6b39 100644 --- a/package.json +++ b/package.json @@ -3,86 +3,91 @@ "ng": "ng", "start": "ng serve", "start:local": "ng serve --configuration=local", + "start:standalone": "ng serve --configuration=standalone", + "start:standalonedemo": "ng serve --configuration=standalonedemo", "e2e:browserstack": "ng e2e -c browserstack", "e2e:puppeteer": "ng e2e -c puppeteer", "build": "ng run netzgrafik-frontend:ngsscbuild", + "build:standalone": "ng build --configuration=standalone", + "build:standalonedemo": "ng build --configuration=standalonedemo", "test": "ng test -c ci", "lint": "ng lint", "e2e": "ng e2e", - "t9n": "ng run netzgrafik-frontend:t9n", "generate:api": "openapi-generator-cli generate", - "local-test": "ng test --watch --code-coverage" + "local-test": "ng test --watch --code-coverage", + "extract-i18n": "ng extract-i18n" }, "name": "netzgrafik-frontend", - "version": "2.5.0", + "version": "2.9.11", + "repository": { + "type": "git", + "url": "https://github.com/osrd-project/netzgrafik-editor-frontend.git" + }, "files": [ "dist/*" ], "dependencies": { - "@angular/animations": "^17.0.5", - "@angular/cdk": "^17.0.1", - "@angular/common": "^17.0.5", - "@angular/compiler": "^17.0.5", - "@angular/core": "^17.0.5", - "@angular/forms": "^17.0.5", - "@angular/localize": "^17.0.5", - "@angular/platform-browser": "^17.0.5", - "@angular/platform-browser-dynamic": "^17.0.5", - "@angular/router": "^17.0.5", - "@sbb-esta/angular": "^17.5.1", + "@angular/animations": "^17.0.9", + "@angular/cdk": "^17.0.6", + "@angular/common": "^17.0.9", + "@angular/compiler": "^17.0.9", + "@angular/core": "^17.0.9", + "@angular/elements": "^17.1.3", + "@angular/forms": "^17.0.9", + "@angular/localize": "^17.0.9", + "@angular/platform-browser": "^17.0.9", + "@angular/platform-browser-dynamic": "^17.0.9", + "@angular/router": "^17.0.9", + "@sbb-esta/angular": "^17.5.3", "angular-oauth2-oidc": "^15.0.1", - "angular-server-side-configuration": "^17.0.2", - "angular-t9n": "^17.0.0", + "angular-server-side-configuration": "^17.0.5", "d3": "^5.16.0", - "dom-to-svg": "^0.12.2", - "jspdf-yworks": "^2.1.1", + "extract-i18n": "^1.0.0", "ngx-editor": "^15.0.1", - "papaparse": "^5.3.0", - "rxjs": "~7.5.0", + "papaparse": "^5.3.2", + "rxjs": "~7.5.7", "save-svg-as-png": "^1.4.17", - "svg2pdf.js": "^2.2.1", - "tslib": "^2.5.0", - "uuid": "^8.3.0", - "zone.js": "~0.14.2" + "tslib": "^2.5.3", + "uuid": "^8.3.2", + "zone.js": "~0.14.10" }, "optionalDependencies": { - "puppeteer": "^19.6.1" + "puppeteer": "^22.13.1" }, "devDependencies": { - "@angular-devkit/architect": "^0.1700.5", - "@angular-devkit/build-angular": "^17.0.5", + "@angular-devkit/architect": "^0.1700.10", + "@angular-devkit/build-angular": "^17.3.9", "@angular-eslint/builder": "17.1.1", "@angular-eslint/eslint-plugin": "17.1.1", "@angular-eslint/eslint-plugin-template": "17.1.1", "@angular-eslint/schematics": "17.1.1", "@angular-eslint/template-parser": "17.1.1", - "@angular/cli": "^17.0.5", - "@angular/compiler-cli": "^17.0.5", - "@angular/language-service": "^17.0.5", + "@angular/cli": "^17.0.10", + "@angular/compiler-cli": "^17.0.9", + "@angular/language-service": "^17.0.9", "@openapitools/openapi-generator-cli": "^2.5.2", - "@types/jasmine": "~3.6.0", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^18.11.18", + "@types/jasmine": "~3.6.11", + "@types/jasminewd2": "~2.0.13", + "@types/node": "^18.11.19", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", - "browserstack-local": "^1.5.1", + "browserstack-local": "^1.5.5", "eslint": "^8.53.0", "eslint-config-prettier": "^8.10.0", - "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-deprecation": "^1.3.3", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-rxjs": "^5.0.2", - "jasmine-core": "^4.1.0", + "eslint-plugin-rxjs": "^5.0.3", + "jasmine-core": "^4.1.1", "jasmine-spec-reporter": "~7.0.0", - "karma": "^6.4.1", + "karma": "^6.4.4", "karma-browserstack-launcher": "^1.6.0", "karma-chrome-launcher": "^3.1.1", - "karma-coverage": "^2.2.0", - "karma-jasmine": "~5.0.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "~5.0.1", "karma-jasmine-html-reporter": "^1.7.0", "karma-sonarqube-reporter": "^1.4.0", "prettier": "3.2.5", - "protractor": "~7.0.0", - "ts-node": "~10.9.1", + "ts-node": "~10.9.2", "typescript": "~5.2.2" } } diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..8df87576 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,13 @@ +{ + "packages": { + ".": { + "changelog-path": "CHANGELOG.md", + "release-type": "node", + "bump-minor-pre-major": false, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease": false + } + }, + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 892db6aa..505426ff 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -24,32 +24,32 @@ const routes: Routes = [ { path: "404", component: ErrorViewComponent, - data: {error: "Die gesuchte Seite wurde nicht gefunden."}, + data: {error: $localize`:@@app-routing.module.path.404:The page you were looking for was not found.`}, }, { path: "401", component: ErrorViewComponent, data: { - error: "Sie sind nicht autorisiert, bitte laden Sie die Seite neu.", + error: $localize`:@@app-routing.module.path.401:You are not authorized, please reload the page.`, }, }, { path: "403", component: ErrorViewComponent, - data: {error: "Sie sind nicht berechtigt diese Aktion durchzuführen."}, + data: {error: $localize`:@@app-routing.module.path.403:You are not authorized to perform this action.`}, }, { path: "409", component: ErrorViewComponent, data: { error: - "Es gab einen Konflikt bei der Ausführung Ihrer Aktion, bitte versuchen Sie es erneut.", + $localize`:@@app-routing.module.path.409:There was a conflict while executing your action, please try again.`, }, }, { path: "error", component: ErrorViewComponent, - data: {error: "Es ist ein Fehler aufgetreten."}, + data: {error: $localize`:@@app-routing.module.path.error:An error has occurred.`}, }, {path: "**", redirectTo: "/404"}, ]; diff --git a/src/app/app.component.html b/src/app/app.component.html index c284f833..59cf3872 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,17 +1,18 @@ - + - User Manuel + {{ 'app.user-manual' | translate }} - {{ + {{ environmentLabel }} + + 🇬🇧 English + 🇩🇪 Deutsch + 🇫🇷 Français + + +
- + + + - - + + + + + + + + diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 139482c1..a1415ccf 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -75,3 +75,8 @@ input[type=number]::-webkit-inner-spin-button { input[type=number] { -moz-appearance: textfield; } + +.sbb-select.language-selector-menu { + transform: translate(10px, 1px); + width: 95%; +} diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8b3c6e00..01f7b049 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,9 +1,17 @@ -import {Component} from "@angular/core"; +import {Component, Input, Output} from "@angular/core"; import {AuthService} from "./services/auth/auth.service"; +import {TrainrunService} from "./services/data/trainrun.service"; +import {TrainrunSectionService} from "./services/data/trainrunsection.service"; +import {DataService} from "./services/data/data.service"; import {environment} from "../environments/environment"; import packageJson from "../../package.json"; -import {Observable} from "rxjs"; +import {Observable, merge} from "rxjs"; import {ProjectDto} from "./api/generated"; +import {NetzgrafikDto} from "./data-structures/business.data.structures"; +import {Operation} from "./models/operation.model"; +import {LabelService} from "./services/data/label.serivce"; +import {NodeService} from "./services/data/node.service"; +import {I18nService} from "./core/i18n/i18n.service"; @Component({ selector: "sbb-root", @@ -11,25 +19,73 @@ import {ProjectDto} from "./api/generated"; styleUrls: ["./app.component.scss"], }) export class AppComponent { - version = packageJson.version; - environmentLabel = environment.label; - authenticated: Promise; + readonly disableBackend = environment.disableBackend; + readonly version = packageJson.version; + readonly environmentLabel = environment.label; + readonly authenticated: Promise; + protected currentLanguage: string = this.i18nService.language; projectInMenu: Observable; get userName() { + if (this.disableBackend) { + return undefined; + } return this.authService.claims?.name; } get email() { + if (this.disableBackend) { + return undefined; + } return this.authService.claims?.email; } - constructor(private authService: AuthService) { - this.authenticated = authService.initialized; + constructor(private authService: AuthService, + private dataService: DataService, + private trainrunService: TrainrunService, + private trainrunSectionService: TrainrunSectionService, + private nodeService: NodeService, + private labelService: LabelService, + private i18nService: I18nService, + ) { + if (!this.disableBackend) { + this.authenticated = authService.initialized; + } } logout() { - this.authService.logOut(); + if (!this.disableBackend) { + this.authService.logOut(); + } } + + @Input() + get language() { + return this.currentLanguage; + } + + set language(language: string) { + if (language !== this.currentLanguage) { + this.i18nService.setLanguage(language); + this.currentLanguage = language; + } + } + + @Input() + get netzgrafikDto() { + return this.dataService.getNetzgrafikDto(); + } + + set netzgrafikDto(netzgrafikDto: NetzgrafikDto) { + this.dataService.loadNetzgrafikDto(netzgrafikDto); + } + + @Output() + operation: Observable = merge( + this.trainrunService.operation, + this.trainrunSectionService.operation, + this.nodeService.operation, + this.labelService.operation, + ); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4a3478b9..a75586bd 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,6 +1,7 @@ -import {NgModule} from "@angular/core"; +import {NgModule, Injector, DoBootstrap} from "@angular/core"; import {NgxEditorModule} from "ngx-editor"; import {BrowserModule} from "@angular/platform-browser"; +import {createCustomElement} from "@angular/elements"; import {HTTP_INTERCEPTORS, HttpClientModule} from "@angular/common/http"; import {OAuthModule} from "angular-oauth2-oidc"; import {FormsModule, ReactiveFormsModule} from "@angular/forms"; @@ -100,6 +101,7 @@ import {TrainRunSectionStopsComponentComponent} from "./streckengrafik/component import {PathGridComponent} from "./streckengrafik/components/grid/path-grid/path-grid.component"; import {TrainRunNodeComponent} from "./streckengrafik/components/train-run-node/trainrun-node.component"; import {ActionMenuComponent} from "./view/action-menu/action-menu/action-menu.component"; +import {I18nModule} from "./core/i18n/i18n.module"; @NgModule({ declarations: [ @@ -203,7 +205,7 @@ import {ActionMenuComponent} from "./view/action-menu/action-menu/action-menu.co // and you send a request to these, the access token is appended. // Documentation: // https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/working-with-httpinterceptors.html - allowedUrls: [environment.backendUrl], + allowedUrls: environment.backendUrl ? [environment.backendUrl] : [], sendAccessToken: true, }, }), @@ -229,11 +231,22 @@ import {ActionMenuComponent} from "./view/action-menu/action-menu/action-menu.co SbbTooltipModule, SbbBreadcrumbModule, SbbAutocompleteModule, + I18nModule, ], - bootstrap: [AppComponent], + bootstrap: environment.customElement ? [] : [AppComponent], providers: [ - {provide: BASE_PATH, useValue: environment.backendUrl}, + ... environment.backendUrl ? [{provide: BASE_PATH, useValue: environment.backendUrl}] : [], {provide: HTTP_INTERCEPTORS, useClass: HttpErrorInterceptor, multi: true}, ], }) -export class AppModule {} + +export class AppModule implements DoBootstrap { + constructor(private injector: Injector) {} + + ngDoBootstrap() { + if (environment.customElement) { + const element = createCustomElement(AppComponent, {injector: this.injector}); + customElements.define("sbb-root", element); + } + } +} diff --git a/src/app/core/i18n/i18n.module.ts b/src/app/core/i18n/i18n.module.ts new file mode 100644 index 00000000..c7929192 --- /dev/null +++ b/src/app/core/i18n/i18n.module.ts @@ -0,0 +1,25 @@ +import {NgModule, APP_INITIALIZER, LOCALE_ID} from "@angular/core"; +import {CommonModule} from "@angular/common"; +import {TranslatePipe} from "./translate.pipe"; +import {I18nService} from "./i18n.service"; + +@NgModule({ + declarations: [TranslatePipe], // Declare the pipe + imports: [CommonModule], + providers: [ + I18nService, + { // Load locale data at app start-up + provide: APP_INITIALIZER, + useFactory: (i18nService: I18nService) => () => i18nService.setLanguage(), + deps: [I18nService], + multi: true, + }, + { // Set the runtime locale for the app + provide: LOCALE_ID, + useFactory: (i18nService: I18nService) => i18nService.language, + deps: [I18nService], + } + ], + exports: [TranslatePipe] // Export the pipe +}) +export class I18nModule { } diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts new file mode 100644 index 00000000..13eab38e --- /dev/null +++ b/src/app/core/i18n/i18n.service.ts @@ -0,0 +1,98 @@ +import {Injectable} from "@angular/core"; +import {registerLocaleData} from "@angular/common"; +import {loadTranslations} from "@angular/localize"; + +@Injectable({ + providedIn: "root", + }) +export class I18nService { + readonly allowedLanguages = ["en", "fr", "de", "it"]; + private currentLanguage: string = this.getLanguageFromStorage() || this.detectNavigatorLanguage(); + translations: any = {}; + + get language(): string { + return this.currentLanguage; + } + + async setLanguage(language?: string) { + if (language && this.allowedLanguages.includes(this.language)) { + this.setLanguageToStorage(language); + this.currentLanguage = language; + } + + const languageModule = await import( + /* webpackInclude: /(en|de|fr|it)\.mjs$/ */ + `/node_modules/@angular/common/locales/${this.language}.mjs` + ); + registerLocaleData(languageModule.default); + + await this.loadTranslations(); + } + + private setLanguageToStorage(language: string) { + localStorage.setItem("i18nLng", language); + } + + private getLanguageFromStorage(): string | null { + const lang = localStorage.getItem("i18nLng"); + return this.allowedLanguages.includes(lang) ? lang : null; + } + + private detectNavigatorLanguage(): string { + const navigatorLanguage = navigator.language.slice(0, 2); + return this.allowedLanguages.includes(navigatorLanguage) ? navigatorLanguage : this.allowedLanguages[0]; + } + + async loadTranslations() { + const languageTranslationsModule = await import( + `src/assets/i18n/${this.language}.json` + ); + + this.translations = this.flattenTranslations(languageTranslationsModule.default); + loadTranslations(this.translations); + } + + // Helper function to flatten nested translations + // nested JSON : + // { + // "app": { + // "login": "Login", + // "models": {...} + // } + // } + // flattened JSON : + // { + // "app.login": "Login", + // "app.models...": ..., + // "app.models...": ... + // } + private flattenTranslations(translations: any): any { + const flattenedTranslations = {}; + + function flatten(obj, prefix = "") { + for (const key in obj) { + if (typeof obj[key] === "string") { + flattenedTranslations[prefix + key] = obj[key]; + } else if (typeof obj[key] === "object") { + flatten(obj[key], prefix + key + "."); + } + } + } + + flatten(translations); + return flattenedTranslations; + } + + // Used for the pipe and allowing parameters + translate(key: string, params?: any): string { + let translation = this.translations[key] || key; + + if (params) { + Object.keys(params).forEach(param => { + translation = translation.replace(`{$${param}}`, params[param]); + }); + } + + return translation; + } +} diff --git a/src/app/core/i18n/translate.pipe.ts b/src/app/core/i18n/translate.pipe.ts new file mode 100644 index 00000000..e11045a3 --- /dev/null +++ b/src/app/core/i18n/translate.pipe.ts @@ -0,0 +1,14 @@ +import {Pipe, PipeTransform} from "@angular/core"; +import {I18nService} from "./i18n.service"; + +@Pipe({ + name: "translate", + pure: false +}) +export class TranslatePipe implements PipeTransform { + constructor(private i18nService: I18nService) {} + + transform(key: string, params?: any): string { + return this.i18nService.translate(key, params); + } +} diff --git a/src/app/data-structures/business.data.structures.ts b/src/app/data-structures/business.data.structures.ts index d84f4d9b..c7e72141 100644 --- a/src/app/data-structures/business.data.structures.ts +++ b/src/app/data-structures/business.data.structures.ts @@ -252,6 +252,15 @@ export interface Haltezeit { no_halt: boolean; // no halt per default } +export interface OriginDestinationSettingsDto { + // TODO: we may want a UI to display/edit this. + connectionPenalty: number; // the cost to add for each connection, in minutes +} + +export interface AnalyticsSettingsDto { + originDestinationSettings: OriginDestinationSettingsDto; +} + /** * Groups Meta data in exported JSON / internal data structure (global properties for a project) */ @@ -260,6 +269,7 @@ export interface MetadataDto { trainrunFrequencies: TrainrunFrequency[]; trainrunTimeCategories: TrainrunTimeCategory[]; netzgrafikColors: NetzgrafikColorDto[]; + analyticsSettings: AnalyticsSettingsDto; } /** diff --git a/src/app/data-structures/technical.data.structures.ts b/src/app/data-structures/technical.data.structures.ts index 51abe079..e2465c89 100644 --- a/src/app/data-structures/technical.data.structures.ts +++ b/src/app/data-structures/technical.data.structures.ts @@ -98,7 +98,7 @@ export interface TimeFormatter { * Represents the time data in TrainrunSectionDto. */ export interface TimeLockDto { - time: number; // minutes [0..60] + time: number | null; // minutes [0..60] consecutiveTime: number; // automatically updated after any data changes in the application lock: boolean; // used to stop the time propagation (forward/backward) warning: WarningDto; // warning - if business logic detects an issue -> set human-readable warning diff --git a/src/app/logger/log-notification-toast.component.html b/src/app/logger/log-notification-toast.component.html index a8748f0b..c4688299 100644 --- a/src/app/logger/log-notification-toast.component.html +++ b/src/app/logger/log-notification-toast.component.html @@ -2,7 +2,7 @@ - Title + Title diff --git a/src/app/models/node.model.ts b/src/app/models/node.model.ts index fd9906a1..c8c0f6ca 100644 --- a/src/app/models/node.model.ts +++ b/src/app/models/node.model.ts @@ -61,8 +61,8 @@ export class Node { labelIds, }: NodeDto = { id: Node.incrementId(), - betriebspunktName: "NEW", - fullName: "Neuer Knoten", + betriebspunktName: $localize`:@@app.models.node.shortNameDefault:NEW`, + fullName: $localize`:@@app.models.node.full-name-default:New node`, positionX: 0, positionY: 0, ports: [], diff --git a/src/app/models/note.model.ts b/src/app/models/note.model.ts index 6eec8540..4c3828c7 100644 --- a/src/app/models/note.model.ts +++ b/src/app/models/note.model.ts @@ -6,8 +6,8 @@ export class Note { public static DEFAULT_NOTE_HEIGHT = 64; public static DEFAULT_NOTE_POSITION_X = 0; public static DEFAULT_NOTE_POSITION_Y = 0; - public static DEFAULT_NOTE_TITLE = "Kommentar Titel"; - public static DEFAULT_NOTE_TEXT = "Kommentar Text"; + public static DEFAULT_NOTE_TITLE = $localize`:@@app.models.note.title-default:Note title`; + public static DEFAULT_NOTE_TEXT = $localize`:@@app.models.note.text-default:Note text`; public static DEFAULT_NOTE_BACKGROUND_COLOR = "#ffffff"; public static DEFAULT_NOTE_TEXT_COLOR = "#000000"; diff --git a/src/app/models/operation.model.ts b/src/app/models/operation.model.ts new file mode 100644 index 00000000..b2120789 --- /dev/null +++ b/src/app/models/operation.model.ts @@ -0,0 +1,60 @@ +import {Node} from "./node.model"; +import {Trainrun} from "./trainrun.model"; +import {Label} from "./label.model"; + +enum OperationType { + create = "create", + update = "update", + delete = "delete", +} + +enum OperationObjectType { + trainrun = "trainrun", + node = "node", + label = "label", +} + +abstract class Operation { + readonly type: OperationType; + readonly objectType: OperationObjectType; + + constructor(type: OperationType, objectType: OperationObjectType) { + this.type = type; + this.objectType = objectType; + } +} + +class TrainrunOperation extends Operation { + readonly trainrun: Trainrun; + + constructor(operationType: OperationType, trainrun: Trainrun) { + super(operationType, OperationObjectType.trainrun); + this.trainrun = trainrun; + } +} + +class NodeOperation extends Operation { + readonly node: Node; + + constructor(operationType: OperationType, node: Node) { + super(operationType, OperationObjectType.node); + this.node = node; + } +} + +class LabelOperation extends Operation { + readonly label: Label; + + constructor(operationType: OperationType, label: Label) { + super(operationType, OperationObjectType.label); + this.label = label; + } +} + +export { + OperationType, + Operation, + TrainrunOperation, + NodeOperation, + LabelOperation, +}; diff --git a/src/app/models/trainrunsection.model.ts b/src/app/models/trainrunsection.model.ts index a062dc53..29c5a304 100644 --- a/src/app/models/trainrunsection.model.ts +++ b/src/app/models/trainrunsection.model.ts @@ -15,6 +15,7 @@ import { } from "../data-structures/technical.data.structures"; import {TrainrunsectionValidator} from "../services/util/trainrunsection.validator"; import {formatDate} from "@angular/common"; +import {environment} from "src/environments/environment"; export class TrainrunSection { private static currentId = 0; @@ -175,54 +176,36 @@ export class TrainrunSection { } private static formatDisplayText(time: TimeLockDto, offset: number): string { + if (time.time === null) { + return "?"; + } if (!time?.timeFormatter?.stylePattern) { return undefined; } - const stylePattern = time.timeFormatter.stylePattern; - let formattedText = ""; - const consecutiveTimePatternHHMMSS = "{{consecutiveTime}}.format(HH:mm:ss)"; - const consecutiveTimePatternHHMM = "{{consecutiveTime}}.format(HH:mm)"; - const consecutiveTimePattern = "{{consecutiveTime}}"; - const timePatternHHMMSS = "{{time}}.format(HH:mm:ss)"; - const timePatternHHMM = "{{time}}.format(HH:mm)"; - const timePattern = "{{time}}"; const consecutiveTimeDate = new Date(null); consecutiveTimeDate.setSeconds((time.consecutiveTime + offset) * 60); const timeDate = new Date(null); timeDate.setSeconds(((time.time + offset + 24 * 60) % 60) * 60); - formattedText = stylePattern; - formattedText = formattedText.replace( - consecutiveTimePatternHHMMSS, - formatDate(consecutiveTimeDate.toISOString(), "HH:mm:ss", "en-US", "UTC"), - ); - formattedText = formattedText.replace( - consecutiveTimePatternHHMM, - formatDate(consecutiveTimeDate.toISOString(), "HH:mm", "en-US", "UTC"), - ); - formattedText = formattedText.replace( - consecutiveTimePattern, - "" + time.consecutiveTime, - ); + const patterns = { + "{{consecutiveTime}}.format(HH:mm:ss)": formatDate(consecutiveTimeDate.toISOString(), "HH:mm:ss", "en-US", "UTC"), + "{{consecutiveTime}}.format(HH:mm)": formatDate(consecutiveTimeDate.toISOString(), "HH:mm", "en-US", "UTC"), + "{{consecutiveTime}}": "" + time.consecutiveTime, + "{{time}}.format(HH:mm:ss)": formatDate(timeDate.toISOString(), "HH:mm:ss", "en-US", "UTC"), + "{{time}}.format(HH:mm)": formatDate(timeDate.toISOString(), "HH:mm", "en-US", "UTC"), + "{{time}}": "" + ((time.time + offset + 24 * 60) % 60), + }; - formattedText = formattedText.replace( - timePatternHHMMSS, - formatDate(timeDate.toISOString(), "HH:mm:ss", "en-US", "UTC"), - ); - formattedText = formattedText.replace( - timePatternHHMM, - formatDate(timeDate.toISOString(), "HH:mm", "en-US", "UTC"), - ); - formattedText = formattedText.replace( - timePattern, - "" + ((time.time + offset + 24 * 60) % 60), - ); + let formattedText = time.timeFormatter.stylePattern; + for (const pattern in patterns) { + formattedText = formattedText.replace(pattern, patterns[pattern]); + } return formattedText; } - shiftAllTimes(translateMinutes: number, mirrorSourceDeparture : boolean) { + shiftAllTimes(translateMinutes: number, mirrorSourceDeparture: boolean) { this.sourceDeparture.time += translateMinutes; this.targetArrival.time += translateMinutes; this.sourceArrival.time += translateMinutes; @@ -470,22 +453,27 @@ export class TrainrunSection { } hasTravelTimeWarning(): boolean { + if (environment.disableBackend) return false return this.travelTime.warning !== null; } hasSourceDepartureWarning(): boolean { + if (environment.disableBackend) return false return this.sourceDeparture.warning !== null; } hasSourceArrivalWarning(): boolean { + if (environment.disableBackend) return false return this.sourceArrival.warning !== null; } hasTargetDepartureWarning(): boolean { + if (environment.disableBackend) return false return this.targetDeparture.warning !== null; } hasTargetArrivalWarning(): boolean { + if (environment.disableBackend) return false return this.targetArrival.warning !== null; } @@ -524,6 +512,26 @@ export class TrainrunSection { }; } + getTargetArrivalWarning() { + return this.targetArrival.warning; + } + + getSourceArrivalWarning() { + return this.sourceArrival.warning; + } + + getTargetDepartureWarning() { + return this.targetDeparture.warning; + } + + getSourceDepartureWarning() { + return this.sourceDeparture.warning; + } + + getTravelTimeWarning() { + return this.travelTime.warning; + } + resetTargetArrivalWarning() { this.targetArrival.warning = null; } @@ -660,7 +668,7 @@ export class TrainrunSection { resourceId: this.resourceId, specificTrainrunSectionFrequencyId: - this.specificTrainrunSectionFrequencyId, + this.specificTrainrunSectionFrequencyId, path: this.path, warnings: this.warnings, }; diff --git a/src/app/netzgrafik-application/netzgrafik-application.component.html b/src/app/netzgrafik-application/netzgrafik-application.component.html index 9b3204a9..938869cf 100644 --- a/src/app/netzgrafik-application/netzgrafik-application.component.html +++ b/src/app/netzgrafik-application/netzgrafik-application.component.html @@ -1,9 +1,9 @@ - - + + - @@ -19,7 +19,7 @@ @@ -41,7 +41,7 @@ @@ -49,7 +49,7 @@ diff --git a/src/app/netzgrafik-application/netzgrafik-application.component.scss b/src/app/netzgrafik-application/netzgrafik-application.component.scss index 37da095c..8a259dac 100644 --- a/src/app/netzgrafik-application/netzgrafik-application.component.scss +++ b/src/app/netzgrafik-application/netzgrafik-application.component.scss @@ -1,16 +1,17 @@ -sbb-icon-sidebar-container { - top: 85px; -} - ::ng-deep a.SideBarMainIcon { - background: whitesmoke; } ::ng-deep a.SideBarMainIcon:hover { - background: white; } a.SideBarMainIcon.sbb-active { pointer-events: all; - background: whitesmoke; +} + +.sbb-icon-sidebar-container { + top: 85px; +} + +.sbb-icon-sidebar-container.disableBackend { + top: 0px; } diff --git a/src/app/netzgrafik-application/netzgrafik-application.component.ts b/src/app/netzgrafik-application/netzgrafik-application.component.ts index 805e5ba4..4764d747 100644 --- a/src/app/netzgrafik-application/netzgrafik-application.component.ts +++ b/src/app/netzgrafik-application/netzgrafik-application.component.ts @@ -12,6 +12,8 @@ import {DomSanitizer} from "@angular/platform-browser"; import {EditorMode} from "../view/editor-menu/editor-mode"; import {UndoService} from "../services/data/undo.service"; import {EditorView} from "../view/editor-main-view/data-views/editor.view"; +import {NetzgrafikDefault} from "../sample-netzgrafik/netzgrafik.default"; +import {environment} from "../../environments/environment"; export enum IconSidebarMode { VARIANTEN = "varianten", @@ -29,6 +31,8 @@ export class NetzgrafikApplicationComponent { mode = IconSidebarMode.NONE; expanded = false; + readonly disableBackend = environment.disableBackend; + private readonly destroyed = new Subject(); constructor( @@ -48,18 +52,26 @@ export class NetzgrafikApplicationComponent { .subscribe((params) => { uiInteractionService.setEditorMode(EditorMode.NetzgrafikEditing); uiInteractionService.showNetzgrafik(); - versionControlService.load(params.getVariantId(), true); + try { + versionControlService.load(params.getVariantId(), true); + } catch (e) { + versionControlService.loadNetzgrafikDTO(NetzgrafikDefault.getDefaultNetzgrafik()); + } uiInteractionService.setViewboxProperties( EditorView.svgName, uiInteractionService.getDefaultViewProperties()); }); } - getVariantIsWritable(): boolean { - if (this.versionControlService.variant === null) { - return true; + getSidebarClassTag(): string { + if (this.disableBackend) { + return "disableBackend"; } - return this.versionControlService.variant.isWritable; + return ""; + } + + getVariantIsWritable(): boolean { + return this.versionControlService.getVariantIsWritable(); } onVariantenClicked() { diff --git a/src/app/perlenkette/model/perlenkette-tests.spec.ts b/src/app/perlenkette/model/perlenkette-tests.spec.ts index 54e9a19f..f2e560fe 100644 --- a/src/app/perlenkette/model/perlenkette-tests.spec.ts +++ b/src/app/perlenkette/model/perlenkette-tests.spec.ts @@ -3,8 +3,18 @@ import {PerlenketteSection} from "./perlenketteSection"; describe("PerlenketteModelTests", () => { it("Perlenkette-Model - Test - PerlenketteNode - 001", () => { - const node = new PerlenketteNode(0, "BN", "Berm", 10, [], undefined); + const node = new PerlenketteNode(0, + "BN", + "Berm", + 10, + [], + undefined, + false, + true + ); + expect(node.isFristTrainrunPartNode()).toBe(false); + expect(node.isLastTrainrunPartNode()).toBe(true); expect(node.isPerlenketteNode()).toBe(true); expect(node.isPerlenketteSection()).toBe(false); expect(node.getPerlenketteNode()).toEqual(node); @@ -19,8 +29,12 @@ describe("PerlenketteModelTests", () => { undefined, 0, false, + false, + true ); + expect(section.isFristTrainrunPartSection()).toBe(false); + expect(section.isLastTrainrunPartSection()).toBe(true); expect(section.isPerlenketteNode()).toBe(false); expect(section.isPerlenketteSection()).toBe(true); expect(section.getPerlenketteNode()).toEqual(undefined); diff --git a/src/app/perlenkette/model/perlenketteNode.ts b/src/app/perlenkette/model/perlenketteNode.ts index 46256a77..3e8b2315 100644 --- a/src/app/perlenkette/model/perlenketteNode.ts +++ b/src/app/perlenkette/model/perlenketteNode.ts @@ -12,7 +12,22 @@ export class PerlenketteNode implements PerlenketteItem { public connectionTime: number, public connections: PerlenketteConnection[], public transition: Transition, - ) {} + public fristTrainrunPartNode: boolean, + public lastTrainrunPartNode: boolean + ) { + } + + isFristTrainrunPartNode(): boolean { + return this.fristTrainrunPartNode; + } + + isLastTrainrunPartNode(): boolean { + return this.lastTrainrunPartNode; + } + + setLastTrainrunPartNode(flag : boolean) { + this.lastTrainrunPartNode = flag; + } isPerlenketteNode(): boolean { return true; diff --git a/src/app/perlenkette/model/perlenketteSection.ts b/src/app/perlenkette/model/perlenketteSection.ts index ccd3eaec..62d0b2c7 100644 --- a/src/app/perlenkette/model/perlenketteSection.ts +++ b/src/app/perlenkette/model/perlenketteSection.ts @@ -10,7 +10,22 @@ export class PerlenketteSection implements PerlenketteItem { public toNode: Node, public numberOfStops: number, public isBeingEdited: boolean = false, - ) {} + public fristTrainrunPartSection: boolean = false, + public lastTrainrunPartSection: boolean = false + ) { + } + + isFristTrainrunPartSection(): boolean { + return this.fristTrainrunPartSection; + } + + isLastTrainrunPartSection(): boolean { + return this.lastTrainrunPartSection; + } + + setLastTrainrunPartSection(flag : boolean) { + this.lastTrainrunPartSection = flag; + } isPerlenketteNode(): boolean { return false; diff --git a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.html b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.html index d15f4c0e..4cccdfe7 100644 --- a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.html +++ b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.html @@ -1,4 +1,6 @@ -
+
- {{ perlenketteNode.shortName }} - + {{ perlenketteNode.shortName }} + {{ perlenketteNode.connectionTime }} @@ -156,8 +158,8 @@ 20 + transformIndex(connectionIndex, connectionGrpKey) * surplus " dominant-baseline="text-after-edge" - class="edge_text station start" - style="fill: white; stroke-width: 6px; stroke: white" + class="edge_text station start layer0" + style=" stroke-width: 6px;" (click)="selectConnection(connection)" [ngClass]="[ getTextNameOrTimeClassTag(connection, connectionGrpKey, 0) @@ -188,9 +190,9 @@ " text-anchor="end" dominant-baseline="text-after-edge" - class="edge_text station end" + class="edge_text station end layer0" (click)="selectConnection(connection)" - style="fill: white; stroke-width: 6px; stroke: white" + style=" stroke-width: 6px;" [ngClass]="[ getTextNameOrTimeClassTag(connection, connectionGrpKey, 1) ]" @@ -220,9 +222,9 @@ 20 + transformIndex(connectionIndex, connectionGrpKey) * surplus " dominant-baseline="text-after-edge" - class="edge_text end station" + class="edge_text end station layer0" (click)="selectConnection(connection)" - style="fill: white; stroke-width: 6px; stroke: white" + style=" stroke-width: 6px;" [ngClass]="[ getTextTerminalStationlassTag(connection, connectionGrpKey, 0) ]" @@ -251,9 +253,9 @@ " text-anchor="start" dominant-baseline="text-after-edge" - class="edge_text start station" + class="edge_text start station layer0" (click)="selectConnection(connection)" - style="fill: white; stroke-width: 6px; stroke: white" + style=" stroke-width: 6px;" [ngClass]="[ getTextTerminalStationlassTag(connection, connectionGrpKey, 1) ]" @@ -326,13 +328,14 @@ - + {{ perlenketteNode.shortName }} {{ perlenketteNode.connectionTime }} diff --git a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.scss b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.scss index 933d6b4e..6d9cffa5 100644 --- a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.scss +++ b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.scss @@ -1,4 +1,5 @@ @import "./../../view/rastering/definitions"; +@import "./../../view/editor-main-view/data-views/nodes.view"; .node-container { position: relative; @@ -8,6 +9,10 @@ } } +.readonly { + pointer-events: none; +} + .title_rect { cursor: pointer; } @@ -19,12 +24,12 @@ .main_rect { stroke: $COLOR_Default; - fill: white; + fill: var(--NODE_DOCKABLE); stroke-width: 1px; } .title_rect { - fill: var(--UI_DIALOG_NODE_COLOR_BACKGROUND); + fill: var(--NODE_COLOR_BACKGROUND); } .main_rect.no_stop_has_connections { @@ -38,7 +43,7 @@ } .non_stop_toogle { - fill: white; + fill: var(--NODE_DOCKABLE); } .non_stop_toogle.nonstop { @@ -67,6 +72,10 @@ text.edge_text.middle { text-anchor: middle; } +text.edge_text.station.layer0 { + stroke: var(--NODE_DOCKABLE) +} + path.SepConnectionLine { stroke: $COLOR_Default; stroke-width: 0.5px; diff --git a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.ts b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.ts index ac483cc4..61d0ea4e 100644 --- a/src/app/perlenkette/perlenkette-node/perlenkette-node.component.ts +++ b/src/app/perlenkette/perlenkette-node/perlenkette-node.component.ts @@ -13,6 +13,7 @@ import {Trainrun} from "../../models/trainrun.model"; import {PerlenketteConnection} from "../model/perlenketteConnection"; import {PerlenketteItem} from "../model/perlenketteItem"; import {UiInteractionService} from "../../services/ui/ui.interaction.service"; +import {VersionControlService} from "../../services/data/version-control.service"; @Component({ selector: "sbb-perlenkette-node", @@ -37,6 +38,7 @@ export class PerlenketteNodeComponent implements OnInit { public trainrunService: TrainrunService, readonly filterService: FilterService, readonly uiInteractionService: UiInteractionService, + readonly versionControlService : VersionControlService, ) { } @@ -45,6 +47,10 @@ export class PerlenketteNodeComponent implements OnInit { this.calculateHeightConnectionSurplus(); } + getVariantIsWritable() : boolean { + return this.versionControlService.getVariantIsWritable(); + } + getConnectionIssue(): string { let amountOfWarningConnections = 0; this.perlenketteNode.connections.forEach( @@ -52,12 +58,12 @@ export class PerlenketteNodeComponent implements OnInit { mockConnection.connectionWarning && amountOfWarningConnections++, ); if (amountOfWarningConnections === 0) { - return "Kein fehlerhafter Anschluss"; + return $localize`:@@app.perlenkette.perlenkette-node.0-warning-connection:No incorrect connection`; } if (amountOfWarningConnections === 1) { - return "1 fehlerhafter Anschluss"; + return $localize`:@@app.perlenkette.perlenkette-node.1-warning-connection:1 incorrect connection`; } - return amountOfWarningConnections + " fehlerhafte Anschlüsse"; + return $localize`:@@app.perlenkette.perlenkette-node.n-warning-connections:${amountOfWarningConnections}:number: incorrect connections`; } getFittingConnections(): string { @@ -67,12 +73,12 @@ export class PerlenketteNodeComponent implements OnInit { !mockConnection.connectionWarning && amountOfFittingConnections++, ); if (amountOfFittingConnections === 0) { - return "Kein passender Anschluss"; + return $localize`:@@app.perlenkette.perlenkette-node.0-fitting-connection:No fitting connection`; } if (amountOfFittingConnections === 1) { - return "1 passender Anschluss"; + return $localize`:@@app.perlenkette.perlenkette-node.1-fitting-connection:1 fitting connection`; } - return amountOfFittingConnections + " passende Anschlüsse"; + return $localize`:@@app.perlenkette.perlenkette-node.n-fitting-connections:${amountOfFittingConnections}:number: fitting connections`; } expandConnections() { @@ -343,8 +349,10 @@ export class PerlenketteNodeComponent implements OnInit { ); } - disapleSectionView(event: MouseEvent) { - this.signalIsBeingEdited.next(undefined); + disableSectionView(event: MouseEvent) { + if (!this.getVariantIsWritable()) { + this.signalIsBeingEdited.next(undefined); + } event.stopPropagation(); } diff --git a/src/app/perlenkette/perlenkette-section/perlenkette-section.component.html b/src/app/perlenkette/perlenkette-section/perlenkette-section.component.html index f3bf165e..fedae9fb 100644 --- a/src/app/perlenkette/perlenkette-section/perlenkette-section.component.html +++ b/src/app/perlenkette/perlenkette-section/perlenkette-section.component.html @@ -1,6 +1,7 @@
@@ -130,14 +131,14 @@ y="1" width="12" height="22" - style="fill: white; cursor: pointer" + style="cursor: pointer; fill: var(--sbb-header-lean-background-color);" (click)="switchSectionViewToogleLock($event, 'travelTime')" > @@ -151,14 +152,14 @@ y="1" width="12" height="22" - style="fill: white; cursor: pointer" + style="cursor: pointer; fill: var(--sbb-header-lean-background-color);" (click)="switchSectionViewToogleLock($event, 'rightDepatureTime')" > @@ -581,7 +582,7 @@ tabindex="-1" mode="icon" (click)="onPropagateTimeLeft($event)" - title="Zeiten nach oben propagieren" + [title]="'app.perlenkette.perlenkette-section.propagate-times-upwards' | translate" >
-
+
- + - +
@@ -94,7 +94,10 @@ (click)="goto(pathItem)" >{{ pathItem.getPerlenketteNode().shortName }} -

+ + + +
@@ -126,6 +129,10 @@ [isBottomNode]="idx === perlenketteTrainrun.pathItems.length-1" > +
+
+
+
diff --git a/src/app/perlenkette/perlenkette.component.scss b/src/app/perlenkette/perlenkette.component.scss index c7aa0a7f..3bb498ce 100644 --- a/src/app/perlenkette/perlenkette.component.scss +++ b/src/app/perlenkette/perlenkette.component.scss @@ -49,7 +49,6 @@ button.SimpleButton { position: relative; left: 5px; top: 5px; - background: none; border: none; color: black; float: right; @@ -61,26 +60,22 @@ button.SimpleButton.ZoomEqual { } button.SimpleButton:hover { - background: none; font-weight: bold; transform: scale(1.25); } button.SimpleButton:active { - background: whitesmoke; } button.SimpleButton:disabled { opacity: 0.5; transform: scale(1); - background: white; } span.station { cursor: pointer; font-size: 22px; - background: none; - border: 5px solid white; + border: 5px solid var(--sbb-color-background); font-weight: lighter; user-select: none; } @@ -89,7 +84,6 @@ span.arrow { cursor: default; pointer-events: none; font-size: 22px; - background: none; user-select: none; } @@ -97,23 +91,20 @@ span.trainname { cursor: default; pointer-events: none; font-size: 22px; - background: none; - border: 5px solid white; + border: 5px solid var(--sbb-color-background); user-select: none; } span.smallstation { cursor: pointer; font-size: 12px; - background: none; - border: 3px solid white; + border: 3px solid var(--sbb-color-background); white-space: pre-wrap; font-weight: lighter; user-select: none; } span.smallstation:active { - background: whitesmoke; } span.smallstation.closest { @@ -135,3 +126,8 @@ span.smallstation:hover { color: var(--COLOR_Edit); stroke: var(--COLOR_Edit); } + +.ToggleAllEyesButton:hover { + stroke: var(--COLOR_Edit); + stroke-width: .5px; +} diff --git a/src/app/perlenkette/perlenkette.component.ts b/src/app/perlenkette/perlenkette.component.ts index 7e0f0bcd..c3687e8b 100644 --- a/src/app/perlenkette/perlenkette.component.ts +++ b/src/app/perlenkette/perlenkette.component.ts @@ -21,6 +21,7 @@ import {EditorMode} from "../view/editor-menu/editor-mode"; import {NodeService} from "../services/data/node.service"; import {takeUntil} from "rxjs/operators"; import {PerlenketteConnection} from "./model/perlenketteConnection"; +import {VersionControlService} from "../services/data/version-control.service"; @Component({ selector: "sbb-perlenkette", @@ -53,6 +54,7 @@ export class PerlenketteComponent implements AfterContentChecked, OnDestroy { readonly filterService: FilterService, private readonly uiInteractionService: UiInteractionService, private readonly nodeService: NodeService, + private versionControlService: VersionControlService, private changeDetectorRef: ChangeDetectorRef, ) { this.selectedPerlenketteConnection = undefined; @@ -213,6 +215,15 @@ export class PerlenketteComponent implements AfterContentChecked, OnDestroy { this.signalAllChildrenIsBeingEditedSubject.next(event); } + doSplitTrainrun(pathItems: PerlenketteItem[], idx: number): boolean { + if (idx >= pathItems.length - 1) { + return false; + } + const item = pathItems[idx]; + const previousItem = pathItems[idx + 1]; + return item.isPerlenketteNode() === previousItem.isPerlenketteNode(); + } + signalHeightChanged(height: number, pathItem: PerlenketteItem) { this.perlenketteRenderingElementsHeight.push([pathItem, height]); this.renderedElementsHeight = 0; @@ -223,12 +234,49 @@ export class PerlenketteComponent implements AfterContentChecked, OnDestroy { }); } + isFirstSection(item: PerlenketteItem): boolean { + if (item.isPerlenketteSection()) { + const psi = item.getPerlenketteSection(); + return psi.isFristTrainrunPartSection(); + } + return false; + } + + isLastSection(item: PerlenketteItem): boolean { + if (item.isPerlenketteSection()) { + const psi = item.getPerlenketteSection(); + return psi.isLastTrainrunPartSection(); + } + return false; + } + + isLastNode(item: PerlenketteItem): boolean { + if (item.isPerlenketteNode()) { + const pni = item.getPerlenketteNode(); + return pni.isLastTrainrunPartNode(); + } + return false; + } + + isLastNodeButNotVeryLast(item: PerlenketteItem) { + if (this.perlenketteTrainrun.pathItems.indexOf(item) === this.perlenketteTrainrun.pathItems.length - 1) { + return false; + } + return this.isLastNode(item); + } + getSignalAllChildrenIsBeingEditedObservable() { return this.signalAllChildrenIsBeingEditedSubject.asObservable(); } + getVariantIsWritable(): boolean { + return this.versionControlService.getVariantIsWritable(); + } + disableSectionView() { - this.signalIsBeingEdited(undefined); + if (!this.getVariantIsWritable()) { + this.signalIsBeingEdited(undefined); + } } scrollFirst(event: MouseEvent) { diff --git a/src/app/perlenkette/service/load-perlenkette.service.ts b/src/app/perlenkette/service/load-perlenkette.service.ts index 78a62689..e07dd9e2 100644 --- a/src/app/perlenkette/service/load-perlenkette.service.ts +++ b/src/app/perlenkette/service/load-perlenkette.service.ts @@ -15,6 +15,7 @@ import {Node} from "../../models/node.model"; import {TrainrunSectionService} from "../../services/data/trainrunsection.service"; import {NodeService} from "../../services/data/node.service"; import {FilterService} from "../../services/ui/filter.service"; +import {TrainrunSection} from "../../models/trainrunsection.model"; @Injectable({ providedIn: "root", @@ -114,62 +115,103 @@ export class LoadPerlenketteService implements OnDestroy { private getPerlenketteItem(trainrun: Trainrun): PerlenketteItem[] { const perlenketteItem: PerlenketteItem[] = []; - const bothEndNodes = this.trainrunService.getBothEndNodesWithTrainrunId( - trainrun.getId(), - ); - const startForwardNode = GeneralViewFunctions.getLeftOrTopNode( - bothEndNodes.endNode1, - bothEndNodes.endNode2, - ); - if (startForwardNode) { - const startTrainrunSection = startForwardNode.getStartTrainrunSection( - trainrun.getId(), - ); - if (startTrainrunSection === undefined) { - return perlenketteItem; - } - // Start Node - perlenketteItem.push( - new PerlenketteNode( - startForwardNode.getId(), - startForwardNode.getBetriebspunktName(), - startForwardNode.getFullName(), - startForwardNode.getConnectionTime(), - this.getPerlenketteConnections(trainrun, startForwardNode), - startForwardNode.getTransition(startTrainrunSection.getId()), - ), - ); - let lastNode = startForwardNode; - const iterator: TrainrunIterator = this.trainrunService.getIterator( - startForwardNode, - startTrainrunSection, - ); - while (iterator.hasNext()) { - const currentTrainrunSectionNodePair = iterator.next(); - const trainrunSection = currentTrainrunSectionNodePair.trainrunSection; - const node = currentTrainrunSectionNodePair.node; - // Section X - perlenketteItem.push( - new PerlenketteSection( - trainrunSection.getId(), - trainrunSection.getTravelTime(), - lastNode, - node, - trainrunSection.getNumberOfStops(), - ), + + let alltrainrunsections = + this.trainrunSectionService + .getAllTrainrunSectionsForTrainrun(trainrun.getId()); + + while (alltrainrunsections.length > 0) { + // traverse over all trainrun parts + const trainrunSection = alltrainrunsections[0]; + const bothEndNodes = + this.trainrunService.getBothEndNodesFromTrainrunPart(trainrunSection); + /*const startForwardNode = GeneralViewFunctions.getLeftOrTopNode( + bothEndNodes.endNode1, + bothEndNodes.endNode2, + );*/ + const startForwardNode = bothEndNodes.endNode2; + + if (startForwardNode) { + const startTrainrunSection = startForwardNode.getStartTrainrunSection( + trainrun.getId(), ); - // Node X + if (startTrainrunSection === undefined) { + return perlenketteItem; + } + // Start Node perlenketteItem.push( new PerlenketteNode( - node.getId(), - node.getBetriebspunktName(), - node.getFullName(), - node.getConnectionTime(), - this.getPerlenketteConnections(trainrun, node), - node.getTransition(trainrunSection.getId()), + startForwardNode.getId(), + startForwardNode.getBetriebspunktName(), + startForwardNode.getFullName(), + startForwardNode.getConnectionTime(), + this.getPerlenketteConnections(trainrun, startForwardNode), + startForwardNode.getTransition(startTrainrunSection.getId()), + true, + false, ), ); - lastNode = node; + let lastNode = startForwardNode; + const iterator: TrainrunIterator = this.trainrunService.getIterator( + startForwardNode, + startTrainrunSection, + ); + + let firstSection = true; + while (iterator.hasNext()) { + const currentTrainrunSectionNodePair = iterator.next(); + const trainrunSection = currentTrainrunSectionNodePair.trainrunSection; + const node = currentTrainrunSectionNodePair.node; + // Section X + perlenketteItem.push( + new PerlenketteSection( + trainrunSection.getId(), + trainrunSection.getTravelTime(), + lastNode, + node, + trainrunSection.getNumberOfStops(), + false, + firstSection, + false + ), + ); + firstSection = false; + + // Node X + perlenketteItem.push( + new PerlenketteNode( + node.getId(), + node.getBetriebspunktName(), + node.getFullName(), + node.getConnectionTime(), + this.getPerlenketteConnections(trainrun, node), + node.getTransition(trainrunSection.getId()), + false, + false + ), + ); + lastNode = node; + + // filter all still visited trainrun sections + alltrainrunsections = alltrainrunsections.filter(ts => + ts.getId() !== currentTrainrunSectionNodePair.trainrunSection.getId() + ); + } + + if (perlenketteItem.length > 1) { + const itemSec = perlenketteItem[perlenketteItem.length - 2]; + if (itemSec.isPerlenketteSection()) { + const pn = itemSec.getPerlenketteSection(); + pn.setLastTrainrunPartSection(true); + } + const itemNode = perlenketteItem[perlenketteItem.length - 1]; + if (itemNode.isPerlenketteNode()) { + const pn = itemNode.getPerlenketteNode(); + pn.setLastTrainrunPartNode(true); + } + } + + } } return perlenketteItem; diff --git a/src/app/sample-netzgrafik/Demo_LZ_netzgrafik.json b/src/app/sample-netzgrafik/Demo_LZ_netzgrafik.json new file mode 100644 index 00000000..033b10f7 --- /dev/null +++ b/src/app/sample-netzgrafik/Demo_LZ_netzgrafik.json @@ -0,0 +1 @@ +{"nodes":[{"id":133,"betriebspunktName":"MADI","fullName":"Madiswil ","positionX":192,"positionY":864,"ports":[{"id":597,"trainrunSectionId":281,"positionIndex":0,"positionAlignment":0},{"id":593,"trainrunSectionId":279,"positionIndex":1,"positionAlignment":0},{"id":596,"trainrunSectionId":280,"positionIndex":0,"positionAlignment":1},{"id":592,"trainrunSectionId":278,"positionIndex":1,"positionAlignment":1}],"transitions":[{"id":183,"port1Id":593,"port2Id":592,"isNonStopTransit":false},{"id":185,"port1Id":597,"port2Id":596,"isNonStopTransit":false}],"connections":[],"resourceId":162,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":134,"betriebspunktName":"WSAU","fullName":"Willisau","positionX":544,"positionY":1952,"ports":[{"id":522,"trainrunSectionId":243,"positionIndex":0,"positionAlignment":1},{"id":527,"trainrunSectionId":246,"positionIndex":1,"positionAlignment":1},{"id":524,"trainrunSectionId":244,"positionIndex":2,"positionAlignment":1},{"id":518,"trainrunSectionId":241,"positionIndex":0,"positionAlignment":2},{"id":515,"trainrunSectionId":240,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":150,"port1Id":522,"port2Id":518,"isNonStopTransit":false},{"id":151,"port1Id":527,"port2Id":515,"isNonStopTransit":false}],"connections":[],"resourceId":163,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":135,"betriebspunktName":"ZG","fullName":"Zug","positionX":1888,"positionY":1984,"ports":[{"id":507,"trainrunSectionId":236,"positionIndex":0,"positionAlignment":0},{"id":509,"trainrunSectionId":237,"positionIndex":1,"positionAlignment":0},{"id":582,"trainrunSectionId":273,"positionIndex":0,"positionAlignment":1},{"id":578,"trainrunSectionId":271,"positionIndex":1,"positionAlignment":1}],"transitions":[{"id":174,"port1Id":509,"port2Id":578,"isNonStopTransit":false},{"id":177,"port1Id":507,"port2Id":582,"isNonStopTransit":false}],"connections":[],"resourceId":164,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":136,"betriebspunktName":"BAA","fullName":"Baar","positionX":1920,"positionY":1632,"ports":[{"id":505,"trainrunSectionId":235,"positionIndex":0,"positionAlignment":0},{"id":508,"trainrunSectionId":236,"positionIndex":0,"positionAlignment":1},{"id":510,"trainrunSectionId":237,"positionIndex":1,"positionAlignment":1}],"transitions":[{"id":147,"port1Id":505,"port2Id":508,"isNonStopTransit":true}],"connections":[],"resourceId":165,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":137,"betriebspunktName":"LZ","fullName":"Luzern","positionX":1152,"positionY":2272,"ports":[{"id":542,"trainrunSectionId":253,"positionIndex":0,"positionAlignment":0},{"id":540,"trainrunSectionId":252,"positionIndex":1,"positionAlignment":0},{"id":538,"trainrunSectionId":251,"positionIndex":2,"positionAlignment":0},{"id":536,"trainrunSectionId":250,"positionIndex":3,"positionAlignment":0},{"id":532,"trainrunSectionId":248,"positionIndex":0,"positionAlignment":2},{"id":530,"trainrunSectionId":247,"positionIndex":1,"positionAlignment":2},{"id":544,"trainrunSectionId":254,"positionIndex":0,"positionAlignment":3},{"id":548,"trainrunSectionId":256,"positionIndex":1,"positionAlignment":3},{"id":550,"trainrunSectionId":257,"positionIndex":2,"positionAlignment":3},{"id":546,"trainrunSectionId":255,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":155,"port1Id":542,"port2Id":544,"isNonStopTransit":false},{"id":156,"port1Id":536,"port2Id":550,"isNonStopTransit":false}],"connections":[],"resourceId":166,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":138,"betriebspunktName":"WH","fullName":"Wolhusen","positionX":576,"positionY":2272,"ports":[{"id":521,"trainrunSectionId":243,"positionIndex":0,"positionAlignment":0},{"id":528,"trainrunSectionId":246,"positionIndex":1,"positionAlignment":0},{"id":523,"trainrunSectionId":244,"positionIndex":2,"positionAlignment":0},{"id":525,"trainrunSectionId":245,"positionIndex":0,"positionAlignment":2},{"id":520,"trainrunSectionId":242,"positionIndex":1,"positionAlignment":2},{"id":531,"trainrunSectionId":248,"positionIndex":0,"positionAlignment":3},{"id":529,"trainrunSectionId":247,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":149,"port1Id":521,"port2Id":520,"isNonStopTransit":false},{"id":152,"port1Id":523,"port2Id":529,"isNonStopTransit":false},{"id":153,"port1Id":525,"port2Id":531,"isNonStopTransit":false}],"connections":[],"resourceId":167,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":139,"betriebspunktName":"LABE","fullName":"Langnau i.E.","positionX":32,"positionY":2272,"ports":[{"id":526,"trainrunSectionId":245,"positionIndex":0,"positionAlignment":3},{"id":519,"trainrunSectionId":242,"positionIndex":1,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":168,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":140,"betriebspunktName":"RK","fullName":"Rotkreuz ","positionX":1504,"positionY":2272,"ports":[{"id":543,"trainrunSectionId":254,"positionIndex":0,"positionAlignment":2},{"id":547,"trainrunSectionId":256,"positionIndex":1,"positionAlignment":2},{"id":549,"trainrunSectionId":257,"positionIndex":2,"positionAlignment":2},{"id":545,"trainrunSectionId":255,"positionIndex":3,"positionAlignment":2},{"id":579,"trainrunSectionId":272,"positionIndex":0,"positionAlignment":3},{"id":575,"trainrunSectionId":270,"positionIndex":1,"positionAlignment":3},{"id":587,"trainrunSectionId":276,"positionIndex":2,"positionAlignment":3},{"id":583,"trainrunSectionId":274,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":172,"port1Id":549,"port2Id":575,"isNonStopTransit":false},{"id":175,"port1Id":547,"port2Id":579,"isNonStopTransit":true},{"id":178,"port1Id":545,"port2Id":583,"isNonStopTransit":false},{"id":180,"port1Id":543,"port2Id":587,"isNonStopTransit":true}],"connections":[],"resourceId":169,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":141,"betriebspunktName":"ZF","fullName":"Zofingen","positionX":992,"positionY":672,"ports":[{"id":472,"trainrunSectionId":218,"positionIndex":0,"positionAlignment":0},{"id":511,"trainrunSectionId":238,"positionIndex":1,"positionAlignment":0},{"id":473,"trainrunSectionId":219,"positionIndex":2,"positionAlignment":0},{"id":477,"trainrunSectionId":221,"positionIndex":0,"positionAlignment":1},{"id":691,"trainrunSectionId":415,"positionIndex":1,"positionAlignment":1},{"id":513,"trainrunSectionId":239,"positionIndex":2,"positionAlignment":1},{"id":534,"trainrunSectionId":249,"positionIndex":3,"positionAlignment":1},{"id":479,"trainrunSectionId":222,"positionIndex":0,"positionAlignment":2}],"transitions":[{"id":137,"port1Id":472,"port2Id":477,"isNonStopTransit":true},{"id":148,"port1Id":511,"port2Id":513,"isNonStopTransit":false},{"id":154,"port1Id":473,"port2Id":534,"isNonStopTransit":false},{"id":188,"port1Id":691,"port2Id":479,"isNonStopTransit":false}],"connections":[],"resourceId":170,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":142,"betriebspunktName":"LTH","fullName":"Langenthal","positionX":192,"positionY":352,"ports":[{"id":598,"trainrunSectionId":281,"positionIndex":0,"positionAlignment":1},{"id":594,"trainrunSectionId":279,"positionIndex":1,"positionAlignment":1},{"id":503,"trainrunSectionId":234,"positionIndex":0,"positionAlignment":2},{"id":491,"trainrunSectionId":228,"positionIndex":1,"positionAlignment":2},{"id":501,"trainrunSectionId":233,"positionIndex":0,"positionAlignment":3},{"id":499,"trainrunSectionId":232,"positionIndex":1,"positionAlignment":3},{"id":601,"trainrunSectionId":283,"positionIndex":2,"positionAlignment":3},{"id":599,"trainrunSectionId":282,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":144,"port1Id":491,"port2Id":499,"isNonStopTransit":false},{"id":146,"port1Id":503,"port2Id":501,"isNonStopTransit":false},{"id":186,"port1Id":594,"port2Id":599,"isNonStopTransit":false},{"id":187,"port1Id":598,"port2Id":601,"isNonStopTransit":false}],"connections":[],"resourceId":171,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":143,"betriebspunktName":"RTR","fullName":"Rothrist","positionX":192,"positionY":160,"ports":[{"id":497,"trainrunSectionId":231,"positionIndex":0,"positionAlignment":2},{"id":487,"trainrunSectionId":226,"positionIndex":1,"positionAlignment":2},{"id":481,"trainrunSectionId":223,"positionIndex":2,"positionAlignment":2},{"id":496,"trainrunSectionId":230,"positionIndex":0,"positionAlignment":3},{"id":486,"trainrunSectionId":225,"positionIndex":1,"positionAlignment":3},{"id":480,"trainrunSectionId":222,"positionIndex":2,"positionAlignment":3}],"transitions":[{"id":139,"port1Id":481,"port2Id":480,"isNonStopTransit":true},{"id":141,"port1Id":487,"port2Id":486,"isNonStopTransit":true},{"id":143,"port1Id":497,"port2Id":496,"isNonStopTransit":true}],"connections":[],"resourceId":172,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":144,"betriebspunktName":"BN","fullName":"Bern","positionX":-672,"positionY":160,"ports":[{"id":498,"trainrunSectionId":231,"positionIndex":0,"positionAlignment":3},{"id":488,"trainrunSectionId":226,"positionIndex":1,"positionAlignment":3},{"id":482,"trainrunSectionId":223,"positionIndex":2,"positionAlignment":3},{"id":504,"trainrunSectionId":234,"positionIndex":3,"positionAlignment":3},{"id":492,"trainrunSectionId":228,"positionIndex":4,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":173,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":145,"betriebspunktName":"ZUE","fullName":"Zuerich","positionX":1920,"positionY":160,"ports":[{"id":506,"trainrunSectionId":235,"positionIndex":0,"positionAlignment":1},{"id":493,"trainrunSectionId":229,"positionIndex":0,"positionAlignment":2},{"id":484,"trainrunSectionId":224,"positionIndex":1,"positionAlignment":2},{"id":489,"trainrunSectionId":227,"positionIndex":2,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":174,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":146,"betriebspunktName":"CHAM","fullName":"Cham","positionX":1888,"positionY":2208,"ports":[{"id":581,"trainrunSectionId":273,"positionIndex":0,"positionAlignment":0},{"id":577,"trainrunSectionId":271,"positionIndex":1,"positionAlignment":0},{"id":580,"trainrunSectionId":272,"positionIndex":0,"positionAlignment":2},{"id":576,"trainrunSectionId":270,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":173,"port1Id":577,"port2Id":576,"isNonStopTransit":false},{"id":176,"port1Id":581,"port2Id":580,"isNonStopTransit":true}],"connections":[],"resourceId":175,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":147,"betriebspunktName":"IM","fullName":"Immensee","positionX":1888,"positionY":2336,"ports":[{"id":588,"trainrunSectionId":276,"positionIndex":0,"positionAlignment":2},{"id":584,"trainrunSectionId":274,"positionIndex":1,"positionAlignment":2},{"id":589,"trainrunSectionId":277,"positionIndex":0,"positionAlignment":3},{"id":585,"trainrunSectionId":275,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":179,"port1Id":584,"port2Id":585,"isNonStopTransit":false},{"id":181,"port1Id":588,"port2Id":589,"isNonStopTransit":false}],"connections":[],"resourceId":176,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":148,"betriebspunktName":"HWIL","fullName":"Huttwil","positionX":192,"positionY":1920,"ports":[{"id":595,"trainrunSectionId":280,"positionIndex":0,"positionAlignment":0},{"id":591,"trainrunSectionId":278,"positionIndex":1,"positionAlignment":0},{"id":517,"trainrunSectionId":241,"positionIndex":0,"positionAlignment":3},{"id":516,"trainrunSectionId":240,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":182,"port1Id":591,"port2Id":516,"isNonStopTransit":false},{"id":184,"port1Id":595,"port2Id":517,"isNonStopTransit":false}],"connections":[],"resourceId":177,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":149,"betriebspunktName":"EBR","fullName":"Emmenbrücke ","positionX":1088,"positionY":1984,"ports":[{"id":571,"trainrunSectionId":268,"positionIndex":0,"positionAlignment":0},{"id":567,"trainrunSectionId":266,"positionIndex":1,"positionAlignment":0},{"id":563,"trainrunSectionId":264,"positionIndex":2,"positionAlignment":0},{"id":559,"trainrunSectionId":262,"positionIndex":3,"positionAlignment":0},{"id":541,"trainrunSectionId":253,"positionIndex":0,"positionAlignment":1},{"id":539,"trainrunSectionId":252,"positionIndex":1,"positionAlignment":1},{"id":537,"trainrunSectionId":251,"positionIndex":2,"positionAlignment":1},{"id":535,"trainrunSectionId":250,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":161,"port1Id":559,"port2Id":535,"isNonStopTransit":false},{"id":163,"port1Id":563,"port2Id":537,"isNonStopTransit":false},{"id":166,"port1Id":567,"port2Id":539,"isNonStopTransit":true},{"id":169,"port1Id":571,"port2Id":541,"isNonStopTransit":true}],"connections":[],"resourceId":178,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":150,"betriebspunktName":"GEAP","fullName":"Genf Flughafen","positionX":-864,"positionY":192,"ports":[],"transitions":[],"connections":[],"resourceId":179,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":151,"betriebspunktName":"IO","fullName":"Interlaken Ost","positionX":-800,"positionY":416,"ports":[],"transitions":[],"connections":[],"resourceId":180,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":152,"betriebspunktName":"BI","fullName":"Biel","positionX":-512,"positionY":64,"ports":[],"transitions":[],"connections":[],"resourceId":181,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":153,"betriebspunktName":"SG","fullName":"St. Gallen","positionX":2752,"positionY":256,"ports":[],"transitions":[],"connections":[],"resourceId":182,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":154,"betriebspunktName":"GD","fullName":"Goldau","positionX":2368,"positionY":2336,"ports":[{"id":603,"trainrunSectionId":284,"positionIndex":0,"positionAlignment":1},{"id":590,"trainrunSectionId":277,"positionIndex":0,"positionAlignment":2},{"id":586,"trainrunSectionId":275,"positionIndex":1,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":183,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":155,"betriebspunktName":"Milano","fullName":"Neuer Knoten","positionX":2528,"positionY":2560,"ports":[{"id":604,"trainrunSectionId":284,"positionIndex":0,"positionAlignment":0}],"transitions":[],"connections":[],"resourceId":184,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":156,"betriebspunktName":"CH","fullName":"Chur","positionX":2816,"positionY":2016,"ports":[],"transitions":[],"connections":[],"resourceId":185,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":157,"betriebspunktName":"OL","fullName":"Olten","positionX":992,"positionY":160,"ports":[{"id":471,"trainrunSectionId":218,"positionIndex":0,"positionAlignment":1},{"id":512,"trainrunSectionId":238,"positionIndex":1,"positionAlignment":1},{"id":474,"trainrunSectionId":219,"positionIndex":2,"positionAlignment":1},{"id":495,"trainrunSectionId":230,"positionIndex":0,"positionAlignment":2},{"id":485,"trainrunSectionId":225,"positionIndex":1,"positionAlignment":2},{"id":502,"trainrunSectionId":233,"positionIndex":2,"positionAlignment":2},{"id":500,"trainrunSectionId":232,"positionIndex":3,"positionAlignment":2},{"id":602,"trainrunSectionId":283,"positionIndex":4,"positionAlignment":2},{"id":600,"trainrunSectionId":282,"positionIndex":5,"positionAlignment":2},{"id":494,"trainrunSectionId":229,"positionIndex":0,"positionAlignment":3},{"id":483,"trainrunSectionId":224,"positionIndex":1,"positionAlignment":3},{"id":490,"trainrunSectionId":227,"positionIndex":2,"positionAlignment":3}],"transitions":[{"id":140,"port1Id":485,"port2Id":483,"isNonStopTransit":false},{"id":142,"port1Id":495,"port2Id":494,"isNonStopTransit":false},{"id":145,"port1Id":500,"port2Id":490,"isNonStopTransit":false}],"connections":[],"resourceId":186,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":158,"betriebspunktName":"BS","fullName":"Basel","positionX":992,"positionY":-64,"ports":[],"transitions":[],"connections":[],"resourceId":187,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":159,"betriebspunktName":"REID","fullName":"Reiden","positionX":992,"positionY":992,"ports":[{"id":478,"trainrunSectionId":221,"positionIndex":0,"positionAlignment":0},{"id":692,"trainrunSectionId":415,"positionIndex":1,"positionAlignment":0},{"id":514,"trainrunSectionId":239,"positionIndex":2,"positionAlignment":0},{"id":533,"trainrunSectionId":249,"positionIndex":3,"positionAlignment":0},{"id":551,"trainrunSectionId":258,"positionIndex":0,"positionAlignment":1},{"id":553,"trainrunSectionId":259,"positionIndex":1,"positionAlignment":1},{"id":555,"trainrunSectionId":260,"positionIndex":2,"positionAlignment":1},{"id":557,"trainrunSectionId":261,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":157,"port1Id":551,"port2Id":478,"isNonStopTransit":true},{"id":159,"port1Id":555,"port2Id":514,"isNonStopTransit":false},{"id":160,"port1Id":557,"port2Id":533,"isNonStopTransit":false},{"id":189,"port1Id":692,"port2Id":553,"isNonStopTransit":false}],"connections":[],"resourceId":188,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":160,"betriebspunktName":"SEM","fullName":"Sempach-Neuenkirch","positionX":1088,"positionY":1696,"ports":[{"id":573,"trainrunSectionId":269,"positionIndex":0,"positionAlignment":0},{"id":569,"trainrunSectionId":267,"positionIndex":1,"positionAlignment":0},{"id":565,"trainrunSectionId":265,"positionIndex":2,"positionAlignment":0},{"id":561,"trainrunSectionId":263,"positionIndex":3,"positionAlignment":0},{"id":572,"trainrunSectionId":268,"positionIndex":0,"positionAlignment":1},{"id":568,"trainrunSectionId":266,"positionIndex":1,"positionAlignment":1},{"id":564,"trainrunSectionId":264,"positionIndex":2,"positionAlignment":1},{"id":560,"trainrunSectionId":262,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":162,"port1Id":560,"port2Id":561,"isNonStopTransit":false},{"id":164,"port1Id":564,"port2Id":565,"isNonStopTransit":false},{"id":167,"port1Id":568,"port2Id":569,"isNonStopTransit":true},{"id":170,"port1Id":572,"port2Id":573,"isNonStopTransit":true}],"connections":[],"resourceId":189,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":161,"betriebspunktName":"SS","fullName":"Sursee","positionX":992,"positionY":1312,"ports":[{"id":552,"trainrunSectionId":258,"positionIndex":0,"positionAlignment":0},{"id":554,"trainrunSectionId":259,"positionIndex":1,"positionAlignment":0},{"id":556,"trainrunSectionId":260,"positionIndex":2,"positionAlignment":0},{"id":558,"trainrunSectionId":261,"positionIndex":3,"positionAlignment":0},{"id":574,"trainrunSectionId":269,"positionIndex":0,"positionAlignment":1},{"id":570,"trainrunSectionId":267,"positionIndex":1,"positionAlignment":1},{"id":566,"trainrunSectionId":265,"positionIndex":2,"positionAlignment":1},{"id":562,"trainrunSectionId":263,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":165,"port1Id":556,"port2Id":566,"isNonStopTransit":false},{"id":168,"port1Id":554,"port2Id":570,"isNonStopTransit":false},{"id":171,"port1Id":552,"port2Id":574,"isNonStopTransit":true}],"connections":[{"id":11,"port1Id":558,"port2Id":566},{"id":12,"port1Id":562,"port2Id":556},{"id":13,"port1Id":554,"port2Id":566}],"resourceId":190,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]}],"trainrunSections":[{"id":218,"sourceNodeId":157,"sourcePortId":471,"targetNodeId":141,"targetPortId":472,"travelTime":{"lock":false,"time":30,"warning":null},"sourceDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"sourceArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":314},"targetDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":284},"targetArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":76},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1008,"y":382},{"x":1008,"y":446},{"x":1008,"y":606},{"x":1008,"y":670}],"textPositions":{"0":{"x":996,"y":400},"1":{"x":1020,"y":428},"2":{"x":1020,"y":652},"3":{"x":996,"y":624},"4":{"x":996,"y":526},"5":{"x":996,"y":526},"6":{"x":1020,"y":526}}},"warnings":null},{"id":219,"sourceNodeId":141,"sourcePortId":473,"targetNodeId":157,"targetPortId":474,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1072,"y":670},{"x":1072,"y":606},{"x":1072,"y":446},{"x":1072,"y":382}],"textPositions":{"0":{"x":1084,"y":652},"1":{"x":1060,"y":624},"2":{"x":1060,"y":400},"3":{"x":1084,"y":428},"4":{"x":1060,"y":526},"5":{"x":1060,"y":526},"6":{"x":1084,"y":526}}},"warnings":null},{"id":221,"sourceNodeId":141,"sourcePortId":477,"targetNodeId":159,"targetPortId":478,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":16,"warning":null,"consecutiveTime":76},"sourceArrival":{"lock":false,"time":44,"warning":null,"consecutiveTime":284},"targetDeparture":{"lock":false,"time":34,"warning":null,"consecutiveTime":274},"targetArrival":{"lock":false,"time":26,"warning":null,"consecutiveTime":86},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1008,"y":738},{"x":1008,"y":802},{"x":1008,"y":926},{"x":1008,"y":990}],"textPositions":{"0":{"x":996,"y":756},"1":{"x":1020,"y":784},"2":{"x":1020,"y":972},"3":{"x":996,"y":944},"4":{"x":996,"y":864},"5":{"x":996,"y":864},"6":{"x":1020,"y":864}}},"warnings":null},{"id":222,"sourceNodeId":141,"sourcePortId":479,"targetNodeId":143,"targetPortId":480,"travelTime":{"lock":false,"time":6,"warning":null},"sourceDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":153},"sourceArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":27},"targetDeparture":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"targetArrival":{"lock":false,"time":39,"warning":null,"consecutiveTime":159},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":990,"y":688},{"x":926,"y":688},{"x":354,"y":240},{"x":290,"y":240}],"textPositions":{"0":{"x":972,"y":676},"1":{"x":944,"y":700},"2":{"x":308,"y":252},"3":{"x":336,"y":228},"4":{"x":640,"y":452},"5":{"x":640,"y":452},"6":{"x":640,"y":476}}},"warnings":null},{"id":223,"sourceNodeId":143,"sourcePortId":481,"targetNodeId":144,"targetPortId":482,"travelTime":{"lock":false,"time":21,"warning":null},"sourceDeparture":{"lock":false,"time":39,"warning":null,"consecutiveTime":159},"sourceArrival":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"targetDeparture":{"lock":true,"time":0,"warning":null,"consecutiveTime":0},"targetArrival":{"lock":true,"time":0,"warning":null,"consecutiveTime":180},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":190,"y":240},{"x":126,"y":240},{"x":-510,"y":240},{"x":-574,"y":240}],"textPositions":{"0":{"x":172,"y":228},"1":{"x":144,"y":252},"2":{"x":-556,"y":252},"3":{"x":-528,"y":228},"4":{"x":-192,"y":228},"5":{"x":-192,"y":228},"6":{"x":-192,"y":252}}},"warnings":null},{"id":224,"sourceNodeId":157,"sourcePortId":483,"targetNodeId":145,"targetPortId":484,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":91},"sourceArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":89},"targetDeparture":{"lock":false,"time":19,"warning":null,"consecutiveTime":79},"targetArrival":{"lock":false,"time":41,"warning":null,"consecutiveTime":101},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1090,"y":208},{"x":1154,"y":208},{"x":1854,"y":208},{"x":1918,"y":208}],"textPositions":{"0":{"x":1108,"y":220},"1":{"x":1136,"y":196},"2":{"x":1900,"y":196},"3":{"x":1872,"y":220},"4":{"x":1504,"y":196},"5":{"x":1504,"y":196},"6":{"x":1504,"y":220}}},"warnings":null},{"id":225,"sourceNodeId":157,"sourcePortId":485,"targetNodeId":143,"targetPortId":486,"travelTime":{"lock":false,"time":20,"warning":null},"sourceDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":91},"sourceArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":89},"targetDeparture":{"lock":false,"time":9,"warning":null,"consecutiveTime":69},"targetArrival":{"lock":false,"time":51,"warning":null,"consecutiveTime":111},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":990,"y":208},{"x":926,"y":208},{"x":354,"y":208},{"x":290,"y":208}],"textPositions":{"0":{"x":972,"y":196},"1":{"x":944,"y":220},"2":{"x":308,"y":220},"3":{"x":336,"y":196},"4":{"x":640,"y":196},"5":{"x":640,"y":196},"6":{"x":640,"y":220}}},"warnings":null},{"id":226,"sourceNodeId":143,"sourcePortId":487,"targetNodeId":144,"targetPortId":488,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":51,"warning":null,"consecutiveTime":111},"sourceArrival":{"lock":false,"time":9,"warning":null,"consecutiveTime":69},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":59},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":121},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":190,"y":208},{"x":126,"y":208},{"x":-510,"y":208},{"x":-574,"y":208}],"textPositions":{"0":{"x":172,"y":196},"1":{"x":144,"y":220},"2":{"x":-556,"y":220},"3":{"x":-528,"y":196},"4":{"x":-192,"y":196},"5":{"x":-192,"y":196},"6":{"x":-192,"y":220}}},"warnings":null},{"id":227,"sourceNodeId":145,"sourcePortId":489,"targetNodeId":157,"targetPortId":490,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":152},"sourceArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":148},"targetDeparture":{"lock":false,"time":18,"warning":null,"consecutiveTime":138},"targetArrival":{"lock":false,"time":42,"warning":null,"consecutiveTime":162},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1918,"y":240},{"x":1854,"y":240},{"x":1154,"y":240},{"x":1090,"y":240}],"textPositions":{"0":{"x":1900,"y":228},"1":{"x":1872,"y":252},"2":{"x":1108,"y":252},"3":{"x":1136,"y":228},"4":{"x":1504,"y":228},"5":{"x":1504,"y":228},"6":{"x":1504,"y":252}}},"warnings":null},{"id":228,"sourceNodeId":142,"sourcePortId":491,"targetNodeId":144,"targetPortId":492,"travelTime":{"lock":false,"time":78,"warning":null},"sourceDeparture":{"lock":false,"time":56,"warning":null,"consecutiveTime":176},"sourceArrival":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"targetDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"targetArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":254},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":190,"y":400},{"x":126,"y":400},{"x":-510,"y":304},{"x":-574,"y":304}],"textPositions":{"0":{"x":172,"y":388},"1":{"x":144,"y":412},"2":{"x":-556,"y":316},"3":{"x":-528,"y":292},"4":{"x":-192,"y":340},"5":{"x":-192,"y":340},"6":{"x":-192,"y":364}}},"warnings":null},{"id":229,"sourceNodeId":145,"sourcePortId":493,"targetNodeId":157,"targetPortId":494,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":19,"warning":null,"consecutiveTime":19},"sourceArrival":{"lock":false,"time":41,"warning":null,"consecutiveTime":41},"targetDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"targetArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1918,"y":176},{"x":1854,"y":176},{"x":1154,"y":176},{"x":1090,"y":176}],"textPositions":{"0":{"x":1900,"y":164},"1":{"x":1872,"y":188},"2":{"x":1108,"y":188},"3":{"x":1136,"y":164},"4":{"x":1504,"y":164},"5":{"x":1504,"y":164},"6":{"x":1504,"y":188}}},"warnings":null},{"id":230,"sourceNodeId":157,"sourcePortId":495,"targetNodeId":143,"targetPortId":496,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"sourceArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"targetDeparture":{"lock":false,"time":19,"warning":null,"consecutiveTime":19},"targetArrival":{"lock":false,"time":41,"warning":null,"consecutiveTime":41},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":990,"y":176},{"x":926,"y":176},{"x":354,"y":176},{"x":290,"y":176}],"textPositions":{"0":{"x":972,"y":164},"1":{"x":944,"y":188},"2":{"x":308,"y":188},"3":{"x":336,"y":164},"4":{"x":640,"y":164},"5":{"x":640,"y":164},"6":{"x":640,"y":188}}},"warnings":null},{"id":231,"sourceNodeId":143,"sourcePortId":497,"targetNodeId":144,"targetPortId":498,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":41,"warning":null,"consecutiveTime":41},"sourceArrival":{"lock":false,"time":19,"warning":null,"consecutiveTime":19},"targetDeparture":{"lock":false,"time":9,"warning":null,"consecutiveTime":9},"targetArrival":{"lock":false,"time":51,"warning":null,"consecutiveTime":51},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":190,"y":176},{"x":126,"y":176},{"x":-510,"y":176},{"x":-574,"y":176}],"textPositions":{"0":{"x":172,"y":164},"1":{"x":144,"y":188},"2":{"x":-556,"y":188},"3":{"x":-528,"y":164},"4":{"x":-192,"y":164},"5":{"x":-192,"y":164},"6":{"x":-192,"y":188}}},"warnings":null},{"id":232,"sourceNodeId":142,"sourcePortId":499,"targetNodeId":157,"targetPortId":500,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":6,"warning":null,"consecutiveTime":126},"sourceArrival":{"lock":false,"time":54,"warning":null,"consecutiveTime":174},"targetDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":164},"targetArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":136},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":290,"y":400},{"x":354,"y":400},{"x":926,"y":272},{"x":990,"y":272}],"textPositions":{"0":{"x":308,"y":412},"1":{"x":336,"y":388},"2":{"x":972,"y":260},"3":{"x":944,"y":284},"4":{"x":640,"y":324},"5":{"x":640,"y":324},"6":{"x":640,"y":348}}},"warnings":null},{"id":233,"sourceNodeId":142,"sourcePortId":501,"targetNodeId":157,"targetPortId":502,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":22,"warning":null,"consecutiveTime":22},"sourceArrival":{"lock":false,"time":38,"warning":null,"consecutiveTime":38},"targetDeparture":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"targetArrival":{"lock":false,"time":32,"warning":null,"consecutiveTime":32},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":290,"y":368},{"x":354,"y":368},{"x":926,"y":240},{"x":990,"y":240}],"textPositions":{"0":{"x":308,"y":380},"1":{"x":336,"y":356},"2":{"x":972,"y":228},"3":{"x":944,"y":252},"4":{"x":640,"y":292},"5":{"x":640,"y":292},"6":{"x":640,"y":316}}},"warnings":null},{"id":234,"sourceNodeId":142,"sourcePortId":503,"targetNodeId":144,"targetPortId":504,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":190,"y":368},{"x":126,"y":368},{"x":-510,"y":272},{"x":-574,"y":272}],"textPositions":{"0":{"x":172,"y":356},"1":{"x":144,"y":380},"2":{"x":-556,"y":284},"3":{"x":-528,"y":260},"4":{"x":-192,"y":308},"5":{"x":-192,"y":308},"6":{"x":-192,"y":332}}},"warnings":null},{"id":235,"sourceNodeId":136,"sourcePortId":505,"targetNodeId":145,"targetPortId":506,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":52,"warning":null,"consecutiveTime":112},"sourceArrival":{"lock":false,"time":8,"warning":null,"consecutiveTime":68},"targetDeparture":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"targetArrival":{"lock":false,"time":2,"warning":null,"consecutiveTime":122},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1936,"y":1630},{"x":1936,"y":1566},{"x":1936,"y":350},{"x":1936,"y":286}],"textPositions":{"0":{"x":1948,"y":1612},"1":{"x":1924,"y":1584},"2":{"x":1924,"y":304},"3":{"x":1948,"y":332},"4":{"x":1924,"y":958},"5":{"x":1924,"y":958},"6":{"x":1948,"y":958}}},"warnings":null},{"id":236,"sourceNodeId":135,"sourcePortId":507,"targetNodeId":136,"targetPortId":508,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":42,"warning":null,"consecutiveTime":102},"sourceArrival":{"lock":false,"time":18,"warning":null,"consecutiveTime":78},"targetDeparture":{"lock":false,"time":8,"warning":null,"consecutiveTime":68},"targetArrival":{"lock":false,"time":52,"warning":null,"consecutiveTime":112},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1904,"y":1982},{"x":1904,"y":1918},{"x":1936,"y":1762},{"x":1936,"y":1698}],"textPositions":{"0":{"x":1916,"y":1964},"1":{"x":1892,"y":1936},"2":{"x":1924,"y":1716},"3":{"x":1948,"y":1744},"4":{"x":1908,"y":1840},"5":{"x":1908,"y":1840},"6":{"x":1932,"y":1840}}},"warnings":null},{"id":237,"sourceNodeId":135,"sourcePortId":509,"targetNodeId":136,"targetPortId":510,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":23,"warning":null,"consecutiveTime":83},"sourceArrival":{"lock":false,"time":37,"warning":null,"consecutiveTime":97},"targetDeparture":{"lock":false,"time":27,"warning":null,"consecutiveTime":87},"targetArrival":{"lock":false,"time":33,"warning":null,"consecutiveTime":93},"numberOfStops":0,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1936,"y":1982},{"x":1936,"y":1918},{"x":1968,"y":1762},{"x":1968,"y":1698}],"textPositions":{"0":{"x":1948,"y":1964},"1":{"x":1924,"y":1936},"2":{"x":1956,"y":1716},"3":{"x":1980,"y":1744},"4":{"x":1940,"y":1840},"5":{"x":1940,"y":1840},"6":{"x":1964,"y":1840}}},"warnings":null},{"id":238,"sourceNodeId":141,"sourcePortId":511,"targetNodeId":157,"targetPortId":512,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":160},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":170},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1040,"y":670},{"x":1040,"y":606},{"x":1040,"y":446},{"x":1040,"y":382}],"textPositions":{"0":{"x":1052,"y":652},"1":{"x":1028,"y":624},"2":{"x":1028,"y":400},"3":{"x":1052,"y":428},"4":{"x":1028,"y":526},"5":{"x":1028,"y":526},"6":{"x":1052,"y":526}}},"warnings":null},{"id":239,"sourceNodeId":141,"sourcePortId":513,"targetNodeId":159,"targetPortId":514,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":21.5,"warning":null,"consecutiveTime":21.5},"sourceArrival":{"lock":false,"time":38.5,"warning":null,"consecutiveTime":158.5},"targetDeparture":{"lock":false,"time":28.5,"warning":null,"consecutiveTime":148.5},"targetArrival":{"lock":false,"time":31.5,"warning":null,"consecutiveTime":31.5},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1072,"y":738},{"x":1072,"y":802},{"x":1072,"y":926},{"x":1072,"y":990}],"textPositions":{"0":{"x":1060,"y":756},"1":{"x":1084,"y":784},"2":{"x":1084,"y":972},"3":{"x":1060,"y":944},"4":{"x":1060,"y":864},"5":{"x":1060,"y":864},"6":{"x":1084,"y":864}}},"warnings":null},{"id":240,"sourceNodeId":134,"sourcePortId":515,"targetNodeId":148,"targetPortId":516,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":93},"sourceArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":87},"targetDeparture":{"lock":false,"time":17,"warning":null,"consecutiveTime":77},"targetArrival":{"lock":false,"time":43,"warning":null,"consecutiveTime":103},"numberOfStops":3,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":542,"y":2000},{"x":478,"y":2000},{"x":354,"y":1968},{"x":290,"y":1968}],"textPositions":{"0":{"x":524,"y":1988},"1":{"x":496,"y":2012},"2":{"x":308,"y":1980},"3":{"x":336,"y":1956},"4":{"x":416,"y":1972},"5":{"x":416,"y":1972},"6":{"x":416,"y":1996}}},"warnings":null},{"id":241,"sourceNodeId":148,"sourcePortId":517,"targetNodeId":134,"targetPortId":518,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":37,"warning":null,"consecutiveTime":37},"sourceArrival":{"lock":false,"time":23,"warning":null,"consecutiveTime":143},"targetDeparture":{"lock":false,"time":13,"warning":null,"consecutiveTime":133},"targetArrival":{"lock":false,"time":47,"warning":null,"consecutiveTime":47},"numberOfStops":2,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":290,"y":1936},{"x":354,"y":1936},{"x":478,"y":1968},{"x":542,"y":1968}],"textPositions":{"0":{"x":308,"y":1948},"1":{"x":336,"y":1924},"2":{"x":524,"y":1956},"3":{"x":496,"y":1980},"4":{"x":416,"y":1940},"5":{"x":416,"y":1940},"6":{"x":416,"y":1964}}},"warnings":null},{"id":242,"sourceNodeId":139,"sourcePortId":519,"targetNodeId":138,"targetPortId":520,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":51,"warning":null,"consecutiveTime":111},"sourceArrival":{"lock":false,"time":9,"warning":null,"consecutiveTime":69},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":59},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":121},"numberOfStops":4,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":130,"y":2320},{"x":194,"y":2320},{"x":510,"y":2320},{"x":574,"y":2320}],"textPositions":{"0":{"x":148,"y":2332},"1":{"x":176,"y":2308},"2":{"x":556,"y":2308},"3":{"x":528,"y":2332},"4":{"x":352,"y":2308},"5":{"x":352,"y":2308},"6":{"x":352,"y":2332}}},"warnings":null},{"id":243,"sourceNodeId":138,"sourcePortId":521,"targetNodeId":134,"targetPortId":522,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":2,"warning":null,"consecutiveTime":122},"sourceArrival":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"targetDeparture":{"lock":false,"time":48,"warning":null,"consecutiveTime":48},"targetArrival":{"lock":false,"time":12,"warning":null,"consecutiveTime":132},"numberOfStops":1,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":592,"y":2270},{"x":592,"y":2206},{"x":560,"y":2110},{"x":560,"y":2046}],"textPositions":{"0":{"x":604,"y":2252},"1":{"x":580,"y":2224},"2":{"x":548,"y":2064},"3":{"x":572,"y":2092},"4":{"x":588,"y":2158},"5":{"x":588,"y":2158},"6":{"x":564,"y":2158}}},"warnings":null},{"id":244,"sourceNodeId":138,"sourcePortId":523,"targetNodeId":134,"targetPortId":524,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"numberOfStops":2,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":656,"y":2270},{"x":656,"y":2206},{"x":624,"y":2110},{"x":624,"y":2046}],"textPositions":{"0":{"x":668,"y":2252},"1":{"x":644,"y":2224},"2":{"x":612,"y":2064},"3":{"x":636,"y":2092},"4":{"x":652,"y":2158},"5":{"x":652,"y":2158},"6":{"x":628,"y":2158}}},"warnings":null},{"id":245,"sourceNodeId":138,"sourcePortId":525,"targetNodeId":139,"targetPortId":526,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"sourceArrival":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"targetDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"targetArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"numberOfStops":5,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":574,"y":2288},{"x":510,"y":2288},{"x":194,"y":2288},{"x":130,"y":2288}],"textPositions":{"0":{"x":556,"y":2276},"1":{"x":528,"y":2300},"2":{"x":148,"y":2300},"3":{"x":176,"y":2276},"4":{"x":352,"y":2276},"5":{"x":352,"y":2276},"6":{"x":352,"y":2300}}},"warnings":null},{"id":246,"sourceNodeId":134,"sourcePortId":527,"targetNodeId":138,"targetPortId":528,"travelTime":{"lock":false,"time":20,"warning":null},"sourceDeparture":{"lock":false,"time":28,"warning":null,"consecutiveTime":88},"sourceArrival":{"lock":false,"time":32,"warning":null,"consecutiveTime":92},"targetDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":72},"targetArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":108},"numberOfStops":2,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":592,"y":2046},{"x":592,"y":2110},{"x":624,"y":2206},{"x":624,"y":2270}],"textPositions":{"0":{"x":580,"y":2064},"1":{"x":604,"y":2092},"2":{"x":636,"y":2252},"3":{"x":612,"y":2224},"4":{"x":620,"y":2158},"5":{"x":620,"y":2158},"6":{"x":596,"y":2158}}},"warnings":null},{"id":247,"sourceNodeId":138,"sourcePortId":529,"targetNodeId":137,"targetPortId":530,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"sourceArrival":{"lock":false,"time":39,"warning":null,"consecutiveTime":39},"targetDeparture":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"targetArrival":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"numberOfStops":4,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":674,"y":2320},{"x":738,"y":2320},{"x":1086,"y":2320},{"x":1150,"y":2320}],"textPositions":{"0":{"x":692,"y":2332},"1":{"x":720,"y":2308},"2":{"x":1132,"y":2308},"3":{"x":1104,"y":2332},"4":{"x":912,"y":2308},"5":{"x":912,"y":2308},"6":{"x":912,"y":2332}}},"warnings":null},{"id":248,"sourceNodeId":138,"sourcePortId":531,"targetNodeId":137,"targetPortId":532,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":41.5,"warning":null,"consecutiveTime":41.5},"sourceArrival":{"lock":false,"time":18.5,"warning":null,"consecutiveTime":18.5},"targetDeparture":{"lock":false,"time":8.5,"warning":null,"consecutiveTime":8.5},"targetArrival":{"lock":false,"time":51.5,"warning":null,"consecutiveTime":51.5},"numberOfStops":2,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":674,"y":2288},{"x":738,"y":2288},{"x":1086,"y":2288},{"x":1150,"y":2288}],"textPositions":{"0":{"x":692,"y":2300},"1":{"x":720,"y":2276},"2":{"x":1132,"y":2276},"3":{"x":1104,"y":2300},"4":{"x":912,"y":2276},"5":{"x":912,"y":2276},"6":{"x":912,"y":2300}}},"warnings":null},{"id":249,"sourceNodeId":159,"sourcePortId":533,"targetNodeId":141,"targetPortId":534,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"sourceArrival":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"targetDeparture":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"targetArrival":{"lock":false,"time":39,"warning":null,"consecutiveTime":39},"numberOfStops":1,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1104,"y":990},{"x":1104,"y":926},{"x":1104,"y":802},{"x":1104,"y":738}],"textPositions":{"0":{"x":1116,"y":972},"1":{"x":1092,"y":944},"2":{"x":1092,"y":756},"3":{"x":1116,"y":784},"4":{"x":1092,"y":864},"5":{"x":1092,"y":864},"6":{"x":1116,"y":864}}},"warnings":null},{"id":250,"sourceNodeId":149,"sourcePortId":535,"targetNodeId":137,"targetPortId":536,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":39,"warning":null,"consecutiveTime":39},"sourceArrival":{"lock":false,"time":21,"warning":null,"consecutiveTime":141},"targetDeparture":{"lock":false,"time":11,"warning":null,"consecutiveTime":131},"targetArrival":{"lock":false,"time":49,"warning":null,"consecutiveTime":49},"numberOfStops":0,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1200,"y":2050},{"x":1200,"y":2114},{"x":1264,"y":2206},{"x":1264,"y":2270}],"textPositions":{"0":{"x":1188,"y":2068},"1":{"x":1212,"y":2096},"2":{"x":1276,"y":2252},"3":{"x":1252,"y":2224},"4":{"x":1244,"y":2160},"5":{"x":1244,"y":2160},"6":{"x":1220,"y":2160}}},"warnings":null},{"id":251,"sourceNodeId":149,"sourcePortId":537,"targetNodeId":137,"targetPortId":538,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":7.5,"warning":null,"consecutiveTime":67.5},"sourceArrival":{"lock":false,"time":52.5,"warning":null,"consecutiveTime":112.5},"targetDeparture":{"lock":false,"time":42.5,"warning":null,"consecutiveTime":102.5},"targetArrival":{"lock":false,"time":17.5,"warning":null,"consecutiveTime":77.5},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1168,"y":2050},{"x":1168,"y":2114},{"x":1232,"y":2206},{"x":1232,"y":2270}],"textPositions":{"0":{"x":1156,"y":2068},"1":{"x":1180,"y":2096},"2":{"x":1244,"y":2252},"3":{"x":1220,"y":2224},"4":{"x":1212,"y":2160},"5":{"x":1212,"y":2160},"6":{"x":1188,"y":2160}}},"warnings":null},{"id":252,"sourceNodeId":149,"sourcePortId":539,"targetNodeId":137,"targetPortId":540,"travelTime":{"lock":false,"time":5,"warning":null},"sourceDeparture":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"sourceArrival":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":119},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":61},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1136,"y":2050},{"x":1136,"y":2114},{"x":1200,"y":2206},{"x":1200,"y":2270}],"textPositions":{"0":{"x":1124,"y":2068},"1":{"x":1148,"y":2096},"2":{"x":1212,"y":2252},"3":{"x":1188,"y":2224},"4":{"x":1180,"y":2160},"5":{"x":1180,"y":2160},"6":{"x":1156,"y":2160}}},"warnings":null},{"id":253,"sourceNodeId":149,"sourcePortId":541,"targetNodeId":137,"targetPortId":542,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":56,"warning":null,"consecutiveTime":116},"sourceArrival":{"lock":false,"time":4,"warning":null,"consecutiveTime":244},"targetDeparture":{"lock":false,"time":54,"warning":null,"consecutiveTime":234},"targetArrival":{"lock":false,"time":6,"warning":null,"consecutiveTime":126},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1104,"y":2050},{"x":1104,"y":2114},{"x":1168,"y":2206},{"x":1168,"y":2270}],"textPositions":{"0":{"x":1092,"y":2068},"1":{"x":1116,"y":2096},"2":{"x":1180,"y":2252},"3":{"x":1156,"y":2224},"4":{"x":1148,"y":2160},"5":{"x":1148,"y":2160},"6":{"x":1124,"y":2160}}},"warnings":null},{"id":254,"sourceNodeId":140,"sourcePortId":543,"targetNodeId":137,"targetPortId":544,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":42,"warning":null,"consecutiveTime":222},"sourceArrival":{"lock":false,"time":18,"warning":null,"consecutiveTime":138},"targetDeparture":{"lock":false,"time":8,"warning":null,"consecutiveTime":128},"targetArrival":{"lock":false,"time":52,"warning":null,"consecutiveTime":232},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1502,"y":2288},{"x":1438,"y":2288},{"x":1346,"y":2288},{"x":1282,"y":2288}],"textPositions":{"0":{"x":1484,"y":2276},"1":{"x":1456,"y":2300},"2":{"x":1300,"y":2300},"3":{"x":1328,"y":2276},"4":{"x":1392,"y":2276},"5":{"x":1392,"y":2276},"6":{"x":1392,"y":2300}}},"warnings":null},{"id":255,"sourceNodeId":140,"sourcePortId":545,"targetNodeId":137,"targetPortId":546,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"numberOfStops":4,"trainrunId":92,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1502,"y":2384},{"x":1438,"y":2384},{"x":1346,"y":2384},{"x":1282,"y":2384}],"textPositions":{"0":{"x":1484,"y":2372},"1":{"x":1456,"y":2396},"2":{"x":1300,"y":2396},"3":{"x":1328,"y":2372},"4":{"x":1392,"y":2372},"5":{"x":1392,"y":2372},"6":{"x":1392,"y":2396}}},"warnings":null},{"id":256,"sourceNodeId":140,"sourcePortId":547,"targetNodeId":137,"targetPortId":548,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":40,"warning":null,"consecutiveTime":100},"sourceArrival":{"lock":false,"time":20,"warning":null,"consecutiveTime":80},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":70},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":110},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1502,"y":2320},{"x":1438,"y":2320},{"x":1346,"y":2320},{"x":1282,"y":2320}],"textPositions":{"0":{"x":1484,"y":2308},"1":{"x":1456,"y":2332},"2":{"x":1300,"y":2332},"3":{"x":1328,"y":2308},"4":{"x":1392,"y":2308},"5":{"x":1392,"y":2308},"6":{"x":1392,"y":2332}}},"warnings":null},{"id":257,"sourceNodeId":140,"sourcePortId":549,"targetNodeId":137,"targetPortId":550,"travelTime":{"lock":false,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":0,"warning":null,"consecutiveTime":120},"sourceArrival":{"lock":false,"time":0,"warning":null,"consecutiveTime":60},"targetDeparture":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"targetArrival":{"lock":false,"time":10,"warning":null,"consecutiveTime":130},"numberOfStops":4,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1502,"y":2352},{"x":1438,"y":2352},{"x":1346,"y":2352},{"x":1282,"y":2352}],"textPositions":{"0":{"x":1484,"y":2340},"1":{"x":1456,"y":2364},"2":{"x":1300,"y":2364},"3":{"x":1328,"y":2340},"4":{"x":1392,"y":2340},"5":{"x":1392,"y":2340},"6":{"x":1392,"y":2364}}},"warnings":null},{"id":258,"sourceNodeId":159,"sourcePortId":551,"targetNodeId":161,"targetPortId":552,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":26,"warning":null,"consecutiveTime":86},"sourceArrival":{"lock":false,"time":34,"warning":null,"consecutiveTime":274},"targetDeparture":{"lock":false,"time":24,"warning":null,"consecutiveTime":264},"targetArrival":{"lock":false,"time":36,"warning":null,"consecutiveTime":96},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1008,"y":1058},{"x":1008,"y":1122},{"x":1008,"y":1246},{"x":1008,"y":1310}],"textPositions":{"0":{"x":996,"y":1076},"1":{"x":1020,"y":1104},"2":{"x":1020,"y":1292},"3":{"x":996,"y":1264},"4":{"x":996,"y":1184},"5":{"x":996,"y":1184},"6":{"x":1020,"y":1184}}},"warnings":null},{"id":259,"sourceNodeId":159,"sourcePortId":553,"targetNodeId":161,"targetPortId":554,"travelTime":{"lock":true,"time":7,"warning":null},"sourceDeparture":{"lock":true,"time":35,"warning":null,"consecutiveTime":35},"sourceArrival":{"lock":true,"time":25,"warning":null,"consecutiveTime":145},"targetDeparture":{"lock":true,"time":18,"warning":null,"consecutiveTime":138},"targetArrival":{"lock":true,"time":42,"warning":null,"consecutiveTime":42},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1040,"y":1058},{"x":1040,"y":1122},{"x":1040,"y":1246},{"x":1040,"y":1310}],"textPositions":{"0":{"x":1028,"y":1076},"1":{"x":1052,"y":1104},"2":{"x":1052,"y":1292},"3":{"x":1028,"y":1264},"4":{"x":1028,"y":1184},"5":{"x":1028,"y":1184},"6":{"x":1052,"y":1184}}},"warnings":null},{"id":260,"sourceNodeId":159,"sourcePortId":555,"targetNodeId":161,"targetPortId":556,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":33},"sourceArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":147},"targetDeparture":{"lock":false,"time":17,"warning":null,"consecutiveTime":137},"targetArrival":{"lock":false,"time":43,"warning":null,"consecutiveTime":43},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1072,"y":1058},{"x":1072,"y":1122},{"x":1072,"y":1246},{"x":1072,"y":1310}],"textPositions":{"0":{"x":1060,"y":1076},"1":{"x":1084,"y":1104},"2":{"x":1084,"y":1292},"3":{"x":1060,"y":1264},"4":{"x":1060,"y":1184},"5":{"x":1060,"y":1184},"6":{"x":1084,"y":1184}}},"warnings":null},{"id":261,"sourceNodeId":159,"sourcePortId":557,"targetNodeId":161,"targetPortId":558,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":32},"sourceArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"targetDeparture":{"lock":false,"time":18,"warning":null,"consecutiveTime":18},"targetArrival":{"lock":false,"time":42,"warning":null,"consecutiveTime":42},"numberOfStops":4,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1104,"y":1058},{"x":1104,"y":1122},{"x":1104,"y":1246},{"x":1104,"y":1310}],"textPositions":{"0":{"x":1092,"y":1076},"1":{"x":1116,"y":1104},"2":{"x":1116,"y":1292},"3":{"x":1092,"y":1264},"4":{"x":1092,"y":1184},"5":{"x":1092,"y":1184},"6":{"x":1116,"y":1184}}},"warnings":null},{"id":262,"sourceNodeId":149,"sourcePortId":559,"targetNodeId":160,"targetPortId":560,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":22,"warning":null,"consecutiveTime":142},"sourceArrival":{"lock":false,"time":38,"warning":null,"consecutiveTime":38},"targetDeparture":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"targetArrival":{"lock":false,"time":32,"warning":null,"consecutiveTime":152},"numberOfStops":3,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1200,"y":1982},{"x":1200,"y":1918},{"x":1200,"y":1826},{"x":1200,"y":1762}],"textPositions":{"0":{"x":1212,"y":1964},"1":{"x":1188,"y":1936},"2":{"x":1188,"y":1780},"3":{"x":1212,"y":1808},"4":{"x":1188,"y":1872},"5":{"x":1188,"y":1872},"6":{"x":1212,"y":1872}}},"warnings":null},{"id":263,"sourceNodeId":160,"sourcePortId":561,"targetNodeId":161,"targetPortId":562,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":153},"sourceArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":27},"targetDeparture":{"lock":false,"time":17,"warning":null,"consecutiveTime":17},"targetArrival":{"lock":false,"time":43,"warning":null,"consecutiveTime":163},"numberOfStops":2,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1200,"y":1694},{"x":1200,"y":1630},{"x":1104,"y":1442},{"x":1104,"y":1378}],"textPositions":{"0":{"x":1212,"y":1676},"1":{"x":1188,"y":1648},"2":{"x":1092,"y":1396},"3":{"x":1116,"y":1424},"4":{"x":1164,"y":1536},"5":{"x":1164,"y":1536},"6":{"x":1140,"y":1536}}},"warnings":null},{"id":264,"sourceNodeId":149,"sourcePortId":563,"targetNodeId":160,"targetPortId":564,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":54,"warning":null,"consecutiveTime":114},"sourceArrival":{"lock":false,"time":6,"warning":null,"consecutiveTime":66},"targetDeparture":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"targetArrival":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1168,"y":1982},{"x":1168,"y":1918},{"x":1168,"y":1826},{"x":1168,"y":1762}],"textPositions":{"0":{"x":1180,"y":1964},"1":{"x":1156,"y":1936},"2":{"x":1156,"y":1780},"3":{"x":1180,"y":1808},"4":{"x":1156,"y":1872},"5":{"x":1156,"y":1872},"6":{"x":1180,"y":1872}}},"warnings":null},{"id":265,"sourceNodeId":160,"sourcePortId":565,"targetNodeId":161,"targetPortId":566,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":5.5,"warning":null,"consecutiveTime":125.5},"sourceArrival":{"lock":false,"time":54.5,"warning":null,"consecutiveTime":54.5},"targetDeparture":{"lock":false,"time":44.5,"warning":null,"consecutiveTime":44.5},"targetArrival":{"lock":false,"time":15.5,"warning":null,"consecutiveTime":135.5},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1168,"y":1694},{"x":1168,"y":1630},{"x":1072,"y":1442},{"x":1072,"y":1378}],"textPositions":{"0":{"x":1180,"y":1676},"1":{"x":1156,"y":1648},"2":{"x":1060,"y":1396},"3":{"x":1084,"y":1424},"4":{"x":1132,"y":1536},"5":{"x":1132,"y":1536},"6":{"x":1108,"y":1536}}},"warnings":null},{"id":266,"sourceNodeId":149,"sourcePortId":567,"targetNodeId":160,"targetPortId":568,"travelTime":{"lock":true,"time":4,"warning":null},"sourceDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"sourceArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"targetDeparture":{"lock":false,"time":52,"warning":null,"consecutiveTime":52},"targetArrival":{"lock":false,"time":8,"warning":null,"consecutiveTime":128},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1136,"y":1982},{"x":1136,"y":1918},{"x":1136,"y":1826},{"x":1136,"y":1762}],"textPositions":{"0":{"x":1148,"y":1964},"1":{"x":1124,"y":1936},"2":{"x":1124,"y":1780},"3":{"x":1148,"y":1808},"4":{"x":1124,"y":1872},"5":{"x":1124,"y":1872},"6":{"x":1148,"y":1872}}},"warnings":null},{"id":267,"sourceNodeId":160,"sourcePortId":569,"targetNodeId":161,"targetPortId":570,"travelTime":{"lock":true,"time":8,"warning":null},"sourceDeparture":{"lock":false,"time":8,"warning":null,"consecutiveTime":128},"sourceArrival":{"lock":false,"time":52,"warning":null,"consecutiveTime":52},"targetDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":44},"targetArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":136},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1136,"y":1694},{"x":1136,"y":1630},{"x":1040,"y":1442},{"x":1040,"y":1378}],"textPositions":{"0":{"x":1148,"y":1676},"1":{"x":1124,"y":1648},"2":{"x":1028,"y":1396},"3":{"x":1052,"y":1424},"4":{"x":1100,"y":1536},"5":{"x":1100,"y":1536},"6":{"x":1076,"y":1536}}},"warnings":null},{"id":268,"sourceNodeId":149,"sourcePortId":571,"targetNodeId":160,"targetPortId":572,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":244},"sourceArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":116},"targetDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":106},"targetArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":254},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1104,"y":1982},{"x":1104,"y":1918},{"x":1104,"y":1826},{"x":1104,"y":1762}],"textPositions":{"0":{"x":1116,"y":1964},"1":{"x":1092,"y":1936},"2":{"x":1092,"y":1780},"3":{"x":1116,"y":1808},"4":{"x":1092,"y":1872},"5":{"x":1092,"y":1872},"6":{"x":1116,"y":1872}}},"warnings":null},{"id":269,"sourceNodeId":160,"sourcePortId":573,"targetNodeId":161,"targetPortId":574,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":14,"warning":null,"consecutiveTime":254},"sourceArrival":{"lock":false,"time":46,"warning":null,"consecutiveTime":106},"targetDeparture":{"lock":false,"time":36,"warning":null,"consecutiveTime":96},"targetArrival":{"lock":false,"time":24,"warning":null,"consecutiveTime":264},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1104,"y":1694},{"x":1104,"y":1630},{"x":1008,"y":1442},{"x":1008,"y":1378}],"textPositions":{"0":{"x":1116,"y":1676},"1":{"x":1092,"y":1648},"2":{"x":996,"y":1396},"3":{"x":1020,"y":1424},"4":{"x":1068,"y":1536},"5":{"x":1068,"y":1536},"6":{"x":1044,"y":1536}}},"warnings":null},{"id":270,"sourceNodeId":140,"sourcePortId":575,"targetNodeId":146,"targetPortId":576,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":1,"warning":null,"consecutiveTime":61},"sourceArrival":{"lock":false,"time":59,"warning":null,"consecutiveTime":119},"targetDeparture":{"lock":false,"time":49,"warning":null,"consecutiveTime":109},"targetArrival":{"lock":false,"time":11,"warning":null,"consecutiveTime":71},"numberOfStops":1,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1602,"y":2320},{"x":1666,"y":2320},{"x":1822,"y":2256},{"x":1886,"y":2256}],"textPositions":{"0":{"x":1620,"y":2332},"1":{"x":1648,"y":2308},"2":{"x":1868,"y":2244},"3":{"x":1840,"y":2268},"4":{"x":1744,"y":2276},"5":{"x":1744,"y":2276},"6":{"x":1744,"y":2300}}},"warnings":null},{"id":271,"sourceNodeId":146,"sourcePortId":577,"targetNodeId":135,"targetPortId":578,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":72},"sourceArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":108},"targetDeparture":{"lock":false,"time":38,"warning":null,"consecutiveTime":98},"targetArrival":{"lock":false,"time":22,"warning":null,"consecutiveTime":82},"numberOfStops":3,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1936,"y":2206},{"x":1936,"y":2142},{"x":1936,"y":2114},{"x":1936,"y":2050}],"textPositions":{"0":{"x":1948,"y":2188},"1":{"x":1924,"y":2160},"2":{"x":1924,"y":2068},"3":{"x":1948,"y":2096},"4":{"x":1924,"y":2128},"5":{"x":1924,"y":2128},"6":{"x":1948,"y":2128}}},"warnings":null},{"id":272,"sourceNodeId":140,"sourcePortId":579,"targetNodeId":146,"targetPortId":580,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":20,"warning":null,"consecutiveTime":80},"sourceArrival":{"lock":false,"time":40,"warning":null,"consecutiveTime":100},"targetDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"targetArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1602,"y":2288},{"x":1666,"y":2288},{"x":1822,"y":2224},{"x":1886,"y":2224}],"textPositions":{"0":{"x":1620,"y":2300},"1":{"x":1648,"y":2276},"2":{"x":1868,"y":2212},"3":{"x":1840,"y":2236},"4":{"x":1744,"y":2244},"5":{"x":1744,"y":2244},"6":{"x":1744,"y":2268}}},"warnings":null},{"id":273,"sourceNodeId":146,"sourcePortId":581,"targetNodeId":135,"targetPortId":582,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"sourceArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"targetDeparture":{"lock":false,"time":20,"warning":null,"consecutiveTime":80},"targetArrival":{"lock":false,"time":40,"warning":null,"consecutiveTime":100},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1904,"y":2206},{"x":1904,"y":2142},{"x":1904,"y":2114},{"x":1904,"y":2050}],"textPositions":{"0":{"x":1916,"y":2188},"1":{"x":1892,"y":2160},"2":{"x":1892,"y":2068},"3":{"x":1916,"y":2096},"4":{"x":1892,"y":2128},"5":{"x":1892,"y":2128},"6":{"x":1916,"y":2128}}},"warnings":null},{"id":274,"sourceNodeId":140,"sourcePortId":583,"targetNodeId":147,"targetPortId":584,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"sourceArrival":{"lock":false,"time":39,"warning":null,"consecutiveTime":39},"targetDeparture":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"targetArrival":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"numberOfStops":0,"trainrunId":92,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1602,"y":2384},{"x":1666,"y":2384},{"x":1822,"y":2384},{"x":1886,"y":2384}],"textPositions":{"0":{"x":1620,"y":2396},"1":{"x":1648,"y":2372},"2":{"x":1868,"y":2372},"3":{"x":1840,"y":2396},"4":{"x":1744,"y":2372},"5":{"x":1744,"y":2372},"6":{"x":1744,"y":2396}}},"warnings":null},{"id":275,"sourceNodeId":147,"sourcePortId":585,"targetNodeId":154,"targetPortId":586,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":32},"sourceArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"targetDeparture":{"lock":false,"time":18,"warning":null,"consecutiveTime":18},"targetArrival":{"lock":false,"time":42,"warning":null,"consecutiveTime":42},"numberOfStops":0,"trainrunId":92,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1986,"y":2384},{"x":2050,"y":2384},{"x":2302,"y":2384},{"x":2366,"y":2384}],"textPositions":{"0":{"x":2004,"y":2396},"1":{"x":2032,"y":2372},"2":{"x":2348,"y":2372},"3":{"x":2320,"y":2396},"4":{"x":2176,"y":2372},"5":{"x":2176,"y":2372},"6":{"x":2176,"y":2396}}},"warnings":null},{"id":276,"sourceNodeId":140,"sourcePortId":587,"targetNodeId":147,"targetPortId":588,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":18,"warning":null,"consecutiveTime":138},"sourceArrival":{"lock":false,"time":42,"warning":null,"consecutiveTime":222},"targetDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":212},"targetArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":148},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1602,"y":2352},{"x":1666,"y":2352},{"x":1822,"y":2352},{"x":1886,"y":2352}],"textPositions":{"0":{"x":1620,"y":2364},"1":{"x":1648,"y":2340},"2":{"x":1868,"y":2340},"3":{"x":1840,"y":2364},"4":{"x":1744,"y":2340},"5":{"x":1744,"y":2340},"6":{"x":1744,"y":2364}}},"warnings":null},{"id":277,"sourceNodeId":147,"sourcePortId":589,"targetNodeId":154,"targetPortId":590,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":150},"sourceArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":210},"targetDeparture":{"lock":false,"time":20,"warning":null,"consecutiveTime":200},"targetArrival":{"lock":false,"time":40,"warning":null,"consecutiveTime":160},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1986,"y":2352},{"x":2050,"y":2352},{"x":2302,"y":2352},{"x":2366,"y":2352}],"textPositions":{"0":{"x":2004,"y":2364},"1":{"x":2032,"y":2340},"2":{"x":2348,"y":2340},"3":{"x":2320,"y":2364},"4":{"x":2176,"y":2340},"5":{"x":2176,"y":2340},"6":{"x":2176,"y":2364}}},"warnings":null},{"id":278,"sourceNodeId":148,"sourcePortId":591,"targetNodeId":133,"targetPortId":592,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":104},"sourceArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":76},"targetDeparture":{"lock":false,"time":6,"warning":null,"consecutiveTime":66},"targetArrival":{"lock":false,"time":54,"warning":null,"consecutiveTime":114},"numberOfStops":3,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":1918},{"x":240,"y":1854},{"x":240,"y":994},{"x":240,"y":930}],"textPositions":{"0":{"x":252,"y":1900},"1":{"x":228,"y":1872},"2":{"x":228,"y":948},"3":{"x":252,"y":976},"4":{"x":228,"y":1424},"5":{"x":228,"y":1424},"6":{"x":252,"y":1424}}},"warnings":null},{"id":279,"sourceNodeId":133,"sourcePortId":593,"targetNodeId":142,"targetPortId":594,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":55,"warning":null,"consecutiveTime":115},"sourceArrival":{"lock":false,"time":5,"warning":null,"consecutiveTime":65},"targetDeparture":{"lock":false,"time":55,"warning":null,"consecutiveTime":55},"targetArrival":{"lock":false,"time":5,"warning":null,"consecutiveTime":125},"numberOfStops":3,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":862},{"x":240,"y":798},{"x":240,"y":574},{"x":240,"y":510}],"textPositions":{"0":{"x":252,"y":844},"1":{"x":228,"y":816},"2":{"x":228,"y":528},"3":{"x":252,"y":556},"4":{"x":228,"y":686},"5":{"x":228,"y":686},"6":{"x":252,"y":686}}},"warnings":null},{"id":280,"sourceNodeId":148,"sourcePortId":595,"targetNodeId":133,"targetPortId":596,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":24,"warning":null,"consecutiveTime":144},"sourceArrival":{"lock":false,"time":36,"warning":null,"consecutiveTime":36},"targetDeparture":{"lock":false,"time":26,"warning":null,"consecutiveTime":26},"targetArrival":{"lock":false,"time":34,"warning":null,"consecutiveTime":154},"numberOfStops":3,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":1918},{"x":208,"y":1854},{"x":208,"y":994},{"x":208,"y":930}],"textPositions":{"0":{"x":220,"y":1900},"1":{"x":196,"y":1872},"2":{"x":196,"y":948},"3":{"x":220,"y":976},"4":{"x":196,"y":1424},"5":{"x":196,"y":1424},"6":{"x":220,"y":1424}}},"warnings":null},{"id":281,"sourceNodeId":133,"sourcePortId":597,"targetNodeId":142,"targetPortId":598,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":35,"warning":null,"consecutiveTime":155},"sourceArrival":{"lock":false,"time":25,"warning":null,"consecutiveTime":25},"targetDeparture":{"lock":false,"time":15,"warning":null,"consecutiveTime":15},"targetArrival":{"lock":false,"time":45,"warning":null,"consecutiveTime":165},"numberOfStops":3,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":862},{"x":208,"y":798},{"x":208,"y":574},{"x":208,"y":510}],"textPositions":{"0":{"x":220,"y":844},"1":{"x":196,"y":816},"2":{"x":196,"y":528},"3":{"x":220,"y":556},"4":{"x":196,"y":686},"5":{"x":196,"y":686},"6":{"x":220,"y":686}}},"warnings":null},{"id":282,"sourceNodeId":142,"sourcePortId":599,"targetNodeId":157,"targetPortId":600,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":6,"warning":null,"consecutiveTime":126},"sourceArrival":{"lock":false,"time":54,"warning":null,"consecutiveTime":54},"targetDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":44},"targetArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":136},"numberOfStops":3,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":290,"y":464},{"x":354,"y":464},{"x":926,"y":336},{"x":990,"y":336}],"textPositions":{"0":{"x":308,"y":476},"1":{"x":336,"y":452},"2":{"x":972,"y":324},"3":{"x":944,"y":348},"4":{"x":640,"y":388},"5":{"x":640,"y":388},"6":{"x":640,"y":412}}},"warnings":null},{"id":283,"sourceNodeId":142,"sourcePortId":601,"targetNodeId":157,"targetPortId":602,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":166},"sourceArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":14},"targetDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":4},"targetArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":176},"numberOfStops":1,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":290,"y":432},{"x":354,"y":432},{"x":926,"y":304},{"x":990,"y":304}],"textPositions":{"0":{"x":308,"y":444},"1":{"x":336,"y":420},"2":{"x":972,"y":292},"3":{"x":944,"y":316},"4":{"x":640,"y":356},"5":{"x":640,"y":356},"6":{"x":640,"y":380}}},"warnings":null},{"id":284,"sourceNodeId":154,"sourcePortId":603,"targetNodeId":155,"targetPortId":604,"travelTime":{"lock":true,"time":10,"warning":null},"sourceDeparture":{"lock":false,"time":0,"warning":null,"consecutiveTime":0},"sourceArrival":{"lock":false,"time":0,"warning":null,"consecutiveTime":60},"targetDeparture":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"targetArrival":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"numberOfStops":0,"trainrunId":98,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2384,"y":2430},{"x":2384,"y":2494},{"x":2544,"y":2494},{"x":2544,"y":2558}],"textPositions":{"0":{"x":2372,"y":2448},"1":{"x":2396,"y":2476},"2":{"x":2556,"y":2540},"3":{"x":2532,"y":2512},"4":{"x":2476,"y":2494},"5":{"x":2476,"y":2494},"6":{"x":2452,"y":2494}}},"warnings":null},{"id":415,"sourceNodeId":141,"sourcePortId":691,"targetNodeId":159,"targetPortId":692,"travelTime":{"time":5,"consecutiveTime":1,"lock":true,"warning":null,"timeFormatter":null},"sourceDeparture":{"time":29,"consecutiveTime":29,"lock":false,"warning":null,"timeFormatter":null},"sourceArrival":{"time":31,"consecutiveTime":151,"lock":false,"warning":null,"timeFormatter":null},"targetDeparture":{"time":26,"consecutiveTime":146,"lock":false,"warning":null,"timeFormatter":null},"targetArrival":{"time":34,"consecutiveTime":34,"lock":false,"warning":null,"timeFormatter":null},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1040,"y":738},{"x":1040,"y":802},{"x":1040,"y":926},{"x":1040,"y":990}],"textPositions":{"0":{"x":1028,"y":756},"1":{"x":1052,"y":784},"2":{"x":1052,"y":972},"3":{"x":1028,"y":944},"4":{"x":1028,"y":864},"5":{"x":1028,"y":864},"6":{"x":1052,"y":864}}},"warnings":null}],"trainruns":[{"id":83,"name":"1","categoryId":2,"frequencyId":2,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":84,"name":"1","categoryId":0,"frequencyId":4,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":85,"name":"12","categoryId":2,"frequencyId":2,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":86,"name":"29","categoryId":4,"frequencyId":2,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":87,"name":"15","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":88,"name":"8","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":89,"name":"12","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":90,"name":"1","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":91,"name":"1","categoryId":4,"frequencyId":0,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":92,"name":"3","categoryId":4,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":93,"name":"","categoryId":3,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":94,"name":"7","categoryId":4,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":95,"name":"6","categoryId":4,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":96,"name":"77","categoryId":4,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":97,"name":"","categoryId":3,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]},{"id":98,"name":"X","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]}],"resources":[{"id":151,"capacity":2},{"id":152,"capacity":2},{"id":153,"capacity":2},{"id":154,"capacity":2},{"id":155,"capacity":2},{"id":156,"capacity":2},{"id":157,"capacity":2},{"id":158,"capacity":2},{"id":159,"capacity":2},{"id":160,"capacity":2},{"id":161,"capacity":2},{"id":162,"capacity":2},{"id":163,"capacity":2},{"id":164,"capacity":2},{"id":165,"capacity":2},{"id":166,"capacity":2},{"id":167,"capacity":2},{"id":168,"capacity":2},{"id":169,"capacity":2},{"id":170,"capacity":2},{"id":171,"capacity":2},{"id":172,"capacity":2},{"id":173,"capacity":2},{"id":174,"capacity":2},{"id":175,"capacity":2},{"id":176,"capacity":2},{"id":177,"capacity":2},{"id":178,"capacity":2},{"id":179,"capacity":2},{"id":180,"capacity":2},{"id":181,"capacity":2},{"id":182,"capacity":2},{"id":183,"capacity":2},{"id":184,"capacity":2},{"id":185,"capacity":2},{"id":186,"capacity":2},{"id":187,"capacity":2},{"id":188,"capacity":2},{"id":189,"capacity":2},{"id":190,"capacity":2}],"metadata":{"netzgrafikColors":[],"trainrunCategories":[{"id":0,"name":"International","order":0,"colorRef":"EC","shortName":"EC","fachCategory":"HaltezeitIPV","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":1,"name":"InterCity","order":1,"colorRef":"IC","shortName":"IC","fachCategory":"HaltezeitA","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":2,"name":"InterRegio","order":2,"colorRef":"IR","shortName":"IR","fachCategory":"HaltezeitB","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":3,"name":"RegioExpress","order":3,"colorRef":"RE","shortName":"RE","fachCategory":"HaltezeitC","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":4,"name":"RegioUndSBahnverkehr","order":4,"colorRef":"S","shortName":"S","fachCategory":"HaltezeitD","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":5,"name":"GüterExpress","order":5,"colorRef":"GEX","shortName":"GEX","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4},{"id":6,"name":"Güterverkehr","order":6,"colorRef":"G","shortName":"G","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4}],"trainrunFrequencies":[{"id":0,"name":"verkehrt viertelstündlich","order":0,"offset":0,"frequency":15,"shortName":"15","linePatternRef":"15"},{"id":1,"name":"verkehrt im 20 Minuten Takt","order":0,"offset":0,"frequency":20,"shortName":"20","linePatternRef":"20"},{"id":2,"name":"verkehrt halbstündlich","order":0,"offset":0,"frequency":30,"shortName":"30","linePatternRef":"30"},{"id":3,"name":"verkehrt stündlich","order":0,"offset":0,"frequency":60,"shortName":"60","linePatternRef":"60"},{"id":4,"name":"verkehrt zweistündlich (gerade)","order":0,"offset":0,"frequency":120,"shortName":"120","linePatternRef":"120"},{"id":5,"name":"verkehrt zweistündlich (ungerade)","order":0,"offset":60,"frequency":120,"shortName":"120+","linePatternRef":"120"}],"trainrunTimeCategories":[{"id":0,"name":"verkehrt uneingeschränkt","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"7/24","linePatternRef":"7/24","dayTimeInterval":[]},{"id":1,"name":"verkehrt zur Hauptverkehrszeit","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"HVZ","linePatternRef":"HVZ","dayTimeInterval":[{"to":420,"from":360},{"to":1140,"from":960}]},{"id":2,"name":"verkehrt zeitweise","order":0,"weekday":[],"shortName":"zeitweise","linePatternRef":"ZEITWEISE","dayTimeInterval":[]}]},"freeFloatingTexts":[],"labels":[],"labelGroups":[],"filterData":{"filterSettings":[]}} \ No newline at end of file diff --git a/src/app/sample-netzgrafik/Demo_Netzgrafik_Fernverkehr_2024.json b/src/app/sample-netzgrafik/Demo_Netzgrafik_Fernverkehr_2024.json new file mode 100644 index 00000000..2d657582 --- /dev/null +++ b/src/app/sample-netzgrafik/Demo_Netzgrafik_Fernverkehr_2024.json @@ -0,0 +1 @@ +{"nodes":[{"id":128,"betriebspunktName":"Lausanne","fullName":"Lausanne","positionX":-3072,"positionY":544,"ports":[{"id":1207,"trainrunSectionId":596,"positionIndex":0,"positionAlignment":2},{"id":1187,"trainrunSectionId":586,"positionIndex":1,"positionAlignment":2},{"id":1382,"trainrunSectionId":683,"positionIndex":0,"positionAlignment":3},{"id":1380,"trainrunSectionId":682,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":345,"port1Id":1187,"port2Id":1380,"isNonStopTransit":false},{"id":347,"port1Id":1207,"port2Id":1382,"isNonStopTransit":false}],"connections":[],"resourceId":152,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":129,"betriebspunktName":"Bern","fullName":"Bern","positionX":-2144,"positionY":128,"ports":[{"id":1328,"trainrunSectionId":656,"positionIndex":0,"positionAlignment":1},{"id":1311,"trainrunSectionId":648,"positionIndex":1,"positionAlignment":1},{"id":1313,"trainrunSectionId":649,"positionIndex":2,"positionAlignment":1},{"id":1339,"trainrunSectionId":662,"positionIndex":3,"positionAlignment":1},{"id":1205,"trainrunSectionId":595,"positionIndex":0,"positionAlignment":2},{"id":1109,"trainrunSectionId":547,"positionIndex":1,"positionAlignment":2},{"id":1440,"trainrunSectionId":712,"positionIndex":0,"positionAlignment":3},{"id":1329,"trainrunSectionId":657,"positionIndex":1,"positionAlignment":3},{"id":1436,"trainrunSectionId":710,"positionIndex":2,"positionAlignment":3},{"id":1434,"trainrunSectionId":709,"positionIndex":3,"positionAlignment":3},{"id":1432,"trainrunSectionId":708,"positionIndex":4,"positionAlignment":3},{"id":1430,"trainrunSectionId":707,"positionIndex":5,"positionAlignment":3},{"id":1428,"trainrunSectionId":706,"positionIndex":6,"positionAlignment":3}],"transitions":[{"id":315,"port1Id":1328,"port2Id":1329,"isNonStopTransit":false},{"id":376,"port1Id":1109,"port2Id":1430,"isNonStopTransit":false},{"id":378,"port1Id":1339,"port2Id":1432,"isNonStopTransit":false},{"id":380,"port1Id":1313,"port2Id":1434,"isNonStopTransit":false},{"id":382,"port1Id":1311,"port2Id":1436,"isNonStopTransit":false},{"id":386,"port1Id":1205,"port2Id":1440,"isNonStopTransit":false}],"connections":[],"resourceId":153,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":130,"betriebspunktName":"Biel","fullName":"Biel","positionX":-2528,"positionY":-32,"ports":[{"id":1183,"trainrunSectionId":584,"positionIndex":0,"positionAlignment":2},{"id":1418,"trainrunSectionId":701,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":366,"port1Id":1183,"port2Id":1418,"isNonStopTransit":false}],"connections":[],"resourceId":154,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":131,"betriebspunktName":"Interlaken ","fullName":"Interlaken Ost","positionX":-1088,"positionY":928,"ports":[{"id":1318,"trainrunSectionId":651,"positionIndex":0,"positionAlignment":2},{"id":1344,"trainrunSectionId":664,"positionIndex":1,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":155,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":132,"betriebspunktName":"Visp","fullName":"Visp","positionX":-2144,"positionY":1440,"ports":[{"id":1323,"trainrunSectionId":654,"positionIndex":0,"positionAlignment":0},{"id":1322,"trainrunSectionId":653,"positionIndex":1,"positionAlignment":0}],"transitions":[],"connections":[],"resourceId":156,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":133,"betriebspunktName":"Olten","fullName":"Olten","positionX":64,"positionY":96,"ports":[{"id":1047,"trainrunSectionId":516,"positionIndex":0,"positionAlignment":0},{"id":1331,"trainrunSectionId":658,"positionIndex":1,"positionAlignment":0},{"id":1308,"trainrunSectionId":646,"positionIndex":2,"positionAlignment":0},{"id":1371,"trainrunSectionId":678,"positionIndex":3,"positionAlignment":0},{"id":1131,"trainrunSectionId":558,"positionIndex":4,"positionAlignment":0},{"id":1117,"trainrunSectionId":551,"positionIndex":5,"positionAlignment":0},{"id":1046,"trainrunSectionId":515,"positionIndex":0,"positionAlignment":1},{"id":1370,"trainrunSectionId":677,"positionIndex":1,"positionAlignment":1},{"id":1130,"trainrunSectionId":557,"positionIndex":2,"positionAlignment":1},{"id":1116,"trainrunSectionId":550,"positionIndex":3,"positionAlignment":1},{"id":1181,"trainrunSectionId":583,"positionIndex":0,"positionAlignment":2},{"id":1203,"trainrunSectionId":594,"positionIndex":1,"positionAlignment":2},{"id":1394,"trainrunSectionId":689,"positionIndex":2,"positionAlignment":2},{"id":1309,"trainrunSectionId":647,"positionIndex":3,"positionAlignment":2},{"id":1225,"trainrunSectionId":605,"positionIndex":4,"positionAlignment":2},{"id":1241,"trainrunSectionId":613,"positionIndex":5,"positionAlignment":2},{"id":1165,"trainrunSectionId":575,"positionIndex":6,"positionAlignment":2},{"id":1202,"trainrunSectionId":593,"positionIndex":0,"positionAlignment":3},{"id":1180,"trainrunSectionId":582,"positionIndex":1,"positionAlignment":3},{"id":1224,"trainrunSectionId":604,"positionIndex":2,"positionAlignment":3},{"id":1240,"trainrunSectionId":612,"positionIndex":3,"positionAlignment":3},{"id":1164,"trainrunSectionId":574,"positionIndex":4,"positionAlignment":3}],"transitions":[{"id":210,"port1Id":1047,"port2Id":1046,"isNonStopTransit":false},{"id":236,"port1Id":1117,"port2Id":1116,"isNonStopTransit":false},{"id":242,"port1Id":1131,"port2Id":1130,"isNonStopTransit":false},{"id":253,"port1Id":1165,"port2Id":1164,"isNonStopTransit":false},{"id":259,"port1Id":1181,"port2Id":1180,"isNonStopTransit":false},{"id":264,"port1Id":1203,"port2Id":1202,"isNonStopTransit":true},{"id":270,"port1Id":1225,"port2Id":1224,"isNonStopTransit":true},{"id":276,"port1Id":1241,"port2Id":1240,"isNonStopTransit":true},{"id":308,"port1Id":1308,"port2Id":1309,"isNonStopTransit":false},{"id":340,"port1Id":1371,"port2Id":1370,"isNonStopTransit":false},{"id":353,"port1Id":1331,"port2Id":1394,"isNonStopTransit":false}],"connections":[],"resourceId":157,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":134,"betriebspunktName":"Basel","fullName":"Basel","positionX":64,"positionY":-1888,"ports":[{"id":1054,"trainrunSectionId":519,"positionIndex":0,"positionAlignment":1},{"id":1416,"trainrunSectionId":700,"positionIndex":1,"positionAlignment":1},{"id":1277,"trainrunSectionId":631,"positionIndex":2,"positionAlignment":1},{"id":1338,"trainrunSectionId":661,"positionIndex":3,"positionAlignment":1},{"id":1301,"trainrunSectionId":643,"positionIndex":4,"positionAlignment":1},{"id":1378,"trainrunSectionId":681,"positionIndex":5,"positionAlignment":1},{"id":1138,"trainrunSectionId":561,"positionIndex":6,"positionAlignment":1},{"id":1124,"trainrunSectionId":554,"positionIndex":7,"positionAlignment":1},{"id":1267,"trainrunSectionId":626,"positionIndex":0,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":158,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":135,"betriebspunktName":"Zürich","fullName":"Zürich","positionX":2656,"positionY":32,"ports":[{"id":1255,"trainrunSectionId":620,"positionIndex":0,"positionAlignment":0},{"id":1254,"trainrunSectionId":619,"positionIndex":1,"positionAlignment":0},{"id":1360,"trainrunSectionId":672,"positionIndex":0,"positionAlignment":1},{"id":1149,"trainrunSectionId":567,"positionIndex":1,"positionAlignment":1},{"id":1153,"trainrunSectionId":569,"positionIndex":2,"positionAlignment":1},{"id":1358,"trainrunSectionId":671,"positionIndex":3,"positionAlignment":1},{"id":1356,"trainrunSectionId":670,"positionIndex":4,"positionAlignment":1},{"id":1354,"trainrunSectionId":669,"positionIndex":5,"positionAlignment":1},{"id":1195,"trainrunSectionId":590,"positionIndex":0,"positionAlignment":2},{"id":1401,"trainrunSectionId":693,"positionIndex":1,"positionAlignment":2},{"id":1292,"trainrunSectionId":638,"positionIndex":2,"positionAlignment":2},{"id":1173,"trainrunSectionId":579,"positionIndex":3,"positionAlignment":2},{"id":1217,"trainrunSectionId":601,"positionIndex":4,"positionAlignment":2},{"id":1233,"trainrunSectionId":609,"positionIndex":5,"positionAlignment":2},{"id":1157,"trainrunSectionId":571,"positionIndex":6,"positionAlignment":2},{"id":1276,"trainrunSectionId":630,"positionIndex":7,"positionAlignment":2},{"id":1300,"trainrunSectionId":642,"positionIndex":8,"positionAlignment":2},{"id":1191,"trainrunSectionId":588,"positionIndex":0,"positionAlignment":3},{"id":1172,"trainrunSectionId":578,"positionIndex":1,"positionAlignment":3},{"id":1213,"trainrunSectionId":599,"positionIndex":2,"positionAlignment":3},{"id":1229,"trainrunSectionId":607,"positionIndex":3,"positionAlignment":3},{"id":1139,"trainrunSectionId":562,"positionIndex":4,"positionAlignment":3},{"id":1245,"trainrunSectionId":615,"positionIndex":5,"positionAlignment":3}],"transitions":[{"id":250,"port1Id":1153,"port2Id":1157,"isNonStopTransit":false},{"id":256,"port1Id":1173,"port2Id":1172,"isNonStopTransit":false},{"id":261,"port1Id":1195,"port2Id":1191,"isNonStopTransit":false},{"id":267,"port1Id":1217,"port2Id":1213,"isNonStopTransit":false},{"id":273,"port1Id":1233,"port2Id":1229,"isNonStopTransit":false},{"id":329,"port1Id":1354,"port2Id":1245,"isNonStopTransit":false},{"id":357,"port1Id":1149,"port2Id":1401,"isNonStopTransit":false}],"connections":[],"resourceId":159,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":136,"betriebspunktName":"Bellinz.","fullName":"Bellinzona","positionX":2592,"positionY":3232,"ports":[{"id":1059,"trainrunSectionId":522,"positionIndex":0,"positionAlignment":0},{"id":1035,"trainrunSectionId":510,"positionIndex":1,"positionAlignment":0},{"id":1071,"trainrunSectionId":528,"positionIndex":2,"positionAlignment":0},{"id":1083,"trainrunSectionId":534,"positionIndex":3,"positionAlignment":0},{"id":1058,"trainrunSectionId":521,"positionIndex":0,"positionAlignment":1},{"id":1034,"trainrunSectionId":509,"positionIndex":1,"positionAlignment":1},{"id":1070,"trainrunSectionId":527,"positionIndex":0,"positionAlignment":2},{"id":1082,"trainrunSectionId":533,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":206,"port1Id":1035,"port2Id":1034,"isNonStopTransit":false},{"id":216,"port1Id":1059,"port2Id":1058,"isNonStopTransit":false},{"id":221,"port1Id":1071,"port2Id":1070,"isNonStopTransit":false},{"id":226,"port1Id":1083,"port2Id":1082,"isNonStopTransit":false}],"connections":[],"resourceId":160,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":137,"betriebspunktName":"St. Gallen","fullName":"Sankt Gallen","positionX":4640,"positionY":96,"ports":[{"id":1145,"trainrunSectionId":565,"positionIndex":0,"positionAlignment":1},{"id":1212,"trainrunSectionId":598,"positionIndex":0,"positionAlignment":2},{"id":1167,"trainrunSectionId":576,"positionIndex":1,"positionAlignment":2},{"id":1144,"trainrunSectionId":564,"positionIndex":2,"positionAlignment":2},{"id":1419,"trainrunSectionId":702,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":248,"port1Id":1145,"port2Id":1144,"isNonStopTransit":false},{"id":367,"port1Id":1167,"port2Id":1419,"isNonStopTransit":false}],"connections":[],"resourceId":161,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":138,"betriebspunktName":"Schaffh.","fullName":"Schaffhausen","positionX":2624,"positionY":-1120,"ports":[{"id":1256,"trainrunSectionId":620,"positionIndex":0,"positionAlignment":1},{"id":1251,"trainrunSectionId":618,"positionIndex":1,"positionAlignment":1}],"transitions":[],"connections":[],"resourceId":162,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":139,"betriebspunktName":"Konstanz","fullName":"Konstanz","positionX":4256,"positionY":-416,"ports":[{"id":1250,"trainrunSectionId":617,"positionIndex":0,"positionAlignment":1}],"transitions":[],"connections":[],"resourceId":163,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":140,"betriebspunktName":"Sargans","fullName":"Sargans","positionX":4640,"positionY":1184,"ports":[{"id":1146,"trainrunSectionId":565,"positionIndex":0,"positionAlignment":0},{"id":1151,"trainrunSectionId":568,"positionIndex":0,"positionAlignment":1},{"id":1147,"trainrunSectionId":566,"positionIndex":1,"positionAlignment":1},{"id":1155,"trainrunSectionId":570,"positionIndex":2,"positionAlignment":1},{"id":1362,"trainrunSectionId":673,"positionIndex":0,"positionAlignment":2},{"id":1364,"trainrunSectionId":674,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":249,"port1Id":1146,"port2Id":1147,"isNonStopTransit":false},{"id":334,"port1Id":1151,"port2Id":1362,"isNonStopTransit":false},{"id":336,"port1Id":1155,"port2Id":1364,"isNonStopTransit":false}],"connections":[],"resourceId":164,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":141,"betriebspunktName":"Sursee","fullName":"Sursee","positionX":64,"positionY":1184,"ports":[{"id":1043,"trainrunSectionId":514,"positionIndex":0,"positionAlignment":0},{"id":1105,"trainrunSectionId":545,"positionIndex":1,"positionAlignment":0},{"id":1367,"trainrunSectionId":676,"positionIndex":2,"positionAlignment":0},{"id":1127,"trainrunSectionId":556,"positionIndex":3,"positionAlignment":0},{"id":1113,"trainrunSectionId":549,"positionIndex":4,"positionAlignment":0},{"id":1042,"trainrunSectionId":513,"positionIndex":0,"positionAlignment":1},{"id":1104,"trainrunSectionId":544,"positionIndex":1,"positionAlignment":1},{"id":1366,"trainrunSectionId":675,"positionIndex":2,"positionAlignment":1},{"id":1126,"trainrunSectionId":555,"positionIndex":3,"positionAlignment":1},{"id":1112,"trainrunSectionId":548,"positionIndex":4,"positionAlignment":1}],"transitions":[{"id":208,"port1Id":1043,"port2Id":1042,"isNonStopTransit":true},{"id":232,"port1Id":1105,"port2Id":1104,"isNonStopTransit":false},{"id":234,"port1Id":1113,"port2Id":1112,"isNonStopTransit":false},{"id":240,"port1Id":1127,"port2Id":1126,"isNonStopTransit":true},{"id":338,"port1Id":1367,"port2Id":1366,"isNonStopTransit":true}],"connections":[],"resourceId":165,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":142,"betriebspunktName":"Luzern","fullName":"Luzern","positionX":64,"positionY":1728,"ports":[{"id":1041,"trainrunSectionId":513,"positionIndex":0,"positionAlignment":0},{"id":1103,"trainrunSectionId":544,"positionIndex":1,"positionAlignment":0},{"id":1365,"trainrunSectionId":675,"positionIndex":2,"positionAlignment":0},{"id":1125,"trainrunSectionId":555,"positionIndex":3,"positionAlignment":0},{"id":1111,"trainrunSectionId":548,"positionIndex":4,"positionAlignment":0},{"id":1352,"trainrunSectionId":668,"positionIndex":0,"positionAlignment":3},{"id":1350,"trainrunSectionId":667,"positionIndex":1,"positionAlignment":3},{"id":1099,"trainrunSectionId":542,"positionIndex":2,"positionAlignment":3},{"id":1095,"trainrunSectionId":540,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":327,"port1Id":1041,"port2Id":1352,"isNonStopTransit":false},{"id":337,"port1Id":1365,"port2Id":1350,"isNonStopTransit":false}],"connections":[],"resourceId":166,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":143,"betriebspunktName":"Zofingen","fullName":"Zofingen","positionX":64,"positionY":736,"ports":[{"id":1045,"trainrunSectionId":515,"positionIndex":0,"positionAlignment":0},{"id":1369,"trainrunSectionId":677,"positionIndex":1,"positionAlignment":0},{"id":1129,"trainrunSectionId":557,"positionIndex":2,"positionAlignment":0},{"id":1115,"trainrunSectionId":550,"positionIndex":3,"positionAlignment":0},{"id":1044,"trainrunSectionId":514,"positionIndex":0,"positionAlignment":1},{"id":1106,"trainrunSectionId":545,"positionIndex":1,"positionAlignment":1},{"id":1368,"trainrunSectionId":676,"positionIndex":2,"positionAlignment":1},{"id":1128,"trainrunSectionId":556,"positionIndex":3,"positionAlignment":1},{"id":1114,"trainrunSectionId":549,"positionIndex":4,"positionAlignment":1},{"id":1107,"trainrunSectionId":546,"positionIndex":0,"positionAlignment":2}],"transitions":[{"id":209,"port1Id":1045,"port2Id":1044,"isNonStopTransit":true},{"id":233,"port1Id":1107,"port2Id":1106,"isNonStopTransit":false},{"id":235,"port1Id":1115,"port2Id":1114,"isNonStopTransit":false},{"id":241,"port1Id":1129,"port2Id":1128,"isNonStopTransit":true},{"id":339,"port1Id":1369,"port2Id":1368,"isNonStopTransit":false}],"connections":[],"resourceId":167,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":144,"betriebspunktName":"Gelterk.","fullName":"Gelterkinden","positionX":64,"positionY":-448,"ports":[{"id":1049,"trainrunSectionId":517,"positionIndex":0,"positionAlignment":0},{"id":1411,"trainrunSectionId":698,"positionIndex":1,"positionAlignment":0},{"id":1282,"trainrunSectionId":633,"positionIndex":2,"positionAlignment":0},{"id":1333,"trainrunSectionId":659,"positionIndex":3,"positionAlignment":0},{"id":1306,"trainrunSectionId":645,"positionIndex":4,"positionAlignment":0},{"id":1373,"trainrunSectionId":679,"positionIndex":5,"positionAlignment":0},{"id":1133,"trainrunSectionId":559,"positionIndex":6,"positionAlignment":0},{"id":1119,"trainrunSectionId":552,"positionIndex":7,"positionAlignment":0},{"id":1048,"trainrunSectionId":516,"positionIndex":0,"positionAlignment":1},{"id":1332,"trainrunSectionId":658,"positionIndex":1,"positionAlignment":1},{"id":1307,"trainrunSectionId":646,"positionIndex":2,"positionAlignment":1},{"id":1372,"trainrunSectionId":678,"positionIndex":3,"positionAlignment":1},{"id":1132,"trainrunSectionId":558,"positionIndex":4,"positionAlignment":1},{"id":1118,"trainrunSectionId":551,"positionIndex":5,"positionAlignment":1},{"id":1410,"trainrunSectionId":697,"positionIndex":0,"positionAlignment":3},{"id":1283,"trainrunSectionId":634,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":211,"port1Id":1049,"port2Id":1048,"isNonStopTransit":true},{"id":237,"port1Id":1119,"port2Id":1118,"isNonStopTransit":false},{"id":243,"port1Id":1133,"port2Id":1132,"isNonStopTransit":true},{"id":297,"port1Id":1282,"port2Id":1283,"isNonStopTransit":true},{"id":307,"port1Id":1306,"port2Id":1307,"isNonStopTransit":true},{"id":316,"port1Id":1333,"port2Id":1332,"isNonStopTransit":true},{"id":341,"port1Id":1373,"port2Id":1372,"isNonStopTransit":true},{"id":362,"port1Id":1411,"port2Id":1410,"isNonStopTransit":true}],"connections":[],"resourceId":168,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":145,"betriebspunktName":"Sissach","fullName":"Sissach","positionX":64,"positionY":-928,"ports":[{"id":1051,"trainrunSectionId":518,"positionIndex":0,"positionAlignment":0},{"id":1413,"trainrunSectionId":699,"positionIndex":1,"positionAlignment":0},{"id":1280,"trainrunSectionId":632,"positionIndex":2,"positionAlignment":0},{"id":1335,"trainrunSectionId":660,"positionIndex":3,"positionAlignment":0},{"id":1304,"trainrunSectionId":644,"positionIndex":4,"positionAlignment":0},{"id":1375,"trainrunSectionId":680,"positionIndex":5,"positionAlignment":0},{"id":1135,"trainrunSectionId":560,"positionIndex":6,"positionAlignment":0},{"id":1121,"trainrunSectionId":553,"positionIndex":7,"positionAlignment":0},{"id":1050,"trainrunSectionId":517,"positionIndex":0,"positionAlignment":1},{"id":1412,"trainrunSectionId":698,"positionIndex":1,"positionAlignment":1},{"id":1281,"trainrunSectionId":633,"positionIndex":2,"positionAlignment":1},{"id":1334,"trainrunSectionId":659,"positionIndex":3,"positionAlignment":1},{"id":1305,"trainrunSectionId":645,"positionIndex":4,"positionAlignment":1},{"id":1374,"trainrunSectionId":679,"positionIndex":5,"positionAlignment":1},{"id":1134,"trainrunSectionId":559,"positionIndex":6,"positionAlignment":1},{"id":1120,"trainrunSectionId":552,"positionIndex":7,"positionAlignment":1}],"transitions":[{"id":212,"port1Id":1051,"port2Id":1050,"isNonStopTransit":true},{"id":238,"port1Id":1121,"port2Id":1120,"isNonStopTransit":false},{"id":244,"port1Id":1135,"port2Id":1134,"isNonStopTransit":true},{"id":296,"port1Id":1280,"port2Id":1281,"isNonStopTransit":true},{"id":306,"port1Id":1304,"port2Id":1305,"isNonStopTransit":true},{"id":317,"port1Id":1335,"port2Id":1334,"isNonStopTransit":true},{"id":342,"port1Id":1375,"port2Id":1374,"isNonStopTransit":true},{"id":363,"port1Id":1413,"port2Id":1412,"isNonStopTransit":true}],"connections":[],"resourceId":169,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":146,"betriebspunktName":"Liestal","fullName":"Liestal","positionX":64,"positionY":-1408,"ports":[{"id":1053,"trainrunSectionId":519,"positionIndex":0,"positionAlignment":0},{"id":1415,"trainrunSectionId":700,"positionIndex":1,"positionAlignment":0},{"id":1278,"trainrunSectionId":631,"positionIndex":2,"positionAlignment":0},{"id":1337,"trainrunSectionId":661,"positionIndex":3,"positionAlignment":0},{"id":1302,"trainrunSectionId":643,"positionIndex":4,"positionAlignment":0},{"id":1377,"trainrunSectionId":681,"positionIndex":5,"positionAlignment":0},{"id":1137,"trainrunSectionId":561,"positionIndex":6,"positionAlignment":0},{"id":1123,"trainrunSectionId":554,"positionIndex":7,"positionAlignment":0},{"id":1052,"trainrunSectionId":518,"positionIndex":0,"positionAlignment":1},{"id":1414,"trainrunSectionId":699,"positionIndex":1,"positionAlignment":1},{"id":1279,"trainrunSectionId":632,"positionIndex":2,"positionAlignment":1},{"id":1336,"trainrunSectionId":660,"positionIndex":3,"positionAlignment":1},{"id":1303,"trainrunSectionId":644,"positionIndex":4,"positionAlignment":1},{"id":1376,"trainrunSectionId":680,"positionIndex":5,"positionAlignment":1},{"id":1136,"trainrunSectionId":560,"positionIndex":6,"positionAlignment":1},{"id":1122,"trainrunSectionId":553,"positionIndex":7,"positionAlignment":1}],"transitions":[{"id":213,"port1Id":1053,"port2Id":1052,"isNonStopTransit":true},{"id":239,"port1Id":1123,"port2Id":1122,"isNonStopTransit":false},{"id":245,"port1Id":1137,"port2Id":1136,"isNonStopTransit":true},{"id":295,"port1Id":1278,"port2Id":1279,"isNonStopTransit":true},{"id":305,"port1Id":1302,"port2Id":1303,"isNonStopTransit":true},{"id":318,"port1Id":1337,"port2Id":1336,"isNonStopTransit":true},{"id":343,"port1Id":1377,"port2Id":1376,"isNonStopTransit":true},{"id":364,"port1Id":1415,"port2Id":1414,"isNonStopTransit":true}],"connections":[],"resourceId":170,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":147,"betriebspunktName":"Aarau","fullName":"Aarau","positionX":960,"positionY":32,"ports":[{"id":1409,"trainrunSectionId":697,"positionIndex":0,"positionAlignment":2},{"id":1284,"trainrunSectionId":634,"positionIndex":1,"positionAlignment":2},{"id":1201,"trainrunSectionId":593,"positionIndex":2,"positionAlignment":2},{"id":1179,"trainrunSectionId":582,"positionIndex":3,"positionAlignment":2},{"id":1223,"trainrunSectionId":604,"positionIndex":4,"positionAlignment":2},{"id":1239,"trainrunSectionId":612,"positionIndex":5,"positionAlignment":2},{"id":1163,"trainrunSectionId":574,"positionIndex":6,"positionAlignment":2},{"id":1200,"trainrunSectionId":592,"positionIndex":0,"positionAlignment":3},{"id":1408,"trainrunSectionId":696,"positionIndex":1,"positionAlignment":3},{"id":1285,"trainrunSectionId":635,"positionIndex":2,"positionAlignment":3},{"id":1178,"trainrunSectionId":581,"positionIndex":3,"positionAlignment":3},{"id":1222,"trainrunSectionId":603,"positionIndex":4,"positionAlignment":3},{"id":1238,"trainrunSectionId":611,"positionIndex":5,"positionAlignment":3},{"id":1162,"trainrunSectionId":573,"positionIndex":6,"positionAlignment":3},{"id":1293,"trainrunSectionId":639,"positionIndex":7,"positionAlignment":3}],"transitions":[{"id":252,"port1Id":1163,"port2Id":1162,"isNonStopTransit":true},{"id":258,"port1Id":1179,"port2Id":1178,"isNonStopTransit":false},{"id":263,"port1Id":1201,"port2Id":1200,"isNonStopTransit":true},{"id":269,"port1Id":1223,"port2Id":1222,"isNonStopTransit":true},{"id":275,"port1Id":1239,"port2Id":1238,"isNonStopTransit":true},{"id":298,"port1Id":1284,"port2Id":1285,"isNonStopTransit":true},{"id":361,"port1Id":1409,"port2Id":1408,"isNonStopTransit":true}],"connections":[],"resourceId":171,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":148,"betriebspunktName":"Lenzburg","fullName":"Lenzburg","positionX":1344,"positionY":32,"ports":[{"id":1199,"trainrunSectionId":592,"positionIndex":0,"positionAlignment":2},{"id":1407,"trainrunSectionId":696,"positionIndex":1,"positionAlignment":2},{"id":1286,"trainrunSectionId":635,"positionIndex":2,"positionAlignment":2},{"id":1177,"trainrunSectionId":581,"positionIndex":3,"positionAlignment":2},{"id":1221,"trainrunSectionId":603,"positionIndex":4,"positionAlignment":2},{"id":1237,"trainrunSectionId":611,"positionIndex":5,"positionAlignment":2},{"id":1161,"trainrunSectionId":573,"positionIndex":6,"positionAlignment":2},{"id":1294,"trainrunSectionId":639,"positionIndex":7,"positionAlignment":2},{"id":1258,"trainrunSectionId":621,"positionIndex":0,"positionAlignment":3},{"id":1406,"trainrunSectionId":695,"positionIndex":1,"positionAlignment":3},{"id":1287,"trainrunSectionId":636,"positionIndex":2,"positionAlignment":3},{"id":1260,"trainrunSectionId":622,"positionIndex":3,"positionAlignment":3},{"id":1262,"trainrunSectionId":623,"positionIndex":4,"positionAlignment":3},{"id":1264,"trainrunSectionId":624,"positionIndex":5,"positionAlignment":3},{"id":1266,"trainrunSectionId":625,"positionIndex":6,"positionAlignment":3},{"id":1295,"trainrunSectionId":640,"positionIndex":7,"positionAlignment":3}],"transitions":[{"id":282,"port1Id":1199,"port2Id":1258,"isNonStopTransit":true},{"id":284,"port1Id":1177,"port2Id":1260,"isNonStopTransit":true},{"id":286,"port1Id":1221,"port2Id":1262,"isNonStopTransit":true},{"id":288,"port1Id":1237,"port2Id":1264,"isNonStopTransit":true},{"id":290,"port1Id":1161,"port2Id":1266,"isNonStopTransit":true},{"id":299,"port1Id":1286,"port2Id":1287,"isNonStopTransit":true},{"id":302,"port1Id":1294,"port2Id":1295,"isNonStopTransit":false},{"id":360,"port1Id":1407,"port2Id":1406,"isNonStopTransit":true}],"connections":[],"resourceId":172,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":149,"betriebspunktName":"Baden","fullName":"Baden","positionX":2240,"positionY":32,"ports":[{"id":1197,"trainrunSectionId":591,"positionIndex":0,"positionAlignment":2},{"id":1403,"trainrunSectionId":694,"positionIndex":1,"positionAlignment":2},{"id":1290,"trainrunSectionId":637,"positionIndex":2,"positionAlignment":2},{"id":1175,"trainrunSectionId":580,"positionIndex":3,"positionAlignment":2},{"id":1219,"trainrunSectionId":602,"positionIndex":4,"positionAlignment":2},{"id":1235,"trainrunSectionId":610,"positionIndex":5,"positionAlignment":2},{"id":1159,"trainrunSectionId":572,"positionIndex":6,"positionAlignment":2},{"id":1274,"trainrunSectionId":629,"positionIndex":7,"positionAlignment":2},{"id":1298,"trainrunSectionId":641,"positionIndex":8,"positionAlignment":2},{"id":1196,"trainrunSectionId":590,"positionIndex":0,"positionAlignment":3},{"id":1402,"trainrunSectionId":693,"positionIndex":1,"positionAlignment":3},{"id":1291,"trainrunSectionId":638,"positionIndex":2,"positionAlignment":3},{"id":1174,"trainrunSectionId":579,"positionIndex":3,"positionAlignment":3},{"id":1218,"trainrunSectionId":601,"positionIndex":4,"positionAlignment":3},{"id":1234,"trainrunSectionId":609,"positionIndex":5,"positionAlignment":3},{"id":1158,"trainrunSectionId":571,"positionIndex":6,"positionAlignment":3},{"id":1275,"trainrunSectionId":630,"positionIndex":7,"positionAlignment":3},{"id":1299,"trainrunSectionId":642,"positionIndex":8,"positionAlignment":3}],"transitions":[{"id":251,"port1Id":1159,"port2Id":1158,"isNonStopTransit":true},{"id":257,"port1Id":1175,"port2Id":1174,"isNonStopTransit":true},{"id":262,"port1Id":1197,"port2Id":1196,"isNonStopTransit":true},{"id":268,"port1Id":1219,"port2Id":1218,"isNonStopTransit":true},{"id":274,"port1Id":1235,"port2Id":1234,"isNonStopTransit":true},{"id":294,"port1Id":1274,"port2Id":1275,"isNonStopTransit":false},{"id":301,"port1Id":1290,"port2Id":1291,"isNonStopTransit":true},{"id":304,"port1Id":1298,"port2Id":1299,"isNonStopTransit":true},{"id":358,"port1Id":1403,"port2Id":1402,"isNonStopTransit":true}],"connections":[],"resourceId":173,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":150,"betriebspunktName":"Zürich ✈","fullName":"Zürich Flughafen","positionX":3296,"positionY":32,"ports":[{"id":1192,"trainrunSectionId":588,"positionIndex":0,"positionAlignment":2},{"id":1171,"trainrunSectionId":578,"positionIndex":1,"positionAlignment":2},{"id":1214,"trainrunSectionId":599,"positionIndex":2,"positionAlignment":2},{"id":1230,"trainrunSectionId":607,"positionIndex":3,"positionAlignment":2},{"id":1140,"trainrunSectionId":562,"positionIndex":4,"positionAlignment":2},{"id":1246,"trainrunSectionId":615,"positionIndex":5,"positionAlignment":2},{"id":1193,"trainrunSectionId":589,"positionIndex":0,"positionAlignment":3},{"id":1170,"trainrunSectionId":577,"positionIndex":1,"positionAlignment":3},{"id":1215,"trainrunSectionId":600,"positionIndex":2,"positionAlignment":3},{"id":1231,"trainrunSectionId":608,"positionIndex":3,"positionAlignment":3},{"id":1141,"trainrunSectionId":563,"positionIndex":4,"positionAlignment":3},{"id":1247,"trainrunSectionId":616,"positionIndex":5,"positionAlignment":3}],"transitions":[{"id":246,"port1Id":1140,"port2Id":1141,"isNonStopTransit":false},{"id":255,"port1Id":1171,"port2Id":1170,"isNonStopTransit":false},{"id":260,"port1Id":1192,"port2Id":1193,"isNonStopTransit":false},{"id":266,"port1Id":1214,"port2Id":1215,"isNonStopTransit":false},{"id":272,"port1Id":1230,"port2Id":1231,"isNonStopTransit":false},{"id":278,"port1Id":1246,"port2Id":1247,"isNonStopTransit":false}],"connections":[],"resourceId":174,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":151,"betriebspunktName":"Wintert.","fullName":"Winterthur","positionX":3872,"positionY":32,"ports":[{"id":1249,"trainrunSectionId":617,"positionIndex":0,"positionAlignment":0},{"id":1194,"trainrunSectionId":589,"positionIndex":0,"positionAlignment":2},{"id":1169,"trainrunSectionId":577,"positionIndex":1,"positionAlignment":2},{"id":1216,"trainrunSectionId":600,"positionIndex":2,"positionAlignment":2},{"id":1232,"trainrunSectionId":608,"positionIndex":3,"positionAlignment":2},{"id":1142,"trainrunSectionId":563,"positionIndex":4,"positionAlignment":2},{"id":1248,"trainrunSectionId":616,"positionIndex":5,"positionAlignment":2},{"id":1227,"trainrunSectionId":606,"positionIndex":0,"positionAlignment":3},{"id":1243,"trainrunSectionId":614,"positionIndex":1,"positionAlignment":3},{"id":1211,"trainrunSectionId":598,"positionIndex":2,"positionAlignment":3},{"id":1168,"trainrunSectionId":576,"positionIndex":3,"positionAlignment":3},{"id":1143,"trainrunSectionId":564,"positionIndex":4,"positionAlignment":3}],"transitions":[{"id":247,"port1Id":1142,"port2Id":1143,"isNonStopTransit":false},{"id":254,"port1Id":1169,"port2Id":1168,"isNonStopTransit":false},{"id":265,"port1Id":1194,"port2Id":1211,"isNonStopTransit":false},{"id":271,"port1Id":1216,"port2Id":1227,"isNonStopTransit":false},{"id":277,"port1Id":1232,"port2Id":1243,"isNonStopTransit":false},{"id":279,"port1Id":1249,"port2Id":1248,"isNonStopTransit":false}],"connections":[],"resourceId":175,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":152,"betriebspunktName":"Chur","fullName":"Chur","positionX":4640,"positionY":1888,"ports":[{"id":1152,"trainrunSectionId":568,"positionIndex":0,"positionAlignment":0},{"id":1148,"trainrunSectionId":566,"positionIndex":1,"positionAlignment":0},{"id":1156,"trainrunSectionId":570,"positionIndex":2,"positionAlignment":0}],"transitions":[],"connections":[],"resourceId":176,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":153,"betriebspunktName":"Zug","fullName":"Zug","positionX":2656,"positionY":1312,"ports":[{"id":1067,"trainrunSectionId":526,"positionIndex":0,"positionAlignment":0},{"id":1093,"trainrunSectionId":539,"positionIndex":1,"positionAlignment":0},{"id":1101,"trainrunSectionId":543,"positionIndex":2,"positionAlignment":0},{"id":1097,"trainrunSectionId":541,"positionIndex":3,"positionAlignment":0},{"id":1066,"trainrunSectionId":525,"positionIndex":0,"positionAlignment":1},{"id":1092,"trainrunSectionId":538,"positionIndex":1,"positionAlignment":1},{"id":1348,"trainrunSectionId":666,"positionIndex":0,"positionAlignment":2},{"id":1346,"trainrunSectionId":665,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":220,"port1Id":1067,"port2Id":1066,"isNonStopTransit":false},{"id":231,"port1Id":1093,"port2Id":1092,"isNonStopTransit":false},{"id":322,"port1Id":1097,"port2Id":1346,"isNonStopTransit":false},{"id":324,"port1Id":1101,"port2Id":1348,"isNonStopTransit":false}],"connections":[],"resourceId":177,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":154,"betriebspunktName":"Arth-G.","fullName":"Arth-Goldau","positionX":2656,"positionY":1792,"ports":[{"id":1065,"trainrunSectionId":525,"positionIndex":0,"positionAlignment":0},{"id":1091,"trainrunSectionId":538,"positionIndex":1,"positionAlignment":0},{"id":1064,"trainrunSectionId":524,"positionIndex":0,"positionAlignment":1},{"id":1038,"trainrunSectionId":511,"positionIndex":1,"positionAlignment":1},{"id":1078,"trainrunSectionId":531,"positionIndex":2,"positionAlignment":1},{"id":1090,"trainrunSectionId":537,"positionIndex":3,"positionAlignment":1},{"id":1039,"trainrunSectionId":512,"positionIndex":0,"positionAlignment":2},{"id":1079,"trainrunSectionId":532,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":207,"port1Id":1038,"port2Id":1039,"isNonStopTransit":false},{"id":219,"port1Id":1065,"port2Id":1064,"isNonStopTransit":false},{"id":225,"port1Id":1078,"port2Id":1079,"isNonStopTransit":false},{"id":230,"port1Id":1091,"port2Id":1090,"isNonStopTransit":false}],"connections":[],"resourceId":178,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":155,"betriebspunktName":"Altdorf","fullName":"Altdorf","positionX":2656,"positionY":2176,"ports":[{"id":1063,"trainrunSectionId":524,"positionIndex":0,"positionAlignment":0},{"id":1037,"trainrunSectionId":511,"positionIndex":1,"positionAlignment":0},{"id":1077,"trainrunSectionId":531,"positionIndex":2,"positionAlignment":0},{"id":1089,"trainrunSectionId":537,"positionIndex":3,"positionAlignment":0},{"id":1062,"trainrunSectionId":523,"positionIndex":0,"positionAlignment":1},{"id":1055,"trainrunSectionId":520,"positionIndex":1,"positionAlignment":1},{"id":1076,"trainrunSectionId":530,"positionIndex":0,"positionAlignment":2},{"id":1088,"trainrunSectionId":536,"positionIndex":1,"positionAlignment":2}],"transitions":[{"id":214,"port1Id":1037,"port2Id":1055,"isNonStopTransit":true},{"id":218,"port1Id":1063,"port2Id":1062,"isNonStopTransit":false},{"id":224,"port1Id":1077,"port2Id":1076,"isNonStopTransit":false},{"id":229,"port1Id":1089,"port2Id":1088,"isNonStopTransit":false}],"connections":[],"resourceId":179,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":156,"betriebspunktName":"Lugano","fullName":"Lugano","positionX":2592,"positionY":3712,"ports":[{"id":1057,"trainrunSectionId":521,"positionIndex":0,"positionAlignment":0},{"id":1033,"trainrunSectionId":509,"positionIndex":1,"positionAlignment":0}],"transitions":[],"connections":[],"resourceId":180,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":157,"betriebspunktName":"Locarno","fullName":"Locarno","positionX":2208,"positionY":3232,"ports":[{"id":1069,"trainrunSectionId":527,"positionIndex":0,"positionAlignment":3},{"id":1081,"trainrunSectionId":533,"positionIndex":1,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":181,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":158,"betriebspunktName":"Biasca","fullName":"Biasca","positionX":2592,"positionY":2688,"ports":[{"id":1073,"trainrunSectionId":529,"positionIndex":0,"positionAlignment":0},{"id":1085,"trainrunSectionId":535,"positionIndex":1,"positionAlignment":0},{"id":1061,"trainrunSectionId":523,"positionIndex":2,"positionAlignment":0},{"id":1056,"trainrunSectionId":520,"positionIndex":3,"positionAlignment":0},{"id":1060,"trainrunSectionId":522,"positionIndex":0,"positionAlignment":1},{"id":1036,"trainrunSectionId":510,"positionIndex":1,"positionAlignment":1},{"id":1072,"trainrunSectionId":528,"positionIndex":2,"positionAlignment":1},{"id":1084,"trainrunSectionId":534,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":215,"port1Id":1056,"port2Id":1036,"isNonStopTransit":true},{"id":217,"port1Id":1061,"port2Id":1060,"isNonStopTransit":true},{"id":222,"port1Id":1073,"port2Id":1072,"isNonStopTransit":false},{"id":227,"port1Id":1085,"port2Id":1084,"isNonStopTransit":false}],"connections":[],"resourceId":182,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":159,"betriebspunktName":"Göschn.","fullName":"Göschenen","positionX":2272,"positionY":2240,"ports":[{"id":1074,"trainrunSectionId":529,"positionIndex":0,"positionAlignment":1},{"id":1086,"trainrunSectionId":535,"positionIndex":1,"positionAlignment":1},{"id":1075,"trainrunSectionId":530,"positionIndex":0,"positionAlignment":3},{"id":1087,"trainrunSectionId":536,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":223,"port1Id":1074,"port2Id":1075,"isNonStopTransit":false},{"id":228,"port1Id":1086,"port2Id":1087,"isNonStopTransit":false}],"connections":[],"resourceId":183,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":160,"betriebspunktName":"Genf","fullName":"Genf","positionX":-3936,"positionY":608,"ports":[{"id":1209,"trainrunSectionId":597,"positionIndex":0,"positionAlignment":2},{"id":1185,"trainrunSectionId":585,"positionIndex":1,"positionAlignment":2},{"id":1189,"trainrunSectionId":587,"positionIndex":2,"positionAlignment":2},{"id":1424,"trainrunSectionId":704,"positionIndex":0,"positionAlignment":3},{"id":1426,"trainrunSectionId":705,"positionIndex":1,"positionAlignment":3},{"id":1422,"trainrunSectionId":703,"positionIndex":2,"positionAlignment":3}],"transitions":[{"id":369,"port1Id":1189,"port2Id":1422,"isNonStopTransit":false},{"id":371,"port1Id":1209,"port2Id":1424,"isNonStopTransit":false},{"id":373,"port1Id":1185,"port2Id":1426,"isNonStopTransit":false}],"connections":[],"resourceId":184,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":161,"betriebspunktName":"Genf ✈","fullName":"Aiport","positionX":-4352,"positionY":608,"ports":[{"id":1210,"trainrunSectionId":597,"positionIndex":0,"positionAlignment":3},{"id":1186,"trainrunSectionId":585,"positionIndex":1,"positionAlignment":3},{"id":1190,"trainrunSectionId":587,"positionIndex":2,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":185,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":162,"betriebspunktName":"Romansh.","fullName":"Romanshorn","positionX":4640,"positionY":-192,"ports":[{"id":1228,"trainrunSectionId":606,"positionIndex":0,"positionAlignment":2},{"id":1244,"trainrunSectionId":614,"positionIndex":1,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":186,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":163,"betriebspunktName":"Bülach","fullName":"Bülach","positionX":2784,"positionY":-544,"ports":[{"id":1252,"trainrunSectionId":618,"positionIndex":0,"positionAlignment":0},{"id":1253,"trainrunSectionId":619,"positionIndex":0,"positionAlignment":1}],"transitions":[{"id":280,"port1Id":1252,"port2Id":1253,"isNonStopTransit":false}],"connections":[],"resourceId":187,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":164,"betriebspunktName":"Reihnf.","fullName":"Reihnfelden","positionX":1056,"positionY":-960,"ports":[{"id":1268,"trainrunSectionId":626,"positionIndex":0,"positionAlignment":2},{"id":1269,"trainrunSectionId":627,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":291,"port1Id":1268,"port2Id":1269,"isNonStopTransit":false}],"connections":[],"resourceId":188,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":165,"betriebspunktName":"Frick","fullName":"Frick","positionX":1792,"positionY":-672,"ports":[{"id":1271,"trainrunSectionId":628,"positionIndex":0,"positionAlignment":1},{"id":1270,"trainrunSectionId":627,"positionIndex":0,"positionAlignment":2}],"transitions":[{"id":292,"port1Id":1271,"port2Id":1270,"isNonStopTransit":false}],"connections":[],"resourceId":189,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":166,"betriebspunktName":"Brugg","fullName":"Brugg","positionX":1792,"positionY":32,"ports":[{"id":1272,"trainrunSectionId":628,"positionIndex":0,"positionAlignment":0},{"id":1257,"trainrunSectionId":621,"positionIndex":0,"positionAlignment":2},{"id":1405,"trainrunSectionId":695,"positionIndex":1,"positionAlignment":2},{"id":1288,"trainrunSectionId":636,"positionIndex":2,"positionAlignment":2},{"id":1259,"trainrunSectionId":622,"positionIndex":3,"positionAlignment":2},{"id":1261,"trainrunSectionId":623,"positionIndex":4,"positionAlignment":2},{"id":1263,"trainrunSectionId":624,"positionIndex":5,"positionAlignment":2},{"id":1265,"trainrunSectionId":625,"positionIndex":6,"positionAlignment":2},{"id":1296,"trainrunSectionId":640,"positionIndex":7,"positionAlignment":2},{"id":1198,"trainrunSectionId":591,"positionIndex":0,"positionAlignment":3},{"id":1404,"trainrunSectionId":694,"positionIndex":1,"positionAlignment":3},{"id":1289,"trainrunSectionId":637,"positionIndex":2,"positionAlignment":3},{"id":1176,"trainrunSectionId":580,"positionIndex":3,"positionAlignment":3},{"id":1220,"trainrunSectionId":602,"positionIndex":4,"positionAlignment":3},{"id":1236,"trainrunSectionId":610,"positionIndex":5,"positionAlignment":3},{"id":1160,"trainrunSectionId":572,"positionIndex":6,"positionAlignment":3},{"id":1273,"trainrunSectionId":629,"positionIndex":7,"positionAlignment":3},{"id":1297,"trainrunSectionId":641,"positionIndex":8,"positionAlignment":3}],"transitions":[{"id":281,"port1Id":1257,"port2Id":1198,"isNonStopTransit":true},{"id":283,"port1Id":1259,"port2Id":1176,"isNonStopTransit":true},{"id":285,"port1Id":1261,"port2Id":1220,"isNonStopTransit":true},{"id":287,"port1Id":1263,"port2Id":1236,"isNonStopTransit":false},{"id":289,"port1Id":1265,"port2Id":1160,"isNonStopTransit":true},{"id":293,"port1Id":1272,"port2Id":1273,"isNonStopTransit":false},{"id":300,"port1Id":1288,"port2Id":1289,"isNonStopTransit":true},{"id":303,"port1Id":1296,"port2Id":1297,"isNonStopTransit":true},{"id":359,"port1Id":1405,"port2Id":1404,"isNonStopTransit":true}],"connections":[],"resourceId":190,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":167,"betriebspunktName":"Thun","fullName":"Thun","positionX":-2144,"positionY":640,"ports":[{"id":1327,"trainrunSectionId":656,"positionIndex":0,"positionAlignment":0},{"id":1312,"trainrunSectionId":648,"positionIndex":1,"positionAlignment":0},{"id":1314,"trainrunSectionId":649,"positionIndex":2,"positionAlignment":0},{"id":1340,"trainrunSectionId":662,"positionIndex":3,"positionAlignment":0},{"id":1326,"trainrunSectionId":655,"positionIndex":0,"positionAlignment":1},{"id":1315,"trainrunSectionId":650,"positionIndex":1,"positionAlignment":1},{"id":1319,"trainrunSectionId":652,"positionIndex":2,"positionAlignment":1},{"id":1341,"trainrunSectionId":663,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":309,"port1Id":1312,"port2Id":1315,"isNonStopTransit":false},{"id":311,"port1Id":1314,"port2Id":1319,"isNonStopTransit":false},{"id":314,"port1Id":1327,"port2Id":1326,"isNonStopTransit":false},{"id":319,"port1Id":1340,"port2Id":1341,"isNonStopTransit":false}],"connections":[],"resourceId":191,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":168,"betriebspunktName":"Spiez","fullName":"Spiez","positionX":-2144,"positionY":928,"ports":[{"id":1325,"trainrunSectionId":655,"positionIndex":0,"positionAlignment":0},{"id":1316,"trainrunSectionId":650,"positionIndex":1,"positionAlignment":0},{"id":1320,"trainrunSectionId":652,"positionIndex":2,"positionAlignment":0},{"id":1342,"trainrunSectionId":663,"positionIndex":3,"positionAlignment":0},{"id":1324,"trainrunSectionId":654,"positionIndex":0,"positionAlignment":1},{"id":1321,"trainrunSectionId":653,"positionIndex":1,"positionAlignment":1},{"id":1317,"trainrunSectionId":651,"positionIndex":0,"positionAlignment":3},{"id":1343,"trainrunSectionId":664,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":310,"port1Id":1316,"port2Id":1317,"isNonStopTransit":false},{"id":312,"port1Id":1320,"port2Id":1321,"isNonStopTransit":false},{"id":313,"port1Id":1325,"port2Id":1324,"isNonStopTransit":false},{"id":320,"port1Id":1342,"port2Id":1343,"isNonStopTransit":false}],"connections":[],"resourceId":192,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":169,"betriebspunktName":"Rothkr.","fullName":"Rothkreuz","positionX":1856,"positionY":1728,"ports":[{"id":1351,"trainrunSectionId":668,"positionIndex":0,"positionAlignment":2},{"id":1349,"trainrunSectionId":667,"positionIndex":1,"positionAlignment":2},{"id":1100,"trainrunSectionId":542,"positionIndex":2,"positionAlignment":2},{"id":1096,"trainrunSectionId":540,"positionIndex":3,"positionAlignment":2},{"id":1347,"trainrunSectionId":666,"positionIndex":0,"positionAlignment":3},{"id":1345,"trainrunSectionId":665,"positionIndex":1,"positionAlignment":3},{"id":1040,"trainrunSectionId":512,"positionIndex":2,"positionAlignment":3},{"id":1080,"trainrunSectionId":532,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":321,"port1Id":1096,"port2Id":1345,"isNonStopTransit":false},{"id":323,"port1Id":1100,"port2Id":1347,"isNonStopTransit":true},{"id":325,"port1Id":1349,"port2Id":1080,"isNonStopTransit":true},{"id":326,"port1Id":1351,"port2Id":1040,"isNonStopTransit":true}],"connections":[],"resourceId":193,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":170,"betriebspunktName":"Thalwil","fullName":"Thalwil","positionX":2656,"positionY":736,"ports":[{"id":1359,"trainrunSectionId":672,"positionIndex":0,"positionAlignment":0},{"id":1150,"trainrunSectionId":567,"positionIndex":1,"positionAlignment":0},{"id":1154,"trainrunSectionId":569,"positionIndex":2,"positionAlignment":0},{"id":1357,"trainrunSectionId":671,"positionIndex":3,"positionAlignment":0},{"id":1355,"trainrunSectionId":670,"positionIndex":4,"positionAlignment":0},{"id":1353,"trainrunSectionId":669,"positionIndex":5,"positionAlignment":0},{"id":1068,"trainrunSectionId":526,"positionIndex":0,"positionAlignment":1},{"id":1094,"trainrunSectionId":539,"positionIndex":1,"positionAlignment":1},{"id":1102,"trainrunSectionId":543,"positionIndex":2,"positionAlignment":1},{"id":1098,"trainrunSectionId":541,"positionIndex":3,"positionAlignment":1},{"id":1361,"trainrunSectionId":673,"positionIndex":0,"positionAlignment":3},{"id":1363,"trainrunSectionId":674,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":328,"port1Id":1353,"port2Id":1098,"isNonStopTransit":false},{"id":330,"port1Id":1355,"port2Id":1102,"isNonStopTransit":true},{"id":331,"port1Id":1357,"port2Id":1094,"isNonStopTransit":true},{"id":332,"port1Id":1359,"port2Id":1068,"isNonStopTransit":true},{"id":333,"port1Id":1150,"port2Id":1361,"isNonStopTransit":true},{"id":335,"port1Id":1154,"port2Id":1363,"isNonStopTransit":false}],"connections":[],"resourceId":194,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":171,"betriebspunktName":"Fribourg","fullName":"Fribourg","positionX":-2560,"positionY":288,"ports":[{"id":1381,"trainrunSectionId":683,"positionIndex":0,"positionAlignment":2},{"id":1379,"trainrunSectionId":682,"positionIndex":1,"positionAlignment":2},{"id":1206,"trainrunSectionId":595,"positionIndex":0,"positionAlignment":3},{"id":1110,"trainrunSectionId":547,"positionIndex":1,"positionAlignment":3}],"transitions":[{"id":344,"port1Id":1379,"port2Id":1110,"isNonStopTransit":false},{"id":346,"port1Id":1381,"port2Id":1206,"isNonStopTransit":false}],"connections":[],"resourceId":195,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":172,"betriebspunktName":"RTR","fullName":"Rothrist","positionX":-608,"positionY":128,"ports":[{"id":1395,"trainrunSectionId":690,"positionIndex":0,"positionAlignment":2},{"id":1438,"trainrunSectionId":711,"positionIndex":1,"positionAlignment":2},{"id":1391,"trainrunSectionId":688,"positionIndex":2,"positionAlignment":2},{"id":1389,"trainrunSectionId":687,"positionIndex":3,"positionAlignment":2},{"id":1387,"trainrunSectionId":686,"positionIndex":4,"positionAlignment":2},{"id":1383,"trainrunSectionId":684,"positionIndex":5,"positionAlignment":2},{"id":1385,"trainrunSectionId":685,"positionIndex":6,"positionAlignment":2},{"id":1204,"trainrunSectionId":594,"positionIndex":0,"positionAlignment":3},{"id":1393,"trainrunSectionId":689,"positionIndex":1,"positionAlignment":3},{"id":1310,"trainrunSectionId":647,"positionIndex":2,"positionAlignment":3},{"id":1226,"trainrunSectionId":605,"positionIndex":3,"positionAlignment":3},{"id":1242,"trainrunSectionId":613,"positionIndex":4,"positionAlignment":3},{"id":1166,"trainrunSectionId":575,"positionIndex":5,"positionAlignment":3},{"id":1108,"trainrunSectionId":546,"positionIndex":6,"positionAlignment":3}],"transitions":[{"id":348,"port1Id":1108,"port2Id":1383,"isNonStopTransit":true},{"id":349,"port1Id":1385,"port2Id":1166,"isNonStopTransit":true},{"id":350,"port1Id":1387,"port2Id":1242,"isNonStopTransit":true},{"id":351,"port1Id":1389,"port2Id":1226,"isNonStopTransit":true},{"id":352,"port1Id":1391,"port2Id":1310,"isNonStopTransit":true},{"id":354,"port1Id":1395,"port2Id":1204,"isNonStopTransit":true},{"id":384,"port1Id":1438,"port2Id":1393,"isNonStopTransit":true}],"connections":[],"resourceId":196,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":173,"betriebspunktName":"Burgdorf","fullName":"Burgdorf","positionX":-1344,"positionY":352,"ports":[{"id":1397,"trainrunSectionId":691,"positionIndex":0,"positionAlignment":2},{"id":1400,"trainrunSectionId":692,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":356,"port1Id":1397,"port2Id":1400,"isNonStopTransit":false}],"connections":[],"resourceId":197,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":174,"betriebspunktName":"Langent.","fullName":"Langenthal","positionX":-992,"positionY":352,"ports":[{"id":1399,"trainrunSectionId":692,"positionIndex":0,"positionAlignment":2},{"id":1386,"trainrunSectionId":685,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":355,"port1Id":1399,"port2Id":1386,"isNonStopTransit":false}],"connections":[],"resourceId":198,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":175,"betriebspunktName":"Solothurn","fullName":"Solothurn","positionX":-1696,"positionY":-32,"ports":[{"id":1417,"trainrunSectionId":701,"positionIndex":0,"positionAlignment":2},{"id":1182,"trainrunSectionId":583,"positionIndex":0,"positionAlignment":3}],"transitions":[{"id":365,"port1Id":1417,"port2Id":1182,"isNonStopTransit":false}],"connections":[],"resourceId":199,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":176,"betriebspunktName":"Rohrsch.","fullName":"Rohrschach","positionX":5376,"positionY":96,"ports":[{"id":1420,"trainrunSectionId":702,"positionIndex":0,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":200,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":177,"betriebspunktName":"Morges","fullName":"Morges","positionX":-3520,"positionY":544,"ports":[{"id":1423,"trainrunSectionId":704,"positionIndex":0,"positionAlignment":2},{"id":1425,"trainrunSectionId":705,"positionIndex":1,"positionAlignment":2},{"id":1421,"trainrunSectionId":703,"positionIndex":2,"positionAlignment":2},{"id":1184,"trainrunSectionId":584,"positionIndex":0,"positionAlignment":3},{"id":1208,"trainrunSectionId":596,"positionIndex":1,"positionAlignment":3},{"id":1188,"trainrunSectionId":586,"positionIndex":2,"positionAlignment":3}],"transitions":[{"id":368,"port1Id":1421,"port2Id":1188,"isNonStopTransit":false},{"id":370,"port1Id":1423,"port2Id":1208,"isNonStopTransit":true},{"id":372,"port1Id":1425,"port2Id":1184,"isNonStopTransit":false}],"connections":[],"resourceId":201,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]},{"id":178,"betriebspunktName":"BNWD","fullName":"Bern Wankdorf","positionX":-1696,"positionY":128,"ports":[{"id":1439,"trainrunSectionId":712,"positionIndex":0,"positionAlignment":2},{"id":1330,"trainrunSectionId":657,"positionIndex":1,"positionAlignment":2},{"id":1435,"trainrunSectionId":710,"positionIndex":2,"positionAlignment":2},{"id":1433,"trainrunSectionId":709,"positionIndex":3,"positionAlignment":2},{"id":1431,"trainrunSectionId":708,"positionIndex":4,"positionAlignment":2},{"id":1429,"trainrunSectionId":707,"positionIndex":5,"positionAlignment":2},{"id":1427,"trainrunSectionId":706,"positionIndex":6,"positionAlignment":2},{"id":1396,"trainrunSectionId":690,"positionIndex":0,"positionAlignment":3},{"id":1437,"trainrunSectionId":711,"positionIndex":1,"positionAlignment":3},{"id":1392,"trainrunSectionId":688,"positionIndex":2,"positionAlignment":3},{"id":1390,"trainrunSectionId":687,"positionIndex":3,"positionAlignment":3},{"id":1388,"trainrunSectionId":686,"positionIndex":4,"positionAlignment":3},{"id":1384,"trainrunSectionId":684,"positionIndex":5,"positionAlignment":3},{"id":1398,"trainrunSectionId":691,"positionIndex":6,"positionAlignment":3}],"transitions":[{"id":374,"port1Id":1427,"port2Id":1398,"isNonStopTransit":true},{"id":375,"port1Id":1429,"port2Id":1384,"isNonStopTransit":true},{"id":377,"port1Id":1431,"port2Id":1388,"isNonStopTransit":true},{"id":379,"port1Id":1433,"port2Id":1390,"isNonStopTransit":true},{"id":381,"port1Id":1435,"port2Id":1392,"isNonStopTransit":true},{"id":383,"port1Id":1330,"port2Id":1437,"isNonStopTransit":true},{"id":385,"port1Id":1439,"port2Id":1396,"isNonStopTransit":true}],"connections":[],"resourceId":202,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[]}],"trainrunSections":[{"id":509,"sourceNodeId":156,"sourcePortId":1033,"targetNodeId":136,"targetPortId":1034,"travelTime":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":182},"sourceArrival":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":178},"targetDeparture":{"lock":false,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":164},"targetArrival":{"lock":false,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":196},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2640,"y":3710},{"x":2640,"y":3646},{"x":2640,"y":3390},{"x":2640,"y":3326}],"textPositions":{"0":{"x":2652,"y":3692},"1":{"x":2628,"y":3664},"2":{"x":2628,"y":3344},"3":{"x":2652,"y":3372},"4":{"x":2628,"y":3518},"5":{"x":2628,"y":3518},"6":{"x":2652,"y":3518}}},"warnings":null},{"id":510,"sourceNodeId":136,"sourcePortId":1035,"targetNodeId":158,"targetPortId":1036,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":198},"sourceArrival":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":162},"targetDeparture":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":156},"targetArrival":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":204},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2640,"y":3230},{"x":2640,"y":3166},{"x":2640,"y":2818},{"x":2640,"y":2754}],"textPositions":{"0":{"x":2652,"y":3212},"1":{"x":2628,"y":3184},"2":{"x":2628,"y":2772},"3":{"x":2652,"y":2800},"4":{"x":2628,"y":2992},"5":{"x":2628,"y":2992},"6":{"x":2652,"y":2992}}},"warnings":null},{"id":511,"sourceNodeId":155,"sourcePortId":1037,"targetNodeId":154,"targetPortId":1038,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":232},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":128},"targetDeparture":{"lock":true,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":109},"targetArrival":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":251},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":2174},{"x":2704,"y":2110},{"x":2704,"y":1950},{"x":2704,"y":1886}],"textPositions":{"0":{"x":2716,"y":2156},"1":{"x":2692,"y":2128},"2":{"x":2692,"y":1904},"3":{"x":2716,"y":1932},"4":{"x":2692,"y":2030},"5":{"x":2692,"y":2030},"6":{"x":2716,"y":2030}}},"warnings":null},{"id":512,"sourceNodeId":154,"sourcePortId":1039,"targetNodeId":169,"targetPortId":1040,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":255},"sourceArrival":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":105},"targetDeparture":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":87},"targetArrival":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":273},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":1808},{"x":2590,"y":1808},{"x":2018,"y":1808},{"x":1954,"y":1808}],"textPositions":{"0":{"x":2636,"y":1796},"1":{"x":2608,"y":1820},"2":{"x":1972,"y":1820},"3":{"x":2000,"y":1796},"4":{"x":2304,"y":1796},"5":{"x":2304,"y":1796},"6":{"x":2304,"y":1820}}},"warnings":null},{"id":513,"sourceNodeId":142,"sourcePortId":1041,"targetNodeId":141,"targetPortId":1042,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":295},"sourceArrival":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":1726},{"x":80,"y":1662},{"x":80,"y":1314},{"x":80,"y":1250}],"textPositions":{"0":{"x":92,"y":1708},"1":{"x":68,"y":1680},"2":{"x":68,"y":1268},"3":{"x":92,"y":1296},"4":{"x":68,"y":1488},"5":{"x":68,"y":1488},"6":{"x":92,"y":1488}}},"warnings":null},{"id":514,"sourceNodeId":141,"sourcePortId":1043,"targetNodeId":143,"targetPortId":1044,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"sourceArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetDeparture":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":37},"targetArrival":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":323},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":1182},{"x":80,"y":1118},{"x":80,"y":866},{"x":80,"y":802}],"textPositions":{"0":{"x":92,"y":1164},"1":{"x":68,"y":1136},"2":{"x":68,"y":820},"3":{"x":92,"y":848},"4":{"x":68,"y":992},"5":{"x":68,"y":992},"6":{"x":92,"y":992}}},"warnings":null},{"id":515,"sourceNodeId":143,"sourcePortId":1045,"targetNodeId":133,"targetPortId":1046,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":323},"sourceArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":37},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":30},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":734},{"x":80,"y":670},{"x":80,"y":414},{"x":80,"y":350}],"textPositions":{"0":{"x":92,"y":716},"1":{"x":68,"y":688},"2":{"x":68,"y":368},"3":{"x":92,"y":396},"4":{"x":68,"y":542},"5":{"x":68,"y":542},"6":{"x":92,"y":542}}},"warnings":null},{"id":516,"sourceNodeId":133,"sourcePortId":1047,"targetNodeId":144,"targetPortId":1048,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":332},"sourceArrival":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":28},"targetDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"targetArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":342},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":94},{"x":80,"y":30},{"x":80,"y":-290},{"x":80,"y":-354}],"textPositions":{"0":{"x":92,"y":76},"1":{"x":68,"y":48},"2":{"x":68,"y":-336},"3":{"x":92,"y":-308},"4":{"x":68,"y":-130},"5":{"x":68,"y":-130},"6":{"x":92,"y":-130}}},"warnings":null},{"id":517,"sourceNodeId":144,"sourcePortId":1049,"targetNodeId":145,"targetPortId":1050,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":342},"sourceArrival":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":-450},{"x":80,"y":-514},{"x":80,"y":-798},{"x":80,"y":-862}],"textPositions":{"0":{"x":92,"y":-468},"1":{"x":68,"y":-496},"2":{"x":68,"y":-844},"3":{"x":92,"y":-816},"4":{"x":68,"y":-656},"5":{"x":68,"y":-656},"6":{"x":92,"y":-656}}},"warnings":null},{"id":518,"sourceNodeId":145,"sourcePortId":1051,"targetNodeId":146,"targetPortId":1052,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":8},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":352},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":-930},{"x":80,"y":-994},{"x":80,"y":-1278},{"x":80,"y":-1342}],"textPositions":{"0":{"x":92,"y":-948},"1":{"x":68,"y":-976},"2":{"x":68,"y":-1324},"3":{"x":92,"y":-1296},"4":{"x":68,"y":-1136},"5":{"x":68,"y":-1136},"6":{"x":92,"y":-1136}}},"warnings":null},{"id":519,"sourceNodeId":146,"sourcePortId":1053,"targetNodeId":134,"targetPortId":1054,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":352},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":8},"targetDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":3},"targetArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":357},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":80,"y":-1410},{"x":80,"y":-1474},{"x":80,"y":-1758},{"x":80,"y":-1822}],"textPositions":{"0":{"x":92,"y":-1428},"1":{"x":68,"y":-1456},"2":{"x":68,"y":-1804},"3":{"x":92,"y":-1776},"4":{"x":68,"y":-1616},"5":{"x":68,"y":-1616},"6":{"x":92,"y":-1616}}},"warnings":null},{"id":520,"sourceNodeId":155,"sourcePortId":1055,"targetNodeId":158,"targetPortId":1056,"travelTime":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":128},"sourceArrival":{"lock":true,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":232},"targetDeparture":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":204},"targetArrival":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":156},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":2270},{"x":2704,"y":2334},{"x":2704,"y":2622},{"x":2704,"y":2686}],"textPositions":{"0":{"x":2692,"y":2288},"1":{"x":2716,"y":2316},"2":{"x":2716,"y":2668},"3":{"x":2692,"y":2640},"4":{"x":2692,"y":2478},"5":{"x":2692,"y":2478},"6":{"x":2716,"y":2478}}},"warnings":null},{"id":521,"sourceNodeId":156,"sourcePortId":1057,"targetNodeId":136,"targetPortId":1058,"travelTime":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":2},"sourceArrival":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":118},"targetDeparture":{"lock":false,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":104},"targetArrival":{"lock":false,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":16},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2608,"y":3710},{"x":2608,"y":3646},{"x":2608,"y":3390},{"x":2608,"y":3326}],"textPositions":{"0":{"x":2620,"y":3692},"1":{"x":2596,"y":3664},"2":{"x":2596,"y":3344},"3":{"x":2620,"y":3372},"4":{"x":2596,"y":3518},"5":{"x":2596,"y":3518},"6":{"x":2620,"y":3518}}},"warnings":null},{"id":522,"sourceNodeId":136,"sourcePortId":1059,"targetNodeId":158,"targetPortId":1060,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"sourceArrival":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":102},"targetDeparture":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":96},"targetArrival":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":24},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2608,"y":3230},{"x":2608,"y":3166},{"x":2608,"y":2818},{"x":2608,"y":2754}],"textPositions":{"0":{"x":2620,"y":3212},"1":{"x":2596,"y":3184},"2":{"x":2596,"y":2772},"3":{"x":2620,"y":2800},"4":{"x":2596,"y":2992},"5":{"x":2596,"y":2992},"6":{"x":2620,"y":2992}}},"warnings":null},{"id":523,"sourceNodeId":158,"sourcePortId":1061,"targetNodeId":155,"targetPortId":1062,"travelTime":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":24},"sourceArrival":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":96},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":2686},{"x":2672,"y":2622},{"x":2672,"y":2334},{"x":2672,"y":2270}],"textPositions":{"0":{"x":2684,"y":2668},"1":{"x":2660,"y":2640},"2":{"x":2660,"y":2288},"3":{"x":2684,"y":2316},"4":{"x":2660,"y":2478},"5":{"x":2660,"y":2478},"6":{"x":2684,"y":2478}}},"warnings":null},{"id":524,"sourceNodeId":155,"sourcePortId":1063,"targetNodeId":154,"targetPortId":1064,"travelTime":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetDeparture":{"lock":true,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":49},"targetArrival":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":71},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":2174},{"x":2672,"y":2110},{"x":2672,"y":1950},{"x":2672,"y":1886}],"textPositions":{"0":{"x":2684,"y":2156},"1":{"x":2660,"y":2128},"2":{"x":2660,"y":1904},"3":{"x":2684,"y":1932},"4":{"x":2660,"y":2030},"5":{"x":2660,"y":2030},"6":{"x":2684,"y":2030}}},"warnings":null},{"id":525,"sourceNodeId":154,"sourcePortId":1065,"targetNodeId":153,"targetPortId":1066,"travelTime":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":75},"sourceArrival":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":45},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":30},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":1790},{"x":2672,"y":1726},{"x":2672,"y":1470},{"x":2672,"y":1406}],"textPositions":{"0":{"x":2684,"y":1772},"1":{"x":2660,"y":1744},"2":{"x":2660,"y":1424},"3":{"x":2684,"y":1452},"4":{"x":2660,"y":1598},"5":{"x":2660,"y":1598},"6":{"x":2684,"y":1598}}},"warnings":null},{"id":526,"sourceNodeId":153,"sourcePortId":1067,"targetNodeId":170,"targetPortId":1068,"travelTime":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":91},"sourceArrival":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":29},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":107},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":1310},{"x":2672,"y":1246},{"x":2672,"y":894},{"x":2672,"y":830}],"textPositions":{"0":{"x":2684,"y":1292},"1":{"x":2660,"y":1264},"2":{"x":2660,"y":848},"3":{"x":2684,"y":876},"4":{"x":2660,"y":1070},"5":{"x":2660,"y":1070},"6":{"x":2684,"y":1070}}},"warnings":null},{"id":527,"sourceNodeId":157,"sourcePortId":1069,"targetNodeId":136,"targetPortId":1070,"travelTime":{"lock":true,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":273},"sourceArrival":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":327},"targetDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":304},"targetArrival":{"lock":true,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":296},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2306,"y":3248},{"x":2370,"y":3248},{"x":2526,"y":3248},{"x":2590,"y":3248}],"textPositions":{"0":{"x":2324,"y":3260},"1":{"x":2352,"y":3236},"2":{"x":2572,"y":3236},"3":{"x":2544,"y":3260},"4":{"x":2448,"y":3236},"5":{"x":2448,"y":3236},"6":{"x":2448,"y":3260}}},"warnings":null},{"id":528,"sourceNodeId":136,"sourcePortId":1071,"targetNodeId":158,"targetPortId":1072,"travelTime":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":300},"sourceArrival":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":300},"targetDeparture":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":285},"targetArrival":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":315},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":3230},{"x":2672,"y":3166},{"x":2672,"y":2818},{"x":2672,"y":2754}],"textPositions":{"0":{"x":2684,"y":3212},"1":{"x":2660,"y":3184},"2":{"x":2660,"y":2772},"3":{"x":2684,"y":2800},"4":{"x":2660,"y":2992},"5":{"x":2660,"y":2992},"6":{"x":2684,"y":2992}}},"warnings":null},{"id":529,"sourceNodeId":158,"sourcePortId":1073,"targetNodeId":159,"targetPortId":1074,"travelTime":{"lock":true,"time":53,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":316},"sourceArrival":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":284},"targetDeparture":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":231},"targetArrival":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":369},"numberOfStops":5,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2608,"y":2686},{"x":2608,"y":2622},{"x":2288,"y":2398},{"x":2288,"y":2334}],"textPositions":{"0":{"x":2620,"y":2668},"1":{"x":2596,"y":2640},"2":{"x":2276,"y":2352},"3":{"x":2300,"y":2380},"4":{"x":2460,"y":2510},"5":{"x":2460,"y":2510},"6":{"x":2436,"y":2510}}},"warnings":null},{"id":530,"sourceNodeId":159,"sourcePortId":1075,"targetNodeId":155,"targetPortId":1076,"travelTime":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":370},"sourceArrival":{"lock":true,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":230},"targetDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":198},"targetArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":402},"numberOfStops":1,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2370,"y":2256},{"x":2434,"y":2256},{"x":2590,"y":2192},{"x":2654,"y":2192}],"textPositions":{"0":{"x":2388,"y":2268},"1":{"x":2416,"y":2244},"2":{"x":2636,"y":2180},"3":{"x":2608,"y":2204},"4":{"x":2512,"y":2212},"5":{"x":2512,"y":2212},"6":{"x":2512,"y":2236}}},"warnings":null},{"id":531,"sourceNodeId":155,"sourcePortId":1077,"targetNodeId":154,"targetPortId":1078,"travelTime":{"lock":true,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":403},"sourceArrival":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":197},"targetDeparture":{"lock":true,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":174},"targetArrival":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":426},"numberOfStops":3,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2736,"y":2174},{"x":2736,"y":2110},{"x":2736,"y":1950},{"x":2736,"y":1886}],"textPositions":{"0":{"x":2748,"y":2156},"1":{"x":2724,"y":2128},"2":{"x":2724,"y":1904},"3":{"x":2748,"y":1932},"4":{"x":2724,"y":2030},"5":{"x":2724,"y":2030},"6":{"x":2748,"y":2030}}},"warnings":null},{"id":532,"sourceNodeId":154,"sourcePortId":1079,"targetNodeId":169,"targetPortId":1080,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":435},"sourceArrival":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":165},"targetDeparture":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":147},"targetArrival":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":453},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":1840},{"x":2590,"y":1840},{"x":2018,"y":1840},{"x":1954,"y":1840}],"textPositions":{"0":{"x":2636,"y":1828},"1":{"x":2608,"y":1852},"2":{"x":1972,"y":1852},"3":{"x":2000,"y":1828},"4":{"x":2304,"y":1828},"5":{"x":2304,"y":1828},"6":{"x":2304,"y":1852}}},"warnings":null},{"id":533,"sourceNodeId":157,"sourcePortId":1081,"targetNodeId":136,"targetPortId":1082,"travelTime":{"lock":true,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":153},"sourceArrival":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":207},"targetDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":184},"targetArrival":{"lock":true,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":176},"numberOfStops":3,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2306,"y":3280},{"x":2370,"y":3280},{"x":2526,"y":3280},{"x":2590,"y":3280}],"textPositions":{"0":{"x":2324,"y":3292},"1":{"x":2352,"y":3268},"2":{"x":2572,"y":3268},"3":{"x":2544,"y":3292},"4":{"x":2448,"y":3268},"5":{"x":2448,"y":3268},"6":{"x":2448,"y":3292}}},"warnings":null},{"id":534,"sourceNodeId":136,"sourcePortId":1083,"targetNodeId":158,"targetPortId":1084,"travelTime":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":180},"sourceArrival":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":180},"targetDeparture":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":165},"targetArrival":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":195},"numberOfStops":1,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":3230},{"x":2704,"y":3166},{"x":2704,"y":2818},{"x":2704,"y":2754}],"textPositions":{"0":{"x":2716,"y":3212},"1":{"x":2692,"y":3184},"2":{"x":2692,"y":2772},"3":{"x":2716,"y":2800},"4":{"x":2692,"y":2992},"5":{"x":2692,"y":2992},"6":{"x":2716,"y":2992}}},"warnings":null},{"id":535,"sourceNodeId":158,"sourcePortId":1085,"targetNodeId":159,"targetPortId":1086,"travelTime":{"lock":true,"time":53,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":196},"sourceArrival":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":164},"targetDeparture":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":111},"targetArrival":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":249},"numberOfStops":5,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2640,"y":2686},{"x":2640,"y":2622},{"x":2320,"y":2398},{"x":2320,"y":2334}],"textPositions":{"0":{"x":2652,"y":2668},"1":{"x":2628,"y":2640},"2":{"x":2308,"y":2352},"3":{"x":2332,"y":2380},"4":{"x":2492,"y":2510},"5":{"x":2492,"y":2510},"6":{"x":2468,"y":2510}}},"warnings":null},{"id":536,"sourceNodeId":159,"sourcePortId":1087,"targetNodeId":155,"targetPortId":1088,"travelTime":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":250},"sourceArrival":{"lock":true,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":110},"targetDeparture":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":78},"targetArrival":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":282},"numberOfStops":1,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2370,"y":2288},{"x":2434,"y":2288},{"x":2590,"y":2224},{"x":2654,"y":2224}],"textPositions":{"0":{"x":2388,"y":2300},"1":{"x":2416,"y":2276},"2":{"x":2636,"y":2212},"3":{"x":2608,"y":2236},"4":{"x":2512,"y":2244},"5":{"x":2512,"y":2244},"6":{"x":2512,"y":2268}}},"warnings":null},{"id":537,"sourceNodeId":155,"sourcePortId":1089,"targetNodeId":154,"targetPortId":1090,"travelTime":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":283},"sourceArrival":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":77},"targetDeparture":{"lock":true,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":54},"targetArrival":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":306},"numberOfStops":3,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2768,"y":2174},{"x":2768,"y":2110},{"x":2768,"y":1950},{"x":2768,"y":1886}],"textPositions":{"0":{"x":2780,"y":2156},"1":{"x":2756,"y":2128},"2":{"x":2756,"y":1904},"3":{"x":2780,"y":1932},"4":{"x":2756,"y":2030},"5":{"x":2756,"y":2030},"6":{"x":2780,"y":2030}}},"warnings":null},{"id":538,"sourceNodeId":154,"sourcePortId":1091,"targetNodeId":153,"targetPortId":1092,"travelTime":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":315},"sourceArrival":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":45},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":30},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"numberOfStops":0,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":1790},{"x":2704,"y":1726},{"x":2704,"y":1470},{"x":2704,"y":1406}],"textPositions":{"0":{"x":2716,"y":1772},"1":{"x":2692,"y":1744},"2":{"x":2692,"y":1424},"3":{"x":2716,"y":1452},"4":{"x":2692,"y":1598},"5":{"x":2692,"y":1598},"6":{"x":2716,"y":1598}}},"warnings":null},{"id":539,"sourceNodeId":153,"sourcePortId":1093,"targetNodeId":170,"targetPortId":1094,"travelTime":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":331},"sourceArrival":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":29},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"numberOfStops":0,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":1310},{"x":2704,"y":1246},{"x":2704,"y":894},{"x":2704,"y":830}],"textPositions":{"0":{"x":2716,"y":1292},"1":{"x":2692,"y":1264},"2":{"x":2692,"y":848},"3":{"x":2716,"y":876},"4":{"x":2692,"y":1070},"5":{"x":2692,"y":1070},"6":{"x":2716,"y":1070}}},"warnings":null},{"id":540,"sourceNodeId":142,"sourcePortId":1095,"targetNodeId":169,"targetPortId":1096,"travelTime":{"lock":false,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"sourceArrival":{"lock":true,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":265},"targetDeparture":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":253},"targetArrival":{"lock":true,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":47},"numberOfStops":0,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":226,"y":1840},{"x":290,"y":1840},{"x":1790,"y":1840},{"x":1854,"y":1840}],"textPositions":{"0":{"x":244,"y":1852},"1":{"x":272,"y":1828},"2":{"x":1836,"y":1828},"3":{"x":1808,"y":1852},"4":{"x":1040,"y":1828},"5":{"x":1040,"y":1828},"6":{"x":1040,"y":1852}}},"warnings":null},{"id":541,"sourceNodeId":153,"sourcePortId":1097,"targetNodeId":170,"targetPortId":1098,"travelTime":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":58},"sourceArrival":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":242},"targetDeparture":{"lock":true,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":227},"targetArrival":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":73},"numberOfStops":1,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2768,"y":1310},{"x":2768,"y":1246},{"x":2768,"y":894},{"x":2768,"y":830}],"textPositions":{"0":{"x":2780,"y":1292},"1":{"x":2756,"y":1264},"2":{"x":2756,"y":848},"3":{"x":2780,"y":876},"4":{"x":2756,"y":1070},"5":{"x":2756,"y":1070},"6":{"x":2780,"y":1070}}},"warnings":null},{"id":542,"sourceNodeId":142,"sourcePortId":1099,"targetNodeId":169,"targetPortId":1100,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":9},"sourceArrival":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":51},"targetDeparture":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":42},"targetArrival":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"numberOfStops":0,"trainrunId":80,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":226,"y":1808},{"x":290,"y":1808},{"x":1790,"y":1808},{"x":1854,"y":1808}],"textPositions":{"0":{"x":244,"y":1820},"1":{"x":272,"y":1796},"2":{"x":1836,"y":1796},"3":{"x":1808,"y":1820},"4":{"x":1040,"y":1796},"5":{"x":1040,"y":1796},"6":{"x":1040,"y":1820}}},"warnings":null},{"id":543,"sourceNodeId":153,"sourcePortId":1101,"targetNodeId":170,"targetPortId":1102,"travelTime":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":29},"sourceArrival":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":31},"targetDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":17},"targetArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":43},"numberOfStops":0,"trainrunId":80,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2736,"y":1310},{"x":2736,"y":1246},{"x":2736,"y":894},{"x":2736,"y":830}],"textPositions":{"0":{"x":2748,"y":1292},"1":{"x":2724,"y":1264},"2":{"x":2724,"y":848},"3":{"x":2748,"y":876},"4":{"x":2724,"y":1070},"5":{"x":2724,"y":1070},"6":{"x":2748,"y":1070}}},"warnings":null},{"id":544,"sourceNodeId":142,"sourcePortId":1103,"targetNodeId":141,"targetPortId":1104,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":299},"sourceArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":241},"targetDeparture":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":222},"targetArrival":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":318},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":1726},{"x":112,"y":1662},{"x":112,"y":1314},{"x":112,"y":1250}],"textPositions":{"0":{"x":124,"y":1708},"1":{"x":100,"y":1680},"2":{"x":100,"y":1268},"3":{"x":124,"y":1296},"4":{"x":100,"y":1488},"5":{"x":100,"y":1488},"6":{"x":124,"y":1488}}},"warnings":null},{"id":545,"sourceNodeId":141,"sourcePortId":1105,"targetNodeId":143,"targetPortId":1106,"travelTime":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":319},"sourceArrival":{"lock":true,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":221},"targetDeparture":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":209},"targetArrival":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":331},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":1182},{"x":112,"y":1118},{"x":112,"y":866},{"x":112,"y":802}],"textPositions":{"0":{"x":124,"y":1164},"1":{"x":100,"y":1136},"2":{"x":100,"y":820},"3":{"x":124,"y":848},"4":{"x":100,"y":992},"5":{"x":100,"y":992},"6":{"x":124,"y":992}}},"warnings":null},{"id":546,"sourceNodeId":143,"sourcePortId":1107,"targetNodeId":172,"targetPortId":1108,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":332},"sourceArrival":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":208},"targetDeparture":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":202},"targetArrival":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":338},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":752},{"x":-2,"y":752},{"x":-446,"y":336},{"x":-510,"y":336}],"textPositions":{"0":{"x":44,"y":740},"1":{"x":16,"y":764},"2":{"x":-492,"y":348},"3":{"x":-464,"y":324},"4":{"x":-224,"y":532},"5":{"x":-224,"y":532},"6":{"x":-224,"y":556}}},"warnings":null},{"id":547,"sourceNodeId":129,"sourcePortId":1109,"targetNodeId":171,"targetPortId":1110,"travelTime":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":364},"sourceArrival":{"lock":true,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":176},"targetDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":154},"targetArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":386},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2146,"y":176},{"x":-2210,"y":176},{"x":-2398,"y":336},{"x":-2462,"y":336}],"textPositions":{"0":{"x":-2164,"y":164},"1":{"x":-2192,"y":188},"2":{"x":-2444,"y":348},"3":{"x":-2416,"y":324},"4":{"x":-2304,"y":244},"5":{"x":-2304,"y":244},"6":{"x":-2304,"y":268}}},"warnings":null},{"id":548,"sourceNodeId":142,"sourcePortId":1111,"targetNodeId":141,"targetPortId":1112,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"sourceArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetDeparture":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":72},"targetArrival":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":108},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":1726},{"x":208,"y":1662},{"x":208,"y":1314},{"x":208,"y":1250}],"textPositions":{"0":{"x":220,"y":1708},"1":{"x":196,"y":1680},"2":{"x":196,"y":1268},"3":{"x":220,"y":1296},"4":{"x":196,"y":1488},"5":{"x":196,"y":1488},"6":{"x":220,"y":1488}}},"warnings":null},{"id":549,"sourceNodeId":141,"sourcePortId":1113,"targetNodeId":143,"targetPortId":1114,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":109},"sourceArrival":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":71},"targetDeparture":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":58},"targetArrival":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":122},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":1182},{"x":208,"y":1118},{"x":208,"y":866},{"x":208,"y":802}],"textPositions":{"0":{"x":220,"y":1164},"1":{"x":196,"y":1136},"2":{"x":196,"y":820},"3":{"x":220,"y":848},"4":{"x":196,"y":992},"5":{"x":196,"y":992},"6":{"x":220,"y":992}}},"warnings":null},{"id":550,"sourceNodeId":143,"sourcePortId":1115,"targetNodeId":133,"targetPortId":1116,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":124},"sourceArrival":{"lock":true,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":56},"targetDeparture":{"lock":true,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":49},"targetArrival":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":131},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":734},{"x":176,"y":670},{"x":176,"y":414},{"x":176,"y":350}],"textPositions":{"0":{"x":188,"y":716},"1":{"x":164,"y":688},"2":{"x":164,"y":368},"3":{"x":188,"y":396},"4":{"x":164,"y":542},"5":{"x":164,"y":542},"6":{"x":188,"y":542}}},"warnings":null},{"id":551,"sourceNodeId":133,"sourcePortId":1117,"targetNodeId":144,"targetPortId":1118,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":132},"sourceArrival":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":48},"targetDeparture":{"lock":true,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":38},"targetArrival":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":142},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":94},{"x":240,"y":30},{"x":240,"y":-290},{"x":240,"y":-354}],"textPositions":{"0":{"x":252,"y":76},"1":{"x":228,"y":48},"2":{"x":228,"y":-336},"3":{"x":252,"y":-308},"4":{"x":228,"y":-130},"5":{"x":228,"y":-130},"6":{"x":252,"y":-130}}},"warnings":null},{"id":552,"sourceNodeId":144,"sourcePortId":1119,"targetNodeId":145,"targetPortId":1120,"travelTime":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":143},"sourceArrival":{"lock":true,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":37},"targetDeparture":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":33},"targetArrival":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":147},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":304,"y":-450},{"x":304,"y":-514},{"x":304,"y":-798},{"x":304,"y":-862}],"textPositions":{"0":{"x":316,"y":-468},"1":{"x":292,"y":-496},"2":{"x":292,"y":-844},"3":{"x":316,"y":-816},"4":{"x":292,"y":-656},"5":{"x":292,"y":-656},"6":{"x":316,"y":-656}}},"warnings":null},{"id":553,"sourceNodeId":145,"sourcePortId":1121,"targetNodeId":146,"targetPortId":1122,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":148},"sourceArrival":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":32},"targetDeparture":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":27},"targetArrival":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":153},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":304,"y":-930},{"x":304,"y":-994},{"x":304,"y":-1278},{"x":304,"y":-1342}],"textPositions":{"0":{"x":316,"y":-948},"1":{"x":292,"y":-976},"2":{"x":292,"y":-1324},"3":{"x":316,"y":-1296},"4":{"x":292,"y":-1136},"5":{"x":292,"y":-1136},"6":{"x":316,"y":-1136}}},"warnings":null},{"id":554,"sourceNodeId":146,"sourcePortId":1123,"targetNodeId":134,"targetPortId":1124,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":154},"sourceArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":26},"targetDeparture":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":16},"targetArrival":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":164},"numberOfStops":0,"trainrunId":82,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":304,"y":-1410},{"x":304,"y":-1474},{"x":304,"y":-1758},{"x":304,"y":-1822}],"textPositions":{"0":{"x":316,"y":-1428},"1":{"x":292,"y":-1456},"2":{"x":292,"y":-1804},"3":{"x":316,"y":-1776},"4":{"x":292,"y":-1616},"5":{"x":292,"y":-1616},"6":{"x":316,"y":-1616}}},"warnings":null},{"id":555,"sourceNodeId":142,"sourcePortId":1125,"targetNodeId":141,"targetPortId":1126,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":115},"sourceArrival":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":1726},{"x":176,"y":1662},{"x":176,"y":1314},{"x":176,"y":1250}],"textPositions":{"0":{"x":188,"y":1708},"1":{"x":164,"y":1680},"2":{"x":164,"y":1268},"3":{"x":188,"y":1296},"4":{"x":164,"y":1488},"5":{"x":164,"y":1488},"6":{"x":188,"y":1488}}},"warnings":null},{"id":556,"sourceNodeId":141,"sourcePortId":1127,"targetNodeId":143,"targetPortId":1128,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"sourceArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":38},"targetArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":142},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":1182},{"x":176,"y":1118},{"x":176,"y":866},{"x":176,"y":802}],"textPositions":{"0":{"x":188,"y":1164},"1":{"x":164,"y":1136},"2":{"x":164,"y":820},"3":{"x":188,"y":848},"4":{"x":164,"y":992},"5":{"x":164,"y":992},"6":{"x":188,"y":992}}},"warnings":null},{"id":557,"sourceNodeId":143,"sourcePortId":1129,"targetNodeId":133,"targetPortId":1130,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":142},"sourceArrival":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":38},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":30},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":150},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":734},{"x":144,"y":670},{"x":144,"y":414},{"x":144,"y":350}],"textPositions":{"0":{"x":156,"y":716},"1":{"x":132,"y":688},"2":{"x":132,"y":368},"3":{"x":156,"y":396},"4":{"x":132,"y":542},"5":{"x":132,"y":542},"6":{"x":156,"y":542}}},"warnings":null},{"id":558,"sourceNodeId":133,"sourcePortId":1131,"targetNodeId":144,"targetPortId":1132,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":152},"sourceArrival":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":28},"targetDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"targetArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":162},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":94},{"x":208,"y":30},{"x":208,"y":-290},{"x":208,"y":-354}],"textPositions":{"0":{"x":220,"y":76},"1":{"x":196,"y":48},"2":{"x":196,"y":-336},"3":{"x":220,"y":-308},"4":{"x":196,"y":-130},"5":{"x":196,"y":-130},"6":{"x":220,"y":-130}}},"warnings":null},{"id":559,"sourceNodeId":144,"sourcePortId":1133,"targetNodeId":145,"targetPortId":1134,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":162},"sourceArrival":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":167},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":272,"y":-450},{"x":272,"y":-514},{"x":272,"y":-798},{"x":272,"y":-862}],"textPositions":{"0":{"x":284,"y":-468},"1":{"x":260,"y":-496},"2":{"x":260,"y":-844},"3":{"x":284,"y":-816},"4":{"x":260,"y":-656},"5":{"x":260,"y":-656},"6":{"x":284,"y":-656}}},"warnings":null},{"id":560,"sourceNodeId":145,"sourcePortId":1135,"targetNodeId":146,"targetPortId":1136,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":167},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":8},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":172},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":272,"y":-930},{"x":272,"y":-994},{"x":272,"y":-1278},{"x":272,"y":-1342}],"textPositions":{"0":{"x":284,"y":-948},"1":{"x":260,"y":-976},"2":{"x":260,"y":-1324},"3":{"x":284,"y":-1296},"4":{"x":260,"y":-1136},"5":{"x":260,"y":-1136},"6":{"x":284,"y":-1136}}},"warnings":null},{"id":561,"sourceNodeId":146,"sourcePortId":1137,"targetNodeId":134,"targetPortId":1138,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":172},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":8},"targetDeparture":{"lock":false,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":3},"targetArrival":{"lock":false,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":177},"numberOfStops":0,"trainrunId":83,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":272,"y":-1410},{"x":272,"y":-1474},{"x":272,"y":-1758},{"x":272,"y":-1822}],"textPositions":{"0":{"x":284,"y":-1428},"1":{"x":260,"y":-1456},"2":{"x":260,"y":-1804},"3":{"x":284,"y":-1776},"4":{"x":260,"y":-1616},"5":{"x":260,"y":-1616},"6":{"x":284,"y":-1616}}},"warnings":null},{"id":562,"sourceNodeId":135,"sourcePortId":1139,"targetNodeId":150,"targetPortId":1140,"travelTime":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":9},"sourceArrival":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":291},"targetDeparture":{"lock":true,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":279},"targetArrival":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":21},"numberOfStops":1,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":176},{"x":2914,"y":176},{"x":3230,"y":176},{"x":3294,"y":176}],"textPositions":{"0":{"x":2868,"y":188},"1":{"x":2896,"y":164},"2":{"x":3276,"y":164},"3":{"x":3248,"y":188},"4":{"x":3072,"y":164},"5":{"x":3072,"y":164},"6":{"x":3072,"y":188}}},"warnings":null},{"id":563,"sourceNodeId":150,"sourcePortId":1141,"targetNodeId":151,"targetPortId":1142,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":23},"sourceArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":277},"targetDeparture":{"lock":true,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":264},"targetArrival":{"lock":true,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":36},"numberOfStops":0,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3394,"y":176},{"x":3458,"y":176},{"x":3806,"y":176},{"x":3870,"y":176}],"textPositions":{"0":{"x":3412,"y":188},"1":{"x":3440,"y":164},"2":{"x":3852,"y":164},"3":{"x":3824,"y":188},"4":{"x":3632,"y":164},"5":{"x":3632,"y":164},"6":{"x":3632,"y":188}}},"warnings":null},{"id":564,"sourceNodeId":151,"sourcePortId":1143,"targetNodeId":137,"targetPortId":1144,"travelTime":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":38},"sourceArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":262},"targetDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":218},"targetArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":82},"numberOfStops":4,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3970,"y":176},{"x":4034,"y":176},{"x":4574,"y":176},{"x":4638,"y":176}],"textPositions":{"0":{"x":3988,"y":188},"1":{"x":4016,"y":164},"2":{"x":4620,"y":164},"3":{"x":4592,"y":188},"4":{"x":4304,"y":164},"5":{"x":4304,"y":164},"6":{"x":4304,"y":188}}},"warnings":null},{"id":565,"sourceNodeId":137,"sourcePortId":1145,"targetNodeId":140,"targetPortId":1146,"travelTime":{"lock":true,"time":61,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":84},"sourceArrival":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":216},"targetDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":155},"targetArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":145},"numberOfStops":5,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4656,"y":222},{"x":4656,"y":286},{"x":4656,"y":1118},{"x":4656,"y":1182}],"textPositions":{"0":{"x":4644,"y":240},"1":{"x":4668,"y":268},"2":{"x":4668,"y":1164},"3":{"x":4644,"y":1136},"4":{"x":4644,"y":702},"5":{"x":4644,"y":702},"6":{"x":4668,"y":702}}},"warnings":null},{"id":566,"sourceNodeId":140,"sourcePortId":1147,"targetNodeId":152,"targetPortId":1148,"travelTime":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":146},"sourceArrival":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":154},"targetDeparture":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":132},"targetArrival":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":168},"numberOfStops":2,"trainrunId":84,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4688,"y":1278},{"x":4688,"y":1342},{"x":4688,"y":1822},{"x":4688,"y":1886}],"textPositions":{"0":{"x":4676,"y":1296},"1":{"x":4700,"y":1324},"2":{"x":4700,"y":1868},"3":{"x":4676,"y":1840},"4":{"x":4676,"y":1582},"5":{"x":4676,"y":1582},"6":{"x":4700,"y":1582}}},"warnings":null},{"id":567,"sourceNodeId":135,"sourcePortId":1149,"targetNodeId":170,"targetPortId":1150,"travelTime":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":67},"sourceArrival":{"lock":true,"time":53,"warning":null,"timeFormatter":null,"consecutiveTime":293},"targetDeparture":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":285},"targetArrival":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":75},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2704,"y":350},{"x":2704,"y":414},{"x":2704,"y":670},{"x":2704,"y":734}],"textPositions":{"0":{"x":2692,"y":368},"1":{"x":2716,"y":396},"2":{"x":2716,"y":716},"3":{"x":2692,"y":688},"4":{"x":2692,"y":542},"5":{"x":2692,"y":542},"6":{"x":2716,"y":542}}},"warnings":null},{"id":568,"sourceNodeId":140,"sourcePortId":1151,"targetNodeId":152,"targetPortId":1152,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":123},"sourceArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":237},"targetDeparture":{"lock":true,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":218},"targetArrival":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":142},"numberOfStops":1,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4656,"y":1278},{"x":4656,"y":1342},{"x":4656,"y":1822},{"x":4656,"y":1886}],"textPositions":{"0":{"x":4644,"y":1296},"1":{"x":4668,"y":1324},"2":{"x":4668,"y":1868},"3":{"x":4644,"y":1840},"4":{"x":4644,"y":1582},"5":{"x":4644,"y":1582},"6":{"x":4668,"y":1582}}},"warnings":null},{"id":569,"sourceNodeId":135,"sourcePortId":1153,"targetNodeId":170,"targetPortId":1154,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":132},"sourceArrival":{"lock":false,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":288},"targetDeparture":{"lock":true,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":280},"targetArrival":{"lock":true,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":140},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2736,"y":350},{"x":2736,"y":414},{"x":2736,"y":670},{"x":2736,"y":734}],"textPositions":{"0":{"x":2724,"y":368},"1":{"x":2748,"y":396},"2":{"x":2748,"y":716},"3":{"x":2724,"y":688},"4":{"x":2724,"y":542},"5":{"x":2724,"y":542},"6":{"x":2748,"y":542}}},"warnings":null},{"id":570,"sourceNodeId":140,"sourcePortId":1155,"targetNodeId":152,"targetPortId":1156,"travelTime":{"lock":true,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":203},"sourceArrival":{"lock":true,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":217},"targetDeparture":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":197},"targetArrival":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":223},"numberOfStops":1,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4720,"y":1278},{"x":4720,"y":1342},{"x":4720,"y":1822},{"x":4720,"y":1886}],"textPositions":{"0":{"x":4708,"y":1296},"1":{"x":4732,"y":1324},"2":{"x":4732,"y":1868},"3":{"x":4708,"y":1840},"4":{"x":4708,"y":1582},"5":{"x":4708,"y":1582},"6":{"x":4732,"y":1582}}},"warnings":null},{"id":571,"sourceNodeId":135,"sourcePortId":1157,"targetNodeId":149,"targetPortId":1158,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":294},"sourceArrival":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":126},"targetDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":119},"targetArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":301},"numberOfStops":1,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":240},{"x":2590,"y":240},{"x":2402,"y":240},{"x":2338,"y":240}],"textPositions":{"0":{"x":2636,"y":228},"1":{"x":2608,"y":252},"2":{"x":2356,"y":252},"3":{"x":2384,"y":228},"4":{"x":2496,"y":228},"5":{"x":2496,"y":228},"6":{"x":2496,"y":252}}},"warnings":null},{"id":572,"sourceNodeId":149,"sourcePortId":1159,"targetNodeId":166,"targetPortId":1160,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":301},"sourceArrival":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":119},"targetDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":240},{"x":2174,"y":240},{"x":1954,"y":240},{"x":1890,"y":240}],"textPositions":{"0":{"x":2220,"y":228},"1":{"x":2192,"y":252},"2":{"x":1908,"y":252},"3":{"x":1936,"y":228},"4":{"x":2064,"y":228},"5":{"x":2064,"y":228},"6":{"x":2064,"y":252}}},"warnings":null},{"id":573,"sourceNodeId":148,"sourcePortId":1161,"targetNodeId":147,"targetPortId":1162,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":315},"sourceArrival":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":105},"targetDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":98},"targetArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":322},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":240},{"x":1278,"y":240},{"x":1122,"y":240},{"x":1058,"y":240}],"textPositions":{"0":{"x":1324,"y":228},"1":{"x":1296,"y":252},"2":{"x":1076,"y":252},"3":{"x":1104,"y":228},"4":{"x":1200,"y":228},"5":{"x":1200,"y":228},"6":{"x":1200,"y":252}}},"warnings":null},{"id":574,"sourceNodeId":147,"sourcePortId":1163,"targetNodeId":133,"targetPortId":1164,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":322},"sourceArrival":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":98},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":240},{"x":894,"y":240},{"x":322,"y":240},{"x":258,"y":240}],"textPositions":{"0":{"x":940,"y":228},"1":{"x":912,"y":252},"2":{"x":276,"y":252},"3":{"x":304,"y":228},"4":{"x":608,"y":228},"5":{"x":608,"y":228},"6":{"x":608,"y":252}}},"warnings":null},{"id":575,"sourceNodeId":133,"sourcePortId":1165,"targetNodeId":172,"targetPortId":1166,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":336},"sourceArrival":{"lock":true,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":84},"targetDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":77},"targetArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":343},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":304},{"x":-2,"y":304},{"x":-446,"y":304},{"x":-510,"y":304}],"textPositions":{"0":{"x":44,"y":292},"1":{"x":16,"y":316},"2":{"x":-492,"y":316},"3":{"x":-464,"y":292},"4":{"x":-224,"y":292},"5":{"x":-224,"y":292},"6":{"x":-224,"y":316}}},"warnings":null},{"id":576,"sourceNodeId":137,"sourcePortId":1167,"targetNodeId":151,"targetPortId":1168,"travelTime":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":298},"sourceArrival":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":242},"targetDeparture":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":209},"targetArrival":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":331},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4638,"y":144},{"x":4574,"y":144},{"x":4034,"y":144},{"x":3970,"y":144}],"textPositions":{"0":{"x":4620,"y":132},"1":{"x":4592,"y":156},"2":{"x":3988,"y":156},"3":{"x":4016,"y":132},"4":{"x":4304,"y":132},"5":{"x":4304,"y":132},"6":{"x":4304,"y":156}}},"warnings":null},{"id":577,"sourceNodeId":151,"sourcePortId":1169,"targetNodeId":150,"targetPortId":1170,"travelTime":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":333},"sourceArrival":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":207},"targetDeparture":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":193},"targetArrival":{"lock":true,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3870,"y":80},{"x":3806,"y":80},{"x":3458,"y":80},{"x":3394,"y":80}],"textPositions":{"0":{"x":3852,"y":68},"1":{"x":3824,"y":92},"2":{"x":3412,"y":92},"3":{"x":3440,"y":68},"4":{"x":3632,"y":68},"5":{"x":3632,"y":68},"6":{"x":3632,"y":92}}},"warnings":null},{"id":578,"sourceNodeId":150,"sourcePortId":1171,"targetNodeId":135,"targetPortId":1172,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":348},"sourceArrival":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":192},"targetDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":183},"targetArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":357},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3294,"y":80},{"x":3230,"y":80},{"x":2914,"y":80},{"x":2850,"y":80}],"textPositions":{"0":{"x":3276,"y":68},"1":{"x":3248,"y":92},"2":{"x":2868,"y":92},"3":{"x":2896,"y":68},"4":{"x":3072,"y":68},"5":{"x":3072,"y":68},"6":{"x":3072,"y":92}}},"warnings":null},{"id":579,"sourceNodeId":135,"sourcePortId":1173,"targetNodeId":149,"targetPortId":1174,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":364},"sourceArrival":{"lock":true,"time":56,"warning":{"title":"Source Arrival Warning","description":"Source arrival time cannot be reached"},"timeFormatter":null,"consecutiveTime":176},"targetDeparture":{"lock":false,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":170},"targetArrival":{"lock":false,"time":10,"warning":{"title":"Target Arrival Warning","description":"Target arrival time cannot be reached"},"timeFormatter":null,"consecutiveTime":370},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":144},{"x":2590,"y":144},{"x":2402,"y":144},{"x":2338,"y":144}],"textPositions":{"0":{"x":2636,"y":132},"1":{"x":2608,"y":156},"2":{"x":2356,"y":156},"3":{"x":2384,"y":132},"4":{"x":2496,"y":132},"5":{"x":2496,"y":132},"6":{"x":2496,"y":156}}},"warnings":null},{"id":580,"sourceNodeId":149,"sourcePortId":1175,"targetNodeId":166,"targetPortId":1176,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":370},"sourceArrival":{"lock":false,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":170},"targetDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":377},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":144},{"x":2174,"y":144},{"x":1954,"y":144},{"x":1890,"y":144}],"textPositions":{"0":{"x":2220,"y":132},"1":{"x":2192,"y":156},"2":{"x":1908,"y":156},"3":{"x":1936,"y":132},"4":{"x":2064,"y":132},"5":{"x":2064,"y":132},"6":{"x":2064,"y":156}}},"warnings":null},{"id":581,"sourceNodeId":148,"sourcePortId":1177,"targetNodeId":147,"targetPortId":1178,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":384},"sourceArrival":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":156},"targetDeparture":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":151},"targetArrival":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":389},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":144},{"x":1278,"y":144},{"x":1122,"y":144},{"x":1058,"y":144}],"textPositions":{"0":{"x":1324,"y":132},"1":{"x":1296,"y":156},"2":{"x":1076,"y":156},"3":{"x":1104,"y":132},"4":{"x":1200,"y":132},"5":{"x":1200,"y":132},"6":{"x":1200,"y":156}}},"warnings":null},{"id":582,"sourceNodeId":147,"sourcePortId":1179,"targetNodeId":133,"targetPortId":1180,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":391},"sourceArrival":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":149},"targetDeparture":{"lock":true,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":140},"targetArrival":{"lock":true,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":400},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":144},{"x":894,"y":144},{"x":322,"y":144},{"x":258,"y":144}],"textPositions":{"0":{"x":940,"y":132},"1":{"x":912,"y":156},"2":{"x":276,"y":156},"3":{"x":304,"y":132},"4":{"x":608,"y":132},"5":{"x":608,"y":132},"6":{"x":608,"y":156}}},"warnings":null},{"id":583,"sourceNodeId":133,"sourcePortId":1181,"targetNodeId":175,"targetPortId":1182,"travelTime":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":402},"sourceArrival":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":138},"targetDeparture":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":121},"targetArrival":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":419},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":112},{"x":-2,"y":112},{"x":-1534,"y":-16},{"x":-1598,"y":-16}],"textPositions":{"0":{"x":44,"y":100},"1":{"x":16,"y":124},"2":{"x":-1580,"y":-4},"3":{"x":-1552,"y":-28},"4":{"x":-768,"y":36},"5":{"x":-768,"y":36},"6":{"x":-768,"y":60}}},"warnings":null},{"id":584,"sourceNodeId":130,"sourcePortId":1183,"targetNodeId":177,"targetPortId":1184,"travelTime":{"lock":false,"time":61,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":437},"sourceArrival":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":103},"targetDeparture":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":42},"targetArrival":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":498},"numberOfStops":2,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2530,"y":-16},{"x":-2594,"y":-16},{"x":-3358,"y":560},{"x":-3422,"y":560}],"textPositions":{"0":{"x":-2548,"y":-28},"1":{"x":-2576,"y":-4},"2":{"x":-3404,"y":572},"3":{"x":-3376,"y":548},"4":{"x":-2976,"y":260},"5":{"x":-2976,"y":260},"6":{"x":-2976,"y":284}}},"warnings":null},{"id":585,"sourceNodeId":160,"sourcePortId":1185,"targetNodeId":161,"targetPortId":1186,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":528},"sourceArrival":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":12},"targetDeparture":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":4},"targetArrival":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":536},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3938,"y":656},{"x":-4002,"y":656},{"x":-4190,"y":656},{"x":-4254,"y":656}],"textPositions":{"0":{"x":-3956,"y":644},"1":{"x":-3984,"y":668},"2":{"x":-4236,"y":668},"3":{"x":-4208,"y":644},"4":{"x":-4096,"y":644},"5":{"x":-4096,"y":644},"6":{"x":-4096,"y":668}}},"warnings":null},{"id":586,"sourceNodeId":128,"sourcePortId":1187,"targetNodeId":177,"targetPortId":1188,"travelTime":{"lock":false,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":439},"sourceArrival":{"lock":true,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":101},"targetDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":450},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3074,"y":592},{"x":-3138,"y":592},{"x":-3358,"y":624},{"x":-3422,"y":624}],"textPositions":{"0":{"x":-3092,"y":580},"1":{"x":-3120,"y":604},"2":{"x":-3404,"y":636},"3":{"x":-3376,"y":612},"4":{"x":-3248,"y":596},"5":{"x":-3248,"y":596},"6":{"x":-3248,"y":620}}},"warnings":null},{"id":587,"sourceNodeId":160,"sourcePortId":1189,"targetNodeId":161,"targetPortId":1190,"travelTime":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":484},"sourceArrival":{"lock":true,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":56},"targetDeparture":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":48},"targetArrival":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":492},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3938,"y":688},{"x":-4002,"y":688},{"x":-4190,"y":688},{"x":-4254,"y":688}],"textPositions":{"0":{"x":-3956,"y":676},"1":{"x":-3984,"y":700},"2":{"x":-4236,"y":700},"3":{"x":-4208,"y":676},"4":{"x":-4096,"y":676},"5":{"x":-4096,"y":676},"6":{"x":-4096,"y":700}}},"warnings":null},{"id":588,"sourceNodeId":135,"sourcePortId":1191,"targetNodeId":150,"targetPortId":1192,"travelTime":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":219},"sourceArrival":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":321},"targetDeparture":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":309},"targetArrival":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":231},"numberOfStops":1,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":48},{"x":2914,"y":48},{"x":3230,"y":48},{"x":3294,"y":48}],"textPositions":{"0":{"x":2868,"y":60},"1":{"x":2896,"y":36},"2":{"x":3276,"y":36},"3":{"x":3248,"y":60},"4":{"x":3072,"y":36},"5":{"x":3072,"y":36},"6":{"x":3072,"y":60}}},"warnings":null},{"id":589,"sourceNodeId":150,"sourcePortId":1193,"targetNodeId":151,"targetPortId":1194,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":53,"warning":null,"timeFormatter":null,"consecutiveTime":233},"sourceArrival":{"lock":false,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":307},"targetDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":294},"targetArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":246},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3394,"y":48},{"x":3458,"y":48},{"x":3806,"y":48},{"x":3870,"y":48}],"textPositions":{"0":{"x":3412,"y":60},"1":{"x":3440,"y":36},"2":{"x":3852,"y":36},"3":{"x":3824,"y":60},"4":{"x":3632,"y":36},"5":{"x":3632,"y":36},"6":{"x":3632,"y":60}}},"warnings":null},{"id":590,"sourceNodeId":135,"sourcePortId":1195,"targetNodeId":149,"targetPortId":1196,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":346},"sourceArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":194},"targetDeparture":{"lock":false,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":189},"targetArrival":{"lock":false,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":351},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":48},{"x":2590,"y":48},{"x":2402,"y":48},{"x":2338,"y":48}],"textPositions":{"0":{"x":2636,"y":36},"1":{"x":2608,"y":60},"2":{"x":2356,"y":60},"3":{"x":2384,"y":36},"4":{"x":2496,"y":36},"5":{"x":2496,"y":36},"6":{"x":2496,"y":60}}},"warnings":null},{"id":591,"sourceNodeId":149,"sourcePortId":1197,"targetNodeId":166,"targetPortId":1198,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":351},"sourceArrival":{"lock":false,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":189},"targetDeparture":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":184},"targetArrival":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":356},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":48},{"x":2174,"y":48},{"x":1954,"y":48},{"x":1890,"y":48}],"textPositions":{"0":{"x":2220,"y":36},"1":{"x":2192,"y":60},"2":{"x":1908,"y":60},"3":{"x":1936,"y":36},"4":{"x":2064,"y":36},"5":{"x":2064,"y":36},"6":{"x":2064,"y":60}}},"warnings":null},{"id":592,"sourceNodeId":148,"sourcePortId":1199,"targetNodeId":147,"targetPortId":1200,"travelTime":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":361},"sourceArrival":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":179},"targetDeparture":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":175},"targetArrival":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":365},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":48},{"x":1278,"y":48},{"x":1122,"y":48},{"x":1058,"y":48}],"textPositions":{"0":{"x":1324,"y":36},"1":{"x":1296,"y":60},"2":{"x":1076,"y":60},"3":{"x":1104,"y":36},"4":{"x":1200,"y":36},"5":{"x":1200,"y":36},"6":{"x":1200,"y":60}}},"warnings":null},{"id":593,"sourceNodeId":147,"sourcePortId":1201,"targetNodeId":133,"targetPortId":1202,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":365},"sourceArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":175},"targetDeparture":{"lock":false,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":170},"targetArrival":{"lock":false,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":370},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":112},{"x":894,"y":112},{"x":322,"y":112},{"x":258,"y":112}],"textPositions":{"0":{"x":940,"y":100},"1":{"x":912,"y":124},"2":{"x":276,"y":124},"3":{"x":304,"y":100},"4":{"x":608,"y":100},"5":{"x":608,"y":100},"6":{"x":608,"y":124}}},"warnings":null},{"id":594,"sourceNodeId":133,"sourcePortId":1203,"targetNodeId":172,"targetPortId":1204,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":370},"sourceArrival":{"lock":false,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":170},"targetDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":377},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":144},{"x":-2,"y":144},{"x":-446,"y":144},{"x":-510,"y":144}],"textPositions":{"0":{"x":44,"y":132},"1":{"x":16,"y":156},"2":{"x":-492,"y":156},"3":{"x":-464,"y":132},"4":{"x":-224,"y":132},"5":{"x":-224,"y":132},"6":{"x":-224,"y":156}}},"warnings":null},{"id":595,"sourceNodeId":129,"sourcePortId":1205,"targetNodeId":171,"targetPortId":1206,"travelTime":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":390},"sourceArrival":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":150},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":128},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":412},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2146,"y":144},{"x":-2210,"y":144},{"x":-2398,"y":304},{"x":-2462,"y":304}],"textPositions":{"0":{"x":-2164,"y":132},"1":{"x":-2192,"y":156},"2":{"x":-2444,"y":316},"3":{"x":-2416,"y":292},"4":{"x":-2304,"y":212},"5":{"x":-2304,"y":212},"6":{"x":-2304,"y":236}}},"warnings":null},{"id":596,"sourceNodeId":128,"sourcePortId":1207,"targetNodeId":177,"targetPortId":1208,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":463},"sourceArrival":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":77},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":472},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3074,"y":560},{"x":-3138,"y":560},{"x":-3358,"y":592},{"x":-3422,"y":592}],"textPositions":{"0":{"x":-3092,"y":548},"1":{"x":-3120,"y":572},"2":{"x":-3404,"y":604},"3":{"x":-3376,"y":580},"4":{"x":-3248,"y":564},"5":{"x":-3248,"y":564},"6":{"x":-3248,"y":588}}},"warnings":null},{"id":597,"sourceNodeId":160,"sourcePortId":1209,"targetNodeId":161,"targetPortId":1210,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":501},"sourceArrival":{"lock":true,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":39},"targetDeparture":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":32},"targetArrival":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":508},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3938,"y":624},{"x":-4002,"y":624},{"x":-4190,"y":624},{"x":-4254,"y":624}],"textPositions":{"0":{"x":-3956,"y":612},"1":{"x":-3984,"y":636},"2":{"x":-4236,"y":636},"3":{"x":-4208,"y":612},"4":{"x":-4096,"y":612},"5":{"x":-4096,"y":612},"6":{"x":-4096,"y":636}}},"warnings":null},{"id":598,"sourceNodeId":151,"sourcePortId":1211,"targetNodeId":137,"targetPortId":1212,"travelTime":{"lock":false,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":248},"sourceArrival":{"lock":true,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":292},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":248},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":292},"numberOfStops":4,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3970,"y":112},{"x":4034,"y":112},{"x":4574,"y":112},{"x":4638,"y":112}],"textPositions":{"0":{"x":3988,"y":124},"1":{"x":4016,"y":100},"2":{"x":4620,"y":100},"3":{"x":4592,"y":124},"4":{"x":4304,"y":100},"5":{"x":4304,"y":100},"6":{"x":4304,"y":124}}},"warnings":null},{"id":599,"sourceNodeId":135,"sourcePortId":1213,"targetNodeId":150,"targetPortId":1214,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":125},"sourceArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":295},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":286},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":112},{"x":2914,"y":112},{"x":3230,"y":112},{"x":3294,"y":112}],"textPositions":{"0":{"x":2868,"y":124},"1":{"x":2896,"y":100},"2":{"x":3276,"y":100},"3":{"x":3248,"y":124},"4":{"x":3072,"y":100},"5":{"x":3072,"y":100},"6":{"x":3072,"y":124}}},"warnings":null},{"id":600,"sourceNodeId":150,"sourcePortId":1215,"targetNodeId":151,"targetPortId":1216,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":136},"sourceArrival":{"lock":false,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":284},"targetDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":271},"targetArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":149},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3394,"y":112},{"x":3458,"y":112},{"x":3806,"y":112},{"x":3870,"y":112}],"textPositions":{"0":{"x":3412,"y":124},"1":{"x":3440,"y":100},"2":{"x":3852,"y":100},"3":{"x":3824,"y":124},"4":{"x":3632,"y":100},"5":{"x":3632,"y":100},"6":{"x":3632,"y":124}}},"warnings":null},{"id":601,"sourceNodeId":135,"sourcePortId":1217,"targetNodeId":149,"targetPortId":1218,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":302},"sourceArrival":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":118},"targetDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":176},{"x":2590,"y":176},{"x":2402,"y":176},{"x":2338,"y":176}],"textPositions":{"0":{"x":2636,"y":164},"1":{"x":2608,"y":188},"2":{"x":2356,"y":188},"3":{"x":2384,"y":164},"4":{"x":2496,"y":164},"5":{"x":2496,"y":164},"6":{"x":2496,"y":188}}},"warnings":null},{"id":602,"sourceNodeId":149,"sourcePortId":1219,"targetNodeId":166,"targetPortId":1220,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":176},{"x":2174,"y":176},{"x":1954,"y":176},{"x":1890,"y":176}],"textPositions":{"0":{"x":2220,"y":164},"1":{"x":2192,"y":188},"2":{"x":1908,"y":188},"3":{"x":1936,"y":164},"4":{"x":2064,"y":164},"5":{"x":2064,"y":164},"6":{"x":2064,"y":188}}},"warnings":null},{"id":603,"sourceNodeId":148,"sourcePortId":1221,"targetNodeId":147,"targetPortId":1222,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":320},"sourceArrival":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":100},"targetDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":95},"targetArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":325},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":176},{"x":1278,"y":176},{"x":1122,"y":176},{"x":1058,"y":176}],"textPositions":{"0":{"x":1324,"y":164},"1":{"x":1296,"y":188},"2":{"x":1076,"y":188},"3":{"x":1104,"y":164},"4":{"x":1200,"y":164},"5":{"x":1200,"y":164},"6":{"x":1200,"y":188}}},"warnings":null},{"id":604,"sourceNodeId":147,"sourcePortId":1223,"targetNodeId":133,"targetPortId":1224,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":325},"sourceArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":95},"targetDeparture":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetArrival":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":176},{"x":894,"y":176},{"x":322,"y":176},{"x":258,"y":176}],"textPositions":{"0":{"x":940,"y":164},"1":{"x":912,"y":188},"2":{"x":276,"y":188},"3":{"x":304,"y":164},"4":{"x":608,"y":164},"5":{"x":608,"y":164},"6":{"x":608,"y":188}}},"warnings":null},{"id":605,"sourceNodeId":133,"sourcePortId":1225,"targetNodeId":172,"targetPortId":1226,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"sourceArrival":{"lock":true,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":83},"targetArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":337},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":240},{"x":-2,"y":240},{"x":-446,"y":240},{"x":-510,"y":240}],"textPositions":{"0":{"x":44,"y":228},"1":{"x":16,"y":252},"2":{"x":-492,"y":252},"3":{"x":-464,"y":228},"4":{"x":-224,"y":228},"5":{"x":-224,"y":228},"6":{"x":-224,"y":252}}},"warnings":null},{"id":606,"sourceNodeId":151,"sourcePortId":1227,"targetNodeId":162,"targetPortId":1228,"travelTime":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":151},"sourceArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":269},"targetDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":218},"targetArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":202},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3970,"y":48},{"x":4034,"y":48},{"x":4574,"y":-176},{"x":4638,"y":-176}],"textPositions":{"0":{"x":3988,"y":60},"1":{"x":4016,"y":36},"2":{"x":4620,"y":-188},"3":{"x":4592,"y":-164},"4":{"x":4304,"y":-76},"5":{"x":4304,"y":-76},"6":{"x":4304,"y":-52}}},"warnings":null},{"id":607,"sourceNodeId":135,"sourcePortId":1229,"targetNodeId":150,"targetPortId":1230,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":125},"sourceArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":295},"targetDeparture":{"lock":true,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":286},"targetArrival":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":144},{"x":2914,"y":144},{"x":3230,"y":144},{"x":3294,"y":144}],"textPositions":{"0":{"x":2868,"y":156},"1":{"x":2896,"y":132},"2":{"x":3276,"y":132},"3":{"x":3248,"y":156},"4":{"x":3072,"y":132},"5":{"x":3072,"y":132},"6":{"x":3072,"y":156}}},"warnings":null},{"id":608,"sourceNodeId":150,"sourcePortId":1231,"targetNodeId":151,"targetPortId":1232,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":136},"sourceArrival":{"lock":false,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":284},"targetDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":271},"targetArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":149},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3394,"y":144},{"x":3458,"y":144},{"x":3806,"y":144},{"x":3870,"y":144}],"textPositions":{"0":{"x":3412,"y":156},"1":{"x":3440,"y":132},"2":{"x":3852,"y":132},"3":{"x":3824,"y":156},"4":{"x":3632,"y":132},"5":{"x":3632,"y":132},"6":{"x":3632,"y":156}}},"warnings":null},{"id":609,"sourceNodeId":135,"sourcePortId":1233,"targetNodeId":149,"targetPortId":1234,"travelTime":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":302},"sourceArrival":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":118},"targetDeparture":{"lock":true,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":103},"targetArrival":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":317},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":208},{"x":2590,"y":208},{"x":2402,"y":208},{"x":2338,"y":208}],"textPositions":{"0":{"x":2636,"y":196},"1":{"x":2608,"y":220},"2":{"x":2356,"y":220},"3":{"x":2384,"y":196},"4":{"x":2496,"y":196},"5":{"x":2496,"y":196},"6":{"x":2496,"y":220}}},"warnings":null},{"id":610,"sourceNodeId":149,"sourcePortId":1235,"targetNodeId":166,"targetPortId":1236,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":317},"sourceArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":103},"targetDeparture":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":97},"targetArrival":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":323},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":208},{"x":2174,"y":208},{"x":1954,"y":208},{"x":1890,"y":208}],"textPositions":{"0":{"x":2220,"y":196},"1":{"x":2192,"y":220},"2":{"x":1908,"y":220},"3":{"x":1936,"y":196},"4":{"x":2064,"y":196},"5":{"x":2064,"y":196},"6":{"x":2064,"y":220}}},"warnings":null},{"id":611,"sourceNodeId":148,"sourcePortId":1237,"targetNodeId":147,"targetPortId":1238,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"sourceArrival":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":85},"targetArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":335},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":208},{"x":1278,"y":208},{"x":1122,"y":208},{"x":1058,"y":208}],"textPositions":{"0":{"x":1324,"y":196},"1":{"x":1296,"y":220},"2":{"x":1076,"y":220},"3":{"x":1104,"y":196},"4":{"x":1200,"y":196},"5":{"x":1200,"y":196},"6":{"x":1200,"y":220}}},"warnings":null},{"id":612,"sourceNodeId":147,"sourcePortId":1239,"targetNodeId":133,"targetPortId":1240,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":335},"sourceArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":85},"targetDeparture":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":80},"targetArrival":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":340},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":208},{"x":894,"y":208},{"x":322,"y":208},{"x":258,"y":208}],"textPositions":{"0":{"x":940,"y":196},"1":{"x":912,"y":220},"2":{"x":276,"y":220},"3":{"x":304,"y":196},"4":{"x":608,"y":196},"5":{"x":608,"y":196},"6":{"x":608,"y":220}}},"warnings":null},{"id":613,"sourceNodeId":133,"sourcePortId":1241,"targetNodeId":172,"targetPortId":1242,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":340},"sourceArrival":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":80},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":73},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":272},{"x":-2,"y":272},{"x":-446,"y":272},{"x":-510,"y":272}],"textPositions":{"0":{"x":44,"y":260},"1":{"x":16,"y":284},"2":{"x":-492,"y":284},"3":{"x":-464,"y":260},"4":{"x":-224,"y":260},"5":{"x":-224,"y":260},"6":{"x":-224,"y":284}}},"warnings":null},{"id":614,"sourceNodeId":151,"sourcePortId":1243,"targetNodeId":162,"targetPortId":1244,"travelTime":{"lock":true,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":151},"sourceArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":269},"targetDeparture":{"lock":false,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":228},"targetArrival":{"lock":false,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":192},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3970,"y":80},{"x":4034,"y":80},{"x":4574,"y":-144},{"x":4638,"y":-144}],"textPositions":{"0":{"x":3988,"y":92},"1":{"x":4016,"y":68},"2":{"x":4620,"y":-156},"3":{"x":4592,"y":-132},"4":{"x":4304,"y":-44},"5":{"x":4304,"y":-44},"6":{"x":4304,"y":-20}}},"warnings":null},{"id":615,"sourceNodeId":135,"sourcePortId":1245,"targetNodeId":150,"targetPortId":1246,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":95},"sourceArrival":{"lock":true,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":205},"targetDeparture":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":196},"targetArrival":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":104},"numberOfStops":0,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":208},{"x":2914,"y":208},{"x":3230,"y":208},{"x":3294,"y":208}],"textPositions":{"0":{"x":2868,"y":220},"1":{"x":2896,"y":196},"2":{"x":3276,"y":196},"3":{"x":3248,"y":220},"4":{"x":3072,"y":196},"5":{"x":3072,"y":196},"6":{"x":3072,"y":220}}},"warnings":null},{"id":616,"sourceNodeId":150,"sourcePortId":1247,"targetNodeId":151,"targetPortId":1248,"travelTime":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"sourceArrival":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":194},"targetDeparture":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":181},"targetArrival":{"lock":true,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":119},"numberOfStops":0,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3394,"y":208},{"x":3458,"y":208},{"x":3806,"y":208},{"x":3870,"y":208}],"textPositions":{"0":{"x":3412,"y":220},"1":{"x":3440,"y":196},"2":{"x":3852,"y":196},"3":{"x":3824,"y":220},"4":{"x":3632,"y":196},"5":{"x":3632,"y":196},"6":{"x":3632,"y":220}}},"warnings":null},{"id":617,"sourceNodeId":151,"sourcePortId":1249,"targetNodeId":139,"targetPortId":1250,"travelTime":{"lock":false,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":121},"sourceArrival":{"lock":true,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":179},"targetDeparture":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":130},"targetArrival":{"lock":true,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":170},"numberOfStops":2,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":3888,"y":30},{"x":3888,"y":-34},{"x":4272,"y":-286},{"x":4272,"y":-350}],"textPositions":{"0":{"x":3900,"y":12},"1":{"x":3876,"y":-16},"2":{"x":4260,"y":-332},"3":{"x":4284,"y":-304},"4":{"x":4068,"y":-160},"5":{"x":4068,"y":-160},"6":{"x":4092,"y":-160}}},"warnings":null},{"id":618,"sourceNodeId":138,"sourcePortId":1251,"targetNodeId":163,"targetPortId":1252,"travelTime":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":0},"sourceArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"targetDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":59},"targetArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":1},"numberOfStops":0,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":-1054},{"x":2672,"y":-990},{"x":2800,"y":-610},{"x":2800,"y":-546}],"textPositions":{"0":{"x":2660,"y":-1036},"1":{"x":2684,"y":-1008},"2":{"x":2812,"y":-564},"3":{"x":2788,"y":-592},"4":{"x":2748,"y":-800},"5":{"x":2748,"y":-800},"6":{"x":2724,"y":-800}}},"warnings":null},{"id":619,"sourceNodeId":163,"sourcePortId":1253,"targetNodeId":135,"targetPortId":1254,"travelTime":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":3},"sourceArrival":{"lock":false,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":57},"targetDeparture":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":56},"targetArrival":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":4},"numberOfStops":0,"trainrunId":91,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2800,"y":-478},{"x":2800,"y":-414},{"x":2704,"y":-34},{"x":2704,"y":30}],"textPositions":{"0":{"x":2788,"y":-460},"1":{"x":2812,"y":-432},"2":{"x":2716,"y":12},"3":{"x":2692,"y":-16},"4":{"x":2740,"y":-224},"5":{"x":2740,"y":-224},"6":{"x":2764,"y":-224}}},"warnings":null},{"id":620,"sourceNodeId":135,"sourcePortId":1255,"targetNodeId":138,"targetPortId":1256,"travelTime":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":120},"sourceArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"targetDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":59},"targetArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":121},"numberOfStops":0,"trainrunId":92,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":30},{"x":2672,"y":-34},{"x":2640,"y":-990},{"x":2640,"y":-1054}],"textPositions":{"0":{"x":2684,"y":12},"1":{"x":2660,"y":-16},"2":{"x":2628,"y":-1036},"3":{"x":2652,"y":-1008},"4":{"x":2668,"y":-512},"5":{"x":2668,"y":-512},"6":{"x":2644,"y":-512}}},"warnings":null},{"id":621,"sourceNodeId":166,"sourcePortId":1257,"targetNodeId":148,"targetPortId":1258,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":356},"sourceArrival":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":184},"targetDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":179},"targetArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":361},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":48},{"x":1726,"y":48},{"x":1506,"y":48},{"x":1442,"y":48}],"textPositions":{"0":{"x":1772,"y":36},"1":{"x":1744,"y":60},"2":{"x":1460,"y":60},"3":{"x":1488,"y":36},"4":{"x":1616,"y":36},"5":{"x":1616,"y":36},"6":{"x":1616,"y":60}}},"warnings":null},{"id":622,"sourceNodeId":166,"sourcePortId":1259,"targetNodeId":148,"targetPortId":1260,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":377},"sourceArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetDeparture":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":156},"targetArrival":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":384},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":144},{"x":1726,"y":144},{"x":1506,"y":144},{"x":1442,"y":144}],"textPositions":{"0":{"x":1772,"y":132},"1":{"x":1744,"y":156},"2":{"x":1460,"y":156},"3":{"x":1488,"y":132},"4":{"x":1616,"y":132},"5":{"x":1616,"y":132},"6":{"x":1616,"y":156}}},"warnings":null},{"id":623,"sourceNodeId":166,"sourcePortId":1261,"targetNodeId":148,"targetPortId":1262,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"sourceArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"targetDeparture":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":100},"targetArrival":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":320},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":176},{"x":1726,"y":176},{"x":1506,"y":176},{"x":1442,"y":176}],"textPositions":{"0":{"x":1772,"y":164},"1":{"x":1744,"y":188},"2":{"x":1460,"y":188},"3":{"x":1488,"y":164},"4":{"x":1616,"y":164},"5":{"x":1616,"y":164},"6":{"x":1616,"y":188}}},"warnings":null},{"id":624,"sourceNodeId":166,"sourcePortId":1263,"targetNodeId":148,"targetPortId":1264,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":325},"sourceArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":95},"targetDeparture":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetArrival":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":330},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":208},{"x":1726,"y":208},{"x":1506,"y":208},{"x":1442,"y":208}],"textPositions":{"0":{"x":1772,"y":196},"1":{"x":1744,"y":220},"2":{"x":1460,"y":220},"3":{"x":1488,"y":196},"4":{"x":1616,"y":196},"5":{"x":1616,"y":196},"6":{"x":1616,"y":220}}},"warnings":null},{"id":625,"sourceNodeId":166,"sourcePortId":1265,"targetNodeId":148,"targetPortId":1266,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetDeparture":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":105},"targetArrival":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":315},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":240},{"x":1726,"y":240},{"x":1506,"y":240},{"x":1442,"y":240}],"textPositions":{"0":{"x":1772,"y":228},"1":{"x":1744,"y":252},"2":{"x":1460,"y":252},"3":{"x":1488,"y":228},"4":{"x":1616,"y":228},"5":{"x":1616,"y":228},"6":{"x":1616,"y":252}}},"warnings":null},{"id":626,"sourceNodeId":134,"sourcePortId":1267,"targetNodeId":164,"targetPortId":1268,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":11},"sourceArrival":{"lock":false,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":169},"targetDeparture":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":156},"targetArrival":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":24},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":322,"y":-1872},{"x":386,"y":-1872},{"x":990,"y":-944},{"x":1054,"y":-944}],"textPositions":{"0":{"x":340,"y":-1860},"1":{"x":368,"y":-1884},"2":{"x":1036,"y":-956},"3":{"x":1008,"y":-932},"4":{"x":688,"y":-1420},"5":{"x":688,"y":-1420},"6":{"x":688,"y":-1396}}},"warnings":null},{"id":627,"sourceNodeId":164,"sourcePortId":1269,"targetNodeId":165,"targetPortId":1270,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":25},"sourceArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":155},"targetDeparture":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":146},"targetArrival":{"lock":false,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":34},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1154,"y":-944},{"x":1218,"y":-944},{"x":1726,"y":-656},{"x":1790,"y":-656}],"textPositions":{"0":{"x":1172,"y":-932},"1":{"x":1200,"y":-956},"2":{"x":1772,"y":-668},"3":{"x":1744,"y":-644},"4":{"x":1472,"y":-812},"5":{"x":1472,"y":-812},"6":{"x":1472,"y":-788}}},"warnings":null},{"id":628,"sourceNodeId":165,"sourcePortId":1271,"targetNodeId":166,"targetPortId":1272,"travelTime":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"sourceArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":145},"targetDeparture":{"lock":false,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":123},"targetArrival":{"lock":false,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":57},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1808,"y":-606},{"x":1808,"y":-542},{"x":1808,"y":-34},{"x":1808,"y":30}],"textPositions":{"0":{"x":1796,"y":-588},"1":{"x":1820,"y":-560},"2":{"x":1820,"y":12},"3":{"x":1796,"y":-16},"4":{"x":1796,"y":-288},"5":{"x":1796,"y":-288},"6":{"x":1820,"y":-288}}},"warnings":null},{"id":629,"sourceNodeId":166,"sourcePortId":1273,"targetNodeId":149,"targetPortId":1274,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"sourceArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":120},"targetDeparture":{"lock":false,"time":53,"warning":null,"timeFormatter":null,"consecutiveTime":113},"targetArrival":{"lock":false,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":67},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1890,"y":272},{"x":1954,"y":272},{"x":2174,"y":272},{"x":2238,"y":272}],"textPositions":{"0":{"x":1908,"y":284},"1":{"x":1936,"y":260},"2":{"x":2220,"y":260},"3":{"x":2192,"y":284},"4":{"x":2064,"y":260},"5":{"x":2064,"y":260},"6":{"x":2064,"y":284}}},"warnings":null},{"id":630,"sourceNodeId":149,"sourcePortId":1275,"targetNodeId":135,"targetPortId":1276,"travelTime":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetDeparture":{"lock":false,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":96},"targetArrival":{"lock":false,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":84},"numberOfStops":0,"trainrunId":93,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2338,"y":272},{"x":2402,"y":272},{"x":2590,"y":272},{"x":2654,"y":272}],"textPositions":{"0":{"x":2356,"y":284},"1":{"x":2384,"y":260},"2":{"x":2636,"y":260},"3":{"x":2608,"y":284},"4":{"x":2496,"y":260},"5":{"x":2496,"y":260},"6":{"x":2496,"y":284}}},"warnings":null},{"id":631,"sourceNodeId":134,"sourcePortId":1277,"targetNodeId":146,"targetPortId":1278,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":6},"sourceArrival":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":174},"targetDeparture":{"lock":false,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":169},"targetArrival":{"lock":false,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":11},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":-1822},{"x":144,"y":-1758},{"x":144,"y":-1474},{"x":144,"y":-1410}],"textPositions":{"0":{"x":132,"y":-1804},"1":{"x":156,"y":-1776},"2":{"x":156,"y":-1428},"3":{"x":132,"y":-1456},"4":{"x":132,"y":-1616},"5":{"x":132,"y":-1616},"6":{"x":156,"y":-1616}}},"warnings":null},{"id":632,"sourceNodeId":146,"sourcePortId":1279,"targetNodeId":145,"targetPortId":1280,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":11},"sourceArrival":{"lock":false,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":169},"targetDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":17},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":-1342},{"x":144,"y":-1278},{"x":144,"y":-994},{"x":144,"y":-930}],"textPositions":{"0":{"x":132,"y":-1324},"1":{"x":156,"y":-1296},"2":{"x":156,"y":-948},"3":{"x":132,"y":-976},"4":{"x":132,"y":-1136},"5":{"x":132,"y":-1136},"6":{"x":156,"y":-1136}}},"warnings":null},{"id":633,"sourceNodeId":145,"sourcePortId":1281,"targetNodeId":144,"targetPortId":1282,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":17},"sourceArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetDeparture":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":157},"targetArrival":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":23},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":-862},{"x":144,"y":-798},{"x":144,"y":-514},{"x":144,"y":-450}],"textPositions":{"0":{"x":132,"y":-844},"1":{"x":156,"y":-816},"2":{"x":156,"y":-468},"3":{"x":132,"y":-496},"4":{"x":132,"y":-656},"5":{"x":132,"y":-656},"6":{"x":156,"y":-656}}},"warnings":null},{"id":634,"sourceNodeId":144,"sourcePortId":1283,"targetNodeId":147,"targetPortId":1284,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":23},"sourceArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":157},"targetDeparture":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":147},"targetArrival":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":33},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":322,"y":-400},{"x":386,"y":-400},{"x":894,"y":80},{"x":958,"y":80}],"textPositions":{"0":{"x":340,"y":-388},"1":{"x":368,"y":-412},"2":{"x":940,"y":68},"3":{"x":912,"y":92},"4":{"x":640,"y":-172},"5":{"x":640,"y":-172},"6":{"x":640,"y":-148}}},"warnings":null},{"id":635,"sourceNodeId":147,"sourcePortId":1285,"targetNodeId":148,"targetPortId":1286,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":33},"sourceArrival":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":147},"targetDeparture":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":140},"targetArrival":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":40},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1058,"y":112},{"x":1122,"y":112},{"x":1278,"y":112},{"x":1342,"y":112}],"textPositions":{"0":{"x":1076,"y":124},"1":{"x":1104,"y":100},"2":{"x":1324,"y":100},"3":{"x":1296,"y":124},"4":{"x":1200,"y":100},"5":{"x":1200,"y":100},"6":{"x":1200,"y":124}}},"warnings":null},{"id":636,"sourceNodeId":148,"sourcePortId":1287,"targetNodeId":166,"targetPortId":1288,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":40},"sourceArrival":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":140},"targetDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"targetArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1442,"y":112},{"x":1506,"y":112},{"x":1726,"y":112},{"x":1790,"y":112}],"textPositions":{"0":{"x":1460,"y":124},"1":{"x":1488,"y":100},"2":{"x":1772,"y":100},"3":{"x":1744,"y":124},"4":{"x":1616,"y":100},"5":{"x":1616,"y":100},"6":{"x":1616,"y":124}}},"warnings":null},{"id":637,"sourceNodeId":166,"sourcePortId":1289,"targetNodeId":149,"targetPortId":1290,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"sourceArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":134},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":128},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1890,"y":112},{"x":1954,"y":112},{"x":2174,"y":112},{"x":2238,"y":112}],"textPositions":{"0":{"x":1908,"y":124},"1":{"x":1936,"y":100},"2":{"x":2220,"y":100},"3":{"x":2192,"y":124},"4":{"x":2064,"y":100},"5":{"x":2064,"y":100},"6":{"x":2064,"y":124}}},"warnings":null},{"id":638,"sourceNodeId":149,"sourcePortId":1291,"targetNodeId":135,"targetPortId":1292,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":128},"targetDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":120},"targetArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"numberOfStops":0,"trainrunId":94,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2338,"y":112},{"x":2402,"y":112},{"x":2590,"y":112},{"x":2654,"y":112}],"textPositions":{"0":{"x":2356,"y":124},"1":{"x":2384,"y":100},"2":{"x":2636,"y":100},"3":{"x":2608,"y":124},"4":{"x":2496,"y":100},"5":{"x":2496,"y":100},"6":{"x":2496,"y":124}}},"warnings":null},{"id":639,"sourceNodeId":147,"sourcePortId":1293,"targetNodeId":148,"targetPortId":1294,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":54},"sourceArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":126},"targetDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":120},"targetArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"numberOfStops":0,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1058,"y":272},{"x":1122,"y":272},{"x":1278,"y":272},{"x":1342,"y":272}],"textPositions":{"0":{"x":1076,"y":284},"1":{"x":1104,"y":260},"2":{"x":1324,"y":260},"3":{"x":1296,"y":284},"4":{"x":1200,"y":260},"5":{"x":1200,"y":260},"6":{"x":1200,"y":284}}},"warnings":null},{"id":640,"sourceNodeId":148,"sourcePortId":1295,"targetNodeId":166,"targetPortId":1296,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":62},"sourceArrival":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":118},"targetDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"numberOfStops":0,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1442,"y":272},{"x":1506,"y":272},{"x":1726,"y":272},{"x":1790,"y":272}],"textPositions":{"0":{"x":1460,"y":284},"1":{"x":1488,"y":260},"2":{"x":1772,"y":260},"3":{"x":1744,"y":284},"4":{"x":1616,"y":260},"5":{"x":1616,"y":260},"6":{"x":1616,"y":284}}},"warnings":null},{"id":641,"sourceNodeId":166,"sourcePortId":1297,"targetNodeId":149,"targetPortId":1298,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetDeparture":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":105},"targetArrival":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":75},"numberOfStops":0,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1890,"y":304},{"x":1954,"y":304},{"x":2174,"y":304},{"x":2238,"y":304}],"textPositions":{"0":{"x":1908,"y":316},"1":{"x":1936,"y":292},"2":{"x":2220,"y":292},"3":{"x":2192,"y":316},"4":{"x":2064,"y":292},"5":{"x":2064,"y":292},"6":{"x":2064,"y":316}}},"warnings":null},{"id":642,"sourceNodeId":149,"sourcePortId":1299,"targetNodeId":135,"targetPortId":1300,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":75},"sourceArrival":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":105},"targetDeparture":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":98},"targetArrival":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":82},"numberOfStops":0,"trainrunId":97,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2338,"y":304},{"x":2402,"y":304},{"x":2590,"y":304},{"x":2654,"y":304}],"textPositions":{"0":{"x":2356,"y":316},"1":{"x":2384,"y":292},"2":{"x":2636,"y":292},"3":{"x":2608,"y":316},"4":{"x":2496,"y":292},"5":{"x":2496,"y":292},"6":{"x":2496,"y":316}}},"warnings":null},{"id":643,"sourceNodeId":134,"sourcePortId":1301,"targetNodeId":146,"targetPortId":1302,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":28},"sourceArrival":{"lock":false,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":272},"targetDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":265},"targetArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":-1822},{"x":208,"y":-1758},{"x":208,"y":-1474},{"x":208,"y":-1410}],"textPositions":{"0":{"x":196,"y":-1804},"1":{"x":220,"y":-1776},"2":{"x":220,"y":-1428},"3":{"x":196,"y":-1456},"4":{"x":196,"y":-1616},"5":{"x":196,"y":-1616},"6":{"x":220,"y":-1616}}},"warnings":null},{"id":644,"sourceNodeId":146,"sourcePortId":1303,"targetNodeId":145,"targetPortId":1304,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"sourceArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":265},"targetDeparture":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":259},"targetArrival":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":-1342},{"x":208,"y":-1278},{"x":208,"y":-994},{"x":208,"y":-930}],"textPositions":{"0":{"x":196,"y":-1324},"1":{"x":220,"y":-1296},"2":{"x":220,"y":-948},"3":{"x":196,"y":-976},"4":{"x":196,"y":-1136},"5":{"x":196,"y":-1136},"6":{"x":220,"y":-1136}}},"warnings":null},{"id":645,"sourceNodeId":145,"sourcePortId":1305,"targetNodeId":144,"targetPortId":1306,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"sourceArrival":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":259},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":253},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":47},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":208,"y":-862},{"x":208,"y":-798},{"x":208,"y":-514},{"x":208,"y":-450}],"textPositions":{"0":{"x":196,"y":-844},"1":{"x":220,"y":-816},"2":{"x":220,"y":-468},"3":{"x":196,"y":-496},"4":{"x":196,"y":-656},"5":{"x":196,"y":-656},"6":{"x":220,"y":-656}}},"warnings":null},{"id":646,"sourceNodeId":144,"sourcePortId":1307,"targetNodeId":133,"targetPortId":1308,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":47},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":253},"targetDeparture":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":245},"targetArrival":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":55},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":-354},{"x":144,"y":-290},{"x":144,"y":30},{"x":144,"y":94}],"textPositions":{"0":{"x":132,"y":-336},"1":{"x":156,"y":-308},"2":{"x":156,"y":76},"3":{"x":132,"y":48},"4":{"x":132,"y":-130},"5":{"x":132,"y":-130},"6":{"x":156,"y":-130}}},"warnings":null},{"id":647,"sourceNodeId":133,"sourcePortId":1309,"targetNodeId":172,"targetPortId":1310,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":58},"sourceArrival":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":242},"targetDeparture":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":235},"targetArrival":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":62,"y":208},{"x":-2,"y":208},{"x":-446,"y":208},{"x":-510,"y":208}],"textPositions":{"0":{"x":44,"y":196},"1":{"x":16,"y":220},"2":{"x":-492,"y":220},"3":{"x":-464,"y":196},"4":{"x":-224,"y":196},"5":{"x":-224,"y":196},"6":{"x":-224,"y":220}}},"warnings":null},{"id":648,"sourceNodeId":129,"sourcePortId":1311,"targetNodeId":167,"targetPortId":1312,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":94},"sourceArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":206},"targetDeparture":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":188},"targetArrival":{"lock":true,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2096,"y":382},{"x":-2096,"y":446},{"x":-2096,"y":574},{"x":-2096,"y":638}],"textPositions":{"0":{"x":-2108,"y":400},"1":{"x":-2084,"y":428},"2":{"x":-2084,"y":620},"3":{"x":-2108,"y":592},"4":{"x":-2108,"y":510},"5":{"x":-2108,"y":510},"6":{"x":-2084,"y":510}}},"warnings":null},{"id":649,"sourceNodeId":129,"sourcePortId":1313,"targetNodeId":167,"targetPortId":1314,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":359},"sourceArrival":{"lock":false,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":61},"targetDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":43},"targetArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":377},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2064,"y":382},{"x":-2064,"y":446},{"x":-2064,"y":574},{"x":-2064,"y":638}],"textPositions":{"0":{"x":-2076,"y":400},"1":{"x":-2052,"y":428},"2":{"x":-2052,"y":620},"3":{"x":-2076,"y":592},"4":{"x":-2076,"y":510},"5":{"x":-2076,"y":510},"6":{"x":-2052,"y":510}}},"warnings":null},{"id":650,"sourceNodeId":167,"sourcePortId":1315,"targetNodeId":168,"targetPortId":1316,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":114},"sourceArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":186},"targetDeparture":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":178},"targetArrival":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":122},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2096,"y":706},{"x":-2096,"y":770},{"x":-2096,"y":862},{"x":-2096,"y":926}],"textPositions":{"0":{"x":-2108,"y":724},"1":{"x":-2084,"y":752},"2":{"x":-2084,"y":908},"3":{"x":-2108,"y":880},"4":{"x":-2108,"y":816},"5":{"x":-2108,"y":816},"6":{"x":-2084,"y":816}}},"warnings":null},{"id":651,"sourceNodeId":168,"sourcePortId":1317,"targetNodeId":131,"targetPortId":1318,"travelTime":{"lock":true,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":124},"sourceArrival":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":176},"targetDeparture":{"lock":false,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":152},"targetArrival":{"lock":false,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":148},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2014,"y":944},{"x":-1950,"y":944},{"x":-1154,"y":944},{"x":-1090,"y":944}],"textPositions":{"0":{"x":-1996,"y":956},"1":{"x":-1968,"y":932},"2":{"x":-1108,"y":932},"3":{"x":-1136,"y":956},"4":{"x":-1552,"y":932},"5":{"x":-1552,"y":932},"6":{"x":-1552,"y":956}}},"warnings":null},{"id":652,"sourceNodeId":167,"sourcePortId":1319,"targetNodeId":168,"targetPortId":1320,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":379},"sourceArrival":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"targetDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":31},"targetArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":389},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2064,"y":706},{"x":-2064,"y":770},{"x":-2064,"y":862},{"x":-2064,"y":926}],"textPositions":{"0":{"x":-2076,"y":724},"1":{"x":-2052,"y":752},"2":{"x":-2052,"y":908},"3":{"x":-2076,"y":880},"4":{"x":-2076,"y":816},"5":{"x":-2076,"y":816},"6":{"x":-2052,"y":816}}},"warnings":null},{"id":653,"sourceNodeId":168,"sourcePortId":1321,"targetNodeId":132,"targetPortId":1322,"travelTime":{"lock":true,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":391},"sourceArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":29},"targetDeparture":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":4},"targetArrival":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":416},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2096,"y":1022},{"x":-2096,"y":1086},{"x":-2096,"y":1374},{"x":-2096,"y":1438}],"textPositions":{"0":{"x":-2108,"y":1040},"1":{"x":-2084,"y":1068},"2":{"x":-2084,"y":1420},"3":{"x":-2108,"y":1392},"4":{"x":-2108,"y":1230},"5":{"x":-2108,"y":1230},"6":{"x":-2084,"y":1230}}},"warnings":null},{"id":654,"sourceNodeId":132,"sourcePortId":1323,"targetNodeId":168,"targetPortId":1324,"travelTime":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":149},"sourceArrival":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":151},"targetDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":125},"targetArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":175},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2128,"y":1438},{"x":-2128,"y":1374},{"x":-2128,"y":1086},{"x":-2128,"y":1022}],"textPositions":{"0":{"x":-2116,"y":1420},"1":{"x":-2140,"y":1392},"2":{"x":-2140,"y":1040},"3":{"x":-2116,"y":1068},"4":{"x":-2140,"y":1230},"5":{"x":-2140,"y":1230},"6":{"x":-2116,"y":1230}}},"warnings":null},{"id":655,"sourceNodeId":168,"sourcePortId":1325,"targetNodeId":167,"targetPortId":1326,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":178},"sourceArrival":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":122},"targetDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":114},"targetArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":186},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2128,"y":926},{"x":-2128,"y":862},{"x":-2128,"y":770},{"x":-2128,"y":706}],"textPositions":{"0":{"x":-2116,"y":908},"1":{"x":-2140,"y":880},"2":{"x":-2140,"y":724},"3":{"x":-2116,"y":752},"4":{"x":-2140,"y":816},"5":{"x":-2140,"y":816},"6":{"x":-2116,"y":816}}},"warnings":null},{"id":656,"sourceNodeId":167,"sourcePortId":1327,"targetNodeId":129,"targetPortId":1328,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":188},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":112},"targetDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":94},"targetArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":206},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2128,"y":638},{"x":-2128,"y":574},{"x":-2128,"y":446},{"x":-2128,"y":382}],"textPositions":{"0":{"x":-2116,"y":620},"1":{"x":-2140,"y":592},"2":{"x":-2140,"y":400},"3":{"x":-2116,"y":428},"4":{"x":-2140,"y":510},"5":{"x":-2140,"y":510},"6":{"x":-2116,"y":510}}},"warnings":null},{"id":657,"sourceNodeId":129,"sourcePortId":1329,"targetNodeId":178,"targetPortId":1330,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":214},"sourceArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":86},"targetDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":83},"targetArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":217},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2014,"y":176},{"x":-1950,"y":176},{"x":-1762,"y":176},{"x":-1698,"y":176}],"textPositions":{"0":{"x":-1996,"y":188},"1":{"x":-1968,"y":164},"2":{"x":-1716,"y":164},"3":{"x":-1744,"y":188},"4":{"x":-1856,"y":164},"5":{"x":-1856,"y":164},"6":{"x":-1856,"y":188}}},"warnings":null},{"id":658,"sourceNodeId":133,"sourcePortId":1331,"targetNodeId":144,"targetPortId":1332,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":245},"sourceArrival":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":55},"targetDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":47},"targetArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":253},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":94},{"x":112,"y":30},{"x":112,"y":-290},{"x":112,"y":-354}],"textPositions":{"0":{"x":124,"y":76},"1":{"x":100,"y":48},"2":{"x":100,"y":-336},"3":{"x":124,"y":-308},"4":{"x":100,"y":-130},"5":{"x":100,"y":-130},"6":{"x":124,"y":-130}}},"warnings":null},{"id":659,"sourceNodeId":144,"sourcePortId":1333,"targetNodeId":145,"targetPortId":1334,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":253},"sourceArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":47},"targetDeparture":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"targetArrival":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":259},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":-450},{"x":176,"y":-514},{"x":176,"y":-798},{"x":176,"y":-862}],"textPositions":{"0":{"x":188,"y":-468},"1":{"x":164,"y":-496},"2":{"x":164,"y":-844},"3":{"x":188,"y":-816},"4":{"x":164,"y":-656},"5":{"x":164,"y":-656},"6":{"x":188,"y":-656}}},"warnings":null},{"id":660,"sourceNodeId":145,"sourcePortId":1335,"targetNodeId":146,"targetPortId":1336,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":259},"sourceArrival":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"targetDeparture":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"targetArrival":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":265},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":-930},{"x":176,"y":-994},{"x":176,"y":-1278},{"x":176,"y":-1342}],"textPositions":{"0":{"x":188,"y":-948},"1":{"x":164,"y":-976},"2":{"x":164,"y":-1324},"3":{"x":188,"y":-1296},"4":{"x":164,"y":-1136},"5":{"x":164,"y":-1136},"6":{"x":188,"y":-1136}}},"warnings":null},{"id":661,"sourceNodeId":146,"sourcePortId":1337,"targetNodeId":134,"targetPortId":1338,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":265},"sourceArrival":{"lock":false,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":35},"targetDeparture":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":28},"targetArrival":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":272},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":-1410},{"x":176,"y":-1474},{"x":176,"y":-1758},{"x":176,"y":-1822}],"textPositions":{"0":{"x":188,"y":-1428},"1":{"x":164,"y":-1456},"2":{"x":164,"y":-1804},"3":{"x":188,"y":-1776},"4":{"x":164,"y":-1616},"5":{"x":164,"y":-1616},"6":{"x":188,"y":-1616}}},"warnings":null},{"id":662,"sourceNodeId":129,"sourcePortId":1339,"targetNodeId":167,"targetPortId":1340,"travelTime":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":368},"sourceArrival":{"lock":true,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"targetDeparture":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":33},"targetArrival":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":387},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2032,"y":382},{"x":-2032,"y":446},{"x":-2032,"y":574},{"x":-2032,"y":638}],"textPositions":{"0":{"x":-2044,"y":400},"1":{"x":-2020,"y":428},"2":{"x":-2020,"y":620},"3":{"x":-2044,"y":592},"4":{"x":-2044,"y":510},"5":{"x":-2044,"y":510},"6":{"x":-2020,"y":510}}},"warnings":null},{"id":663,"sourceNodeId":167,"sourcePortId":1341,"targetNodeId":168,"targetPortId":1342,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":388},"sourceArrival":{"lock":false,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":32},"targetDeparture":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":22},"targetArrival":{"lock":true,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":398},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2032,"y":706},{"x":-2032,"y":770},{"x":-2032,"y":862},{"x":-2032,"y":926}],"textPositions":{"0":{"x":-2044,"y":724},"1":{"x":-2020,"y":752},"2":{"x":-2020,"y":908},"3":{"x":-2044,"y":880},"4":{"x":-2044,"y":816},"5":{"x":-2044,"y":816},"6":{"x":-2020,"y":816}}},"warnings":null},{"id":664,"sourceNodeId":168,"sourcePortId":1343,"targetNodeId":131,"targetPortId":1344,"travelTime":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":399},"sourceArrival":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":21},"targetDeparture":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":0},"targetArrival":{"lock":false,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":420},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2014,"y":976},{"x":-1950,"y":976},{"x":-1154,"y":976},{"x":-1090,"y":976}],"textPositions":{"0":{"x":-1996,"y":988},"1":{"x":-1968,"y":964},"2":{"x":-1108,"y":964},"3":{"x":-1136,"y":988},"4":{"x":-1552,"y":964},"5":{"x":-1552,"y":964},"6":{"x":-1552,"y":988}}},"warnings":null},{"id":665,"sourceNodeId":169,"sourcePortId":1345,"targetNodeId":153,"targetPortId":1346,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":48,"warning":null,"timeFormatter":null,"consecutiveTime":48},"sourceArrival":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":252},"targetDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":243},"targetArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":57},"numberOfStops":0,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1954,"y":1776},{"x":2018,"y":1776},{"x":2590,"y":1360},{"x":2654,"y":1360}],"textPositions":{"0":{"x":1972,"y":1788},"1":{"x":2000,"y":1764},"2":{"x":2636,"y":1348},"3":{"x":2608,"y":1372},"4":{"x":2304,"y":1556},"5":{"x":2304,"y":1556},"6":{"x":2304,"y":1580}}},"warnings":null},{"id":666,"sourceNodeId":169,"sourcePortId":1347,"targetNodeId":153,"targetPortId":1348,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":18},"sourceArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":42},"targetDeparture":{"lock":false,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":32},"targetArrival":{"lock":false,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":28},"numberOfStops":0,"trainrunId":80,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1954,"y":1744},{"x":2018,"y":1744},{"x":2590,"y":1328},{"x":2654,"y":1328}],"textPositions":{"0":{"x":1972,"y":1756},"1":{"x":2000,"y":1732},"2":{"x":2636,"y":1316},"3":{"x":2608,"y":1340},"4":{"x":2304,"y":1524},"5":{"x":2304,"y":1524},"6":{"x":2304,"y":1548}}},"warnings":null},{"id":667,"sourceNodeId":169,"sourcePortId":1349,"targetNodeId":142,"targetPortId":1350,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":453},"sourceArrival":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":147},"targetDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":138},"targetArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":462},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1854,"y":1776},{"x":1790,"y":1776},{"x":290,"y":1776},{"x":226,"y":1776}],"textPositions":{"0":{"x":1836,"y":1764},"1":{"x":1808,"y":1788},"2":{"x":244,"y":1788},"3":{"x":272,"y":1764},"4":{"x":1040,"y":1764},"5":{"x":1040,"y":1764},"6":{"x":1040,"y":1788}}},"warnings":null},{"id":668,"sourceNodeId":169,"sourcePortId":1351,"targetNodeId":142,"targetPortId":1352,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":273},"sourceArrival":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":87},"targetDeparture":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":78},"targetArrival":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":282},"numberOfStops":0,"trainrunId":75,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1854,"y":1744},{"x":1790,"y":1744},{"x":290,"y":1744},{"x":226,"y":1744}],"textPositions":{"0":{"x":1836,"y":1732},"1":{"x":1808,"y":1756},"2":{"x":244,"y":1756},"3":{"x":272,"y":1732},"4":{"x":1040,"y":1732},"5":{"x":1040,"y":1732},"6":{"x":1040,"y":1756}}},"warnings":null},{"id":669,"sourceNodeId":170,"sourcePortId":1353,"targetNodeId":135,"targetPortId":1354,"travelTime":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":74},"sourceArrival":{"lock":true,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":226},"targetDeparture":{"lock":true,"time":35,"warning":null,"timeFormatter":null,"consecutiveTime":215},"targetArrival":{"lock":true,"time":25,"warning":null,"timeFormatter":null,"consecutiveTime":85},"numberOfStops":0,"trainrunId":79,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2832,"y":734},{"x":2832,"y":670},{"x":2832,"y":414},{"x":2832,"y":350}],"textPositions":{"0":{"x":2844,"y":716},"1":{"x":2820,"y":688},"2":{"x":2820,"y":368},"3":{"x":2844,"y":396},"4":{"x":2820,"y":542},"5":{"x":2820,"y":542},"6":{"x":2844,"y":542}}},"warnings":null},{"id":670,"sourceNodeId":170,"sourcePortId":1355,"targetNodeId":135,"targetPortId":1356,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":43},"sourceArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":17},"targetDeparture":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":10},"targetArrival":{"lock":true,"time":50,"warning":null,"timeFormatter":null,"consecutiveTime":50},"numberOfStops":0,"trainrunId":80,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2800,"y":734},{"x":2800,"y":670},{"x":2800,"y":414},{"x":2800,"y":350}],"textPositions":{"0":{"x":2812,"y":716},"1":{"x":2788,"y":688},"2":{"x":2788,"y":368},"3":{"x":2812,"y":396},"4":{"x":2788,"y":542},"5":{"x":2788,"y":542},"6":{"x":2812,"y":542}}},"warnings":null},{"id":671,"sourceNodeId":170,"sourcePortId":1357,"targetNodeId":135,"targetPortId":1358,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetDeparture":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":5},"targetArrival":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":355},"numberOfStops":0,"trainrunId":78,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2768,"y":734},{"x":2768,"y":670},{"x":2768,"y":414},{"x":2768,"y":350}],"textPositions":{"0":{"x":2780,"y":716},"1":{"x":2756,"y":688},"2":{"x":2756,"y":368},"3":{"x":2780,"y":396},"4":{"x":2756,"y":542},"5":{"x":2756,"y":542},"6":{"x":2780,"y":542}}},"warnings":null},{"id":672,"sourceNodeId":170,"sourcePortId":1359,"targetNodeId":135,"targetPortId":1360,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":107},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":13},"targetDeparture":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":5},"targetArrival":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":115},"numberOfStops":0,"trainrunId":76,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2672,"y":734},{"x":2672,"y":670},{"x":2672,"y":414},{"x":2672,"y":350}],"textPositions":{"0":{"x":2684,"y":716},"1":{"x":2660,"y":688},"2":{"x":2660,"y":368},"3":{"x":2684,"y":396},"4":{"x":2660,"y":542},"5":{"x":2660,"y":542},"6":{"x":2684,"y":542}}},"warnings":null},{"id":673,"sourceNodeId":170,"sourcePortId":1361,"targetNodeId":140,"targetPortId":1362,"travelTime":{"lock":true,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":75},"sourceArrival":{"lock":false,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":285},"targetDeparture":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":238},"targetArrival":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":122},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":752},{"x":2914,"y":752},{"x":4574,"y":1200},{"x":4638,"y":1200}],"textPositions":{"0":{"x":2868,"y":764},"1":{"x":2896,"y":740},"2":{"x":4620,"y":1188},"3":{"x":4592,"y":1212},"4":{"x":3744,"y":964},"5":{"x":3744,"y":964},"6":{"x":3744,"y":988}}},"warnings":null},{"id":674,"sourceNodeId":170,"sourcePortId":1363,"targetNodeId":140,"targetPortId":1364,"travelTime":{"lock":false,"time":61,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":141},"sourceArrival":{"lock":true,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":279},"targetDeparture":{"lock":true,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":218},"targetArrival":{"lock":true,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":202},"numberOfStops":5,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2850,"y":784},{"x":2914,"y":784},{"x":4574,"y":1232},{"x":4638,"y":1232}],"textPositions":{"0":{"x":2868,"y":796},"1":{"x":2896,"y":772},"2":{"x":4620,"y":1220},"3":{"x":4592,"y":1244},"4":{"x":3744,"y":996},"5":{"x":3744,"y":996},"6":{"x":3744,"y":1020}}},"warnings":null},{"id":675,"sourceNodeId":142,"sourcePortId":1365,"targetNodeId":141,"targetPortId":1366,"travelTime":{"lock":true,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":475},"sourceArrival":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":125},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":494},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":1726},{"x":144,"y":1662},{"x":144,"y":1314},{"x":144,"y":1250}],"textPositions":{"0":{"x":156,"y":1708},"1":{"x":132,"y":1680},"2":{"x":132,"y":1268},"3":{"x":156,"y":1296},"4":{"x":132,"y":1488},"5":{"x":132,"y":1488},"6":{"x":156,"y":1488}}},"warnings":null},{"id":676,"sourceNodeId":141,"sourcePortId":1367,"targetNodeId":143,"targetPortId":1368,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":494},"sourceArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"targetDeparture":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":99},"targetArrival":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":501},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":144,"y":1182},{"x":144,"y":1118},{"x":144,"y":866},{"x":144,"y":802}],"textPositions":{"0":{"x":156,"y":1164},"1":{"x":132,"y":1136},"2":{"x":132,"y":820},"3":{"x":156,"y":848},"4":{"x":132,"y":992},"5":{"x":132,"y":992},"6":{"x":156,"y":992}}},"warnings":null},{"id":677,"sourceNodeId":143,"sourcePortId":1369,"targetNodeId":133,"targetPortId":1370,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":503},"sourceArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":97},"targetDeparture":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":90},"targetArrival":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":510},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":734},{"x":112,"y":670},{"x":112,"y":414},{"x":112,"y":350}],"textPositions":{"0":{"x":124,"y":716},"1":{"x":100,"y":688},"2":{"x":100,"y":368},"3":{"x":124,"y":396},"4":{"x":100,"y":542},"5":{"x":100,"y":542},"6":{"x":124,"y":542}}},"warnings":null},{"id":678,"sourceNodeId":133,"sourcePortId":1371,"targetNodeId":144,"targetPortId":1372,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":32,"warning":null,"timeFormatter":null,"consecutiveTime":512},"sourceArrival":{"lock":true,"time":28,"warning":null,"timeFormatter":null,"consecutiveTime":88},"targetDeparture":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":78},"targetArrival":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":522},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":176,"y":94},{"x":176,"y":30},{"x":176,"y":-290},{"x":176,"y":-354}],"textPositions":{"0":{"x":188,"y":76},"1":{"x":164,"y":48},"2":{"x":164,"y":-336},"3":{"x":188,"y":-308},"4":{"x":164,"y":-130},"5":{"x":164,"y":-130},"6":{"x":188,"y":-130}}},"warnings":null},{"id":679,"sourceNodeId":144,"sourcePortId":1373,"targetNodeId":145,"targetPortId":1374,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":522},"sourceArrival":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":78},"targetDeparture":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":73},"targetArrival":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":527},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":-450},{"x":240,"y":-514},{"x":240,"y":-798},{"x":240,"y":-862}],"textPositions":{"0":{"x":252,"y":-468},"1":{"x":228,"y":-496},"2":{"x":228,"y":-844},"3":{"x":252,"y":-816},"4":{"x":228,"y":-656},"5":{"x":228,"y":-656},"6":{"x":252,"y":-656}}},"warnings":null},{"id":680,"sourceNodeId":145,"sourcePortId":1375,"targetNodeId":146,"targetPortId":1376,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":527},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":73},"targetDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":532},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":-930},{"x":240,"y":-994},{"x":240,"y":-1278},{"x":240,"y":-1342}],"textPositions":{"0":{"x":252,"y":-948},"1":{"x":228,"y":-976},"2":{"x":228,"y":-1324},"3":{"x":252,"y":-1296},"4":{"x":228,"y":-1136},"5":{"x":228,"y":-1136},"6":{"x":252,"y":-1136}}},"warnings":null},{"id":681,"sourceNodeId":146,"sourcePortId":1377,"targetNodeId":134,"targetPortId":1378,"travelTime":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":532},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":63},"targetArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":537},"numberOfStops":0,"trainrunId":77,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":240,"y":-1410},{"x":240,"y":-1474},{"x":240,"y":-1758},{"x":240,"y":-1822}],"textPositions":{"0":{"x":252,"y":-1428},"1":{"x":228,"y":-1456},"2":{"x":228,"y":-1804},"3":{"x":252,"y":-1776},"4":{"x":228,"y":-1616},"5":{"x":228,"y":-1616},"6":{"x":252,"y":-1616}}},"warnings":null},{"id":682,"sourceNodeId":171,"sourcePortId":1379,"targetNodeId":128,"targetPortId":1380,"travelTime":{"lock":false,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":387},"sourceArrival":{"lock":true,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":153},"targetDeparture":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":104},"targetArrival":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":436},"numberOfStops":2,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2562,"y":336},{"x":-2626,"y":336},{"x":-2910,"y":592},{"x":-2974,"y":592}],"textPositions":{"0":{"x":-2580,"y":324},"1":{"x":-2608,"y":348},"2":{"x":-2956,"y":604},"3":{"x":-2928,"y":580},"4":{"x":-2768,"y":452},"5":{"x":-2768,"y":452},"6":{"x":-2768,"y":476}}},"warnings":null},{"id":683,"sourceNodeId":171,"sourcePortId":1381,"targetNodeId":128,"targetPortId":1382,"travelTime":{"lock":true,"time":44,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":414},"sourceArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":126},"targetDeparture":{"lock":false,"time":22,"warning":null,"timeFormatter":null,"consecutiveTime":82},"targetArrival":{"lock":false,"time":38,"warning":null,"timeFormatter":null,"consecutiveTime":458},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-2562,"y":304},{"x":-2626,"y":304},{"x":-2910,"y":560},{"x":-2974,"y":560}],"textPositions":{"0":{"x":-2580,"y":292},"1":{"x":-2608,"y":316},"2":{"x":-2956,"y":572},"3":{"x":-2928,"y":548},"4":{"x":-2768,"y":420},"5":{"x":-2768,"y":420},"6":{"x":-2768,"y":444}}},"warnings":null},{"id":684,"sourceNodeId":172,"sourcePortId":1383,"targetNodeId":178,"targetPortId":1384,"travelTime":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":339},"sourceArrival":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":201},"targetDeparture":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":184},"targetArrival":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":356},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":304},{"x":-674,"y":304},{"x":-1534,"y":304},{"x":-1598,"y":304}],"textPositions":{"0":{"x":-628,"y":292},"1":{"x":-656,"y":316},"2":{"x":-1580,"y":316},"3":{"x":-1552,"y":292},"4":{"x":-1104,"y":292},"5":{"x":-1104,"y":292},"6":{"x":-1104,"y":316}}},"warnings":null},{"id":685,"sourceNodeId":172,"sourcePortId":1385,"targetNodeId":174,"targetPortId":1386,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":343},"sourceArrival":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":77},"targetDeparture":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":69},"targetArrival":{"lock":true,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":351},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":336},{"x":-674,"y":336},{"x":-830,"y":368},{"x":-894,"y":368}],"textPositions":{"0":{"x":-628,"y":324},"1":{"x":-656,"y":348},"2":{"x":-876,"y":380},"3":{"x":-848,"y":356},"4":{"x":-752,"y":340},"5":{"x":-752,"y":340},"6":{"x":-752,"y":364}}},"warnings":null},{"id":686,"sourceNodeId":172,"sourcePortId":1387,"targetNodeId":178,"targetPortId":1388,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":47,"warning":null,"timeFormatter":null,"consecutiveTime":347},"sourceArrival":{"lock":false,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":73},"targetDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"targetArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":355},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":272},{"x":-674,"y":272},{"x":-1534,"y":272},{"x":-1598,"y":272}],"textPositions":{"0":{"x":-628,"y":260},"1":{"x":-656,"y":284},"2":{"x":-1580,"y":284},"3":{"x":-1552,"y":260},"4":{"x":-1104,"y":260},"5":{"x":-1104,"y":260},"6":{"x":-1104,"y":284}}},"warnings":null},{"id":687,"sourceNodeId":172,"sourcePortId":1389,"targetNodeId":178,"targetPortId":1390,"travelTime":{"lock":true,"time":12,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":342},"sourceArrival":{"lock":false,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":78},"targetDeparture":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":66},"targetArrival":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":354},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":240},{"x":-674,"y":240},{"x":-1534,"y":240},{"x":-1598,"y":240}],"textPositions":{"0":{"x":-628,"y":228},"1":{"x":-656,"y":252},"2":{"x":-1580,"y":252},"3":{"x":-1552,"y":228},"4":{"x":-1104,"y":228},"5":{"x":-1104,"y":228},"6":{"x":-1104,"y":252}}},"warnings":null},{"id":688,"sourceNodeId":172,"sourcePortId":1391,"targetNodeId":178,"targetPortId":1392,"travelTime":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"sourceArrival":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":235},"targetDeparture":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":217},"targetArrival":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":83},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":208},{"x":-674,"y":208},{"x":-1534,"y":208},{"x":-1598,"y":208}],"textPositions":{"0":{"x":-628,"y":196},"1":{"x":-656,"y":220},"2":{"x":-1580,"y":220},"3":{"x":-1552,"y":196},"4":{"x":-1104,"y":196},"5":{"x":-1104,"y":196},"6":{"x":-1104,"y":220}}},"warnings":null},{"id":689,"sourceNodeId":172,"sourcePortId":1393,"targetNodeId":133,"targetPortId":1394,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":234},"sourceArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":66},"targetDeparture":{"lock":true,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":58},"targetArrival":{"lock":true,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":242},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-510,"y":176},{"x":-446,"y":176},{"x":-2,"y":176},{"x":62,"y":176}],"textPositions":{"0":{"x":-492,"y":188},"1":{"x":-464,"y":164},"2":{"x":44,"y":164},"3":{"x":16,"y":188},"4":{"x":-224,"y":164},"5":{"x":-224,"y":164},"6":{"x":-224,"y":188}}},"warnings":null},{"id":690,"sourceNodeId":172,"sourcePortId":1395,"targetNodeId":178,"targetPortId":1396,"travelTime":{"lock":true,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":377},"sourceArrival":{"lock":false,"time":43,"warning":null,"timeFormatter":null,"consecutiveTime":163},"targetDeparture":{"lock":false,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":154},"targetArrival":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":386},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-610,"y":144},{"x":-674,"y":144},{"x":-1534,"y":144},{"x":-1598,"y":144}],"textPositions":{"0":{"x":-628,"y":132},"1":{"x":-656,"y":156},"2":{"x":-1580,"y":156},"3":{"x":-1552,"y":132},"4":{"x":-1104,"y":132},"5":{"x":-1104,"y":132},"6":{"x":-1104,"y":156}}},"warnings":null},{"id":691,"sourceNodeId":173,"sourcePortId":1397,"targetNodeId":178,"targetPortId":1398,"travelTime":{"lock":true,"time":10,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":11,"warning":null,"timeFormatter":null,"consecutiveTime":371},"sourceArrival":{"lock":true,"time":49,"warning":null,"timeFormatter":null,"consecutiveTime":49},"targetDeparture":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":39},"targetArrival":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":381},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1346,"y":368},{"x":-1410,"y":368},{"x":-1534,"y":336},{"x":-1598,"y":336}],"textPositions":{"0":{"x":-1364,"y":356},"1":{"x":-1392,"y":380},"2":{"x":-1580,"y":348},"3":{"x":-1552,"y":324},"4":{"x":-1472,"y":340},"5":{"x":-1472,"y":340},"6":{"x":-1472,"y":364}}},"warnings":null},{"id":692,"sourceNodeId":174,"sourcePortId":1399,"targetNodeId":173,"targetPortId":1400,"travelTime":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":352},"sourceArrival":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetDeparture":{"lock":false,"time":51,"warning":null,"timeFormatter":null,"consecutiveTime":51},"targetArrival":{"lock":false,"time":9,"warning":null,"timeFormatter":null,"consecutiveTime":369},"numberOfStops":1,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-994,"y":368},{"x":-1058,"y":368},{"x":-1182,"y":368},{"x":-1246,"y":368}],"textPositions":{"0":{"x":-1012,"y":356},"1":{"x":-1040,"y":380},"2":{"x":-1228,"y":380},"3":{"x":-1200,"y":356},"4":{"x":-1120,"y":356},"5":{"x":-1120,"y":356},"6":{"x":-1120,"y":380}}},"warnings":null},{"id":693,"sourceNodeId":135,"sourcePortId":1401,"targetNodeId":149,"targetPortId":1402,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":300},"sourceArrival":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":60},"targetDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"targetArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2654,"y":80},{"x":2590,"y":80},{"x":2402,"y":80},{"x":2338,"y":80}],"textPositions":{"0":{"x":2636,"y":68},"1":{"x":2608,"y":92},"2":{"x":2356,"y":92},"3":{"x":2384,"y":68},"4":{"x":2496,"y":68},"5":{"x":2496,"y":68},"6":{"x":2496,"y":92}}},"warnings":null},{"id":694,"sourceNodeId":149,"sourcePortId":1403,"targetNodeId":166,"targetPortId":1404,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":308},"sourceArrival":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":52},"targetDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":2238,"y":80},{"x":2174,"y":80},{"x":1954,"y":80},{"x":1890,"y":80}],"textPositions":{"0":{"x":2220,"y":68},"1":{"x":2192,"y":92},"2":{"x":1908,"y":92},"3":{"x":1936,"y":68},"4":{"x":2064,"y":68},"5":{"x":2064,"y":68},"6":{"x":2064,"y":92}}},"warnings":null},{"id":695,"sourceNodeId":166,"sourcePortId":1405,"targetNodeId":148,"targetPortId":1406,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":314},"sourceArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":46},"targetDeparture":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":40},"targetArrival":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":320},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1790,"y":80},{"x":1726,"y":80},{"x":1506,"y":80},{"x":1442,"y":80}],"textPositions":{"0":{"x":1772,"y":68},"1":{"x":1744,"y":92},"2":{"x":1460,"y":92},"3":{"x":1488,"y":68},"4":{"x":1616,"y":68},"5":{"x":1616,"y":68},"6":{"x":1616,"y":92}}},"warnings":null},{"id":696,"sourceNodeId":148,"sourcePortId":1407,"targetNodeId":147,"targetPortId":1408,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":20,"warning":null,"timeFormatter":null,"consecutiveTime":320},"sourceArrival":{"lock":false,"time":40,"warning":null,"timeFormatter":null,"consecutiveTime":40},"targetDeparture":{"lock":false,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":34},"targetArrival":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":326},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1342,"y":80},{"x":1278,"y":80},{"x":1122,"y":80},{"x":1058,"y":80}],"textPositions":{"0":{"x":1324,"y":68},"1":{"x":1296,"y":92},"2":{"x":1076,"y":92},"3":{"x":1104,"y":68},"4":{"x":1200,"y":68},"5":{"x":1200,"y":68},"6":{"x":1200,"y":92}}},"warnings":null},{"id":697,"sourceNodeId":147,"sourcePortId":1409,"targetNodeId":144,"targetPortId":1410,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":326},"sourceArrival":{"lock":false,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":34},"targetDeparture":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":27},"targetArrival":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":333},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":958,"y":48},{"x":894,"y":48},{"x":386,"y":-432},{"x":322,"y":-432}],"textPositions":{"0":{"x":940,"y":36},"1":{"x":912,"y":60},"2":{"x":340,"y":-420},"3":{"x":368,"y":-444},"4":{"x":640,"y":-204},"5":{"x":640,"y":-204},"6":{"x":640,"y":-180}}},"warnings":null},{"id":698,"sourceNodeId":144,"sourcePortId":1411,"targetNodeId":145,"targetPortId":1412,"travelTime":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":33,"warning":null,"timeFormatter":null,"consecutiveTime":333},"sourceArrival":{"lock":false,"time":27,"warning":null,"timeFormatter":null,"consecutiveTime":27},"targetDeparture":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":21},"targetArrival":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":339},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":-450},{"x":112,"y":-514},{"x":112,"y":-798},{"x":112,"y":-862}],"textPositions":{"0":{"x":124,"y":-468},"1":{"x":100,"y":-496},"2":{"x":100,"y":-844},"3":{"x":124,"y":-816},"4":{"x":100,"y":-656},"5":{"x":100,"y":-656},"6":{"x":124,"y":-656}}},"warnings":null},{"id":699,"sourceNodeId":145,"sourcePortId":1413,"targetNodeId":146,"targetPortId":1414,"travelTime":{"lock":true,"time":7,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":339},"sourceArrival":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":21},"targetDeparture":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":14},"targetArrival":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":346},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":-930},{"x":112,"y":-994},{"x":112,"y":-1278},{"x":112,"y":-1342}],"textPositions":{"0":{"x":124,"y":-948},"1":{"x":100,"y":-976},"2":{"x":100,"y":-1324},"3":{"x":124,"y":-1296},"4":{"x":100,"y":-1136},"5":{"x":100,"y":-1136},"6":{"x":124,"y":-1136}}},"warnings":null},{"id":700,"sourceNodeId":146,"sourcePortId":1415,"targetNodeId":134,"targetPortId":1416,"travelTime":{"lock":true,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":346},"sourceArrival":{"lock":false,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":14},"targetDeparture":{"lock":true,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":6},"targetArrival":{"lock":true,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":354},"numberOfStops":0,"trainrunId":85,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":112,"y":-1410},{"x":112,"y":-1474},{"x":112,"y":-1758},{"x":112,"y":-1822}],"textPositions":{"0":{"x":124,"y":-1428},"1":{"x":100,"y":-1456},"2":{"x":100,"y":-1804},"3":{"x":124,"y":-1776},"4":{"x":100,"y":-1616},"5":{"x":100,"y":-1616},"6":{"x":124,"y":-1616}}},"warnings":null},{"id":701,"sourceNodeId":175,"sourcePortId":1417,"targetNodeId":130,"targetPortId":1418,"travelTime":{"lock":true,"time":13,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":421},"sourceArrival":{"lock":true,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":119},"targetDeparture":{"lock":true,"time":46,"warning":null,"timeFormatter":null,"consecutiveTime":106},"targetArrival":{"lock":true,"time":14,"warning":null,"timeFormatter":null,"consecutiveTime":434},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":-16},{"x":-1762,"y":-16},{"x":-2366,"y":-16},{"x":-2430,"y":-16}],"textPositions":{"0":{"x":-1716,"y":-28},"1":{"x":-1744,"y":-4},"2":{"x":-2412,"y":-4},"3":{"x":-2384,"y":-28},"4":{"x":-2064,"y":-28},"5":{"x":-2064,"y":-28},"6":{"x":-2064,"y":-4}}},"warnings":null},{"id":702,"sourceNodeId":137,"sourcePortId":1419,"targetNodeId":176,"targetPortId":1420,"travelTime":{"lock":true,"time":16,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":245},"sourceArrival":{"lock":true,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":295},"targetDeparture":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":279},"targetArrival":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":261},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":4738,"y":112},{"x":4802,"y":112},{"x":5310,"y":112},{"x":5374,"y":112}],"textPositions":{"0":{"x":4756,"y":124},"1":{"x":4784,"y":100},"2":{"x":5356,"y":100},"3":{"x":5328,"y":124},"4":{"x":5056,"y":100},"5":{"x":5056,"y":100},"6":{"x":5056,"y":124}}},"warnings":null},{"id":703,"sourceNodeId":177,"sourcePortId":1421,"targetNodeId":160,"targetPortId":1422,"travelTime":{"lock":false,"time":30,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":true,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":451},"sourceArrival":{"lock":true,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":89},"targetDeparture":{"lock":true,"time":59,"warning":null,"timeFormatter":null,"consecutiveTime":59},"targetArrival":{"lock":true,"time":1,"warning":null,"timeFormatter":null,"consecutiveTime":481},"numberOfStops":1,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3522,"y":624},{"x":-3586,"y":624},{"x":-3774,"y":688},{"x":-3838,"y":688}],"textPositions":{"0":{"x":-3540,"y":612},"1":{"x":-3568,"y":636},"2":{"x":-3820,"y":700},"3":{"x":-3792,"y":676},"4":{"x":-3680,"y":644},"5":{"x":-3680,"y":644},"6":{"x":-3680,"y":668}}},"warnings":null},{"id":704,"sourceNodeId":177,"sourcePortId":1423,"targetNodeId":160,"targetPortId":1424,"travelTime":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":52,"warning":null,"timeFormatter":null,"consecutiveTime":472},"sourceArrival":{"lock":false,"time":8,"warning":null,"timeFormatter":null,"consecutiveTime":68},"targetDeparture":{"lock":true,"time":42,"warning":null,"timeFormatter":null,"consecutiveTime":42},"targetArrival":{"lock":true,"time":18,"warning":null,"timeFormatter":null,"consecutiveTime":498},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3522,"y":560},{"x":-3586,"y":560},{"x":-3774,"y":624},{"x":-3838,"y":624}],"textPositions":{"0":{"x":-3540,"y":548},"1":{"x":-3568,"y":572},"2":{"x":-3820,"y":636},"3":{"x":-3792,"y":612},"4":{"x":-3680,"y":580},"5":{"x":-3680,"y":580},"6":{"x":-3680,"y":604}}},"warnings":null},{"id":705,"sourceNodeId":177,"sourcePortId":1425,"targetNodeId":160,"targetPortId":1426,"travelTime":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":19,"warning":null,"timeFormatter":null,"consecutiveTime":499},"sourceArrival":{"lock":false,"time":41,"warning":null,"timeFormatter":null,"consecutiveTime":41},"targetDeparture":{"lock":true,"time":15,"warning":null,"timeFormatter":null,"consecutiveTime":15},"targetArrival":{"lock":true,"time":45,"warning":null,"timeFormatter":null,"consecutiveTime":525},"numberOfStops":0,"trainrunId":87,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-3522,"y":592},{"x":-3586,"y":592},{"x":-3774,"y":656},{"x":-3838,"y":656}],"textPositions":{"0":{"x":-3540,"y":580},"1":{"x":-3568,"y":604},"2":{"x":-3820,"y":668},"3":{"x":-3792,"y":644},"4":{"x":-3680,"y":612},"5":{"x":-3680,"y":612},"6":{"x":-3680,"y":636}}},"warnings":null},{"id":706,"sourceNodeId":178,"sourcePortId":1427,"targetNodeId":129,"targetPortId":1428,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":21,"warning":null,"timeFormatter":null,"consecutiveTime":381},"sourceArrival":{"lock":false,"time":39,"warning":null,"timeFormatter":null,"consecutiveTime":39},"targetDeparture":{"lock":true,"time":36,"warning":null,"timeFormatter":null,"consecutiveTime":36},"targetArrival":{"lock":true,"time":24,"warning":null,"timeFormatter":null,"consecutiveTime":384},"numberOfStops":0,"trainrunId":86,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":336},{"x":-1762,"y":336},{"x":-1950,"y":336},{"x":-2014,"y":336}],"textPositions":{"0":{"x":-1716,"y":324},"1":{"x":-1744,"y":348},"2":{"x":-1996,"y":348},"3":{"x":-1968,"y":324},"4":{"x":-1856,"y":324},"5":{"x":-1856,"y":324},"6":{"x":-1856,"y":348}}},"warnings":null},{"id":707,"sourceNodeId":178,"sourcePortId":1429,"targetNodeId":129,"targetPortId":1430,"travelTime":{"lock":true,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":56,"warning":null,"timeFormatter":null,"consecutiveTime":356},"sourceArrival":{"lock":false,"time":4,"warning":null,"timeFormatter":null,"consecutiveTime":184},"targetDeparture":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":180},"targetArrival":{"lock":true,"time":0,"warning":null,"timeFormatter":null,"consecutiveTime":360},"numberOfStops":0,"trainrunId":81,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":304},{"x":-1762,"y":304},{"x":-1950,"y":304},{"x":-2014,"y":304}],"textPositions":{"0":{"x":-1716,"y":292},"1":{"x":-1744,"y":316},"2":{"x":-1996,"y":316},"3":{"x":-1968,"y":292},"4":{"x":-1856,"y":292},"5":{"x":-1856,"y":292},"6":{"x":-1856,"y":316}}},"warnings":null},{"id":708,"sourceNodeId":178,"sourcePortId":1431,"targetNodeId":129,"targetPortId":1432,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":55,"warning":null,"timeFormatter":null,"consecutiveTime":355},"sourceArrival":{"lock":false,"time":5,"warning":null,"timeFormatter":null,"consecutiveTime":65},"targetDeparture":{"lock":false,"time":2,"warning":null,"timeFormatter":null,"consecutiveTime":62},"targetArrival":{"lock":false,"time":58,"warning":null,"timeFormatter":null,"consecutiveTime":358},"numberOfStops":0,"trainrunId":90,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":272},{"x":-1762,"y":272},{"x":-1950,"y":272},{"x":-2014,"y":272}],"textPositions":{"0":{"x":-1716,"y":260},"1":{"x":-1744,"y":284},"2":{"x":-1996,"y":284},"3":{"x":-1968,"y":260},"4":{"x":-1856,"y":260},"5":{"x":-1856,"y":260},"6":{"x":-1856,"y":284}}},"warnings":null},{"id":709,"sourceNodeId":178,"sourcePortId":1433,"targetNodeId":129,"targetPortId":1434,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":354},"sourceArrival":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":66},"targetDeparture":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":63},"targetArrival":{"lock":true,"time":57,"warning":null,"timeFormatter":null,"consecutiveTime":357},"numberOfStops":0,"trainrunId":89,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":240},{"x":-1762,"y":240},{"x":-1950,"y":240},{"x":-2014,"y":240}],"textPositions":{"0":{"x":-1716,"y":228},"1":{"x":-1744,"y":252},"2":{"x":-1996,"y":252},"3":{"x":-1968,"y":228},"4":{"x":-1856,"y":228},"5":{"x":-1856,"y":228},"6":{"x":-1856,"y":252}}},"warnings":null},{"id":710,"sourceNodeId":178,"sourcePortId":1435,"targetNodeId":129,"targetPortId":1436,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":83},"sourceArrival":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":217},"targetDeparture":{"lock":true,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":214},"targetArrival":{"lock":true,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":86},"numberOfStops":0,"trainrunId":95,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":208},{"x":-1762,"y":208},{"x":-1950,"y":208},{"x":-2014,"y":208}],"textPositions":{"0":{"x":-1716,"y":196},"1":{"x":-1744,"y":220},"2":{"x":-1996,"y":220},"3":{"x":-1968,"y":196},"4":{"x":-1856,"y":196},"5":{"x":-1856,"y":196},"6":{"x":-1856,"y":220}}},"warnings":null},{"id":711,"sourceNodeId":178,"sourcePortId":1437,"targetNodeId":172,"targetPortId":1438,"travelTime":{"lock":true,"time":17,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":37,"warning":null,"timeFormatter":null,"consecutiveTime":217},"sourceArrival":{"lock":false,"time":23,"warning":null,"timeFormatter":null,"consecutiveTime":83},"targetDeparture":{"lock":false,"time":6,"warning":null,"timeFormatter":null,"consecutiveTime":66},"targetArrival":{"lock":false,"time":54,"warning":null,"timeFormatter":null,"consecutiveTime":234},"numberOfStops":0,"trainrunId":96,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1598,"y":176},{"x":-1534,"y":176},{"x":-674,"y":176},{"x":-610,"y":176}],"textPositions":{"0":{"x":-1580,"y":188},"1":{"x":-1552,"y":164},"2":{"x":-628,"y":164},"3":{"x":-656,"y":188},"4":{"x":-1104,"y":164},"5":{"x":-1104,"y":164},"6":{"x":-1104,"y":188}}},"warnings":null},{"id":712,"sourceNodeId":178,"sourcePortId":1439,"targetNodeId":129,"targetPortId":1440,"travelTime":{"lock":true,"time":3,"warning":null,"timeFormatter":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":26,"warning":null,"timeFormatter":null,"consecutiveTime":386},"sourceArrival":{"lock":false,"time":34,"warning":null,"timeFormatter":null,"consecutiveTime":154},"targetDeparture":{"lock":false,"time":31,"warning":null,"timeFormatter":null,"consecutiveTime":151},"targetArrival":{"lock":false,"time":29,"warning":null,"timeFormatter":null,"consecutiveTime":389},"numberOfStops":0,"trainrunId":88,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-1698,"y":144},{"x":-1762,"y":144},{"x":-1950,"y":144},{"x":-2014,"y":144}],"textPositions":{"0":{"x":-1716,"y":132},"1":{"x":-1744,"y":156},"2":{"x":-1996,"y":156},"3":{"x":-1968,"y":132},"4":{"x":-1856,"y":132},"5":{"x":-1856,"y":132},"6":{"x":-1856,"y":156}}},"warnings":null}],"trainruns":[{"id":75,"name":"21","categoryId":1,"frequencyId":4,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":76,"name":"2","categoryId":1,"frequencyId":4,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":77,"name":"26","categoryId":2,"frequencyId":5,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":78,"name":"46","categoryId":2,"frequencyId":4,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":79,"name":"75","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":80,"name":"70","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":81,"name":"15","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":82,"name":"27","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":83,"name":"26","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":84,"name":"13","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":85,"name":"3","categoryId":1,"frequencyId":4,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":86,"name":"35","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":87,"name":"5","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":88,"name":"1","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":89,"name":"8","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":90,"name":"81","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":91,"name":"48","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[1,9,5]},{"id":92,"name":"","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[1,9,5]},{"id":93,"name":"36","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":94,"name":"3","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":95,"name":"61","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":96,"name":"6","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]},{"id":97,"name":"37","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[3,8,4]}],"resources":[{"id":88,"capacity":2},{"id":89,"capacity":2},{"id":90,"capacity":2},{"id":91,"capacity":2},{"id":92,"capacity":2},{"id":93,"capacity":2},{"id":94,"capacity":2},{"id":95,"capacity":2},{"id":96,"capacity":2},{"id":97,"capacity":2},{"id":98,"capacity":2},{"id":99,"capacity":2},{"id":100,"capacity":2},{"id":101,"capacity":2},{"id":102,"capacity":2},{"id":103,"capacity":2},{"id":104,"capacity":2},{"id":105,"capacity":2},{"id":106,"capacity":2},{"id":107,"capacity":2},{"id":108,"capacity":2},{"id":109,"capacity":2},{"id":110,"capacity":2},{"id":111,"capacity":2},{"id":112,"capacity":2},{"id":113,"capacity":2},{"id":114,"capacity":2},{"id":115,"capacity":2},{"id":116,"capacity":2},{"id":117,"capacity":2},{"id":118,"capacity":2},{"id":119,"capacity":2},{"id":120,"capacity":2},{"id":121,"capacity":2},{"id":122,"capacity":2},{"id":123,"capacity":2},{"id":124,"capacity":2},{"id":125,"capacity":2},{"id":126,"capacity":2},{"id":127,"capacity":2},{"id":128,"capacity":2},{"id":129,"capacity":2},{"id":130,"capacity":2},{"id":131,"capacity":2},{"id":132,"capacity":2},{"id":133,"capacity":2},{"id":134,"capacity":2},{"id":135,"capacity":2},{"id":136,"capacity":2},{"id":137,"capacity":2},{"id":138,"capacity":2},{"id":139,"capacity":2},{"id":140,"capacity":2},{"id":141,"capacity":2},{"id":142,"capacity":2},{"id":143,"capacity":2},{"id":144,"capacity":2},{"id":145,"capacity":2},{"id":146,"capacity":2},{"id":147,"capacity":2},{"id":148,"capacity":2},{"id":149,"capacity":2},{"id":150,"capacity":2},{"id":151,"capacity":2},{"id":152,"capacity":2},{"id":153,"capacity":2},{"id":154,"capacity":2},{"id":155,"capacity":2},{"id":156,"capacity":2},{"id":157,"capacity":2},{"id":158,"capacity":2},{"id":159,"capacity":2},{"id":160,"capacity":2},{"id":161,"capacity":2},{"id":162,"capacity":2},{"id":163,"capacity":2},{"id":164,"capacity":2},{"id":165,"capacity":2},{"id":166,"capacity":2},{"id":167,"capacity":2},{"id":168,"capacity":2},{"id":169,"capacity":2},{"id":170,"capacity":2},{"id":171,"capacity":2},{"id":172,"capacity":2},{"id":173,"capacity":2},{"id":174,"capacity":2},{"id":175,"capacity":2},{"id":176,"capacity":2},{"id":177,"capacity":2},{"id":178,"capacity":2},{"id":179,"capacity":2},{"id":180,"capacity":2},{"id":181,"capacity":2},{"id":182,"capacity":2},{"id":183,"capacity":2},{"id":184,"capacity":2},{"id":185,"capacity":2},{"id":186,"capacity":2},{"id":187,"capacity":2},{"id":188,"capacity":2},{"id":189,"capacity":2},{"id":190,"capacity":2},{"id":191,"capacity":2},{"id":192,"capacity":2},{"id":193,"capacity":2},{"id":194,"capacity":2},{"id":195,"capacity":2},{"id":196,"capacity":2},{"id":197,"capacity":2},{"id":198,"capacity":2},{"id":199,"capacity":2},{"id":200,"capacity":2},{"id":201,"capacity":2},{"id":202,"capacity":2}],"metadata":{"netzgrafikColors":[],"trainrunCategories":[{"id":0,"name":"International","order":0,"colorRef":"EC","shortName":"EC","fachCategory":"HaltezeitIPV","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":1,"name":"InterCity","order":1,"colorRef":"IC","shortName":"IC","fachCategory":"HaltezeitA","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":2,"name":"InterRegio","order":2,"colorRef":"IR","shortName":"IR","fachCategory":"HaltezeitB","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":3,"name":"RegioExpress","order":3,"colorRef":"RE","shortName":"RE","fachCategory":"HaltezeitC","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":4,"name":"RegioUndSBahnverkehr","order":4,"colorRef":"S","shortName":"S","fachCategory":"HaltezeitD","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":5,"name":"GüterExpress","order":5,"colorRef":"GEX","shortName":"GEX","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4},{"id":6,"name":"Güterverkehr","order":6,"colorRef":"G","shortName":"G","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4}],"trainrunFrequencies":[{"id":0,"name":"verkehrt viertelstündlich","order":0,"offset":0,"frequency":15,"shortName":"15","linePatternRef":"15"},{"id":1,"name":"verkehrt im 20 Minuten Takt","order":0,"offset":0,"frequency":20,"shortName":"20","linePatternRef":"20"},{"id":2,"name":"verkehrt halbstündlich","order":0,"offset":0,"frequency":30,"shortName":"30","linePatternRef":"30"},{"id":3,"name":"verkehrt stündlich","order":0,"offset":0,"frequency":60,"shortName":"60","linePatternRef":"60"},{"id":4,"name":"verkehrt zweistündlich (gerade)","order":0,"offset":0,"frequency":120,"shortName":"120","linePatternRef":"120"},{"id":5,"name":"verkehrt zweistündlich (ungerade)","order":0,"offset":60,"frequency":120,"shortName":"120+","linePatternRef":"120"}],"trainrunTimeCategories":[{"id":0,"name":"verkehrt uneingeschränkt","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"7/24","linePatternRef":"7/24","dayTimeInterval":[]},{"id":1,"name":"verkehrt zur Hauptverkehrszeit","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"HVZ","linePatternRef":"HVZ","dayTimeInterval":[{"to":420,"from":360},{"to":1140,"from":960}]},{"id":2,"name":"verkehrt zeitweise","order":0,"weekday":[],"shortName":"zeitweise","linePatternRef":"ZEITWEISE","dayTimeInterval":[]}]},"freeFloatingTexts":[],"labels":[{"id":4,"label":"OK","labelGroupId":1,"labelRef":"Trainrun"},{"id":5,"label":"Zeiten falsch","labelGroupId":3,"labelRef":"Trainrun"}],"labelGroups":[{"id":1,"name":"Standard","labelRef":"Trainrun"},{"id":2,"name":"Standard","labelRef":"Node"},{"id":3,"name":"Standard","labelRef":"Trainrun"}],"filterData":{"filterSettings":[{"id":5,"name":"Neuer Filter","description":"","filterNodeLabels":[],"filterNoteLabels":[],"filterTrainrunLabels":[],"filterArrivalDepartureTime":true,"filterTravelTime":true,"filterTrainrunName":true,"filterConnections":true,"filterShowNonStopTime":true,"filterTrainrunCategory":[{"id":0,"name":"International","order":0,"colorRef":"EC","shortName":"EC","fachCategory":"HaltezeitIPV","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":1,"name":"InterCity","order":1,"colorRef":"IC","shortName":"IC","fachCategory":"HaltezeitA","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":2,"name":"InterRegio","order":2,"colorRef":"IR","shortName":"IR","fachCategory":"HaltezeitB","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":3,"name":"RegioExpress","order":3,"colorRef":"RE","shortName":"RE","fachCategory":"HaltezeitC","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":4,"name":"RegioUndSBahnverkehr","order":4,"colorRef":"S","shortName":"S","fachCategory":"HaltezeitD","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":4},{"id":5,"name":"GüterExpress","order":5,"colorRef":"GEX","shortName":"GEX","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4},{"id":6,"name":"Güterverkehr","order":6,"colorRef":"G","shortName":"G","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":4}],"filterTrainrunFrequency":[{"id":0,"name":"verkehrt viertelstündlich","order":0,"offset":0,"frequency":15,"shortName":"15","linePatternRef":"15"},{"id":1,"name":"verkehrt im 20 Minuten Takt","order":0,"offset":0,"frequency":20,"shortName":"20","linePatternRef":"20"},{"id":2,"name":"verkehrt halbstündlich","order":0,"offset":0,"frequency":30,"shortName":"30","linePatternRef":"30"},{"id":3,"name":"verkehrt stündlich","order":0,"offset":0,"frequency":60,"shortName":"60","linePatternRef":"60"},{"id":4,"name":"verkehrt zweistündlich (gerade)","order":0,"offset":0,"frequency":120,"shortName":"120","linePatternRef":"120"},{"id":5,"name":"verkehrt zweistündlich (ungerade)","order":0,"offset":60,"frequency":120,"shortName":"120+","linePatternRef":"120"}],"filterTrainrunTimeCategory":[{"id":0,"name":"verkehrt uneingeschränkt","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"7/24","linePatternRef":"7/24","dayTimeInterval":[]},{"id":1,"name":"verkehrt zur Hauptverkehrszeit","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"HVZ","linePatternRef":"HVZ","dayTimeInterval":[{"to":420,"from":360},{"to":1140,"from":960}]},{"id":2,"name":"verkehrt zeitweise","order":0,"weekday":[],"shortName":"zeitweise","linePatternRef":"ZEITWEISE","dayTimeInterval":[]}],"filterAllEmptyNodes":false,"filterAllNonStopNodes":false,"filterNotes":false,"timeDisplayPrecision":1,"isTemporaryDisableFilteringOfItemsInView":false,"temporaryEmptyAndNonStopFilteringSwitchedOff":false}]}} \ No newline at end of file diff --git a/src/app/sample-netzgrafik/Demo_OL_LZ.json.json b/src/app/sample-netzgrafik/Demo_OL_LZ.json.json new file mode 100644 index 00000000..95ff3d07 --- /dev/null +++ b/src/app/sample-netzgrafik/Demo_OL_LZ.json.json @@ -0,0 +1 @@ +{"nodes":[{"id":0,"betriebspunktName":"BN","fullName":"Bern","positionX":-960,"positionY":32,"ports":[{"id":118,"trainrunSectionId":101,"positionIndex":0,"positionAlignment":3},{"id":137,"trainrunSectionId":110,"positionIndex":1,"positionAlignment":3},{"id":94,"trainrunSectionId":90,"positionIndex":2,"positionAlignment":3},{"id":104,"trainrunSectionId":95,"positionIndex":3,"positionAlignment":3},{"id":86,"trainrunSectionId":86,"positionIndex":4,"positionAlignment":3},{"id":126,"trainrunSectionId":105,"positionIndex":5,"positionAlignment":3},{"id":214,"trainrunSectionId":141,"positionIndex":6,"positionAlignment":3},{"id":143,"trainrunSectionId":113,"positionIndex":7,"positionAlignment":3},{"id":147,"trainrunSectionId":115,"positionIndex":8,"positionAlignment":3},{"id":181,"trainrunSectionId":132,"positionIndex":9,"positionAlignment":3}],"transitions":[],"connections":[],"resourceId":65,"perronkanten":10,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":0,"warnings":null,"labelIds":[41]},{"id":1,"betriebspunktName":"OL","fullName":"Olten","positionX":832,"positionY":32,"ports":[{"id":141,"trainrunSectionId":112,"positionIndex":0,"positionAlignment":0},{"id":108,"trainrunSectionId":97,"positionIndex":1,"positionAlignment":0},{"id":166,"trainrunSectionId":124,"positionIndex":2,"positionAlignment":0},{"id":174,"trainrunSectionId":128,"positionIndex":3,"positionAlignment":0},{"id":167,"trainrunSectionId":125,"positionIndex":0,"positionAlignment":1},{"id":175,"trainrunSectionId":129,"positionIndex":1,"positionAlignment":1},{"id":153,"trainrunSectionId":118,"positionIndex":2,"positionAlignment":1},{"id":161,"trainrunSectionId":122,"positionIndex":3,"positionAlignment":1},{"id":159,"trainrunSectionId":121,"positionIndex":4,"positionAlignment":1},{"id":185,"trainrunSectionId":134,"positionIndex":5,"positionAlignment":1},{"id":121,"trainrunSectionId":102,"positionIndex":0,"positionAlignment":2},{"id":140,"trainrunSectionId":111,"positionIndex":1,"positionAlignment":2},{"id":97,"trainrunSectionId":91,"positionIndex":2,"positionAlignment":2},{"id":107,"trainrunSectionId":96,"positionIndex":3,"positionAlignment":2},{"id":210,"trainrunSectionId":139,"positionIndex":4,"positionAlignment":2},{"id":129,"trainrunSectionId":106,"positionIndex":5,"positionAlignment":2},{"id":146,"trainrunSectionId":136,"positionIndex":6,"positionAlignment":2},{"id":150,"trainrunSectionId":137,"positionIndex":7,"positionAlignment":2},{"id":184,"trainrunSectionId":138,"positionIndex":8,"positionAlignment":2},{"id":122,"trainrunSectionId":103,"positionIndex":0,"positionAlignment":3},{"id":98,"trainrunSectionId":92,"positionIndex":1,"positionAlignment":3},{"id":151,"trainrunSectionId":117,"positionIndex":2,"positionAlignment":3}],"transitions":[{"id":102,"port1Id":97,"port2Id":98,"isNonStopTransit":true},{"id":104,"port1Id":108,"port2Id":107,"isNonStopTransit":false},{"id":109,"port1Id":121,"port2Id":122,"isNonStopTransit":true},{"id":114,"port1Id":141,"port2Id":140,"isNonStopTransit":false},{"id":117,"port1Id":150,"port2Id":151,"isNonStopTransit":false},{"id":121,"port1Id":166,"port2Id":167,"isNonStopTransit":false},{"id":124,"port1Id":174,"port2Id":175,"isNonStopTransit":false},{"id":128,"port1Id":185,"port2Id":184,"isNonStopTransit":true}],"connections":[],"resourceId":66,"perronkanten":10,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[2,3]},{"id":2,"betriebspunktName":"ZUE","fullName":"Zuerich","positionX":2464,"positionY":32,"ports":[{"id":123,"trainrunSectionId":103,"positionIndex":0,"positionAlignment":2},{"id":99,"trainrunSectionId":92,"positionIndex":1,"positionAlignment":2},{"id":152,"trainrunSectionId":117,"positionIndex":2,"positionAlignment":2}],"transitions":[],"connections":[],"resourceId":67,"perronkanten":10,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[42]},{"id":3,"betriebspunktName":"LZ","fullName":"Luzern","positionX":832,"positionY":1440,"ports":[{"id":93,"trainrunSectionId":89,"positionIndex":0,"positionAlignment":0},{"id":172,"trainrunSectionId":127,"positionIndex":1,"positionAlignment":0},{"id":180,"trainrunSectionId":131,"positionIndex":2,"positionAlignment":0},{"id":158,"trainrunSectionId":120,"positionIndex":3,"positionAlignment":0}],"transitions":[],"connections":[],"resourceId":68,"perronkanten":10,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[40]},{"id":4,"betriebspunktName":"ZF","fullName":"Zofingen","positionX":832,"positionY":576,"ports":[{"id":168,"trainrunSectionId":125,"positionIndex":0,"positionAlignment":0},{"id":176,"trainrunSectionId":129,"positionIndex":1,"positionAlignment":0},{"id":154,"trainrunSectionId":118,"positionIndex":2,"positionAlignment":0},{"id":162,"trainrunSectionId":122,"positionIndex":3,"positionAlignment":0},{"id":160,"trainrunSectionId":121,"positionIndex":4,"positionAlignment":0},{"id":186,"trainrunSectionId":134,"positionIndex":5,"positionAlignment":0},{"id":90,"trainrunSectionId":88,"positionIndex":0,"positionAlignment":1},{"id":169,"trainrunSectionId":126,"positionIndex":1,"positionAlignment":1},{"id":177,"trainrunSectionId":130,"positionIndex":2,"positionAlignment":1},{"id":155,"trainrunSectionId":119,"positionIndex":3,"positionAlignment":1},{"id":163,"trainrunSectionId":123,"positionIndex":4,"positionAlignment":1},{"id":189,"trainrunSectionId":135,"positionIndex":5,"positionAlignment":1},{"id":89,"trainrunSectionId":87,"positionIndex":0,"positionAlignment":2}],"transitions":[{"id":99,"port1Id":90,"port2Id":89,"isNonStopTransit":false},{"id":118,"port1Id":154,"port2Id":155,"isNonStopTransit":false},{"id":120,"port1Id":162,"port2Id":163,"isNonStopTransit":false},{"id":122,"port1Id":168,"port2Id":169,"isNonStopTransit":true},{"id":125,"port1Id":176,"port2Id":177,"isNonStopTransit":false},{"id":130,"port1Id":186,"port2Id":189,"isNonStopTransit":true}],"connections":[{"id":3,"port1Id":89,"port2Id":160},{"id":4,"port1Id":163,"port2Id":89},{"id":5,"port1Id":162,"port2Id":90}],"resourceId":69,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[2,3]},{"id":6,"betriebspunktName":"SS","fullName":"Sursee","positionX":832,"positionY":1024,"ports":[{"id":91,"trainrunSectionId":88,"positionIndex":0,"positionAlignment":0},{"id":170,"trainrunSectionId":126,"positionIndex":1,"positionAlignment":0},{"id":178,"trainrunSectionId":130,"positionIndex":2,"positionAlignment":0},{"id":156,"trainrunSectionId":119,"positionIndex":3,"positionAlignment":0},{"id":164,"trainrunSectionId":123,"positionIndex":4,"positionAlignment":0},{"id":190,"trainrunSectionId":135,"positionIndex":5,"positionAlignment":0},{"id":92,"trainrunSectionId":89,"positionIndex":0,"positionAlignment":1},{"id":171,"trainrunSectionId":127,"positionIndex":1,"positionAlignment":1},{"id":179,"trainrunSectionId":131,"positionIndex":2,"positionAlignment":1},{"id":157,"trainrunSectionId":120,"positionIndex":3,"positionAlignment":1}],"transitions":[{"id":100,"port1Id":91,"port2Id":92,"isNonStopTransit":false},{"id":119,"port1Id":156,"port2Id":157,"isNonStopTransit":false},{"id":123,"port1Id":170,"port2Id":171,"isNonStopTransit":true},{"id":126,"port1Id":178,"port2Id":179,"isNonStopTransit":false}],"connections":[],"resourceId":71,"perronkanten":5,"connectionTime":6,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[40]},{"id":7,"betriebspunktName":"RTR","fullName":"Rothrist","positionX":256,"positionY":32,"ports":[{"id":119,"trainrunSectionId":101,"positionIndex":0,"positionAlignment":2},{"id":138,"trainrunSectionId":110,"positionIndex":1,"positionAlignment":2},{"id":95,"trainrunSectionId":90,"positionIndex":2,"positionAlignment":2},{"id":105,"trainrunSectionId":95,"positionIndex":3,"positionAlignment":2},{"id":87,"trainrunSectionId":86,"positionIndex":4,"positionAlignment":2},{"id":127,"trainrunSectionId":105,"positionIndex":5,"positionAlignment":2},{"id":211,"trainrunSectionId":140,"positionIndex":6,"positionAlignment":2},{"id":203,"trainrunSectionId":114,"positionIndex":7,"positionAlignment":2},{"id":205,"trainrunSectionId":116,"positionIndex":8,"positionAlignment":2},{"id":207,"trainrunSectionId":133,"positionIndex":9,"positionAlignment":2},{"id":120,"trainrunSectionId":102,"positionIndex":0,"positionAlignment":3},{"id":139,"trainrunSectionId":111,"positionIndex":1,"positionAlignment":3},{"id":96,"trainrunSectionId":91,"positionIndex":2,"positionAlignment":3},{"id":106,"trainrunSectionId":96,"positionIndex":3,"positionAlignment":3},{"id":209,"trainrunSectionId":139,"positionIndex":4,"positionAlignment":3},{"id":128,"trainrunSectionId":106,"positionIndex":5,"positionAlignment":3},{"id":204,"trainrunSectionId":136,"positionIndex":6,"positionAlignment":3},{"id":206,"trainrunSectionId":137,"positionIndex":7,"positionAlignment":3},{"id":208,"trainrunSectionId":138,"positionIndex":8,"positionAlignment":3},{"id":88,"trainrunSectionId":87,"positionIndex":9,"positionAlignment":3}],"transitions":[{"id":98,"port1Id":87,"port2Id":88,"isNonStopTransit":true},{"id":101,"port1Id":95,"port2Id":96,"isNonStopTransit":true},{"id":103,"port1Id":105,"port2Id":106,"isNonStopTransit":true},{"id":108,"port1Id":119,"port2Id":120,"isNonStopTransit":true},{"id":110,"port1Id":127,"port2Id":128,"isNonStopTransit":true},{"id":113,"port1Id":138,"port2Id":139,"isNonStopTransit":true},{"id":137,"port1Id":203,"port2Id":204,"isNonStopTransit":true},{"id":138,"port1Id":205,"port2Id":206,"isNonStopTransit":true},{"id":139,"port1Id":207,"port2Id":208,"isNonStopTransit":true},{"id":140,"port1Id":211,"port2Id":209,"isNonStopTransit":true}],"connections":[],"resourceId":72,"perronkanten":5,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[2]},{"id":8,"betriebspunktName":"LTH","fullName":"Langenthal","positionX":-320,"positionY":224,"ports":[{"id":213,"trainrunSectionId":141,"positionIndex":0,"positionAlignment":2},{"id":144,"trainrunSectionId":113,"positionIndex":1,"positionAlignment":2},{"id":148,"trainrunSectionId":115,"positionIndex":2,"positionAlignment":2},{"id":201,"trainrunSectionId":132,"positionIndex":3,"positionAlignment":2},{"id":212,"trainrunSectionId":140,"positionIndex":0,"positionAlignment":3},{"id":145,"trainrunSectionId":114,"positionIndex":1,"positionAlignment":3},{"id":149,"trainrunSectionId":116,"positionIndex":2,"positionAlignment":3},{"id":202,"trainrunSectionId":133,"positionIndex":3,"positionAlignment":3}],"transitions":[{"id":115,"port1Id":144,"port2Id":145,"isNonStopTransit":false},{"id":116,"port1Id":148,"port2Id":149,"isNonStopTransit":false},{"id":136,"port1Id":201,"port2Id":202,"isNonStopTransit":false},{"id":141,"port1Id":213,"port2Id":212,"isNonStopTransit":false}],"connections":[],"resourceId":73,"perronkanten":5,"connectionTime":5,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[1]},{"id":106,"betriebspunktName":"BS","fullName":"Basel","positionX":832,"positionY":-352,"ports":[{"id":142,"trainrunSectionId":112,"positionIndex":0,"positionAlignment":1},{"id":109,"trainrunSectionId":97,"positionIndex":1,"positionAlignment":1},{"id":165,"trainrunSectionId":124,"positionIndex":2,"positionAlignment":1},{"id":173,"trainrunSectionId":128,"positionIndex":3,"positionAlignment":1}],"transitions":[],"connections":[],"resourceId":76,"perronkanten":5,"connectionTime":3,"trainrunCategoryHaltezeiten":{"HaltezeitA":{"no_halt":false,"haltezeit":2},"HaltezeitB":{"no_halt":false,"haltezeit":2},"HaltezeitC":{"no_halt":false,"haltezeit":1},"HaltezeitD":{"no_halt":false,"haltezeit":1},"HaltezeitIPV":{"no_halt":false,"haltezeit":3},"HaltezeitUncategorized":{"no_halt":true,"haltezeit":0}},"symmetryAxis":null,"warnings":null,"labelIds":[2]}],"trainrunSections":[{"id":86,"sourceNodeId":0,"sourcePortId":86,"targetNodeId":7,"targetPortId":87,"travelTime":{"lock":true,"time":23,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":0,"warning":null,"consecutiveTime":0},"sourceArrival":{"lock":false,"time":0,"warning":null,"consecutiveTime":180},"targetDeparture":{"lock":false,"time":37,"warning":null,"consecutiveTime":157},"targetArrival":{"lock":false,"time":23,"warning":null,"consecutiveTime":23},"numberOfStops":0,"trainrunId":11,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":176},{"x":-798,"y":176},{"x":190,"y":176},{"x":254,"y":176}],"textPositions":{"0":{"x":-844,"y":188},"1":{"x":-816,"y":164},"2":{"x":236,"y":164},"3":{"x":208,"y":188},"4":{"x":-304,"y":164},"5":{"x":-304,"y":164},"6":{"x":-304,"y":188}}},"warnings":null},{"id":87,"sourceNodeId":7,"sourcePortId":88,"targetNodeId":4,"targetPortId":89,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":23,"warning":null,"consecutiveTime":23},"sourceArrival":{"lock":false,"time":37,"warning":null,"consecutiveTime":157},"targetDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":152},"targetArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"numberOfStops":0,"trainrunId":11,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":336},{"x":418,"y":336},{"x":766,"y":592},{"x":830,"y":592}],"textPositions":{"0":{"x":372,"y":348},"1":{"x":400,"y":324},"2":{"x":812,"y":580},"3":{"x":784,"y":604},"4":{"x":592,"y":452},"5":{"x":592,"y":452},"6":{"x":592,"y":476}}},"warnings":null},{"id":88,"sourceNodeId":4,"sourcePortId":90,"targetNodeId":6,"targetPortId":91,"travelTime":{"lock":true,"time":13,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"sourceArrival":{"lock":false,"time":31,"warning":null,"consecutiveTime":151},"targetDeparture":{"lock":false,"time":18,"warning":null,"consecutiveTime":138},"targetArrival":{"lock":false,"time":42,"warning":null,"consecutiveTime":42},"numberOfStops":0,"trainrunId":11,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":848,"y":642},{"x":848,"y":706},{"x":848,"y":958},{"x":848,"y":1022}],"textPositions":{"0":{"x":836,"y":660},"1":{"x":860,"y":688},"2":{"x":860,"y":1004},"3":{"x":836,"y":976},"4":{"x":836,"y":832},"5":{"x":836,"y":832},"6":{"x":860,"y":832}}},"warnings":null},{"id":89,"sourceNodeId":6,"sourcePortId":92,"targetNodeId":3,"targetPortId":93,"travelTime":{"lock":true,"time":18,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":43,"warning":null,"consecutiveTime":43},"sourceArrival":{"lock":false,"time":17,"warning":null,"consecutiveTime":137},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":119},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":61},"numberOfStops":0,"trainrunId":11,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":848,"y":1090},{"x":848,"y":1154},{"x":848,"y":1374},{"x":848,"y":1438}],"textPositions":{"0":{"x":836,"y":1108},"1":{"x":860,"y":1136},"2":{"x":860,"y":1420},"3":{"x":836,"y":1392},"4":{"x":836,"y":1264},"5":{"x":836,"y":1264},"6":{"x":860,"y":1264}}},"warnings":null},{"id":90,"sourceNodeId":0,"sourcePortId":94,"targetNodeId":7,"targetPortId":95,"travelTime":{"lock":true,"time":23,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"sourceArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":149},"targetDeparture":{"lock":false,"time":6,"warning":null,"consecutiveTime":126},"targetArrival":{"lock":false,"time":54,"warning":null,"consecutiveTime":54},"numberOfStops":0,"trainrunId":12,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":112},{"x":-798,"y":112},{"x":190,"y":112},{"x":254,"y":112}],"textPositions":{"0":{"x":-844,"y":124},"1":{"x":-816,"y":100},"2":{"x":236,"y":100},"3":{"x":208,"y":124},"4":{"x":-304,"y":100},"5":{"x":-304,"y":100},"6":{"x":-304,"y":124}}},"warnings":null},{"id":91,"sourceNodeId":7,"sourcePortId":96,"targetNodeId":1,"targetPortId":97,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":54,"warning":null,"consecutiveTime":54},"sourceArrival":{"lock":false,"time":6,"warning":null,"consecutiveTime":126},"targetDeparture":{"lock":false,"time":1,"warning":null,"consecutiveTime":121},"targetArrival":{"lock":false,"time":59,"warning":null,"consecutiveTime":59},"numberOfStops":0,"trainrunId":12,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":112},{"x":418,"y":112},{"x":766,"y":112},{"x":830,"y":112}],"textPositions":{"0":{"x":372,"y":124},"1":{"x":400,"y":100},"2":{"x":812,"y":100},"3":{"x":784,"y":124},"4":{"x":592,"y":100},"5":{"x":592,"y":100},"6":{"x":592,"y":124}}},"warnings":null},{"id":92,"sourceNodeId":1,"sourcePortId":98,"targetNodeId":2,"targetPortId":99,"travelTime":{"lock":true,"time":29,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":59},"sourceArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":121},"targetDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":92},"targetArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":88},"numberOfStops":0,"trainrunId":12,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1026,"y":80},{"x":1090,"y":80},{"x":2398,"y":80},{"x":2462,"y":80}],"textPositions":{"0":{"x":1044,"y":92},"1":{"x":1072,"y":68},"2":{"x":2444,"y":68},"3":{"x":2416,"y":92},"4":{"x":1744,"y":68},"5":{"x":1744,"y":68},"6":{"x":1744,"y":92}}},"warnings":null},{"id":95,"sourceNodeId":0,"sourcePortId":104,"targetNodeId":7,"targetPortId":105,"travelTime":{"lock":true,"time":23,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":4},"sourceArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":176},"targetDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":153},"targetArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":27},"numberOfStops":0,"trainrunId":14,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":144},{"x":-798,"y":144},{"x":190,"y":144},{"x":254,"y":144}],"textPositions":{"0":{"x":-844,"y":156},"1":{"x":-816,"y":132},"2":{"x":236,"y":132},"3":{"x":208,"y":156},"4":{"x":-304,"y":132},"5":{"x":-304,"y":132},"6":{"x":-304,"y":156}}},"warnings":null},{"id":96,"sourceNodeId":7,"sourcePortId":106,"targetNodeId":1,"targetPortId":107,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":27,"warning":null,"consecutiveTime":27},"sourceArrival":{"lock":false,"time":33,"warning":null,"consecutiveTime":153},"targetDeparture":{"lock":false,"time":28,"warning":null,"consecutiveTime":148},"targetArrival":{"lock":false,"time":32,"warning":null,"consecutiveTime":32},"numberOfStops":0,"trainrunId":14,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":144},{"x":418,"y":144},{"x":766,"y":144},{"x":830,"y":144}],"textPositions":{"0":{"x":372,"y":156},"1":{"x":400,"y":132},"2":{"x":812,"y":132},"3":{"x":784,"y":156},"4":{"x":592,"y":132},"5":{"x":592,"y":132},"6":{"x":592,"y":156}}},"warnings":null},{"id":97,"sourceNodeId":1,"sourcePortId":108,"targetNodeId":106,"targetPortId":109,"travelTime":{"lock":true,"time":27,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":34,"warning":null,"consecutiveTime":34},"sourceArrival":{"lock":false,"time":26,"warning":null,"consecutiveTime":146},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":119},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":61},"numberOfStops":0,"trainrunId":14,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":880,"y":30},{"x":880,"y":-34},{"x":880,"y":-222},{"x":880,"y":-286}],"textPositions":{"0":{"x":892,"y":12},"1":{"x":868,"y":-16},"2":{"x":868,"y":-268},"3":{"x":892,"y":-240},"4":{"x":868,"y":-128},"5":{"x":868,"y":-128},"6":{"x":892,"y":-128}}},"warnings":null},{"id":101,"sourceNodeId":0,"sourcePortId":118,"targetNodeId":7,"targetPortId":119,"travelTime":{"lock":true,"time":23,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":2,"warning":null,"consecutiveTime":2},"sourceArrival":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"targetDeparture":{"lock":false,"time":35,"warning":null,"consecutiveTime":35},"targetArrival":{"lock":false,"time":25,"warning":null,"consecutiveTime":25},"numberOfStops":0,"trainrunId":16,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":48},{"x":-798,"y":48},{"x":190,"y":48},{"x":254,"y":48}],"textPositions":{"0":{"x":-844,"y":60},"1":{"x":-816,"y":36},"2":{"x":236,"y":36},"3":{"x":208,"y":60},"4":{"x":-304,"y":36},"5":{"x":-304,"y":36},"6":{"x":-304,"y":60}}},"warnings":null},{"id":102,"sourceNodeId":7,"sourcePortId":120,"targetNodeId":1,"targetPortId":121,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":25,"warning":null,"consecutiveTime":25},"sourceArrival":{"lock":false,"time":35,"warning":null,"consecutiveTime":35},"targetDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"targetArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"numberOfStops":0,"trainrunId":16,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":48},{"x":418,"y":48},{"x":766,"y":48},{"x":830,"y":48}],"textPositions":{"0":{"x":372,"y":60},"1":{"x":400,"y":36},"2":{"x":812,"y":36},"3":{"x":784,"y":60},"4":{"x":592,"y":36},"5":{"x":592,"y":36},"6":{"x":592,"y":60}}},"warnings":null},{"id":103,"sourceNodeId":1,"sourcePortId":122,"targetNodeId":2,"targetPortId":123,"travelTime":{"lock":true,"time":28,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"sourceArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"targetDeparture":{"lock":false,"time":2,"warning":null,"consecutiveTime":2},"targetArrival":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"numberOfStops":0,"trainrunId":16,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1026,"y":48},{"x":1090,"y":48},{"x":2398,"y":48},{"x":2462,"y":48}],"textPositions":{"0":{"x":1044,"y":60},"1":{"x":1072,"y":36},"2":{"x":2444,"y":36},"3":{"x":2416,"y":60},"4":{"x":1744,"y":36},"5":{"x":1744,"y":36},"6":{"x":1744,"y":60}}},"warnings":null},{"id":105,"sourceNodeId":0,"sourcePortId":126,"targetNodeId":7,"targetPortId":127,"travelTime":{"lock":true,"time":23,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":33,"warning":null,"consecutiveTime":33},"sourceArrival":{"lock":false,"time":27,"warning":null,"consecutiveTime":147},"targetDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"targetArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"numberOfStops":0,"trainrunId":18,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":208},{"x":-798,"y":208},{"x":190,"y":208},{"x":254,"y":208}],"textPositions":{"0":{"x":-844,"y":220},"1":{"x":-816,"y":196},"2":{"x":236,"y":196},"3":{"x":208,"y":220},"4":{"x":-304,"y":196},"5":{"x":-304,"y":196},"6":{"x":-304,"y":220}}},"warnings":null},{"id":106,"sourceNodeId":7,"sourcePortId":128,"targetNodeId":1,"targetPortId":129,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"sourceArrival":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"targetDeparture":{"lock":false,"time":59,"warning":null,"consecutiveTime":119},"targetArrival":{"lock":false,"time":1,"warning":null,"consecutiveTime":61},"numberOfStops":0,"trainrunId":18,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":208},{"x":418,"y":208},{"x":766,"y":208},{"x":830,"y":208}],"textPositions":{"0":{"x":372,"y":220},"1":{"x":400,"y":196},"2":{"x":812,"y":196},"3":{"x":784,"y":220},"4":{"x":592,"y":196},"5":{"x":592,"y":196},"6":{"x":592,"y":220}}},"warnings":null},{"id":110,"sourceNodeId":0,"sourcePortId":137,"targetNodeId":7,"targetPortId":138,"travelTime":{"lock":true,"time":22,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":36,"warning":null,"consecutiveTime":36},"sourceArrival":{"lock":false,"time":24,"warning":null,"consecutiveTime":144},"targetDeparture":{"lock":false,"time":2,"warning":null,"consecutiveTime":122},"targetArrival":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"numberOfStops":0,"trainrunId":20,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":80},{"x":-798,"y":80},{"x":190,"y":80},{"x":254,"y":80}],"textPositions":{"0":{"x":-844,"y":92},"1":{"x":-816,"y":68},"2":{"x":236,"y":68},"3":{"x":208,"y":92},"4":{"x":-304,"y":68},"5":{"x":-304,"y":68},"6":{"x":-304,"y":92}}},"warnings":null},{"id":111,"sourceNodeId":7,"sourcePortId":139,"targetNodeId":1,"targetPortId":140,"travelTime":{"lock":false,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"sourceArrival":{"lock":false,"time":2,"warning":null,"consecutiveTime":122},"targetDeparture":{"lock":false,"time":57,"warning":null,"consecutiveTime":117},"targetArrival":{"lock":false,"time":3,"warning":null,"consecutiveTime":63},"numberOfStops":0,"trainrunId":20,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":80},{"x":418,"y":80},{"x":766,"y":80},{"x":830,"y":80}],"textPositions":{"0":{"x":372,"y":92},"1":{"x":400,"y":68},"2":{"x":812,"y":68},"3":{"x":784,"y":92},"4":{"x":592,"y":68},"5":{"x":592,"y":68},"6":{"x":592,"y":92}}},"warnings":null},{"id":112,"sourceNodeId":1,"sourcePortId":141,"targetNodeId":106,"targetPortId":142,"travelTime":{"lock":true,"time":27,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":5,"warning":null,"consecutiveTime":65},"sourceArrival":{"lock":false,"time":55,"warning":null,"consecutiveTime":115},"targetDeparture":{"lock":true,"time":28,"warning":null,"consecutiveTime":88},"targetArrival":{"lock":true,"time":32,"warning":null,"consecutiveTime":92},"numberOfStops":0,"trainrunId":20,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":848,"y":30},{"x":848,"y":-34},{"x":848,"y":-222},{"x":848,"y":-286}],"textPositions":{"0":{"x":860,"y":12},"1":{"x":836,"y":-16},"2":{"x":836,"y":-268},"3":{"x":860,"y":-240},"4":{"x":836,"y":-128},"5":{"x":836,"y":-128},"6":{"x":860,"y":-128}}},"warnings":null},{"id":113,"sourceNodeId":0,"sourcePortId":143,"targetNodeId":8,"targetPortId":144,"travelTime":{"lock":true,"time":33,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":7,"warning":null,"consecutiveTime":7},"sourceArrival":{"lock":false,"time":53,"warning":null,"consecutiveTime":53},"targetDeparture":{"lock":false,"time":20,"warning":null,"consecutiveTime":20},"targetArrival":{"lock":false,"time":40,"warning":null,"consecutiveTime":40},"numberOfStops":0,"trainrunId":21,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":272},{"x":-798,"y":272},{"x":-386,"y":272},{"x":-322,"y":272}],"textPositions":{"0":{"x":-844,"y":284},"1":{"x":-816,"y":260},"2":{"x":-340,"y":260},"3":{"x":-368,"y":284},"4":{"x":-592,"y":260},"5":{"x":-592,"y":260},"6":{"x":-592,"y":284}}},"warnings":null},{"id":114,"sourceNodeId":8,"sourcePortId":145,"targetNodeId":7,"targetPortId":203,"travelTime":{"lock":true,"time":4,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":42,"warning":null,"consecutiveTime":42},"sourceArrival":{"lock":false,"time":18,"warning":null,"consecutiveTime":18},"targetDeparture":{"lock":false,"time":14,"warning":null,"consecutiveTime":14},"targetArrival":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"numberOfStops":0,"trainrunId":21,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-222,"y":272},{"x":-158,"y":272},{"x":190,"y":272},{"x":254,"y":272}],"textPositions":{"0":{"x":-204,"y":284},"1":{"x":-176,"y":260},"2":{"x":236,"y":260},"3":{"x":208,"y":284},"4":{"x":16,"y":260},"5":{"x":16,"y":260},"6":{"x":16,"y":284}}},"warnings":null},{"id":115,"sourceNodeId":0,"sourcePortId":147,"targetNodeId":8,"targetPortId":148,"travelTime":{"lock":true,"time":32,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":38,"warning":null,"consecutiveTime":38},"sourceArrival":{"lock":false,"time":22,"warning":null,"consecutiveTime":262},"targetDeparture":{"lock":false,"time":50,"warning":null,"consecutiveTime":230},"targetArrival":{"lock":false,"time":10,"warning":null,"consecutiveTime":70},"numberOfStops":0,"trainrunId":22,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":304},{"x":-798,"y":304},{"x":-386,"y":304},{"x":-322,"y":304}],"textPositions":{"0":{"x":-844,"y":316},"1":{"x":-816,"y":292},"2":{"x":-340,"y":292},"3":{"x":-368,"y":316},"4":{"x":-592,"y":292},"5":{"x":-592,"y":292},"6":{"x":-592,"y":316}}},"warnings":null},{"id":116,"sourceNodeId":8,"sourcePortId":149,"targetNodeId":7,"targetPortId":205,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":72},"sourceArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":228},"targetDeparture":{"lock":false,"time":43,"warning":null,"consecutiveTime":223},"targetArrival":{"lock":false,"time":17,"warning":null,"consecutiveTime":77},"numberOfStops":0,"trainrunId":22,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-222,"y":304},{"x":-158,"y":304},{"x":190,"y":304},{"x":254,"y":304}],"textPositions":{"0":{"x":-204,"y":316},"1":{"x":-176,"y":292},"2":{"x":236,"y":292},"3":{"x":208,"y":316},"4":{"x":16,"y":292},"5":{"x":16,"y":292},"6":{"x":16,"y":316}}},"warnings":null},{"id":117,"sourceNodeId":1,"sourcePortId":151,"targetNodeId":2,"targetPortId":152,"travelTime":{"lock":true,"time":36,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":24,"warning":null,"consecutiveTime":84},"sourceArrival":{"lock":false,"time":36,"warning":null,"consecutiveTime":216},"targetDeparture":{"lock":false,"time":0,"warning":null,"consecutiveTime":180},"targetArrival":{"lock":false,"time":0,"warning":null,"consecutiveTime":120},"numberOfStops":0,"trainrunId":22,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1026,"y":112},{"x":1090,"y":112},{"x":2398,"y":112},{"x":2462,"y":112}],"textPositions":{"0":{"x":1044,"y":124},"1":{"x":1072,"y":100},"2":{"x":2444,"y":100},"3":{"x":2416,"y":124},"4":{"x":1744,"y":100},"5":{"x":1744,"y":100},"6":{"x":1744,"y":124}}},"warnings":null},{"id":118,"sourceNodeId":1,"sourcePortId":153,"targetNodeId":4,"targetPortId":154,"travelTime":{"lock":true,"time":6,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":6,"warning":null,"consecutiveTime":6},"sourceArrival":{"lock":false,"time":54,"warning":null,"consecutiveTime":54},"targetDeparture":{"lock":false,"time":48,"warning":null,"consecutiveTime":48},"targetArrival":{"lock":false,"time":12,"warning":null,"consecutiveTime":12},"numberOfStops":0,"trainrunId":23,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":912,"y":350},{"x":912,"y":414},{"x":912,"y":510},{"x":912,"y":574}],"textPositions":{"0":{"x":900,"y":368},"1":{"x":924,"y":396},"2":{"x":924,"y":556},"3":{"x":900,"y":528},"4":{"x":900,"y":462},"5":{"x":900,"y":462},"6":{"x":924,"y":462}}},"warnings":null},{"id":119,"sourceNodeId":4,"sourcePortId":155,"targetNodeId":6,"targetPortId":156,"travelTime":{"lock":true,"time":17,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":13,"warning":null,"consecutiveTime":13},"sourceArrival":{"lock":false,"time":47,"warning":null,"consecutiveTime":47},"targetDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"targetArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"numberOfStops":0,"trainrunId":23,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":944,"y":642},{"x":944,"y":706},{"x":944,"y":958},{"x":944,"y":1022}],"textPositions":{"0":{"x":932,"y":660},"1":{"x":956,"y":688},"2":{"x":956,"y":1004},"3":{"x":932,"y":976},"4":{"x":932,"y":832},"5":{"x":932,"y":832},"6":{"x":956,"y":832}}},"warnings":null},{"id":120,"sourceNodeId":6,"sourcePortId":157,"targetNodeId":3,"targetPortId":158,"travelTime":{"lock":true,"time":24,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":31,"warning":null,"consecutiveTime":31},"sourceArrival":{"lock":false,"time":29,"warning":null,"consecutiveTime":29},"targetDeparture":{"lock":false,"time":5,"warning":null,"consecutiveTime":5},"targetArrival":{"lock":false,"time":55,"warning":null,"consecutiveTime":55},"numberOfStops":0,"trainrunId":23,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":944,"y":1090},{"x":944,"y":1154},{"x":944,"y":1374},{"x":944,"y":1438}],"textPositions":{"0":{"x":932,"y":1108},"1":{"x":956,"y":1136},"2":{"x":956,"y":1420},"3":{"x":932,"y":1392},"4":{"x":932,"y":1264},"5":{"x":932,"y":1264},"6":{"x":956,"y":1264}}},"warnings":null},{"id":121,"sourceNodeId":1,"sourcePortId":159,"targetNodeId":4,"targetPortId":160,"travelTime":{"lock":true,"time":9,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":12},"sourceArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":48},"targetDeparture":{"lock":false,"time":39,"warning":null,"consecutiveTime":39},"targetArrival":{"lock":false,"time":21,"warning":null,"consecutiveTime":21},"numberOfStops":0,"trainrunId":24,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":976,"y":350},{"x":976,"y":414},{"x":976,"y":510},{"x":976,"y":574}],"textPositions":{"0":{"x":964,"y":368},"1":{"x":988,"y":396},"2":{"x":988,"y":556},"3":{"x":964,"y":528},"4":{"x":964,"y":462},"5":{"x":964,"y":462},"6":{"x":988,"y":462}}},"warnings":null},{"id":122,"sourceNodeId":1,"sourcePortId":161,"targetNodeId":4,"targetPortId":162,"travelTime":{"lock":true,"time":8,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":36,"warning":null,"consecutiveTime":36},"sourceArrival":{"lock":false,"time":24,"warning":null,"consecutiveTime":144},"targetDeparture":{"lock":false,"time":16,"warning":null,"consecutiveTime":136},"targetArrival":{"lock":false,"time":44,"warning":null,"consecutiveTime":44},"numberOfStops":0,"trainrunId":25,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":944,"y":350},{"x":944,"y":414},{"x":944,"y":510},{"x":944,"y":574}],"textPositions":{"0":{"x":932,"y":368},"1":{"x":956,"y":396},"2":{"x":956,"y":556},"3":{"x":932,"y":528},"4":{"x":932,"y":462},"5":{"x":932,"y":462},"6":{"x":956,"y":462}}},"warnings":null},{"id":123,"sourceNodeId":4,"sourcePortId":163,"targetNodeId":6,"targetPortId":164,"travelTime":{"lock":true,"time":22,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":45,"warning":null,"consecutiveTime":45},"sourceArrival":{"lock":false,"time":15,"warning":null,"consecutiveTime":135},"targetDeparture":{"lock":false,"time":53,"warning":null,"consecutiveTime":113},"targetArrival":{"lock":false,"time":7,"warning":null,"consecutiveTime":67},"numberOfStops":0,"trainrunId":25,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":976,"y":642},{"x":976,"y":706},{"x":976,"y":958},{"x":976,"y":1022}],"textPositions":{"0":{"x":964,"y":660},"1":{"x":988,"y":688},"2":{"x":988,"y":1004},"3":{"x":964,"y":976},"4":{"x":964,"y":832},"5":{"x":964,"y":832},"6":{"x":988,"y":832}}},"warnings":null},{"id":124,"sourceNodeId":106,"sourcePortId":165,"targetNodeId":1,"targetPortId":166,"travelTime":{"lock":true,"time":25,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":3,"warning":null,"consecutiveTime":3},"sourceArrival":{"lock":false,"time":57,"warning":null,"consecutiveTime":177},"targetDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":152},"targetArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":28},"numberOfStops":0,"trainrunId":26,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":912,"y":-286},{"x":912,"y":-222},{"x":912,"y":-34},{"x":912,"y":30}],"textPositions":{"0":{"x":900,"y":-268},"1":{"x":924,"y":-240},"2":{"x":924,"y":12},"3":{"x":900,"y":-16},"4":{"x":900,"y":-128},"5":{"x":900,"y":-128},"6":{"x":924,"y":-128}}},"warnings":null},{"id":125,"sourceNodeId":1,"sourcePortId":167,"targetNodeId":4,"targetPortId":168,"travelTime":{"lock":true,"time":6,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":30},"sourceArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":150},"targetDeparture":{"lock":false,"time":24,"warning":null,"consecutiveTime":144},"targetArrival":{"lock":false,"time":36,"warning":null,"consecutiveTime":36},"numberOfStops":0,"trainrunId":26,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":848,"y":350},{"x":848,"y":414},{"x":848,"y":510},{"x":848,"y":574}],"textPositions":{"0":{"x":836,"y":368},"1":{"x":860,"y":396},"2":{"x":860,"y":556},"3":{"x":836,"y":528},"4":{"x":836,"y":462},"5":{"x":836,"y":462},"6":{"x":860,"y":462}}},"warnings":null},{"id":126,"sourceNodeId":4,"sourcePortId":169,"targetNodeId":6,"targetPortId":170,"travelTime":{"lock":true,"time":10,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":36,"warning":null,"consecutiveTime":36},"sourceArrival":{"lock":false,"time":24,"warning":null,"consecutiveTime":144},"targetDeparture":{"lock":false,"time":14,"warning":null,"consecutiveTime":134},"targetArrival":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"numberOfStops":0,"trainrunId":26,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":880,"y":642},{"x":880,"y":706},{"x":880,"y":958},{"x":880,"y":1022}],"textPositions":{"0":{"x":868,"y":660},"1":{"x":892,"y":688},"2":{"x":892,"y":1004},"3":{"x":868,"y":976},"4":{"x":868,"y":832},"5":{"x":868,"y":832},"6":{"x":892,"y":832}}},"warnings":null},{"id":127,"sourceNodeId":6,"sourcePortId":171,"targetNodeId":3,"targetPortId":172,"travelTime":{"lock":true,"time":19,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"sourceArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":134},"targetDeparture":{"lock":false,"time":55,"warning":null,"consecutiveTime":115},"targetArrival":{"lock":false,"time":5,"warning":null,"consecutiveTime":65},"numberOfStops":0,"trainrunId":26,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":880,"y":1090},{"x":880,"y":1154},{"x":880,"y":1374},{"x":880,"y":1438}],"textPositions":{"0":{"x":868,"y":1108},"1":{"x":892,"y":1136},"2":{"x":892,"y":1420},"3":{"x":868,"y":1392},"4":{"x":868,"y":1264},"5":{"x":868,"y":1264},"6":{"x":892,"y":1264}}},"warnings":null},{"id":128,"sourceNodeId":106,"sourcePortId":173,"targetNodeId":1,"targetPortId":174,"travelTime":{"lock":true,"time":32,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":16,"warning":null,"consecutiveTime":16},"sourceArrival":{"lock":false,"time":44,"warning":null,"consecutiveTime":164},"targetDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":132},"targetArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":48},"numberOfStops":0,"trainrunId":27,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":944,"y":-286},{"x":944,"y":-222},{"x":944,"y":-34},{"x":944,"y":30}],"textPositions":{"0":{"x":932,"y":-268},"1":{"x":956,"y":-240},"2":{"x":956,"y":12},"3":{"x":932,"y":-16},"4":{"x":932,"y":-128},"5":{"x":932,"y":-128},"6":{"x":956,"y":-128}}},"warnings":null},{"id":129,"sourceNodeId":1,"sourcePortId":175,"targetNodeId":4,"targetPortId":176,"travelTime":{"lock":true,"time":7,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":49,"warning":null,"consecutiveTime":49},"sourceArrival":{"lock":false,"time":11,"warning":null,"consecutiveTime":131},"targetDeparture":{"lock":false,"time":4,"warning":null,"consecutiveTime":124},"targetArrival":{"lock":false,"time":56,"warning":null,"consecutiveTime":56},"numberOfStops":0,"trainrunId":27,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":880,"y":350},{"x":880,"y":414},{"x":880,"y":510},{"x":880,"y":574}],"textPositions":{"0":{"x":868,"y":368},"1":{"x":892,"y":396},"2":{"x":892,"y":556},"3":{"x":868,"y":528},"4":{"x":868,"y":462},"5":{"x":868,"y":462},"6":{"x":892,"y":462}}},"warnings":null},{"id":130,"sourceNodeId":4,"sourcePortId":177,"targetNodeId":6,"targetPortId":178,"travelTime":{"lock":true,"time":12,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"sourceArrival":{"lock":false,"time":2,"warning":null,"consecutiveTime":122},"targetDeparture":{"lock":false,"time":50,"warning":null,"consecutiveTime":110},"targetArrival":{"lock":false,"time":10,"warning":null,"consecutiveTime":70},"numberOfStops":0,"trainrunId":27,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":912,"y":642},{"x":912,"y":706},{"x":912,"y":958},{"x":912,"y":1022}],"textPositions":{"0":{"x":900,"y":660},"1":{"x":924,"y":688},"2":{"x":924,"y":1004},"3":{"x":900,"y":976},"4":{"x":900,"y":832},"5":{"x":900,"y":832},"6":{"x":924,"y":832}}},"warnings":null},{"id":131,"sourceNodeId":6,"sourcePortId":179,"targetNodeId":3,"targetPortId":180,"travelTime":{"lock":true,"time":18,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":12,"warning":null,"consecutiveTime":72},"sourceArrival":{"lock":false,"time":48,"warning":null,"consecutiveTime":108},"targetDeparture":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"targetArrival":{"lock":false,"time":30,"warning":null,"consecutiveTime":90},"numberOfStops":0,"trainrunId":27,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":912,"y":1090},{"x":912,"y":1154},{"x":912,"y":1374},{"x":912,"y":1438}],"textPositions":{"0":{"x":900,"y":1108},"1":{"x":924,"y":1136},"2":{"x":924,"y":1420},"3":{"x":900,"y":1392},"4":{"x":900,"y":1264},"5":{"x":900,"y":1264},"6":{"x":924,"y":1264}}},"warnings":null},{"id":132,"sourceNodeId":0,"sourcePortId":181,"targetNodeId":8,"targetPortId":201,"travelTime":{"lock":true,"time":44,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":48,"warning":null,"consecutiveTime":48},"sourceArrival":{"lock":false,"time":12,"warning":null,"consecutiveTime":252},"targetDeparture":{"lock":false,"time":28,"warning":null,"consecutiveTime":208},"targetArrival":{"lock":false,"time":32,"warning":null,"consecutiveTime":92},"numberOfStops":0,"trainrunId":28,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-862,"y":336},{"x":-798,"y":336},{"x":-386,"y":336},{"x":-322,"y":336}],"textPositions":{"0":{"x":-844,"y":348},"1":{"x":-816,"y":324},"2":{"x":-340,"y":324},"3":{"x":-368,"y":348},"4":{"x":-592,"y":324},"5":{"x":-592,"y":324},"6":{"x":-592,"y":348}}},"warnings":null},{"id":133,"sourceNodeId":8,"sourcePortId":202,"targetNodeId":7,"targetPortId":207,"travelTime":{"lock":true,"time":6,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":44,"warning":null,"consecutiveTime":104},"sourceArrival":{"lock":false,"time":16,"warning":null,"consecutiveTime":196},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":190},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":110},"numberOfStops":0,"trainrunId":28,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-222,"y":336},{"x":-158,"y":336},{"x":190,"y":336},{"x":254,"y":336}],"textPositions":{"0":{"x":-204,"y":348},"1":{"x":-176,"y":324},"2":{"x":236,"y":324},"3":{"x":208,"y":348},"4":{"x":16,"y":324},"5":{"x":16,"y":324},"6":{"x":16,"y":348}}},"warnings":null},{"id":134,"sourceNodeId":1,"sourcePortId":185,"targetNodeId":4,"targetPortId":186,"travelTime":{"lock":true,"time":13,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":55,"warning":null,"consecutiveTime":115},"sourceArrival":{"lock":false,"time":5,"warning":null,"consecutiveTime":185},"targetDeparture":{"lock":false,"time":52,"warning":null,"consecutiveTime":172},"targetArrival":{"lock":false,"time":8,"warning":null,"consecutiveTime":128},"numberOfStops":0,"trainrunId":28,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1008,"y":350},{"x":1008,"y":414},{"x":1008,"y":510},{"x":1008,"y":574}],"textPositions":{"0":{"x":996,"y":368},"1":{"x":1020,"y":396},"2":{"x":1020,"y":556},"3":{"x":996,"y":528},"4":{"x":996,"y":462},"5":{"x":996,"y":462},"6":{"x":1020,"y":462}}},"warnings":null},{"id":135,"sourceNodeId":4,"sourcePortId":189,"targetNodeId":6,"targetPortId":190,"travelTime":{"lock":true,"time":20,"warning":null,"consecutiveTime":10},"sourceDeparture":{"lock":false,"time":8,"warning":null,"consecutiveTime":128},"sourceArrival":{"lock":false,"time":52,"warning":null,"consecutiveTime":172},"targetDeparture":{"lock":false,"time":32,"warning":null,"consecutiveTime":152},"targetArrival":{"lock":false,"time":28,"warning":null,"consecutiveTime":148},"numberOfStops":0,"trainrunId":28,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":1008,"y":642},{"x":1008,"y":706},{"x":1008,"y":958},{"x":1008,"y":1022}],"textPositions":{"0":{"x":996,"y":660},"1":{"x":1020,"y":688},"2":{"x":1020,"y":1004},"3":{"x":996,"y":976},"4":{"x":996,"y":832},"5":{"x":996,"y":832},"6":{"x":1020,"y":832}}},"warnings":null},{"id":136,"sourceNodeId":7,"sourcePortId":204,"targetNodeId":1,"targetPortId":146,"travelTime":{"lock":true,"time":4,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":46,"warning":null,"consecutiveTime":46},"sourceArrival":{"lock":false,"time":14,"warning":null,"consecutiveTime":14},"targetDeparture":{"lock":false,"time":10,"warning":null,"consecutiveTime":10},"targetArrival":{"lock":false,"time":50,"warning":null,"consecutiveTime":50},"numberOfStops":0,"trainrunId":21,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":240},{"x":418,"y":240},{"x":766,"y":240},{"x":830,"y":240}],"textPositions":{"0":{"x":372,"y":252},"1":{"x":400,"y":228},"2":{"x":812,"y":228},"3":{"x":784,"y":252},"4":{"x":592,"y":228},"5":{"x":592,"y":228},"6":{"x":592,"y":252}}},"warnings":null},{"id":137,"sourceNodeId":7,"sourcePortId":206,"targetNodeId":1,"targetPortId":150,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":17,"warning":null,"consecutiveTime":77},"sourceArrival":{"lock":false,"time":43,"warning":null,"consecutiveTime":223},"targetDeparture":{"lock":false,"time":38,"warning":null,"consecutiveTime":218},"targetArrival":{"lock":false,"time":22,"warning":null,"consecutiveTime":82},"numberOfStops":0,"trainrunId":22,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":272},{"x":418,"y":272},{"x":766,"y":272},{"x":830,"y":272}],"textPositions":{"0":{"x":372,"y":284},"1":{"x":400,"y":260},"2":{"x":812,"y":260},"3":{"x":784,"y":284},"4":{"x":592,"y":260},"5":{"x":592,"y":260},"6":{"x":592,"y":284}}},"warnings":null},{"id":138,"sourceNodeId":7,"sourcePortId":208,"targetNodeId":1,"targetPortId":184,"travelTime":{"lock":true,"time":5,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":50,"warning":null,"consecutiveTime":110},"sourceArrival":{"lock":false,"time":10,"warning":null,"consecutiveTime":190},"targetDeparture":{"lock":false,"time":5,"warning":null,"consecutiveTime":185},"targetArrival":{"lock":false,"time":55,"warning":null,"consecutiveTime":115},"numberOfStops":0,"trainrunId":28,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":304},{"x":418,"y":304},{"x":766,"y":304},{"x":830,"y":304}],"textPositions":{"0":{"x":372,"y":316},"1":{"x":400,"y":292},"2":{"x":812,"y":292},"3":{"x":784,"y":316},"4":{"x":592,"y":292},"5":{"x":592,"y":292},"6":{"x":592,"y":316}}},"warnings":null},{"id":139,"sourceNodeId":7,"sourcePortId":209,"targetNodeId":1,"targetPortId":210,"travelTime":{"lock":true,"time":1,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"sourceArrival":{"lock":false,"time":2,"warning":null,"consecutiveTime":2},"targetDeparture":{"lock":false,"time":1,"warning":null,"consecutiveTime":1},"targetArrival":{"lock":false,"time":59,"warning":null,"consecutiveTime":59},"numberOfStops":0,"trainrunId":29,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":354,"y":176},{"x":418,"y":176},{"x":766,"y":176},{"x":830,"y":176}],"textPositions":{"0":{"x":372,"y":188},"1":{"x":400,"y":164},"2":{"x":812,"y":164},"3":{"x":784,"y":188},"4":{"x":592,"y":164},"5":{"x":592,"y":164},"6":{"x":592,"y":188}}},"warnings":null},{"id":140,"sourceNodeId":7,"sourcePortId":211,"targetNodeId":8,"targetPortId":212,"travelTime":{"lock":true,"time":1,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":2,"warning":null,"consecutiveTime":2},"sourceArrival":{"lock":false,"time":58,"warning":null,"consecutiveTime":58},"targetDeparture":{"lock":false,"time":57,"warning":null,"consecutiveTime":57},"targetArrival":{"lock":false,"time":3,"warning":null,"consecutiveTime":3},"numberOfStops":0,"trainrunId":29,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":254,"y":240},{"x":190,"y":240},{"x":-158,"y":240},{"x":-222,"y":240}],"textPositions":{"0":{"x":236,"y":228},"1":{"x":208,"y":252},"2":{"x":-204,"y":252},"3":{"x":-176,"y":228},"4":{"x":16,"y":228},"5":{"x":16,"y":228},"6":{"x":16,"y":252}}},"warnings":null},{"id":141,"sourceNodeId":8,"sourcePortId":213,"targetNodeId":0,"targetPortId":214,"travelTime":{"lock":true,"time":1,"warning":null,"consecutiveTime":1},"sourceDeparture":{"lock":false,"time":5,"warning":null,"consecutiveTime":5},"sourceArrival":{"lock":false,"time":55,"warning":null,"consecutiveTime":55},"targetDeparture":{"lock":false,"time":54,"warning":null,"consecutiveTime":54},"targetArrival":{"lock":false,"time":6,"warning":null,"consecutiveTime":6},"numberOfStops":0,"trainrunId":29,"resourceId":0,"specificTrainrunSectionFrequencyId":null,"path":{"path":[{"x":-322,"y":240},{"x":-386,"y":240},{"x":-798,"y":240},{"x":-862,"y":240}],"textPositions":{"0":{"x":-340,"y":228},"1":{"x":-368,"y":252},"2":{"x":-844,"y":252},"3":{"x":-816,"y":228},"4":{"x":-592,"y":228},"5":{"x":-592,"y":228},"6":{"x":-592,"y":252}}},"warnings":null}],"trainruns":[{"id":11,"name":"15","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[26]},{"id":12,"name":"8","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[31]},{"id":14,"name":"E","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[28]},{"id":16,"name":"1","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[30]},{"id":18,"name":"16","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[27]},{"id":20,"name":"61","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[29]},{"id":21,"name":"17","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[32]},{"id":22,"name":"35","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[33]},{"id":23,"name":"","categoryId":3,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[37]},{"id":24,"name":"29a","categoryId":4,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[38]},{"id":25,"name":"29","categoryId":3,"frequencyId":2,"trainrunTimeCategoryId":0,"labelIds":[39]},{"id":26,"name":"26","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[35]},{"id":27,"name":"27","categoryId":2,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[36]},{"id":28,"name":"X","categoryId":5,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[34]},{"id":29,"name":"X","categoryId":1,"frequencyId":3,"trainrunTimeCategoryId":0,"labelIds":[]}],"resources":[{"id":65,"capacity":10},{"id":66,"capacity":8},{"id":67,"capacity":15},{"id":68,"capacity":10},{"id":69,"capacity":3},{"id":70,"capacity":2},{"id":71,"capacity":3},{"id":72,"capacity":3},{"id":73,"capacity":3},{"id":74,"capacity":2},{"id":75,"capacity":2},{"id":76,"capacity":9},{"id":77,"capacity":2}],"metadata":{"netzgrafikColors":[],"trainrunCategories":[{"id":0,"name":"International","order":0,"colorRef":"EC","shortName":"EC","fachCategory":"HaltezeitIPV","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":8},{"id":1,"name":"InterCity","order":1,"colorRef":"IC","shortName":"IC","fachCategory":"HaltezeitA","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":8},{"id":2,"name":"InterRegio","order":2,"colorRef":"IR","shortName":"IR","fachCategory":"HaltezeitB","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":8},{"id":3,"name":"RegioExpress","order":3,"colorRef":"RE","shortName":"RE","fachCategory":"HaltezeitC","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":8},{"id":4,"name":"RegioUndSBahnverkehr","order":4,"colorRef":"S","shortName":"S","fachCategory":"HaltezeitD","sectionHeadway":2,"nodeHeadwayStop":2,"nodeHeadwayNonStop":2,"minimalTurnaroundTime":8},{"id":5,"name":"GüterExpress","order":5,"colorRef":"GEX","shortName":"GEX","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":8},{"id":6,"name":"Güterverkehr","order":6,"colorRef":"G","shortName":"G","fachCategory":"HaltezeitUncategorized","sectionHeadway":3,"nodeHeadwayStop":3,"nodeHeadwayNonStop":3,"minimalTurnaroundTime":8}],"trainrunFrequencies":[{"id":0,"name":"verkehrt viertelstündlich","order":0,"offset":0,"frequency":15,"shortName":"15","linePatternRef":"15"},{"id":1,"name":"verkehrt im 20 Minuten Takt","order":0,"offset":0,"frequency":20,"shortName":"20","linePatternRef":"20"},{"id":2,"name":"verkehrt halbstündlich","order":0,"offset":0,"frequency":30,"shortName":"30","linePatternRef":"30"},{"id":3,"name":"verkehrt stündlich","order":0,"offset":0,"frequency":60,"shortName":"60","linePatternRef":"60"},{"id":4,"name":"verkehrt zweistündlich (gerade)","order":0,"offset":0,"frequency":120,"shortName":"120","linePatternRef":"120"},{"id":5,"name":"verkehrt zweistündlich (ungerade)","order":0,"offset":60,"frequency":120,"shortName":"120+","linePatternRef":"120"}],"trainrunTimeCategories":[{"id":0,"name":"verkehrt uneingeschränkt","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"7/24","linePatternRef":"7/24","dayTimeInterval":[]},{"id":1,"name":"verkehrt zur Hauptverkehrszeit","order":0,"weekday":[1,2,3,4,5,6,7],"shortName":"HVZ","linePatternRef":"HVZ","dayTimeInterval":[{"to":420,"from":360},{"to":1140,"from":960}]},{"id":2,"name":"verkehrt zeitweise","order":0,"weekday":[],"shortName":"zeitweise","linePatternRef":"ZEITWEISE","dayTimeInterval":[]}]},"freeFloatingTexts":[],"labels":[{"id":1,"label":"BLS","labelGroupId":1,"labelRef":"Node"},{"id":2,"label":"SBB","labelGroupId":1,"labelRef":"Node"},{"id":3,"label":"OL-LZ","labelGroupId":1,"labelRef":"Node"},{"id":26,"label":"IR15","labelGroupId":9,"labelRef":"Trainrun"},{"id":27,"label":"IR16","labelGroupId":9,"labelRef":"Trainrun"},{"id":28,"label":"ICE","labelGroupId":9,"labelRef":"Trainrun"},{"id":29,"label":"IC61","labelGroupId":9,"labelRef":"Trainrun"},{"id":30,"label":"IC1","labelGroupId":9,"labelRef":"Trainrun"},{"id":31,"label":"IC8","labelGroupId":9,"labelRef":"Trainrun"},{"id":32,"label":"IR17","labelGroupId":9,"labelRef":"Trainrun"},{"id":33,"label":"IR35","labelGroupId":9,"labelRef":"Trainrun"},{"id":34,"label":"GEXX","labelGroupId":9,"labelRef":"Trainrun"},{"id":35,"label":"IR26","labelGroupId":9,"labelRef":"Trainrun"},{"id":36,"label":"IR27","labelGroupId":9,"labelRef":"Trainrun"},{"id":37,"label":"RE","labelGroupId":9,"labelRef":"Trainrun"},{"id":38,"label":"S29","labelGroupId":9,"labelRef":"Trainrun"},{"id":39,"label":"S29_OL_SS","labelGroupId":9,"labelRef":"Trainrun"},{"id":40,"label":"LZ","labelGroupId":1,"labelRef":"Node"},{"id":41,"label":"BN","labelGroupId":1,"labelRef":"Node"},{"id":42,"label":"ZUE","labelGroupId":1,"labelRef":"Node"}],"labelGroups":[{"id":1,"name":"Standard","labelRef":"Node"},{"id":9,"name":"Standard","labelRef":"Trainrun"}],"filterData":{"filterSettings":[]}} \ No newline at end of file diff --git a/src/app/sample-netzgrafik/netzgrafik.default.ts b/src/app/sample-netzgrafik/netzgrafik.default.ts index 269b1404..9c883ab7 100644 --- a/src/app/sample-netzgrafik/netzgrafik.default.ts +++ b/src/app/sample-netzgrafik/netzgrafik.default.ts @@ -3,9 +3,14 @@ import { LinePatternRefs, NetzgrafikDto, } from "../data-structures/business.data.structures"; +import {environment} from "../../environments/environment"; +import {NetzgrafikDemoStandaloneGithub} from "./netzgrafik.demo.standalone.github"; export class NetzgrafikDefault { static getDefaultNetzgrafik(): NetzgrafikDto { + if (environment.standalonedemo) { + return NetzgrafikDemoStandaloneGithub.getNetzgrafikDemoStandaloneGithub(); + } return { nodes: [ { @@ -200,6 +205,11 @@ export class NetzgrafikDefault { trainruns: [], resources: [], metadata: { + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + } + }, trainrunCategories: [ { id: 0, diff --git a/src/app/sample-netzgrafik/netzgrafik.demo.standalone.github.ts b/src/app/sample-netzgrafik/netzgrafik.demo.standalone.github.ts new file mode 100644 index 00000000..6a09ce19 --- /dev/null +++ b/src/app/sample-netzgrafik/netzgrafik.demo.standalone.github.ts @@ -0,0 +1,26511 @@ +import { + HaltezeitFachCategories, + LinePatternRefs, + NetzgrafikDto, +} from "../data-structures/business.data.structures"; + +export class NetzgrafikDemoStandaloneGithub { + static getNetzgrafikDemoStandaloneGithub(): NetzgrafikDto { + return { + nodes: [ + { + id: 128, + betriebspunktName: "Lausanne", + fullName: "Lausanne", + positionX: -3072, + positionY: 544, + ports: [ + { + id: 1207, + trainrunSectionId: 596, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1187, + trainrunSectionId: 586, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1382, + trainrunSectionId: 683, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1380, + trainrunSectionId: 682, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 345, + port1Id: 1187, + port2Id: 1380, + isNonStopTransit: false + }, + { + id: 347, + port1Id: 1207, + port2Id: 1382, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 152, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 129, + betriebspunktName: "Bern", + fullName: "Bern", + positionX: -2144, + positionY: 128, + ports: [ + { + id: 1328, + trainrunSectionId: 656, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1311, + trainrunSectionId: 648, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1313, + trainrunSectionId: 649, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1339, + trainrunSectionId: 662, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1205, + trainrunSectionId: 595, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1109, + trainrunSectionId: 547, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1440, + trainrunSectionId: 712, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1329, + trainrunSectionId: 657, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1436, + trainrunSectionId: 710, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1434, + trainrunSectionId: 709, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1432, + trainrunSectionId: 708, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1430, + trainrunSectionId: 707, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1428, + trainrunSectionId: 706, + positionIndex: 6, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 315, + port1Id: 1328, + port2Id: 1329, + isNonStopTransit: false + }, + { + id: 376, + port1Id: 1109, + port2Id: 1430, + isNonStopTransit: false + }, + { + id: 378, + port1Id: 1339, + port2Id: 1432, + isNonStopTransit: false + }, + { + id: 380, + port1Id: 1313, + port2Id: 1434, + isNonStopTransit: false + }, + { + id: 382, + port1Id: 1311, + port2Id: 1436, + isNonStopTransit: false + }, + { + id: 386, + port1Id: 1205, + port2Id: 1440, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 153, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 130, + betriebspunktName: "Biel", + fullName: "Biel", + positionX: -2528, + positionY: -32, + ports: [ + { + id: 1183, + trainrunSectionId: 584, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1418, + trainrunSectionId: 701, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 366, + port1Id: 1183, + port2Id: 1418, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 154, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 131, + betriebspunktName: "Interlaken ", + fullName: "Interlaken Ost", + positionX: -1088, + positionY: 928, + ports: [ + { + id: 1318, + trainrunSectionId: 651, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1344, + trainrunSectionId: 664, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [], + connections: [], + resourceId: 155, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 132, + betriebspunktName: "Visp", + fullName: "Visp", + positionX: -2144, + positionY: 1440, + ports: [ + { + id: 1323, + trainrunSectionId: 654, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1322, + trainrunSectionId: 653, + positionIndex: 1, + positionAlignment: 0 + } + ], + transitions: [], + connections: [], + resourceId: 156, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 133, + betriebspunktName: "Olten", + fullName: "Olten", + positionX: 64, + positionY: 96, + ports: [ + { + id: 1047, + trainrunSectionId: 516, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1331, + trainrunSectionId: 658, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1308, + trainrunSectionId: 646, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1371, + trainrunSectionId: 678, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1131, + trainrunSectionId: 558, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1117, + trainrunSectionId: 551, + positionIndex: 5, + positionAlignment: 0 + }, + { + id: 1046, + trainrunSectionId: 515, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1370, + trainrunSectionId: 677, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1130, + trainrunSectionId: 557, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1116, + trainrunSectionId: 550, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1181, + trainrunSectionId: 583, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1203, + trainrunSectionId: 594, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1394, + trainrunSectionId: 689, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1309, + trainrunSectionId: 647, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1225, + trainrunSectionId: 605, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1241, + trainrunSectionId: 613, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1165, + trainrunSectionId: 575, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1202, + trainrunSectionId: 593, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1180, + trainrunSectionId: 582, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1224, + trainrunSectionId: 604, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1240, + trainrunSectionId: 612, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1164, + trainrunSectionId: 574, + positionIndex: 4, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 210, + port1Id: 1047, + port2Id: 1046, + isNonStopTransit: false + }, + { + id: 236, + port1Id: 1117, + port2Id: 1116, + isNonStopTransit: false + }, + { + id: 242, + port1Id: 1131, + port2Id: 1130, + isNonStopTransit: false + }, + { + id: 253, + port1Id: 1165, + port2Id: 1164, + isNonStopTransit: false + }, + { + id: 259, + port1Id: 1181, + port2Id: 1180, + isNonStopTransit: false + }, + { + id: 264, + port1Id: 1203, + port2Id: 1202, + isNonStopTransit: true + }, + { + id: 270, + port1Id: 1225, + port2Id: 1224, + isNonStopTransit: true + }, + { + id: 276, + port1Id: 1241, + port2Id: 1240, + isNonStopTransit: true + }, + { + id: 308, + port1Id: 1308, + port2Id: 1309, + isNonStopTransit: false + }, + { + id: 340, + port1Id: 1371, + port2Id: 1370, + isNonStopTransit: false + }, + { + id: 353, + port1Id: 1331, + port2Id: 1394, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 157, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 134, + betriebspunktName: "Basel", + fullName: "Basel", + positionX: 64, + positionY: -1888, + ports: [ + { + id: 1054, + trainrunSectionId: 519, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1416, + trainrunSectionId: 700, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1277, + trainrunSectionId: 631, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1338, + trainrunSectionId: 661, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1301, + trainrunSectionId: 643, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1378, + trainrunSectionId: 681, + positionIndex: 5, + positionAlignment: 1 + }, + { + id: 1138, + trainrunSectionId: 561, + positionIndex: 6, + positionAlignment: 1 + }, + { + id: 1124, + trainrunSectionId: 554, + positionIndex: 7, + positionAlignment: 1 + }, + { + id: 1267, + trainrunSectionId: 626, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [], + connections: [], + resourceId: 158, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 135, + betriebspunktName: "Zürich", + fullName: "Zürich", + positionX: 2656, + positionY: 32, + ports: [ + { + id: 1255, + trainrunSectionId: 620, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1254, + trainrunSectionId: 619, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1360, + trainrunSectionId: 672, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1149, + trainrunSectionId: 567, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1153, + trainrunSectionId: 569, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1358, + trainrunSectionId: 671, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1356, + trainrunSectionId: 670, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1354, + trainrunSectionId: 669, + positionIndex: 5, + positionAlignment: 1 + }, + { + id: 1195, + trainrunSectionId: 590, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1401, + trainrunSectionId: 693, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1292, + trainrunSectionId: 638, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1173, + trainrunSectionId: 579, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1217, + trainrunSectionId: 601, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1233, + trainrunSectionId: 609, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1157, + trainrunSectionId: 571, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1276, + trainrunSectionId: 630, + positionIndex: 7, + positionAlignment: 2 + }, + { + id: 1300, + trainrunSectionId: 642, + positionIndex: 8, + positionAlignment: 2 + }, + { + id: 1191, + trainrunSectionId: 588, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1172, + trainrunSectionId: 578, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1213, + trainrunSectionId: 599, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1229, + trainrunSectionId: 607, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1139, + trainrunSectionId: 562, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1245, + trainrunSectionId: 615, + positionIndex: 5, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 250, + port1Id: 1153, + port2Id: 1157, + isNonStopTransit: false + }, + { + id: 256, + port1Id: 1173, + port2Id: 1172, + isNonStopTransit: false + }, + { + id: 261, + port1Id: 1195, + port2Id: 1191, + isNonStopTransit: false + }, + { + id: 267, + port1Id: 1217, + port2Id: 1213, + isNonStopTransit: false + }, + { + id: 273, + port1Id: 1233, + port2Id: 1229, + isNonStopTransit: false + }, + { + id: 329, + port1Id: 1354, + port2Id: 1245, + isNonStopTransit: false + }, + { + id: 357, + port1Id: 1149, + port2Id: 1401, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 159, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 136, + betriebspunktName: "Bellinz.", + fullName: "Bellinzona", + positionX: 2592, + positionY: 3232, + ports: [ + { + id: 1059, + trainrunSectionId: 522, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1035, + trainrunSectionId: 510, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1071, + trainrunSectionId: 528, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1083, + trainrunSectionId: 534, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1058, + trainrunSectionId: 521, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1034, + trainrunSectionId: 509, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1070, + trainrunSectionId: 527, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1082, + trainrunSectionId: 533, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 206, + port1Id: 1035, + port2Id: 1034, + isNonStopTransit: false + }, + { + id: 216, + port1Id: 1059, + port2Id: 1058, + isNonStopTransit: false + }, + { + id: 221, + port1Id: 1071, + port2Id: 1070, + isNonStopTransit: false + }, + { + id: 226, + port1Id: 1083, + port2Id: 1082, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 160, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 137, + betriebspunktName: "St. Gallen", + fullName: "Sankt Gallen", + positionX: 4640, + positionY: 96, + ports: [ + { + id: 1145, + trainrunSectionId: 565, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1212, + trainrunSectionId: 598, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1167, + trainrunSectionId: 576, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1144, + trainrunSectionId: 564, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1419, + trainrunSectionId: 702, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 248, + port1Id: 1145, + port2Id: 1144, + isNonStopTransit: false + }, + { + id: 367, + port1Id: 1167, + port2Id: 1419, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 161, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 138, + betriebspunktName: "Schaffh.", + fullName: "Schaffhausen", + positionX: 2624, + positionY: -1120, + ports: [ + { + id: 1256, + trainrunSectionId: 620, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1251, + trainrunSectionId: 618, + positionIndex: 1, + positionAlignment: 1 + } + ], + transitions: [], + connections: [], + resourceId: 162, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 139, + betriebspunktName: "Konstanz", + fullName: "Konstanz", + positionX: 4256, + positionY: -416, + ports: [ + { + id: 1250, + trainrunSectionId: 617, + positionIndex: 0, + positionAlignment: 1 + } + ], + transitions: [], + connections: [], + resourceId: 163, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 140, + betriebspunktName: "Sargans", + fullName: "Sargans", + positionX: 4640, + positionY: 1184, + ports: [ + { + id: 1146, + trainrunSectionId: 565, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1151, + trainrunSectionId: 568, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1147, + trainrunSectionId: 566, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1155, + trainrunSectionId: 570, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1362, + trainrunSectionId: 673, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1364, + trainrunSectionId: 674, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 249, + port1Id: 1146, + port2Id: 1147, + isNonStopTransit: false + }, + { + id: 334, + port1Id: 1151, + port2Id: 1362, + isNonStopTransit: false + }, + { + id: 336, + port1Id: 1155, + port2Id: 1364, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 164, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 141, + betriebspunktName: "Sursee", + fullName: "Sursee", + positionX: 64, + positionY: 1184, + ports: [ + { + id: 1043, + trainrunSectionId: 514, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1105, + trainrunSectionId: 545, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1367, + trainrunSectionId: 676, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1127, + trainrunSectionId: 556, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1113, + trainrunSectionId: 549, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1042, + trainrunSectionId: 513, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1104, + trainrunSectionId: 544, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1366, + trainrunSectionId: 675, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1126, + trainrunSectionId: 555, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1112, + trainrunSectionId: 548, + positionIndex: 4, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 208, + port1Id: 1043, + port2Id: 1042, + isNonStopTransit: true + }, + { + id: 232, + port1Id: 1105, + port2Id: 1104, + isNonStopTransit: false + }, + { + id: 234, + port1Id: 1113, + port2Id: 1112, + isNonStopTransit: false + }, + { + id: 240, + port1Id: 1127, + port2Id: 1126, + isNonStopTransit: true + }, + { + id: 338, + port1Id: 1367, + port2Id: 1366, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 165, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 142, + betriebspunktName: "Luzern", + fullName: "Luzern", + positionX: 64, + positionY: 1728, + ports: [ + { + id: 1041, + trainrunSectionId: 513, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1103, + trainrunSectionId: 544, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1365, + trainrunSectionId: 675, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1125, + trainrunSectionId: 555, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1111, + trainrunSectionId: 548, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1352, + trainrunSectionId: 668, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1350, + trainrunSectionId: 667, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1099, + trainrunSectionId: 542, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1095, + trainrunSectionId: 540, + positionIndex: 3, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 327, + port1Id: 1041, + port2Id: 1352, + isNonStopTransit: false + }, + { + id: 337, + port1Id: 1365, + port2Id: 1350, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 166, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 143, + betriebspunktName: "Zofingen", + fullName: "Zofingen", + positionX: 64, + positionY: 736, + ports: [ + { + id: 1045, + trainrunSectionId: 515, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1369, + trainrunSectionId: 677, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1129, + trainrunSectionId: 557, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1115, + trainrunSectionId: 550, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1044, + trainrunSectionId: 514, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1106, + trainrunSectionId: 545, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1368, + trainrunSectionId: 676, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1128, + trainrunSectionId: 556, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1114, + trainrunSectionId: 549, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1107, + trainrunSectionId: 546, + positionIndex: 0, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 209, + port1Id: 1045, + port2Id: 1044, + isNonStopTransit: true + }, + { + id: 233, + port1Id: 1107, + port2Id: 1106, + isNonStopTransit: false + }, + { + id: 235, + port1Id: 1115, + port2Id: 1114, + isNonStopTransit: false + }, + { + id: 241, + port1Id: 1129, + port2Id: 1128, + isNonStopTransit: true + }, + { + id: 339, + port1Id: 1369, + port2Id: 1368, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 167, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 144, + betriebspunktName: "Gelterk.", + fullName: "Gelterkinden", + positionX: 64, + positionY: -448, + ports: [ + { + id: 1049, + trainrunSectionId: 517, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1411, + trainrunSectionId: 698, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1282, + trainrunSectionId: 633, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1333, + trainrunSectionId: 659, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1306, + trainrunSectionId: 645, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1373, + trainrunSectionId: 679, + positionIndex: 5, + positionAlignment: 0 + }, + { + id: 1133, + trainrunSectionId: 559, + positionIndex: 6, + positionAlignment: 0 + }, + { + id: 1119, + trainrunSectionId: 552, + positionIndex: 7, + positionAlignment: 0 + }, + { + id: 1048, + trainrunSectionId: 516, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1332, + trainrunSectionId: 658, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1307, + trainrunSectionId: 646, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1372, + trainrunSectionId: 678, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1132, + trainrunSectionId: 558, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1118, + trainrunSectionId: 551, + positionIndex: 5, + positionAlignment: 1 + }, + { + id: 1410, + trainrunSectionId: 697, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1283, + trainrunSectionId: 634, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 211, + port1Id: 1049, + port2Id: 1048, + isNonStopTransit: true + }, + { + id: 237, + port1Id: 1119, + port2Id: 1118, + isNonStopTransit: false + }, + { + id: 243, + port1Id: 1133, + port2Id: 1132, + isNonStopTransit: true + }, + { + id: 297, + port1Id: 1282, + port2Id: 1283, + isNonStopTransit: true + }, + { + id: 307, + port1Id: 1306, + port2Id: 1307, + isNonStopTransit: true + }, + { + id: 316, + port1Id: 1333, + port2Id: 1332, + isNonStopTransit: true + }, + { + id: 341, + port1Id: 1373, + port2Id: 1372, + isNonStopTransit: true + }, + { + id: 362, + port1Id: 1411, + port2Id: 1410, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 168, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 145, + betriebspunktName: "Sissach", + fullName: "Sissach", + positionX: 64, + positionY: -928, + ports: [ + { + id: 1051, + trainrunSectionId: 518, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1413, + trainrunSectionId: 699, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1280, + trainrunSectionId: 632, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1335, + trainrunSectionId: 660, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1304, + trainrunSectionId: 644, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1375, + trainrunSectionId: 680, + positionIndex: 5, + positionAlignment: 0 + }, + { + id: 1135, + trainrunSectionId: 560, + positionIndex: 6, + positionAlignment: 0 + }, + { + id: 1121, + trainrunSectionId: 553, + positionIndex: 7, + positionAlignment: 0 + }, + { + id: 1050, + trainrunSectionId: 517, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1412, + trainrunSectionId: 698, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1281, + trainrunSectionId: 633, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1334, + trainrunSectionId: 659, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1305, + trainrunSectionId: 645, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1374, + trainrunSectionId: 679, + positionIndex: 5, + positionAlignment: 1 + }, + { + id: 1134, + trainrunSectionId: 559, + positionIndex: 6, + positionAlignment: 1 + }, + { + id: 1120, + trainrunSectionId: 552, + positionIndex: 7, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 212, + port1Id: 1051, + port2Id: 1050, + isNonStopTransit: true + }, + { + id: 238, + port1Id: 1121, + port2Id: 1120, + isNonStopTransit: false + }, + { + id: 244, + port1Id: 1135, + port2Id: 1134, + isNonStopTransit: true + }, + { + id: 296, + port1Id: 1280, + port2Id: 1281, + isNonStopTransit: true + }, + { + id: 306, + port1Id: 1304, + port2Id: 1305, + isNonStopTransit: true + }, + { + id: 317, + port1Id: 1335, + port2Id: 1334, + isNonStopTransit: true + }, + { + id: 342, + port1Id: 1375, + port2Id: 1374, + isNonStopTransit: true + }, + { + id: 363, + port1Id: 1413, + port2Id: 1412, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 169, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 146, + betriebspunktName: "Liestal", + fullName: "Liestal", + positionX: 64, + positionY: -1408, + ports: [ + { + id: 1053, + trainrunSectionId: 519, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1415, + trainrunSectionId: 700, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1278, + trainrunSectionId: 631, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1337, + trainrunSectionId: 661, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1302, + trainrunSectionId: 643, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1377, + trainrunSectionId: 681, + positionIndex: 5, + positionAlignment: 0 + }, + { + id: 1137, + trainrunSectionId: 561, + positionIndex: 6, + positionAlignment: 0 + }, + { + id: 1123, + trainrunSectionId: 554, + positionIndex: 7, + positionAlignment: 0 + }, + { + id: 1052, + trainrunSectionId: 518, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1414, + trainrunSectionId: 699, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1279, + trainrunSectionId: 632, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1336, + trainrunSectionId: 660, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1303, + trainrunSectionId: 644, + positionIndex: 4, + positionAlignment: 1 + }, + { + id: 1376, + trainrunSectionId: 680, + positionIndex: 5, + positionAlignment: 1 + }, + { + id: 1136, + trainrunSectionId: 560, + positionIndex: 6, + positionAlignment: 1 + }, + { + id: 1122, + trainrunSectionId: 553, + positionIndex: 7, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 213, + port1Id: 1053, + port2Id: 1052, + isNonStopTransit: true + }, + { + id: 239, + port1Id: 1123, + port2Id: 1122, + isNonStopTransit: false + }, + { + id: 245, + port1Id: 1137, + port2Id: 1136, + isNonStopTransit: true + }, + { + id: 295, + port1Id: 1278, + port2Id: 1279, + isNonStopTransit: true + }, + { + id: 305, + port1Id: 1302, + port2Id: 1303, + isNonStopTransit: true + }, + { + id: 318, + port1Id: 1337, + port2Id: 1336, + isNonStopTransit: true + }, + { + id: 343, + port1Id: 1377, + port2Id: 1376, + isNonStopTransit: true + }, + { + id: 364, + port1Id: 1415, + port2Id: 1414, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 170, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 147, + betriebspunktName: "Aarau", + fullName: "Aarau", + positionX: 960, + positionY: 32, + ports: [ + { + id: 1409, + trainrunSectionId: 697, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1284, + trainrunSectionId: 634, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1201, + trainrunSectionId: 593, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1179, + trainrunSectionId: 582, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1223, + trainrunSectionId: 604, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1239, + trainrunSectionId: 612, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1163, + trainrunSectionId: 574, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1200, + trainrunSectionId: 592, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1408, + trainrunSectionId: 696, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1285, + trainrunSectionId: 635, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1178, + trainrunSectionId: 581, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1222, + trainrunSectionId: 603, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1238, + trainrunSectionId: 611, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1162, + trainrunSectionId: 573, + positionIndex: 6, + positionAlignment: 3 + }, + { + id: 1293, + trainrunSectionId: 639, + positionIndex: 7, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 252, + port1Id: 1163, + port2Id: 1162, + isNonStopTransit: true + }, + { + id: 258, + port1Id: 1179, + port2Id: 1178, + isNonStopTransit: false + }, + { + id: 263, + port1Id: 1201, + port2Id: 1200, + isNonStopTransit: true + }, + { + id: 269, + port1Id: 1223, + port2Id: 1222, + isNonStopTransit: true + }, + { + id: 275, + port1Id: 1239, + port2Id: 1238, + isNonStopTransit: true + }, + { + id: 298, + port1Id: 1284, + port2Id: 1285, + isNonStopTransit: true + }, + { + id: 361, + port1Id: 1409, + port2Id: 1408, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 171, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 148, + betriebspunktName: "Lenzburg", + fullName: "Lenzburg", + positionX: 1344, + positionY: 32, + ports: [ + { + id: 1199, + trainrunSectionId: 592, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1407, + trainrunSectionId: 696, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1286, + trainrunSectionId: 635, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1177, + trainrunSectionId: 581, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1221, + trainrunSectionId: 603, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1237, + trainrunSectionId: 611, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1161, + trainrunSectionId: 573, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1294, + trainrunSectionId: 639, + positionIndex: 7, + positionAlignment: 2 + }, + { + id: 1258, + trainrunSectionId: 621, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1406, + trainrunSectionId: 695, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1287, + trainrunSectionId: 636, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1260, + trainrunSectionId: 622, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1262, + trainrunSectionId: 623, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1264, + trainrunSectionId: 624, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1266, + trainrunSectionId: 625, + positionIndex: 6, + positionAlignment: 3 + }, + { + id: 1295, + trainrunSectionId: 640, + positionIndex: 7, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 282, + port1Id: 1199, + port2Id: 1258, + isNonStopTransit: true + }, + { + id: 284, + port1Id: 1177, + port2Id: 1260, + isNonStopTransit: true + }, + { + id: 286, + port1Id: 1221, + port2Id: 1262, + isNonStopTransit: true + }, + { + id: 288, + port1Id: 1237, + port2Id: 1264, + isNonStopTransit: true + }, + { + id: 290, + port1Id: 1161, + port2Id: 1266, + isNonStopTransit: true + }, + { + id: 299, + port1Id: 1286, + port2Id: 1287, + isNonStopTransit: true + }, + { + id: 302, + port1Id: 1294, + port2Id: 1295, + isNonStopTransit: false + }, + { + id: 360, + port1Id: 1407, + port2Id: 1406, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 172, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 149, + betriebspunktName: "Baden", + fullName: "Baden", + positionX: 2240, + positionY: 32, + ports: [ + { + id: 1197, + trainrunSectionId: 591, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1403, + trainrunSectionId: 694, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1290, + trainrunSectionId: 637, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1175, + trainrunSectionId: 580, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1219, + trainrunSectionId: 602, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1235, + trainrunSectionId: 610, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1159, + trainrunSectionId: 572, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1274, + trainrunSectionId: 629, + positionIndex: 7, + positionAlignment: 2 + }, + { + id: 1298, + trainrunSectionId: 641, + positionIndex: 8, + positionAlignment: 2 + }, + { + id: 1196, + trainrunSectionId: 590, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1402, + trainrunSectionId: 693, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1291, + trainrunSectionId: 638, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1174, + trainrunSectionId: 579, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1218, + trainrunSectionId: 601, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1234, + trainrunSectionId: 609, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1158, + trainrunSectionId: 571, + positionIndex: 6, + positionAlignment: 3 + }, + { + id: 1275, + trainrunSectionId: 630, + positionIndex: 7, + positionAlignment: 3 + }, + { + id: 1299, + trainrunSectionId: 642, + positionIndex: 8, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 251, + port1Id: 1159, + port2Id: 1158, + isNonStopTransit: true + }, + { + id: 257, + port1Id: 1175, + port2Id: 1174, + isNonStopTransit: true + }, + { + id: 262, + port1Id: 1197, + port2Id: 1196, + isNonStopTransit: true + }, + { + id: 268, + port1Id: 1219, + port2Id: 1218, + isNonStopTransit: true + }, + { + id: 274, + port1Id: 1235, + port2Id: 1234, + isNonStopTransit: true + }, + { + id: 294, + port1Id: 1274, + port2Id: 1275, + isNonStopTransit: false + }, + { + id: 301, + port1Id: 1290, + port2Id: 1291, + isNonStopTransit: true + }, + { + id: 304, + port1Id: 1298, + port2Id: 1299, + isNonStopTransit: true + }, + { + id: 358, + port1Id: 1403, + port2Id: 1402, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 173, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 150, + betriebspunktName: "Zürich ✈", + fullName: "Zürich Flughafen", + positionX: 3296, + positionY: 32, + ports: [ + { + id: 1192, + trainrunSectionId: 588, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1171, + trainrunSectionId: 578, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1214, + trainrunSectionId: 599, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1230, + trainrunSectionId: 607, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1140, + trainrunSectionId: 562, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1246, + trainrunSectionId: 615, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1193, + trainrunSectionId: 589, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1170, + trainrunSectionId: 577, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1215, + trainrunSectionId: 600, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1231, + trainrunSectionId: 608, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1141, + trainrunSectionId: 563, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1247, + trainrunSectionId: 616, + positionIndex: 5, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 246, + port1Id: 1140, + port2Id: 1141, + isNonStopTransit: false + }, + { + id: 255, + port1Id: 1171, + port2Id: 1170, + isNonStopTransit: false + }, + { + id: 260, + port1Id: 1192, + port2Id: 1193, + isNonStopTransit: false + }, + { + id: 266, + port1Id: 1214, + port2Id: 1215, + isNonStopTransit: false + }, + { + id: 272, + port1Id: 1230, + port2Id: 1231, + isNonStopTransit: false + }, + { + id: 278, + port1Id: 1246, + port2Id: 1247, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 174, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 151, + betriebspunktName: "Wintert.", + fullName: "Winterthur", + positionX: 3872, + positionY: 32, + ports: [ + { + id: 1249, + trainrunSectionId: 617, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1194, + trainrunSectionId: 589, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1169, + trainrunSectionId: 577, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1216, + trainrunSectionId: 600, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1232, + trainrunSectionId: 608, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1142, + trainrunSectionId: 563, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1248, + trainrunSectionId: 616, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1227, + trainrunSectionId: 606, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1243, + trainrunSectionId: 614, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1211, + trainrunSectionId: 598, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1168, + trainrunSectionId: 576, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1143, + trainrunSectionId: 564, + positionIndex: 4, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 247, + port1Id: 1142, + port2Id: 1143, + isNonStopTransit: false + }, + { + id: 254, + port1Id: 1169, + port2Id: 1168, + isNonStopTransit: false + }, + { + id: 265, + port1Id: 1194, + port2Id: 1211, + isNonStopTransit: false + }, + { + id: 271, + port1Id: 1216, + port2Id: 1227, + isNonStopTransit: false + }, + { + id: 277, + port1Id: 1232, + port2Id: 1243, + isNonStopTransit: false + }, + { + id: 279, + port1Id: 1249, + port2Id: 1248, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 175, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 152, + betriebspunktName: "Chur", + fullName: "Chur", + positionX: 4640, + positionY: 1888, + ports: [ + { + id: 1152, + trainrunSectionId: 568, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1148, + trainrunSectionId: 566, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1156, + trainrunSectionId: 570, + positionIndex: 2, + positionAlignment: 0 + } + ], + transitions: [], + connections: [], + resourceId: 176, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 153, + betriebspunktName: "Zug", + fullName: "Zug", + positionX: 2656, + positionY: 1312, + ports: [ + { + id: 1067, + trainrunSectionId: 526, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1093, + trainrunSectionId: 539, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1101, + trainrunSectionId: 543, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1097, + trainrunSectionId: 541, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1066, + trainrunSectionId: 525, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1092, + trainrunSectionId: 538, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1348, + trainrunSectionId: 666, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1346, + trainrunSectionId: 665, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 220, + port1Id: 1067, + port2Id: 1066, + isNonStopTransit: false + }, + { + id: 231, + port1Id: 1093, + port2Id: 1092, + isNonStopTransit: false + }, + { + id: 322, + port1Id: 1097, + port2Id: 1346, + isNonStopTransit: false + }, + { + id: 324, + port1Id: 1101, + port2Id: 1348, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 177, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 154, + betriebspunktName: "Arth-G.", + fullName: "Arth-Goldau", + positionX: 2656, + positionY: 1792, + ports: [ + { + id: 1065, + trainrunSectionId: 525, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1091, + trainrunSectionId: 538, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1064, + trainrunSectionId: 524, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1038, + trainrunSectionId: 511, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1078, + trainrunSectionId: 531, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1090, + trainrunSectionId: 537, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1039, + trainrunSectionId: 512, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1079, + trainrunSectionId: 532, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 207, + port1Id: 1038, + port2Id: 1039, + isNonStopTransit: false + }, + { + id: 219, + port1Id: 1065, + port2Id: 1064, + isNonStopTransit: false + }, + { + id: 225, + port1Id: 1078, + port2Id: 1079, + isNonStopTransit: false + }, + { + id: 230, + port1Id: 1091, + port2Id: 1090, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 178, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 155, + betriebspunktName: "Altdorf", + fullName: "Altdorf", + positionX: 2656, + positionY: 2176, + ports: [ + { + id: 1063, + trainrunSectionId: 524, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1037, + trainrunSectionId: 511, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1077, + trainrunSectionId: 531, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1089, + trainrunSectionId: 537, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1062, + trainrunSectionId: 523, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1055, + trainrunSectionId: 520, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1076, + trainrunSectionId: 530, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1088, + trainrunSectionId: 536, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 214, + port1Id: 1037, + port2Id: 1055, + isNonStopTransit: true + }, + { + id: 218, + port1Id: 1063, + port2Id: 1062, + isNonStopTransit: false + }, + { + id: 224, + port1Id: 1077, + port2Id: 1076, + isNonStopTransit: false + }, + { + id: 229, + port1Id: 1089, + port2Id: 1088, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 179, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 156, + betriebspunktName: "Lugano", + fullName: "Lugano", + positionX: 2592, + positionY: 3712, + ports: [ + { + id: 1057, + trainrunSectionId: 521, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1033, + trainrunSectionId: 509, + positionIndex: 1, + positionAlignment: 0 + } + ], + transitions: [], + connections: [], + resourceId: 180, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 157, + betriebspunktName: "Locarno", + fullName: "Locarno", + positionX: 2208, + positionY: 3232, + ports: [ + { + id: 1069, + trainrunSectionId: 527, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1081, + trainrunSectionId: 533, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [], + connections: [], + resourceId: 181, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 158, + betriebspunktName: "Biasca", + fullName: "Biasca", + positionX: 2592, + positionY: 2688, + ports: [ + { + id: 1073, + trainrunSectionId: 529, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1085, + trainrunSectionId: 535, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1061, + trainrunSectionId: 523, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1056, + trainrunSectionId: 520, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1060, + trainrunSectionId: 522, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1036, + trainrunSectionId: 510, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1072, + trainrunSectionId: 528, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1084, + trainrunSectionId: 534, + positionIndex: 3, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 215, + port1Id: 1056, + port2Id: 1036, + isNonStopTransit: true + }, + { + id: 217, + port1Id: 1061, + port2Id: 1060, + isNonStopTransit: true + }, + { + id: 222, + port1Id: 1073, + port2Id: 1072, + isNonStopTransit: false + }, + { + id: 227, + port1Id: 1085, + port2Id: 1084, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 182, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 159, + betriebspunktName: "Göschn.", + fullName: "Göschenen", + positionX: 2272, + positionY: 2240, + ports: [ + { + id: 1074, + trainrunSectionId: 529, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1086, + trainrunSectionId: 535, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1075, + trainrunSectionId: 530, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1087, + trainrunSectionId: 536, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 223, + port1Id: 1074, + port2Id: 1075, + isNonStopTransit: false + }, + { + id: 228, + port1Id: 1086, + port2Id: 1087, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 183, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 160, + betriebspunktName: "Genf", + fullName: "Genf", + positionX: -3936, + positionY: 608, + ports: [ + { + id: 1209, + trainrunSectionId: 597, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1185, + trainrunSectionId: 585, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1189, + trainrunSectionId: 587, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1424, + trainrunSectionId: 704, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1426, + trainrunSectionId: 705, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1422, + trainrunSectionId: 703, + positionIndex: 2, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 369, + port1Id: 1189, + port2Id: 1422, + isNonStopTransit: false + }, + { + id: 371, + port1Id: 1209, + port2Id: 1424, + isNonStopTransit: false + }, + { + id: 373, + port1Id: 1185, + port2Id: 1426, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 184, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 161, + betriebspunktName: "Genf ✈", + fullName: "Aiport", + positionX: -4352, + positionY: 608, + ports: [ + { + id: 1210, + trainrunSectionId: 597, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1186, + trainrunSectionId: 585, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1190, + trainrunSectionId: 587, + positionIndex: 2, + positionAlignment: 3 + } + ], + transitions: [], + connections: [], + resourceId: 185, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 162, + betriebspunktName: "Romansh.", + fullName: "Romanshorn", + positionX: 4640, + positionY: -192, + ports: [ + { + id: 1228, + trainrunSectionId: 606, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1244, + trainrunSectionId: 614, + positionIndex: 1, + positionAlignment: 2 + } + ], + transitions: [], + connections: [], + resourceId: 186, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 163, + betriebspunktName: "Bülach", + fullName: "Bülach", + positionX: 2784, + positionY: -544, + ports: [ + { + id: 1252, + trainrunSectionId: 618, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1253, + trainrunSectionId: 619, + positionIndex: 0, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 280, + port1Id: 1252, + port2Id: 1253, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 187, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 164, + betriebspunktName: "Reihnf.", + fullName: "Reihnfelden", + positionX: 1056, + positionY: -960, + ports: [ + { + id: 1268, + trainrunSectionId: 626, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1269, + trainrunSectionId: 627, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 291, + port1Id: 1268, + port2Id: 1269, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 188, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 165, + betriebspunktName: "Frick", + fullName: "Frick", + positionX: 1792, + positionY: -672, + ports: [ + { + id: 1271, + trainrunSectionId: 628, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1270, + trainrunSectionId: 627, + positionIndex: 0, + positionAlignment: 2 + } + ], + transitions: [ + { + id: 292, + port1Id: 1271, + port2Id: 1270, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 189, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 166, + betriebspunktName: "Brugg", + fullName: "Brugg", + positionX: 1792, + positionY: 32, + ports: [ + { + id: 1272, + trainrunSectionId: 628, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1257, + trainrunSectionId: 621, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1405, + trainrunSectionId: 695, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1288, + trainrunSectionId: 636, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1259, + trainrunSectionId: 622, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1261, + trainrunSectionId: 623, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1263, + trainrunSectionId: 624, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1265, + trainrunSectionId: 625, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1296, + trainrunSectionId: 640, + positionIndex: 7, + positionAlignment: 2 + }, + { + id: 1198, + trainrunSectionId: 591, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1404, + trainrunSectionId: 694, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1289, + trainrunSectionId: 637, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1176, + trainrunSectionId: 580, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1220, + trainrunSectionId: 602, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1236, + trainrunSectionId: 610, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1160, + trainrunSectionId: 572, + positionIndex: 6, + positionAlignment: 3 + }, + { + id: 1273, + trainrunSectionId: 629, + positionIndex: 7, + positionAlignment: 3 + }, + { + id: 1297, + trainrunSectionId: 641, + positionIndex: 8, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 281, + port1Id: 1257, + port2Id: 1198, + isNonStopTransit: true + }, + { + id: 283, + port1Id: 1259, + port2Id: 1176, + isNonStopTransit: true + }, + { + id: 285, + port1Id: 1261, + port2Id: 1220, + isNonStopTransit: true + }, + { + id: 287, + port1Id: 1263, + port2Id: 1236, + isNonStopTransit: false + }, + { + id: 289, + port1Id: 1265, + port2Id: 1160, + isNonStopTransit: true + }, + { + id: 293, + port1Id: 1272, + port2Id: 1273, + isNonStopTransit: false + }, + { + id: 300, + port1Id: 1288, + port2Id: 1289, + isNonStopTransit: true + }, + { + id: 303, + port1Id: 1296, + port2Id: 1297, + isNonStopTransit: true + }, + { + id: 359, + port1Id: 1405, + port2Id: 1404, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 190, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 167, + betriebspunktName: "Thun", + fullName: "Thun", + positionX: -2144, + positionY: 640, + ports: [ + { + id: 1327, + trainrunSectionId: 656, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1312, + trainrunSectionId: 648, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1314, + trainrunSectionId: 649, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1340, + trainrunSectionId: 662, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1326, + trainrunSectionId: 655, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1315, + trainrunSectionId: 650, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1319, + trainrunSectionId: 652, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1341, + trainrunSectionId: 663, + positionIndex: 3, + positionAlignment: 1 + } + ], + transitions: [ + { + id: 309, + port1Id: 1312, + port2Id: 1315, + isNonStopTransit: false + }, + { + id: 311, + port1Id: 1314, + port2Id: 1319, + isNonStopTransit: false + }, + { + id: 314, + port1Id: 1327, + port2Id: 1326, + isNonStopTransit: false + }, + { + id: 319, + port1Id: 1340, + port2Id: 1341, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 191, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 168, + betriebspunktName: "Spiez", + fullName: "Spiez", + positionX: -2144, + positionY: 928, + ports: [ + { + id: 1325, + trainrunSectionId: 655, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1316, + trainrunSectionId: 650, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1320, + trainrunSectionId: 652, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1342, + trainrunSectionId: 663, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1324, + trainrunSectionId: 654, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1321, + trainrunSectionId: 653, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1317, + trainrunSectionId: 651, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1343, + trainrunSectionId: 664, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 310, + port1Id: 1316, + port2Id: 1317, + isNonStopTransit: false + }, + { + id: 312, + port1Id: 1320, + port2Id: 1321, + isNonStopTransit: false + }, + { + id: 313, + port1Id: 1325, + port2Id: 1324, + isNonStopTransit: false + }, + { + id: 320, + port1Id: 1342, + port2Id: 1343, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 192, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 169, + betriebspunktName: "Rothkr.", + fullName: "Rothkreuz", + positionX: 1856, + positionY: 1728, + ports: [ + { + id: 1351, + trainrunSectionId: 668, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1349, + trainrunSectionId: 667, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1100, + trainrunSectionId: 542, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1096, + trainrunSectionId: 540, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1347, + trainrunSectionId: 666, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1345, + trainrunSectionId: 665, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1040, + trainrunSectionId: 512, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1080, + trainrunSectionId: 532, + positionIndex: 3, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 321, + port1Id: 1096, + port2Id: 1345, + isNonStopTransit: false + }, + { + id: 323, + port1Id: 1100, + port2Id: 1347, + isNonStopTransit: true + }, + { + id: 325, + port1Id: 1349, + port2Id: 1080, + isNonStopTransit: true + }, + { + id: 326, + port1Id: 1351, + port2Id: 1040, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 193, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 170, + betriebspunktName: "Thalwil", + fullName: "Thalwil", + positionX: 2656, + positionY: 736, + ports: [ + { + id: 1359, + trainrunSectionId: 672, + positionIndex: 0, + positionAlignment: 0 + }, + { + id: 1150, + trainrunSectionId: 567, + positionIndex: 1, + positionAlignment: 0 + }, + { + id: 1154, + trainrunSectionId: 569, + positionIndex: 2, + positionAlignment: 0 + }, + { + id: 1357, + trainrunSectionId: 671, + positionIndex: 3, + positionAlignment: 0 + }, + { + id: 1355, + trainrunSectionId: 670, + positionIndex: 4, + positionAlignment: 0 + }, + { + id: 1353, + trainrunSectionId: 669, + positionIndex: 5, + positionAlignment: 0 + }, + { + id: 1068, + trainrunSectionId: 526, + positionIndex: 0, + positionAlignment: 1 + }, + { + id: 1094, + trainrunSectionId: 539, + positionIndex: 1, + positionAlignment: 1 + }, + { + id: 1102, + trainrunSectionId: 543, + positionIndex: 2, + positionAlignment: 1 + }, + { + id: 1098, + trainrunSectionId: 541, + positionIndex: 3, + positionAlignment: 1 + }, + { + id: 1361, + trainrunSectionId: 673, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1363, + trainrunSectionId: 674, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 328, + port1Id: 1353, + port2Id: 1098, + isNonStopTransit: false + }, + { + id: 330, + port1Id: 1355, + port2Id: 1102, + isNonStopTransit: true + }, + { + id: 331, + port1Id: 1357, + port2Id: 1094, + isNonStopTransit: true + }, + { + id: 332, + port1Id: 1359, + port2Id: 1068, + isNonStopTransit: true + }, + { + id: 333, + port1Id: 1150, + port2Id: 1361, + isNonStopTransit: true + }, + { + id: 335, + port1Id: 1154, + port2Id: 1363, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 194, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 171, + betriebspunktName: "Fribourg", + fullName: "Fribourg", + positionX: -2560, + positionY: 288, + ports: [ + { + id: 1381, + trainrunSectionId: 683, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1379, + trainrunSectionId: 682, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1206, + trainrunSectionId: 595, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1110, + trainrunSectionId: 547, + positionIndex: 1, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 344, + port1Id: 1379, + port2Id: 1110, + isNonStopTransit: false + }, + { + id: 346, + port1Id: 1381, + port2Id: 1206, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 195, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 172, + betriebspunktName: "RTR", + fullName: "Rothrist", + positionX: -608, + positionY: 128, + ports: [ + { + id: 1395, + trainrunSectionId: 690, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1438, + trainrunSectionId: 711, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1391, + trainrunSectionId: 688, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1389, + trainrunSectionId: 687, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1387, + trainrunSectionId: 686, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1383, + trainrunSectionId: 684, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1385, + trainrunSectionId: 685, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1204, + trainrunSectionId: 594, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1393, + trainrunSectionId: 689, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1310, + trainrunSectionId: 647, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1226, + trainrunSectionId: 605, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1242, + trainrunSectionId: 613, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1166, + trainrunSectionId: 575, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1108, + trainrunSectionId: 546, + positionIndex: 6, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 348, + port1Id: 1108, + port2Id: 1383, + isNonStopTransit: true + }, + { + id: 349, + port1Id: 1385, + port2Id: 1166, + isNonStopTransit: true + }, + { + id: 350, + port1Id: 1387, + port2Id: 1242, + isNonStopTransit: true + }, + { + id: 351, + port1Id: 1389, + port2Id: 1226, + isNonStopTransit: true + }, + { + id: 352, + port1Id: 1391, + port2Id: 1310, + isNonStopTransit: true + }, + { + id: 354, + port1Id: 1395, + port2Id: 1204, + isNonStopTransit: true + }, + { + id: 384, + port1Id: 1438, + port2Id: 1393, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 196, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 173, + betriebspunktName: "Burgdorf", + fullName: "Burgdorf", + positionX: -1344, + positionY: 352, + ports: [ + { + id: 1397, + trainrunSectionId: 691, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1400, + trainrunSectionId: 692, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 356, + port1Id: 1397, + port2Id: 1400, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 197, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 174, + betriebspunktName: "Langent.", + fullName: "Langenthal", + positionX: -992, + positionY: 352, + ports: [ + { + id: 1399, + trainrunSectionId: 692, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1386, + trainrunSectionId: 685, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 355, + port1Id: 1399, + port2Id: 1386, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 198, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 175, + betriebspunktName: "Solothurn", + fullName: "Solothurn", + positionX: -1696, + positionY: -32, + ports: [ + { + id: 1417, + trainrunSectionId: 701, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1182, + trainrunSectionId: 583, + positionIndex: 0, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 365, + port1Id: 1417, + port2Id: 1182, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 199, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 176, + betriebspunktName: "Rohrsch.", + fullName: "Rohrschach", + positionX: 5376, + positionY: 96, + ports: [ + { + id: 1420, + trainrunSectionId: 702, + positionIndex: 0, + positionAlignment: 2 + } + ], + transitions: [], + connections: [], + resourceId: 200, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 177, + betriebspunktName: "Morges", + fullName: "Morges", + positionX: -3520, + positionY: 544, + ports: [ + { + id: 1423, + trainrunSectionId: 704, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1425, + trainrunSectionId: 705, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1421, + trainrunSectionId: 703, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1184, + trainrunSectionId: 584, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1208, + trainrunSectionId: 596, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1188, + trainrunSectionId: 586, + positionIndex: 2, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 368, + port1Id: 1421, + port2Id: 1188, + isNonStopTransit: false + }, + { + id: 370, + port1Id: 1423, + port2Id: 1208, + isNonStopTransit: true + }, + { + id: 372, + port1Id: 1425, + port2Id: 1184, + isNonStopTransit: false + } + ], + connections: [], + resourceId: 201, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + }, + { + id: 178, + betriebspunktName: "BNWD", + fullName: "Bern Wankdorf", + positionX: -1696, + positionY: 128, + ports: [ + { + id: 1439, + trainrunSectionId: 712, + positionIndex: 0, + positionAlignment: 2 + }, + { + id: 1330, + trainrunSectionId: 657, + positionIndex: 1, + positionAlignment: 2 + }, + { + id: 1435, + trainrunSectionId: 710, + positionIndex: 2, + positionAlignment: 2 + }, + { + id: 1433, + trainrunSectionId: 709, + positionIndex: 3, + positionAlignment: 2 + }, + { + id: 1431, + trainrunSectionId: 708, + positionIndex: 4, + positionAlignment: 2 + }, + { + id: 1429, + trainrunSectionId: 707, + positionIndex: 5, + positionAlignment: 2 + }, + { + id: 1427, + trainrunSectionId: 706, + positionIndex: 6, + positionAlignment: 2 + }, + { + id: 1396, + trainrunSectionId: 690, + positionIndex: 0, + positionAlignment: 3 + }, + { + id: 1437, + trainrunSectionId: 711, + positionIndex: 1, + positionAlignment: 3 + }, + { + id: 1392, + trainrunSectionId: 688, + positionIndex: 2, + positionAlignment: 3 + }, + { + id: 1390, + trainrunSectionId: 687, + positionIndex: 3, + positionAlignment: 3 + }, + { + id: 1388, + trainrunSectionId: 686, + positionIndex: 4, + positionAlignment: 3 + }, + { + id: 1384, + trainrunSectionId: 684, + positionIndex: 5, + positionAlignment: 3 + }, + { + id: 1398, + trainrunSectionId: 691, + positionIndex: 6, + positionAlignment: 3 + } + ], + transitions: [ + { + id: 374, + port1Id: 1427, + port2Id: 1398, + isNonStopTransit: true + }, + { + id: 375, + port1Id: 1429, + port2Id: 1384, + isNonStopTransit: true + }, + { + id: 377, + port1Id: 1431, + port2Id: 1388, + isNonStopTransit: true + }, + { + id: 379, + port1Id: 1433, + port2Id: 1390, + isNonStopTransit: true + }, + { + id: 381, + port1Id: 1435, + port2Id: 1392, + isNonStopTransit: true + }, + { + id: 383, + port1Id: 1330, + port2Id: 1437, + isNonStopTransit: true + }, + { + id: 385, + port1Id: 1439, + port2Id: 1396, + isNonStopTransit: true + } + ], + connections: [], + resourceId: 202, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitA: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitB: { + no_halt: false, + haltezeit: 2 + }, + HaltezeitC: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitD: { + no_halt: false, + haltezeit: 1 + }, + HaltezeitIPV: { + no_halt: false, + haltezeit: 3 + }, + HaltezeitUncategorized: { + no_halt: true, + haltezeit: 0 + } + }, + symmetryAxis: null, + warnings: null, + labelIds: [] + } + ], + trainrunSections: [ + { + id: 509, + sourceNodeId: 156, + sourcePortId: 1033, + targetNodeId: 136, + targetPortId: 1034, + travelTime: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 182 + }, + sourceArrival: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 178 + }, + targetDeparture: { + lock: false, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 164 + }, + targetArrival: { + lock: false, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 196 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2640, + y: 3710 + }, + { + x: 2640, + y: 3646 + }, + { + x: 2640, + y: 3390 + }, + { + x: 2640, + y: 3326 + } + ], + textPositions: { + 0: { + x: 2652, + y: 3692 + }, + 1: { + x: 2628, + y: 3664 + }, + 2: { + x: 2628, + y: 3344 + }, + 3: { + x: 2652, + y: 3372 + }, + 4: { + x: 2628, + y: 3518 + }, + 5: { + x: 2628, + y: 3518 + }, + 6: { + x: 2652, + y: 3518 + } + } + }, + warnings: null + }, + { + id: 510, + sourceNodeId: 136, + sourcePortId: 1035, + targetNodeId: 158, + targetPortId: 1036, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 198 + }, + sourceArrival: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 162 + }, + targetDeparture: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 156 + }, + targetArrival: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 204 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2640, + y: 3230 + }, + { + x: 2640, + y: 3166 + }, + { + x: 2640, + y: 2818 + }, + { + x: 2640, + y: 2754 + } + ], + textPositions: { + 0: { + x: 2652, + y: 3212 + }, + 1: { + x: 2628, + y: 3184 + }, + 2: { + x: 2628, + y: 2772 + }, + 3: { + x: 2652, + y: 2800 + }, + 4: { + x: 2628, + y: 2992 + }, + 5: { + x: 2628, + y: 2992 + }, + 6: { + x: 2652, + y: 2992 + } + } + }, + warnings: null + }, + { + id: 511, + sourceNodeId: 155, + sourcePortId: 1037, + targetNodeId: 154, + targetPortId: 1038, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 232 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 128 + }, + targetDeparture: { + lock: true, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 109 + }, + targetArrival: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 251 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 2174 + }, + { + x: 2704, + y: 2110 + }, + { + x: 2704, + y: 1950 + }, + { + x: 2704, + y: 1886 + } + ], + textPositions: { + 0: { + x: 2716, + y: 2156 + }, + 1: { + x: 2692, + y: 2128 + }, + 2: { + x: 2692, + y: 1904 + }, + 3: { + x: 2716, + y: 1932 + }, + 4: { + x: 2692, + y: 2030 + }, + 5: { + x: 2692, + y: 2030 + }, + 6: { + x: 2716, + y: 2030 + } + } + }, + warnings: null + }, + { + id: 512, + sourceNodeId: 154, + sourcePortId: 1039, + targetNodeId: 169, + targetPortId: 1040, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 255 + }, + sourceArrival: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 105 + }, + targetDeparture: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 87 + }, + targetArrival: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 273 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 1808 + }, + { + x: 2590, + y: 1808 + }, + { + x: 2018, + y: 1808 + }, + { + x: 1954, + y: 1808 + } + ], + textPositions: { + 0: { + x: 2636, + y: 1796 + }, + 1: { + x: 2608, + y: 1820 + }, + 2: { + x: 1972, + y: 1820 + }, + 3: { + x: 2000, + y: 1796 + }, + 4: { + x: 2304, + y: 1796 + }, + 5: { + x: 2304, + y: 1796 + }, + 6: { + x: 2304, + y: 1820 + } + } + }, + warnings: null + }, + { + id: 513, + sourceNodeId: 142, + sourcePortId: 1041, + targetNodeId: 141, + targetPortId: 1042, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 295 + }, + sourceArrival: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: 1726 + }, + { + x: 80, + y: 1662 + }, + { + x: 80, + y: 1314 + }, + { + x: 80, + y: 1250 + } + ], + textPositions: { + 0: { + x: 92, + y: 1708 + }, + 1: { + x: 68, + y: 1680 + }, + 2: { + x: 68, + y: 1268 + }, + 3: { + x: 92, + y: 1296 + }, + 4: { + x: 68, + y: 1488 + }, + 5: { + x: 68, + y: 1488 + }, + 6: { + x: 92, + y: 1488 + } + } + }, + warnings: null + }, + { + id: 514, + sourceNodeId: 141, + sourcePortId: 1043, + targetNodeId: 143, + targetPortId: 1044, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + sourceArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 37 + }, + targetArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 323 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: 1182 + }, + { + x: 80, + y: 1118 + }, + { + x: 80, + y: 866 + }, + { + x: 80, + y: 802 + } + ], + textPositions: { + 0: { + x: 92, + y: 1164 + }, + 1: { + x: 68, + y: 1136 + }, + 2: { + x: 68, + y: 820 + }, + 3: { + x: 92, + y: 848 + }, + 4: { + x: 68, + y: 992 + }, + 5: { + x: 68, + y: 992 + }, + 6: { + x: 92, + y: 992 + } + } + }, + warnings: null + }, + { + id: 515, + sourceNodeId: 143, + sourcePortId: 1045, + targetNodeId: 133, + targetPortId: 1046, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 323 + }, + sourceArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 37 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 30 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: 734 + }, + { + x: 80, + y: 670 + }, + { + x: 80, + y: 414 + }, + { + x: 80, + y: 350 + } + ], + textPositions: { + 0: { + x: 92, + y: 716 + }, + 1: { + x: 68, + y: 688 + }, + 2: { + x: 68, + y: 368 + }, + 3: { + x: 92, + y: 396 + }, + 4: { + x: 68, + y: 542 + }, + 5: { + x: 68, + y: 542 + }, + 6: { + x: 92, + y: 542 + } + } + }, + warnings: null + }, + { + id: 516, + sourceNodeId: 133, + sourcePortId: 1047, + targetNodeId: 144, + targetPortId: 1048, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 332 + }, + sourceArrival: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 28 + }, + targetDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + targetArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 342 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: 94 + }, + { + x: 80, + y: 30 + }, + { + x: 80, + y: -290 + }, + { + x: 80, + y: -354 + } + ], + textPositions: { + 0: { + x: 92, + y: 76 + }, + 1: { + x: 68, + y: 48 + }, + 2: { + x: 68, + y: -336 + }, + 3: { + x: 92, + y: -308 + }, + 4: { + x: 68, + y: -130 + }, + 5: { + x: 68, + y: -130 + }, + 6: { + x: 92, + y: -130 + } + } + }, + warnings: null + }, + { + id: 517, + sourceNodeId: 144, + sourcePortId: 1049, + targetNodeId: 145, + targetPortId: 1050, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 342 + }, + sourceArrival: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: -450 + }, + { + x: 80, + y: -514 + }, + { + x: 80, + y: -798 + }, + { + x: 80, + y: -862 + } + ], + textPositions: { + 0: { + x: 92, + y: -468 + }, + 1: { + x: 68, + y: -496 + }, + 2: { + x: 68, + y: -844 + }, + 3: { + x: 92, + y: -816 + }, + 4: { + x: 68, + y: -656 + }, + 5: { + x: 68, + y: -656 + }, + 6: { + x: 92, + y: -656 + } + } + }, + warnings: null + }, + { + id: 518, + sourceNodeId: 145, + sourcePortId: 1051, + targetNodeId: 146, + targetPortId: 1052, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 8 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 352 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: -930 + }, + { + x: 80, + y: -994 + }, + { + x: 80, + y: -1278 + }, + { + x: 80, + y: -1342 + } + ], + textPositions: { + 0: { + x: 92, + y: -948 + }, + 1: { + x: 68, + y: -976 + }, + 2: { + x: 68, + y: -1324 + }, + 3: { + x: 92, + y: -1296 + }, + 4: { + x: 68, + y: -1136 + }, + 5: { + x: 68, + y: -1136 + }, + 6: { + x: 92, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 519, + sourceNodeId: 146, + sourcePortId: 1053, + targetNodeId: 134, + targetPortId: 1054, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 352 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 8 + }, + targetDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 3 + }, + targetArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 357 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 80, + y: -1410 + }, + { + x: 80, + y: -1474 + }, + { + x: 80, + y: -1758 + }, + { + x: 80, + y: -1822 + } + ], + textPositions: { + 0: { + x: 92, + y: -1428 + }, + 1: { + x: 68, + y: -1456 + }, + 2: { + x: 68, + y: -1804 + }, + 3: { + x: 92, + y: -1776 + }, + 4: { + x: 68, + y: -1616 + }, + 5: { + x: 68, + y: -1616 + }, + 6: { + x: 92, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 520, + sourceNodeId: 155, + sourcePortId: 1055, + targetNodeId: 158, + targetPortId: 1056, + travelTime: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 128 + }, + sourceArrival: { + lock: true, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 232 + }, + targetDeparture: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 204 + }, + targetArrival: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 156 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 2270 + }, + { + x: 2704, + y: 2334 + }, + { + x: 2704, + y: 2622 + }, + { + x: 2704, + y: 2686 + } + ], + textPositions: { + 0: { + x: 2692, + y: 2288 + }, + 1: { + x: 2716, + y: 2316 + }, + 2: { + x: 2716, + y: 2668 + }, + 3: { + x: 2692, + y: 2640 + }, + 4: { + x: 2692, + y: 2478 + }, + 5: { + x: 2692, + y: 2478 + }, + 6: { + x: 2716, + y: 2478 + } + } + }, + warnings: null + }, + { + id: 521, + sourceNodeId: 156, + sourcePortId: 1057, + targetNodeId: 136, + targetPortId: 1058, + travelTime: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 2 + }, + sourceArrival: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 118 + }, + targetDeparture: { + lock: false, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 104 + }, + targetArrival: { + lock: false, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 16 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2608, + y: 3710 + }, + { + x: 2608, + y: 3646 + }, + { + x: 2608, + y: 3390 + }, + { + x: 2608, + y: 3326 + } + ], + textPositions: { + 0: { + x: 2620, + y: 3692 + }, + 1: { + x: 2596, + y: 3664 + }, + 2: { + x: 2596, + y: 3344 + }, + 3: { + x: 2620, + y: 3372 + }, + 4: { + x: 2596, + y: 3518 + }, + 5: { + x: 2596, + y: 3518 + }, + 6: { + x: 2620, + y: 3518 + } + } + }, + warnings: null + }, + { + id: 522, + sourceNodeId: 136, + sourcePortId: 1059, + targetNodeId: 158, + targetPortId: 1060, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + sourceArrival: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 102 + }, + targetDeparture: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 96 + }, + targetArrival: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 24 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2608, + y: 3230 + }, + { + x: 2608, + y: 3166 + }, + { + x: 2608, + y: 2818 + }, + { + x: 2608, + y: 2754 + } + ], + textPositions: { + 0: { + x: 2620, + y: 3212 + }, + 1: { + x: 2596, + y: 3184 + }, + 2: { + x: 2596, + y: 2772 + }, + 3: { + x: 2620, + y: 2800 + }, + 4: { + x: 2596, + y: 2992 + }, + 5: { + x: 2596, + y: 2992 + }, + 6: { + x: 2620, + y: 2992 + } + } + }, + warnings: null + }, + { + id: 523, + sourceNodeId: 158, + sourcePortId: 1061, + targetNodeId: 155, + targetPortId: 1062, + travelTime: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 24 + }, + sourceArrival: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 96 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 2686 + }, + { + x: 2672, + y: 2622 + }, + { + x: 2672, + y: 2334 + }, + { + x: 2672, + y: 2270 + } + ], + textPositions: { + 0: { + x: 2684, + y: 2668 + }, + 1: { + x: 2660, + y: 2640 + }, + 2: { + x: 2660, + y: 2288 + }, + 3: { + x: 2684, + y: 2316 + }, + 4: { + x: 2660, + y: 2478 + }, + 5: { + x: 2660, + y: 2478 + }, + 6: { + x: 2684, + y: 2478 + } + } + }, + warnings: null + }, + { + id: 524, + sourceNodeId: 155, + sourcePortId: 1063, + targetNodeId: 154, + targetPortId: 1064, + travelTime: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetDeparture: { + lock: true, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 49 + }, + targetArrival: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 71 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 2174 + }, + { + x: 2672, + y: 2110 + }, + { + x: 2672, + y: 1950 + }, + { + x: 2672, + y: 1886 + } + ], + textPositions: { + 0: { + x: 2684, + y: 2156 + }, + 1: { + x: 2660, + y: 2128 + }, + 2: { + x: 2660, + y: 1904 + }, + 3: { + x: 2684, + y: 1932 + }, + 4: { + x: 2660, + y: 2030 + }, + 5: { + x: 2660, + y: 2030 + }, + 6: { + x: 2684, + y: 2030 + } + } + }, + warnings: null + }, + { + id: 525, + sourceNodeId: 154, + sourcePortId: 1065, + targetNodeId: 153, + targetPortId: 1066, + travelTime: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 75 + }, + sourceArrival: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 45 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 30 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 1790 + }, + { + x: 2672, + y: 1726 + }, + { + x: 2672, + y: 1470 + }, + { + x: 2672, + y: 1406 + } + ], + textPositions: { + 0: { + x: 2684, + y: 1772 + }, + 1: { + x: 2660, + y: 1744 + }, + 2: { + x: 2660, + y: 1424 + }, + 3: { + x: 2684, + y: 1452 + }, + 4: { + x: 2660, + y: 1598 + }, + 5: { + x: 2660, + y: 1598 + }, + 6: { + x: 2684, + y: 1598 + } + } + }, + warnings: null + }, + { + id: 526, + sourceNodeId: 153, + sourcePortId: 1067, + targetNodeId: 170, + targetPortId: 1068, + travelTime: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 91 + }, + sourceArrival: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 29 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 107 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 1310 + }, + { + x: 2672, + y: 1246 + }, + { + x: 2672, + y: 894 + }, + { + x: 2672, + y: 830 + } + ], + textPositions: { + 0: { + x: 2684, + y: 1292 + }, + 1: { + x: 2660, + y: 1264 + }, + 2: { + x: 2660, + y: 848 + }, + 3: { + x: 2684, + y: 876 + }, + 4: { + x: 2660, + y: 1070 + }, + 5: { + x: 2660, + y: 1070 + }, + 6: { + x: 2684, + y: 1070 + } + } + }, + warnings: null + }, + { + id: 527, + sourceNodeId: 157, + sourcePortId: 1069, + targetNodeId: 136, + targetPortId: 1070, + travelTime: { + lock: true, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 273 + }, + sourceArrival: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 327 + }, + targetDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 304 + }, + targetArrival: { + lock: true, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 296 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2306, + y: 3248 + }, + { + x: 2370, + y: 3248 + }, + { + x: 2526, + y: 3248 + }, + { + x: 2590, + y: 3248 + } + ], + textPositions: { + 0: { + x: 2324, + y: 3260 + }, + 1: { + x: 2352, + y: 3236 + }, + 2: { + x: 2572, + y: 3236 + }, + 3: { + x: 2544, + y: 3260 + }, + 4: { + x: 2448, + y: 3236 + }, + 5: { + x: 2448, + y: 3236 + }, + 6: { + x: 2448, + y: 3260 + } + } + }, + warnings: null + }, + { + id: 528, + sourceNodeId: 136, + sourcePortId: 1071, + targetNodeId: 158, + targetPortId: 1072, + travelTime: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 300 + }, + sourceArrival: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 300 + }, + targetDeparture: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 285 + }, + targetArrival: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 315 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 3230 + }, + { + x: 2672, + y: 3166 + }, + { + x: 2672, + y: 2818 + }, + { + x: 2672, + y: 2754 + } + ], + textPositions: { + 0: { + x: 2684, + y: 3212 + }, + 1: { + x: 2660, + y: 3184 + }, + 2: { + x: 2660, + y: 2772 + }, + 3: { + x: 2684, + y: 2800 + }, + 4: { + x: 2660, + y: 2992 + }, + 5: { + x: 2660, + y: 2992 + }, + 6: { + x: 2684, + y: 2992 + } + } + }, + warnings: null + }, + { + id: 529, + sourceNodeId: 158, + sourcePortId: 1073, + targetNodeId: 159, + targetPortId: 1074, + travelTime: { + lock: true, + time: 53, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 316 + }, + sourceArrival: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 284 + }, + targetDeparture: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 231 + }, + targetArrival: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 369 + }, + numberOfStops: 5, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2608, + y: 2686 + }, + { + x: 2608, + y: 2622 + }, + { + x: 2288, + y: 2398 + }, + { + x: 2288, + y: 2334 + } + ], + textPositions: { + 0: { + x: 2620, + y: 2668 + }, + 1: { + x: 2596, + y: 2640 + }, + 2: { + x: 2276, + y: 2352 + }, + 3: { + x: 2300, + y: 2380 + }, + 4: { + x: 2460, + y: 2510 + }, + 5: { + x: 2460, + y: 2510 + }, + 6: { + x: 2436, + y: 2510 + } + } + }, + warnings: null + }, + { + id: 530, + sourceNodeId: 159, + sourcePortId: 1075, + targetNodeId: 155, + targetPortId: 1076, + travelTime: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 370 + }, + sourceArrival: { + lock: true, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 230 + }, + targetDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 198 + }, + targetArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 402 + }, + numberOfStops: 1, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2370, + y: 2256 + }, + { + x: 2434, + y: 2256 + }, + { + x: 2590, + y: 2192 + }, + { + x: 2654, + y: 2192 + } + ], + textPositions: { + 0: { + x: 2388, + y: 2268 + }, + 1: { + x: 2416, + y: 2244 + }, + 2: { + x: 2636, + y: 2180 + }, + 3: { + x: 2608, + y: 2204 + }, + 4: { + x: 2512, + y: 2212 + }, + 5: { + x: 2512, + y: 2212 + }, + 6: { + x: 2512, + y: 2236 + } + } + }, + warnings: null + }, + { + id: 531, + sourceNodeId: 155, + sourcePortId: 1077, + targetNodeId: 154, + targetPortId: 1078, + travelTime: { + lock: true, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 403 + }, + sourceArrival: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 197 + }, + targetDeparture: { + lock: true, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 174 + }, + targetArrival: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 426 + }, + numberOfStops: 3, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2736, + y: 2174 + }, + { + x: 2736, + y: 2110 + }, + { + x: 2736, + y: 1950 + }, + { + x: 2736, + y: 1886 + } + ], + textPositions: { + 0: { + x: 2748, + y: 2156 + }, + 1: { + x: 2724, + y: 2128 + }, + 2: { + x: 2724, + y: 1904 + }, + 3: { + x: 2748, + y: 1932 + }, + 4: { + x: 2724, + y: 2030 + }, + 5: { + x: 2724, + y: 2030 + }, + 6: { + x: 2748, + y: 2030 + } + } + }, + warnings: null + }, + { + id: 532, + sourceNodeId: 154, + sourcePortId: 1079, + targetNodeId: 169, + targetPortId: 1080, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 435 + }, + sourceArrival: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 165 + }, + targetDeparture: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 147 + }, + targetArrival: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 453 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 1840 + }, + { + x: 2590, + y: 1840 + }, + { + x: 2018, + y: 1840 + }, + { + x: 1954, + y: 1840 + } + ], + textPositions: { + 0: { + x: 2636, + y: 1828 + }, + 1: { + x: 2608, + y: 1852 + }, + 2: { + x: 1972, + y: 1852 + }, + 3: { + x: 2000, + y: 1828 + }, + 4: { + x: 2304, + y: 1828 + }, + 5: { + x: 2304, + y: 1828 + }, + 6: { + x: 2304, + y: 1852 + } + } + }, + warnings: null + }, + { + id: 533, + sourceNodeId: 157, + sourcePortId: 1081, + targetNodeId: 136, + targetPortId: 1082, + travelTime: { + lock: true, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 153 + }, + sourceArrival: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 207 + }, + targetDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 184 + }, + targetArrival: { + lock: true, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 176 + }, + numberOfStops: 3, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2306, + y: 3280 + }, + { + x: 2370, + y: 3280 + }, + { + x: 2526, + y: 3280 + }, + { + x: 2590, + y: 3280 + } + ], + textPositions: { + 0: { + x: 2324, + y: 3292 + }, + 1: { + x: 2352, + y: 3268 + }, + 2: { + x: 2572, + y: 3268 + }, + 3: { + x: 2544, + y: 3292 + }, + 4: { + x: 2448, + y: 3268 + }, + 5: { + x: 2448, + y: 3268 + }, + 6: { + x: 2448, + y: 3292 + } + } + }, + warnings: null + }, + { + id: 534, + sourceNodeId: 136, + sourcePortId: 1083, + targetNodeId: 158, + targetPortId: 1084, + travelTime: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 180 + }, + sourceArrival: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 180 + }, + targetDeparture: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 165 + }, + targetArrival: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 195 + }, + numberOfStops: 1, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 3230 + }, + { + x: 2704, + y: 3166 + }, + { + x: 2704, + y: 2818 + }, + { + x: 2704, + y: 2754 + } + ], + textPositions: { + 0: { + x: 2716, + y: 3212 + }, + 1: { + x: 2692, + y: 3184 + }, + 2: { + x: 2692, + y: 2772 + }, + 3: { + x: 2716, + y: 2800 + }, + 4: { + x: 2692, + y: 2992 + }, + 5: { + x: 2692, + y: 2992 + }, + 6: { + x: 2716, + y: 2992 + } + } + }, + warnings: null + }, + { + id: 535, + sourceNodeId: 158, + sourcePortId: 1085, + targetNodeId: 159, + targetPortId: 1086, + travelTime: { + lock: true, + time: 53, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 196 + }, + sourceArrival: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 164 + }, + targetDeparture: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 111 + }, + targetArrival: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 249 + }, + numberOfStops: 5, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2640, + y: 2686 + }, + { + x: 2640, + y: 2622 + }, + { + x: 2320, + y: 2398 + }, + { + x: 2320, + y: 2334 + } + ], + textPositions: { + 0: { + x: 2652, + y: 2668 + }, + 1: { + x: 2628, + y: 2640 + }, + 2: { + x: 2308, + y: 2352 + }, + 3: { + x: 2332, + y: 2380 + }, + 4: { + x: 2492, + y: 2510 + }, + 5: { + x: 2492, + y: 2510 + }, + 6: { + x: 2468, + y: 2510 + } + } + }, + warnings: null + }, + { + id: 536, + sourceNodeId: 159, + sourcePortId: 1087, + targetNodeId: 155, + targetPortId: 1088, + travelTime: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 250 + }, + sourceArrival: { + lock: true, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 110 + }, + targetDeparture: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 78 + }, + targetArrival: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 282 + }, + numberOfStops: 1, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2370, + y: 2288 + }, + { + x: 2434, + y: 2288 + }, + { + x: 2590, + y: 2224 + }, + { + x: 2654, + y: 2224 + } + ], + textPositions: { + 0: { + x: 2388, + y: 2300 + }, + 1: { + x: 2416, + y: 2276 + }, + 2: { + x: 2636, + y: 2212 + }, + 3: { + x: 2608, + y: 2236 + }, + 4: { + x: 2512, + y: 2244 + }, + 5: { + x: 2512, + y: 2244 + }, + 6: { + x: 2512, + y: 2268 + } + } + }, + warnings: null + }, + { + id: 537, + sourceNodeId: 155, + sourcePortId: 1089, + targetNodeId: 154, + targetPortId: 1090, + travelTime: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 283 + }, + sourceArrival: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 77 + }, + targetDeparture: { + lock: true, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 54 + }, + targetArrival: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 306 + }, + numberOfStops: 3, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2768, + y: 2174 + }, + { + x: 2768, + y: 2110 + }, + { + x: 2768, + y: 1950 + }, + { + x: 2768, + y: 1886 + } + ], + textPositions: { + 0: { + x: 2780, + y: 2156 + }, + 1: { + x: 2756, + y: 2128 + }, + 2: { + x: 2756, + y: 1904 + }, + 3: { + x: 2780, + y: 1932 + }, + 4: { + x: 2756, + y: 2030 + }, + 5: { + x: 2756, + y: 2030 + }, + 6: { + x: 2780, + y: 2030 + } + } + }, + warnings: null + }, + { + id: 538, + sourceNodeId: 154, + sourcePortId: 1091, + targetNodeId: 153, + targetPortId: 1092, + travelTime: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 315 + }, + sourceArrival: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 45 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 30 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + numberOfStops: 0, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 1790 + }, + { + x: 2704, + y: 1726 + }, + { + x: 2704, + y: 1470 + }, + { + x: 2704, + y: 1406 + } + ], + textPositions: { + 0: { + x: 2716, + y: 1772 + }, + 1: { + x: 2692, + y: 1744 + }, + 2: { + x: 2692, + y: 1424 + }, + 3: { + x: 2716, + y: 1452 + }, + 4: { + x: 2692, + y: 1598 + }, + 5: { + x: 2692, + y: 1598 + }, + 6: { + x: 2716, + y: 1598 + } + } + }, + warnings: null + }, + { + id: 539, + sourceNodeId: 153, + sourcePortId: 1093, + targetNodeId: 170, + targetPortId: 1094, + travelTime: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 331 + }, + sourceArrival: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 29 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + numberOfStops: 0, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 1310 + }, + { + x: 2704, + y: 1246 + }, + { + x: 2704, + y: 894 + }, + { + x: 2704, + y: 830 + } + ], + textPositions: { + 0: { + x: 2716, + y: 1292 + }, + 1: { + x: 2692, + y: 1264 + }, + 2: { + x: 2692, + y: 848 + }, + 3: { + x: 2716, + y: 876 + }, + 4: { + x: 2692, + y: 1070 + }, + 5: { + x: 2692, + y: 1070 + }, + 6: { + x: 2716, + y: 1070 + } + } + }, + warnings: null + }, + { + id: 540, + sourceNodeId: 142, + sourcePortId: 1095, + targetNodeId: 169, + targetPortId: 1096, + travelTime: { + lock: false, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + sourceArrival: { + lock: true, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 265 + }, + targetDeparture: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 253 + }, + targetArrival: { + lock: true, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 47 + }, + numberOfStops: 0, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 226, + y: 1840 + }, + { + x: 290, + y: 1840 + }, + { + x: 1790, + y: 1840 + }, + { + x: 1854, + y: 1840 + } + ], + textPositions: { + 0: { + x: 244, + y: 1852 + }, + 1: { + x: 272, + y: 1828 + }, + 2: { + x: 1836, + y: 1828 + }, + 3: { + x: 1808, + y: 1852 + }, + 4: { + x: 1040, + y: 1828 + }, + 5: { + x: 1040, + y: 1828 + }, + 6: { + x: 1040, + y: 1852 + } + } + }, + warnings: null + }, + { + id: 541, + sourceNodeId: 153, + sourcePortId: 1097, + targetNodeId: 170, + targetPortId: 1098, + travelTime: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 58 + }, + sourceArrival: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 242 + }, + targetDeparture: { + lock: true, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 227 + }, + targetArrival: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 73 + }, + numberOfStops: 1, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2768, + y: 1310 + }, + { + x: 2768, + y: 1246 + }, + { + x: 2768, + y: 894 + }, + { + x: 2768, + y: 830 + } + ], + textPositions: { + 0: { + x: 2780, + y: 1292 + }, + 1: { + x: 2756, + y: 1264 + }, + 2: { + x: 2756, + y: 848 + }, + 3: { + x: 2780, + y: 876 + }, + 4: { + x: 2756, + y: 1070 + }, + 5: { + x: 2756, + y: 1070 + }, + 6: { + x: 2780, + y: 1070 + } + } + }, + warnings: null + }, + { + id: 542, + sourceNodeId: 142, + sourcePortId: 1099, + targetNodeId: 169, + targetPortId: 1100, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 9 + }, + sourceArrival: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 51 + }, + targetDeparture: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 42 + }, + targetArrival: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + numberOfStops: 0, + trainrunId: 80, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 226, + y: 1808 + }, + { + x: 290, + y: 1808 + }, + { + x: 1790, + y: 1808 + }, + { + x: 1854, + y: 1808 + } + ], + textPositions: { + 0: { + x: 244, + y: 1820 + }, + 1: { + x: 272, + y: 1796 + }, + 2: { + x: 1836, + y: 1796 + }, + 3: { + x: 1808, + y: 1820 + }, + 4: { + x: 1040, + y: 1796 + }, + 5: { + x: 1040, + y: 1796 + }, + 6: { + x: 1040, + y: 1820 + } + } + }, + warnings: null + }, + { + id: 543, + sourceNodeId: 153, + sourcePortId: 1101, + targetNodeId: 170, + targetPortId: 1102, + travelTime: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 29 + }, + sourceArrival: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 31 + }, + targetDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 17 + }, + targetArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 43 + }, + numberOfStops: 0, + trainrunId: 80, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2736, + y: 1310 + }, + { + x: 2736, + y: 1246 + }, + { + x: 2736, + y: 894 + }, + { + x: 2736, + y: 830 + } + ], + textPositions: { + 0: { + x: 2748, + y: 1292 + }, + 1: { + x: 2724, + y: 1264 + }, + 2: { + x: 2724, + y: 848 + }, + 3: { + x: 2748, + y: 876 + }, + 4: { + x: 2724, + y: 1070 + }, + 5: { + x: 2724, + y: 1070 + }, + 6: { + x: 2748, + y: 1070 + } + } + }, + warnings: null + }, + { + id: 544, + sourceNodeId: 142, + sourcePortId: 1103, + targetNodeId: 141, + targetPortId: 1104, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 299 + }, + sourceArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 241 + }, + targetDeparture: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 222 + }, + targetArrival: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 318 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: 1726 + }, + { + x: 112, + y: 1662 + }, + { + x: 112, + y: 1314 + }, + { + x: 112, + y: 1250 + } + ], + textPositions: { + 0: { + x: 124, + y: 1708 + }, + 1: { + x: 100, + y: 1680 + }, + 2: { + x: 100, + y: 1268 + }, + 3: { + x: 124, + y: 1296 + }, + 4: { + x: 100, + y: 1488 + }, + 5: { + x: 100, + y: 1488 + }, + 6: { + x: 124, + y: 1488 + } + } + }, + warnings: null + }, + { + id: 545, + sourceNodeId: 141, + sourcePortId: 1105, + targetNodeId: 143, + targetPortId: 1106, + travelTime: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 319 + }, + sourceArrival: { + lock: true, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 221 + }, + targetDeparture: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 209 + }, + targetArrival: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 331 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: 1182 + }, + { + x: 112, + y: 1118 + }, + { + x: 112, + y: 866 + }, + { + x: 112, + y: 802 + } + ], + textPositions: { + 0: { + x: 124, + y: 1164 + }, + 1: { + x: 100, + y: 1136 + }, + 2: { + x: 100, + y: 820 + }, + 3: { + x: 124, + y: 848 + }, + 4: { + x: 100, + y: 992 + }, + 5: { + x: 100, + y: 992 + }, + 6: { + x: 124, + y: 992 + } + } + }, + warnings: null + }, + { + id: 546, + sourceNodeId: 143, + sourcePortId: 1107, + targetNodeId: 172, + targetPortId: 1108, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 332 + }, + sourceArrival: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 208 + }, + targetDeparture: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 201 + }, + targetArrival: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 339 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 752 + }, + { + x: -2, + y: 752 + }, + { + x: -446, + y: 336 + }, + { + x: -510, + y: 336 + } + ], + textPositions: { + 0: { + x: 44, + y: 740 + }, + 1: { + x: 16, + y: 764 + }, + 2: { + x: -492, + y: 348 + }, + 3: { + x: -464, + y: 324 + }, + 4: { + x: -224, + y: 532 + }, + 5: { + x: -224, + y: 532 + }, + 6: { + x: -224, + y: 556 + } + } + }, + warnings: null + }, + { + id: 547, + sourceNodeId: 129, + sourcePortId: 1109, + targetNodeId: 171, + targetPortId: 1110, + travelTime: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 364 + }, + sourceArrival: { + lock: true, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 176 + }, + targetDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 154 + }, + targetArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 386 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2146, + y: 176 + }, + { + x: -2210, + y: 176 + }, + { + x: -2398, + y: 336 + }, + { + x: -2462, + y: 336 + } + ], + textPositions: { + 0: { + x: -2164, + y: 164 + }, + 1: { + x: -2192, + y: 188 + }, + 2: { + x: -2444, + y: 348 + }, + 3: { + x: -2416, + y: 324 + }, + 4: { + x: -2304, + y: 244 + }, + 5: { + x: -2304, + y: 244 + }, + 6: { + x: -2304, + y: 268 + } + } + }, + warnings: null + }, + { + id: 548, + sourceNodeId: 142, + sourcePortId: 1111, + targetNodeId: 141, + targetPortId: 1112, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + sourceArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetDeparture: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 72 + }, + targetArrival: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 108 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: 1726 + }, + { + x: 208, + y: 1662 + }, + { + x: 208, + y: 1314 + }, + { + x: 208, + y: 1250 + } + ], + textPositions: { + 0: { + x: 220, + y: 1708 + }, + 1: { + x: 196, + y: 1680 + }, + 2: { + x: 196, + y: 1268 + }, + 3: { + x: 220, + y: 1296 + }, + 4: { + x: 196, + y: 1488 + }, + 5: { + x: 196, + y: 1488 + }, + 6: { + x: 220, + y: 1488 + } + } + }, + warnings: null + }, + { + id: 549, + sourceNodeId: 141, + sourcePortId: 1113, + targetNodeId: 143, + targetPortId: 1114, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 109 + }, + sourceArrival: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 71 + }, + targetDeparture: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 58 + }, + targetArrival: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 122 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: 1182 + }, + { + x: 208, + y: 1118 + }, + { + x: 208, + y: 866 + }, + { + x: 208, + y: 802 + } + ], + textPositions: { + 0: { + x: 220, + y: 1164 + }, + 1: { + x: 196, + y: 1136 + }, + 2: { + x: 196, + y: 820 + }, + 3: { + x: 220, + y: 848 + }, + 4: { + x: 196, + y: 992 + }, + 5: { + x: 196, + y: 992 + }, + 6: { + x: 220, + y: 992 + } + } + }, + warnings: null + }, + { + id: 550, + sourceNodeId: 143, + sourcePortId: 1115, + targetNodeId: 133, + targetPortId: 1116, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 124 + }, + sourceArrival: { + lock: true, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 56 + }, + targetDeparture: { + lock: true, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 49 + }, + targetArrival: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 131 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: 734 + }, + { + x: 176, + y: 670 + }, + { + x: 176, + y: 414 + }, + { + x: 176, + y: 350 + } + ], + textPositions: { + 0: { + x: 188, + y: 716 + }, + 1: { + x: 164, + y: 688 + }, + 2: { + x: 164, + y: 368 + }, + 3: { + x: 188, + y: 396 + }, + 4: { + x: 164, + y: 542 + }, + 5: { + x: 164, + y: 542 + }, + 6: { + x: 188, + y: 542 + } + } + }, + warnings: null + }, + { + id: 551, + sourceNodeId: 133, + sourcePortId: 1117, + targetNodeId: 144, + targetPortId: 1118, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 132 + }, + sourceArrival: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 48 + }, + targetDeparture: { + lock: true, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 38 + }, + targetArrival: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 142 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 240, + y: 94 + }, + { + x: 240, + y: 30 + }, + { + x: 240, + y: -290 + }, + { + x: 240, + y: -354 + } + ], + textPositions: { + 0: { + x: 252, + y: 76 + }, + 1: { + x: 228, + y: 48 + }, + 2: { + x: 228, + y: -336 + }, + 3: { + x: 252, + y: -308 + }, + 4: { + x: 228, + y: -130 + }, + 5: { + x: 228, + y: -130 + }, + 6: { + x: 252, + y: -130 + } + } + }, + warnings: null + }, + { + id: 552, + sourceNodeId: 144, + sourcePortId: 1119, + targetNodeId: 145, + targetPortId: 1120, + travelTime: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 143 + }, + sourceArrival: { + lock: true, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 37 + }, + targetDeparture: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 33 + }, + targetArrival: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 147 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 304, + y: -450 + }, + { + x: 304, + y: -514 + }, + { + x: 304, + y: -798 + }, + { + x: 304, + y: -862 + } + ], + textPositions: { + 0: { + x: 316, + y: -468 + }, + 1: { + x: 292, + y: -496 + }, + 2: { + x: 292, + y: -844 + }, + 3: { + x: 316, + y: -816 + }, + 4: { + x: 292, + y: -656 + }, + 5: { + x: 292, + y: -656 + }, + 6: { + x: 316, + y: -656 + } + } + }, + warnings: null + }, + { + id: 553, + sourceNodeId: 145, + sourcePortId: 1121, + targetNodeId: 146, + targetPortId: 1122, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 148 + }, + sourceArrival: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 32 + }, + targetDeparture: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 27 + }, + targetArrival: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 153 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 304, + y: -930 + }, + { + x: 304, + y: -994 + }, + { + x: 304, + y: -1278 + }, + { + x: 304, + y: -1342 + } + ], + textPositions: { + 0: { + x: 316, + y: -948 + }, + 1: { + x: 292, + y: -976 + }, + 2: { + x: 292, + y: -1324 + }, + 3: { + x: 316, + y: -1296 + }, + 4: { + x: 292, + y: -1136 + }, + 5: { + x: 292, + y: -1136 + }, + 6: { + x: 316, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 554, + sourceNodeId: 146, + sourcePortId: 1123, + targetNodeId: 134, + targetPortId: 1124, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 154 + }, + sourceArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 26 + }, + targetDeparture: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 16 + }, + targetArrival: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 164 + }, + numberOfStops: 0, + trainrunId: 82, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 304, + y: -1410 + }, + { + x: 304, + y: -1474 + }, + { + x: 304, + y: -1758 + }, + { + x: 304, + y: -1822 + } + ], + textPositions: { + 0: { + x: 316, + y: -1428 + }, + 1: { + x: 292, + y: -1456 + }, + 2: { + x: 292, + y: -1804 + }, + 3: { + x: 316, + y: -1776 + }, + 4: { + x: 292, + y: -1616 + }, + 5: { + x: 292, + y: -1616 + }, + 6: { + x: 316, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 555, + sourceNodeId: 142, + sourcePortId: 1125, + targetNodeId: 141, + targetPortId: 1126, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 115 + }, + sourceArrival: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: 1726 + }, + { + x: 176, + y: 1662 + }, + { + x: 176, + y: 1314 + }, + { + x: 176, + y: 1250 + } + ], + textPositions: { + 0: { + x: 188, + y: 1708 + }, + 1: { + x: 164, + y: 1680 + }, + 2: { + x: 164, + y: 1268 + }, + 3: { + x: 188, + y: 1296 + }, + 4: { + x: 164, + y: 1488 + }, + 5: { + x: 164, + y: 1488 + }, + 6: { + x: 188, + y: 1488 + } + } + }, + warnings: null + }, + { + id: 556, + sourceNodeId: 141, + sourcePortId: 1127, + targetNodeId: 143, + targetPortId: 1128, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + sourceArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 38 + }, + targetArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 142 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: 1182 + }, + { + x: 176, + y: 1118 + }, + { + x: 176, + y: 866 + }, + { + x: 176, + y: 802 + } + ], + textPositions: { + 0: { + x: 188, + y: 1164 + }, + 1: { + x: 164, + y: 1136 + }, + 2: { + x: 164, + y: 820 + }, + 3: { + x: 188, + y: 848 + }, + 4: { + x: 164, + y: 992 + }, + 5: { + x: 164, + y: 992 + }, + 6: { + x: 188, + y: 992 + } + } + }, + warnings: null + }, + { + id: 557, + sourceNodeId: 143, + sourcePortId: 1129, + targetNodeId: 133, + targetPortId: 1130, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 142 + }, + sourceArrival: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 38 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 30 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 150 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: 734 + }, + { + x: 144, + y: 670 + }, + { + x: 144, + y: 414 + }, + { + x: 144, + y: 350 + } + ], + textPositions: { + 0: { + x: 156, + y: 716 + }, + 1: { + x: 132, + y: 688 + }, + 2: { + x: 132, + y: 368 + }, + 3: { + x: 156, + y: 396 + }, + 4: { + x: 132, + y: 542 + }, + 5: { + x: 132, + y: 542 + }, + 6: { + x: 156, + y: 542 + } + } + }, + warnings: null + }, + { + id: 558, + sourceNodeId: 133, + sourcePortId: 1131, + targetNodeId: 144, + targetPortId: 1132, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 152 + }, + sourceArrival: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 28 + }, + targetDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + targetArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 162 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: 94 + }, + { + x: 208, + y: 30 + }, + { + x: 208, + y: -290 + }, + { + x: 208, + y: -354 + } + ], + textPositions: { + 0: { + x: 220, + y: 76 + }, + 1: { + x: 196, + y: 48 + }, + 2: { + x: 196, + y: -336 + }, + 3: { + x: 220, + y: -308 + }, + 4: { + x: 196, + y: -130 + }, + 5: { + x: 196, + y: -130 + }, + 6: { + x: 220, + y: -130 + } + } + }, + warnings: null + }, + { + id: 559, + sourceNodeId: 144, + sourcePortId: 1133, + targetNodeId: 145, + targetPortId: 1134, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 162 + }, + sourceArrival: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 167 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 272, + y: -450 + }, + { + x: 272, + y: -514 + }, + { + x: 272, + y: -798 + }, + { + x: 272, + y: -862 + } + ], + textPositions: { + 0: { + x: 284, + y: -468 + }, + 1: { + x: 260, + y: -496 + }, + 2: { + x: 260, + y: -844 + }, + 3: { + x: 284, + y: -816 + }, + 4: { + x: 260, + y: -656 + }, + 5: { + x: 260, + y: -656 + }, + 6: { + x: 284, + y: -656 + } + } + }, + warnings: null + }, + { + id: 560, + sourceNodeId: 145, + sourcePortId: 1135, + targetNodeId: 146, + targetPortId: 1136, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 167 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 8 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 172 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 272, + y: -930 + }, + { + x: 272, + y: -994 + }, + { + x: 272, + y: -1278 + }, + { + x: 272, + y: -1342 + } + ], + textPositions: { + 0: { + x: 284, + y: -948 + }, + 1: { + x: 260, + y: -976 + }, + 2: { + x: 260, + y: -1324 + }, + 3: { + x: 284, + y: -1296 + }, + 4: { + x: 260, + y: -1136 + }, + 5: { + x: 260, + y: -1136 + }, + 6: { + x: 284, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 561, + sourceNodeId: 146, + sourcePortId: 1137, + targetNodeId: 134, + targetPortId: 1138, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 172 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 8 + }, + targetDeparture: { + lock: false, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 3 + }, + targetArrival: { + lock: false, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 177 + }, + numberOfStops: 0, + trainrunId: 83, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 272, + y: -1410 + }, + { + x: 272, + y: -1474 + }, + { + x: 272, + y: -1758 + }, + { + x: 272, + y: -1822 + } + ], + textPositions: { + 0: { + x: 284, + y: -1428 + }, + 1: { + x: 260, + y: -1456 + }, + 2: { + x: 260, + y: -1804 + }, + 3: { + x: 284, + y: -1776 + }, + 4: { + x: 260, + y: -1616 + }, + 5: { + x: 260, + y: -1616 + }, + 6: { + x: 284, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 562, + sourceNodeId: 135, + sourcePortId: 1139, + targetNodeId: 150, + targetPortId: 1140, + travelTime: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 9 + }, + sourceArrival: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 291 + }, + targetDeparture: { + lock: true, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 279 + }, + targetArrival: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 21 + }, + numberOfStops: 1, + trainrunId: 84, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 176 + }, + { + x: 2914, + y: 176 + }, + { + x: 3230, + y: 176 + }, + { + x: 3294, + y: 176 + } + ], + textPositions: { + 0: { + x: 2868, + y: 188 + }, + 1: { + x: 2896, + y: 164 + }, + 2: { + x: 3276, + y: 164 + }, + 3: { + x: 3248, + y: 188 + }, + 4: { + x: 3072, + y: 164 + }, + 5: { + x: 3072, + y: 164 + }, + 6: { + x: 3072, + y: 188 + } + } + }, + warnings: null + }, + { + id: 563, + sourceNodeId: 150, + sourcePortId: 1141, + targetNodeId: 151, + targetPortId: 1142, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 23 + }, + sourceArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 277 + }, + targetDeparture: { + lock: true, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 264 + }, + targetArrival: { + lock: true, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 36 + }, + numberOfStops: 0, + trainrunId: 84, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3394, + y: 176 + }, + { + x: 3458, + y: 176 + }, + { + x: 3806, + y: 176 + }, + { + x: 3870, + y: 176 + } + ], + textPositions: { + 0: { + x: 3412, + y: 188 + }, + 1: { + x: 3440, + y: 164 + }, + 2: { + x: 3852, + y: 164 + }, + 3: { + x: 3824, + y: 188 + }, + 4: { + x: 3632, + y: 164 + }, + 5: { + x: 3632, + y: 164 + }, + 6: { + x: 3632, + y: 188 + } + } + }, + warnings: null + }, + { + id: 564, + sourceNodeId: 151, + sourcePortId: 1143, + targetNodeId: 137, + targetPortId: 1144, + travelTime: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 38 + }, + sourceArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 262 + }, + targetDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 218 + }, + targetArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 82 + }, + numberOfStops: 4, + trainrunId: 84, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3970, + y: 176 + }, + { + x: 4034, + y: 176 + }, + { + x: 4574, + y: 176 + }, + { + x: 4638, + y: 176 + } + ], + textPositions: { + 0: { + x: 3988, + y: 188 + }, + 1: { + x: 4016, + y: 164 + }, + 2: { + x: 4620, + y: 164 + }, + 3: { + x: 4592, + y: 188 + }, + 4: { + x: 4304, + y: 164 + }, + 5: { + x: 4304, + y: 164 + }, + 6: { + x: 4304, + y: 188 + } + } + }, + warnings: null + }, + { + id: 565, + sourceNodeId: 137, + sourcePortId: 1145, + targetNodeId: 140, + targetPortId: 1146, + travelTime: { + lock: true, + time: 61, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 84 + }, + sourceArrival: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 216 + }, + targetDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 155 + }, + targetArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 145 + }, + numberOfStops: 5, + trainrunId: 84, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4656, + y: 222 + }, + { + x: 4656, + y: 286 + }, + { + x: 4656, + y: 1118 + }, + { + x: 4656, + y: 1182 + } + ], + textPositions: { + 0: { + x: 4644, + y: 240 + }, + 1: { + x: 4668, + y: 268 + }, + 2: { + x: 4668, + y: 1164 + }, + 3: { + x: 4644, + y: 1136 + }, + 4: { + x: 4644, + y: 702 + }, + 5: { + x: 4644, + y: 702 + }, + 6: { + x: 4668, + y: 702 + } + } + }, + warnings: null + }, + { + id: 566, + sourceNodeId: 140, + sourcePortId: 1147, + targetNodeId: 152, + targetPortId: 1148, + travelTime: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 146 + }, + sourceArrival: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 154 + }, + targetDeparture: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 132 + }, + targetArrival: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 168 + }, + numberOfStops: 2, + trainrunId: 84, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4688, + y: 1278 + }, + { + x: 4688, + y: 1342 + }, + { + x: 4688, + y: 1822 + }, + { + x: 4688, + y: 1886 + } + ], + textPositions: { + 0: { + x: 4676, + y: 1296 + }, + 1: { + x: 4700, + y: 1324 + }, + 2: { + x: 4700, + y: 1868 + }, + 3: { + x: 4676, + y: 1840 + }, + 4: { + x: 4676, + y: 1582 + }, + 5: { + x: 4676, + y: 1582 + }, + 6: { + x: 4700, + y: 1582 + } + } + }, + warnings: null + }, + { + id: 567, + sourceNodeId: 135, + sourcePortId: 1149, + targetNodeId: 170, + targetPortId: 1150, + travelTime: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 67 + }, + sourceArrival: { + lock: true, + time: 53, + warning: null, + timeFormatter: null, + consecutiveTime: 293 + }, + targetDeparture: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 285 + }, + targetArrival: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 75 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2704, + y: 350 + }, + { + x: 2704, + y: 414 + }, + { + x: 2704, + y: 670 + }, + { + x: 2704, + y: 734 + } + ], + textPositions: { + 0: { + x: 2692, + y: 368 + }, + 1: { + x: 2716, + y: 396 + }, + 2: { + x: 2716, + y: 716 + }, + 3: { + x: 2692, + y: 688 + }, + 4: { + x: 2692, + y: 542 + }, + 5: { + x: 2692, + y: 542 + }, + 6: { + x: 2716, + y: 542 + } + } + }, + warnings: null + }, + { + id: 568, + sourceNodeId: 140, + sourcePortId: 1151, + targetNodeId: 152, + targetPortId: 1152, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 123 + }, + sourceArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 237 + }, + targetDeparture: { + lock: true, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 218 + }, + targetArrival: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 142 + }, + numberOfStops: 1, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4656, + y: 1278 + }, + { + x: 4656, + y: 1342 + }, + { + x: 4656, + y: 1822 + }, + { + x: 4656, + y: 1886 + } + ], + textPositions: { + 0: { + x: 4644, + y: 1296 + }, + 1: { + x: 4668, + y: 1324 + }, + 2: { + x: 4668, + y: 1868 + }, + 3: { + x: 4644, + y: 1840 + }, + 4: { + x: 4644, + y: 1582 + }, + 5: { + x: 4644, + y: 1582 + }, + 6: { + x: 4668, + y: 1582 + } + } + }, + warnings: null + }, + { + id: 569, + sourceNodeId: 135, + sourcePortId: 1153, + targetNodeId: 170, + targetPortId: 1154, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 132 + }, + sourceArrival: { + lock: false, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 288 + }, + targetDeparture: { + lock: true, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 280 + }, + targetArrival: { + lock: true, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 140 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2736, + y: 350 + }, + { + x: 2736, + y: 414 + }, + { + x: 2736, + y: 670 + }, + { + x: 2736, + y: 734 + } + ], + textPositions: { + 0: { + x: 2724, + y: 368 + }, + 1: { + x: 2748, + y: 396 + }, + 2: { + x: 2748, + y: 716 + }, + 3: { + x: 2724, + y: 688 + }, + 4: { + x: 2724, + y: 542 + }, + 5: { + x: 2724, + y: 542 + }, + 6: { + x: 2748, + y: 542 + } + } + }, + warnings: null + }, + { + id: 570, + sourceNodeId: 140, + sourcePortId: 1155, + targetNodeId: 152, + targetPortId: 1156, + travelTime: { + lock: true, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 203 + }, + sourceArrival: { + lock: true, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 217 + }, + targetDeparture: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 197 + }, + targetArrival: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 223 + }, + numberOfStops: 1, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4720, + y: 1278 + }, + { + x: 4720, + y: 1342 + }, + { + x: 4720, + y: 1822 + }, + { + x: 4720, + y: 1886 + } + ], + textPositions: { + 0: { + x: 4708, + y: 1296 + }, + 1: { + x: 4732, + y: 1324 + }, + 2: { + x: 4732, + y: 1868 + }, + 3: { + x: 4708, + y: 1840 + }, + 4: { + x: 4708, + y: 1582 + }, + 5: { + x: 4708, + y: 1582 + }, + 6: { + x: 4732, + y: 1582 + } + } + }, + warnings: null + }, + { + id: 571, + sourceNodeId: 135, + sourcePortId: 1157, + targetNodeId: 149, + targetPortId: 1158, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 294 + }, + sourceArrival: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 126 + }, + targetDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 119 + }, + targetArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 301 + }, + numberOfStops: 1, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 240 + }, + { + x: 2590, + y: 240 + }, + { + x: 2402, + y: 240 + }, + { + x: 2338, + y: 240 + } + ], + textPositions: { + 0: { + x: 2636, + y: 228 + }, + 1: { + x: 2608, + y: 252 + }, + 2: { + x: 2356, + y: 252 + }, + 3: { + x: 2384, + y: 228 + }, + 4: { + x: 2496, + y: 228 + }, + 5: { + x: 2496, + y: 228 + }, + 6: { + x: 2496, + y: 252 + } + } + }, + warnings: null + }, + { + id: 572, + sourceNodeId: 149, + sourcePortId: 1159, + targetNodeId: 166, + targetPortId: 1160, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 301 + }, + sourceArrival: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 119 + }, + targetDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 240 + }, + { + x: 2174, + y: 240 + }, + { + x: 1954, + y: 240 + }, + { + x: 1890, + y: 240 + } + ], + textPositions: { + 0: { + x: 2220, + y: 228 + }, + 1: { + x: 2192, + y: 252 + }, + 2: { + x: 1908, + y: 252 + }, + 3: { + x: 1936, + y: 228 + }, + 4: { + x: 2064, + y: 228 + }, + 5: { + x: 2064, + y: 228 + }, + 6: { + x: 2064, + y: 252 + } + } + }, + warnings: null + }, + { + id: 573, + sourceNodeId: 148, + sourcePortId: 1161, + targetNodeId: 147, + targetPortId: 1162, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 315 + }, + sourceArrival: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 105 + }, + targetDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 98 + }, + targetArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 322 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 240 + }, + { + x: 1278, + y: 240 + }, + { + x: 1122, + y: 240 + }, + { + x: 1058, + y: 240 + } + ], + textPositions: { + 0: { + x: 1324, + y: 228 + }, + 1: { + x: 1296, + y: 252 + }, + 2: { + x: 1076, + y: 252 + }, + 3: { + x: 1104, + y: 228 + }, + 4: { + x: 1200, + y: 228 + }, + 5: { + x: 1200, + y: 228 + }, + 6: { + x: 1200, + y: 252 + } + } + }, + warnings: null + }, + { + id: 574, + sourceNodeId: 147, + sourcePortId: 1163, + targetNodeId: 133, + targetPortId: 1164, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 322 + }, + sourceArrival: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 98 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 240 + }, + { + x: 894, + y: 240 + }, + { + x: 322, + y: 240 + }, + { + x: 258, + y: 240 + } + ], + textPositions: { + 0: { + x: 940, + y: 228 + }, + 1: { + x: 912, + y: 252 + }, + 2: { + x: 276, + y: 252 + }, + 3: { + x: 304, + y: 228 + }, + 4: { + x: 608, + y: 228 + }, + 5: { + x: 608, + y: 228 + }, + 6: { + x: 608, + y: 252 + } + } + }, + warnings: null + }, + { + id: 575, + sourceNodeId: 133, + sourcePortId: 1165, + targetNodeId: 172, + targetPortId: 1166, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 336 + }, + sourceArrival: { + lock: true, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 84 + }, + targetDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 77 + }, + targetArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 343 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 304 + }, + { + x: -2, + y: 304 + }, + { + x: -446, + y: 304 + }, + { + x: -510, + y: 304 + } + ], + textPositions: { + 0: { + x: 44, + y: 292 + }, + 1: { + x: 16, + y: 316 + }, + 2: { + x: -492, + y: 316 + }, + 3: { + x: -464, + y: 292 + }, + 4: { + x: -224, + y: 292 + }, + 5: { + x: -224, + y: 292 + }, + 6: { + x: -224, + y: 316 + } + } + }, + warnings: null + }, + { + id: 576, + sourceNodeId: 137, + sourcePortId: 1167, + targetNodeId: 151, + targetPortId: 1168, + travelTime: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 298 + }, + sourceArrival: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 242 + }, + targetDeparture: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 209 + }, + targetArrival: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 331 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4638, + y: 144 + }, + { + x: 4574, + y: 144 + }, + { + x: 4034, + y: 144 + }, + { + x: 3970, + y: 144 + } + ], + textPositions: { + 0: { + x: 4620, + y: 132 + }, + 1: { + x: 4592, + y: 156 + }, + 2: { + x: 3988, + y: 156 + }, + 3: { + x: 4016, + y: 132 + }, + 4: { + x: 4304, + y: 132 + }, + 5: { + x: 4304, + y: 132 + }, + 6: { + x: 4304, + y: 156 + } + } + }, + warnings: null + }, + { + id: 577, + sourceNodeId: 151, + sourcePortId: 1169, + targetNodeId: 150, + targetPortId: 1170, + travelTime: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 333 + }, + sourceArrival: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 207 + }, + targetDeparture: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 193 + }, + targetArrival: { + lock: true, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3870, + y: 80 + }, + { + x: 3806, + y: 80 + }, + { + x: 3458, + y: 80 + }, + { + x: 3394, + y: 80 + } + ], + textPositions: { + 0: { + x: 3852, + y: 68 + }, + 1: { + x: 3824, + y: 92 + }, + 2: { + x: 3412, + y: 92 + }, + 3: { + x: 3440, + y: 68 + }, + 4: { + x: 3632, + y: 68 + }, + 5: { + x: 3632, + y: 68 + }, + 6: { + x: 3632, + y: 92 + } + } + }, + warnings: null + }, + { + id: 578, + sourceNodeId: 150, + sourcePortId: 1171, + targetNodeId: 135, + targetPortId: 1172, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 348 + }, + sourceArrival: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 192 + }, + targetDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 183 + }, + targetArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 357 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3294, + y: 80 + }, + { + x: 3230, + y: 80 + }, + { + x: 2914, + y: 80 + }, + { + x: 2850, + y: 80 + } + ], + textPositions: { + 0: { + x: 3276, + y: 68 + }, + 1: { + x: 3248, + y: 92 + }, + 2: { + x: 2868, + y: 92 + }, + 3: { + x: 2896, + y: 68 + }, + 4: { + x: 3072, + y: 68 + }, + 5: { + x: 3072, + y: 68 + }, + 6: { + x: 3072, + y: 92 + } + } + }, + warnings: null + }, + { + id: 579, + sourceNodeId: 135, + sourcePortId: 1173, + targetNodeId: 149, + targetPortId: 1174, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 364 + }, + sourceArrival: { + lock: true, + time: 56, + warning: { + title: "Quelle Ankunft Warnung", + description: "Quellankunftszeit kann nicht erreicht werden" + }, + timeFormatter: null, + consecutiveTime: 176 + }, + targetDeparture: { + lock: false, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 170 + }, + targetArrival: { + lock: false, + time: 10, + warning: { + title: "Ziel Ankunft Warnung", + description: "Zielankunftszeit kann nicht erreicht werden" + }, + timeFormatter: null, + consecutiveTime: 370 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 144 + }, + { + x: 2590, + y: 144 + }, + { + x: 2402, + y: 144 + }, + { + x: 2338, + y: 144 + } + ], + textPositions: { + 0: { + x: 2636, + y: 132 + }, + 1: { + x: 2608, + y: 156 + }, + 2: { + x: 2356, + y: 156 + }, + 3: { + x: 2384, + y: 132 + }, + 4: { + x: 2496, + y: 132 + }, + 5: { + x: 2496, + y: 132 + }, + 6: { + x: 2496, + y: 156 + } + } + }, + warnings: null + }, + { + id: 580, + sourceNodeId: 149, + sourcePortId: 1175, + targetNodeId: 166, + targetPortId: 1176, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 370 + }, + sourceArrival: { + lock: false, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 170 + }, + targetDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 377 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 144 + }, + { + x: 2174, + y: 144 + }, + { + x: 1954, + y: 144 + }, + { + x: 1890, + y: 144 + } + ], + textPositions: { + 0: { + x: 2220, + y: 132 + }, + 1: { + x: 2192, + y: 156 + }, + 2: { + x: 1908, + y: 156 + }, + 3: { + x: 1936, + y: 132 + }, + 4: { + x: 2064, + y: 132 + }, + 5: { + x: 2064, + y: 132 + }, + 6: { + x: 2064, + y: 156 + } + } + }, + warnings: null + }, + { + id: 581, + sourceNodeId: 148, + sourcePortId: 1177, + targetNodeId: 147, + targetPortId: 1178, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 384 + }, + sourceArrival: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 156 + }, + targetDeparture: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 151 + }, + targetArrival: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 389 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 144 + }, + { + x: 1278, + y: 144 + }, + { + x: 1122, + y: 144 + }, + { + x: 1058, + y: 144 + } + ], + textPositions: { + 0: { + x: 1324, + y: 132 + }, + 1: { + x: 1296, + y: 156 + }, + 2: { + x: 1076, + y: 156 + }, + 3: { + x: 1104, + y: 132 + }, + 4: { + x: 1200, + y: 132 + }, + 5: { + x: 1200, + y: 132 + }, + 6: { + x: 1200, + y: 156 + } + } + }, + warnings: null + }, + { + id: 582, + sourceNodeId: 147, + sourcePortId: 1179, + targetNodeId: 133, + targetPortId: 1180, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 391 + }, + sourceArrival: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 149 + }, + targetDeparture: { + lock: true, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 140 + }, + targetArrival: { + lock: true, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 400 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 144 + }, + { + x: 894, + y: 144 + }, + { + x: 322, + y: 144 + }, + { + x: 258, + y: 144 + } + ], + textPositions: { + 0: { + x: 940, + y: 132 + }, + 1: { + x: 912, + y: 156 + }, + 2: { + x: 276, + y: 156 + }, + 3: { + x: 304, + y: 132 + }, + 4: { + x: 608, + y: 132 + }, + 5: { + x: 608, + y: 132 + }, + 6: { + x: 608, + y: 156 + } + } + }, + warnings: null + }, + { + id: 583, + sourceNodeId: 133, + sourcePortId: 1181, + targetNodeId: 175, + targetPortId: 1182, + travelTime: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 402 + }, + sourceArrival: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 138 + }, + targetDeparture: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 121 + }, + targetArrival: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 419 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 112 + }, + { + x: -2, + y: 112 + }, + { + x: -1534, + y: -16 + }, + { + x: -1598, + y: -16 + } + ], + textPositions: { + 0: { + x: 44, + y: 100 + }, + 1: { + x: 16, + y: 124 + }, + 2: { + x: -1580, + y: -4 + }, + 3: { + x: -1552, + y: -28 + }, + 4: { + x: -768, + y: 36 + }, + 5: { + x: -768, + y: 36 + }, + 6: { + x: -768, + y: 60 + } + } + }, + warnings: null + }, + { + id: 584, + sourceNodeId: 130, + sourcePortId: 1183, + targetNodeId: 177, + targetPortId: 1184, + travelTime: { + lock: false, + time: 61, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 437 + }, + sourceArrival: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 103 + }, + targetDeparture: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 42 + }, + targetArrival: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 498 + }, + numberOfStops: 2, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2530, + y: -16 + }, + { + x: -2594, + y: -16 + }, + { + x: -3358, + y: 560 + }, + { + x: -3422, + y: 560 + } + ], + textPositions: { + 0: { + x: -2548, + y: -28 + }, + 1: { + x: -2576, + y: -4 + }, + 2: { + x: -3404, + y: 572 + }, + 3: { + x: -3376, + y: 548 + }, + 4: { + x: -2976, + y: 260 + }, + 5: { + x: -2976, + y: 260 + }, + 6: { + x: -2976, + y: 284 + } + } + }, + warnings: null + }, + { + id: 585, + sourceNodeId: 160, + sourcePortId: 1185, + targetNodeId: 161, + targetPortId: 1186, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 528 + }, + sourceArrival: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 12 + }, + targetDeparture: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 4 + }, + targetArrival: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 536 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3938, + y: 656 + }, + { + x: -4002, + y: 656 + }, + { + x: -4190, + y: 656 + }, + { + x: -4254, + y: 656 + } + ], + textPositions: { + 0: { + x: -3956, + y: 644 + }, + 1: { + x: -3984, + y: 668 + }, + 2: { + x: -4236, + y: 668 + }, + 3: { + x: -4208, + y: 644 + }, + 4: { + x: -4096, + y: 644 + }, + 5: { + x: -4096, + y: 644 + }, + 6: { + x: -4096, + y: 668 + } + } + }, + warnings: null + }, + { + id: 586, + sourceNodeId: 128, + sourcePortId: 1187, + targetNodeId: 177, + targetPortId: 1188, + travelTime: { + lock: false, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 439 + }, + sourceArrival: { + lock: true, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 101 + }, + targetDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 450 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3074, + y: 592 + }, + { + x: -3138, + y: 592 + }, + { + x: -3358, + y: 624 + }, + { + x: -3422, + y: 624 + } + ], + textPositions: { + 0: { + x: -3092, + y: 580 + }, + 1: { + x: -3120, + y: 604 + }, + 2: { + x: -3404, + y: 636 + }, + 3: { + x: -3376, + y: 612 + }, + 4: { + x: -3248, + y: 596 + }, + 5: { + x: -3248, + y: 596 + }, + 6: { + x: -3248, + y: 620 + } + } + }, + warnings: null + }, + { + id: 587, + sourceNodeId: 160, + sourcePortId: 1189, + targetNodeId: 161, + targetPortId: 1190, + travelTime: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 484 + }, + sourceArrival: { + lock: true, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 56 + }, + targetDeparture: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 48 + }, + targetArrival: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 492 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3938, + y: 688 + }, + { + x: -4002, + y: 688 + }, + { + x: -4190, + y: 688 + }, + { + x: -4254, + y: 688 + } + ], + textPositions: { + 0: { + x: -3956, + y: 676 + }, + 1: { + x: -3984, + y: 700 + }, + 2: { + x: -4236, + y: 700 + }, + 3: { + x: -4208, + y: 676 + }, + 4: { + x: -4096, + y: 676 + }, + 5: { + x: -4096, + y: 676 + }, + 6: { + x: -4096, + y: 700 + } + } + }, + warnings: null + }, + { + id: 588, + sourceNodeId: 135, + sourcePortId: 1191, + targetNodeId: 150, + targetPortId: 1192, + travelTime: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 219 + }, + sourceArrival: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 321 + }, + targetDeparture: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 309 + }, + targetArrival: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 231 + }, + numberOfStops: 1, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 48 + }, + { + x: 2914, + y: 48 + }, + { + x: 3230, + y: 48 + }, + { + x: 3294, + y: 48 + } + ], + textPositions: { + 0: { + x: 2868, + y: 60 + }, + 1: { + x: 2896, + y: 36 + }, + 2: { + x: 3276, + y: 36 + }, + 3: { + x: 3248, + y: 60 + }, + 4: { + x: 3072, + y: 36 + }, + 5: { + x: 3072, + y: 36 + }, + 6: { + x: 3072, + y: 60 + } + } + }, + warnings: null + }, + { + id: 589, + sourceNodeId: 150, + sourcePortId: 1193, + targetNodeId: 151, + targetPortId: 1194, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 53, + warning: null, + timeFormatter: null, + consecutiveTime: 233 + }, + sourceArrival: { + lock: false, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 307 + }, + targetDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 294 + }, + targetArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 246 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3394, + y: 48 + }, + { + x: 3458, + y: 48 + }, + { + x: 3806, + y: 48 + }, + { + x: 3870, + y: 48 + } + ], + textPositions: { + 0: { + x: 3412, + y: 60 + }, + 1: { + x: 3440, + y: 36 + }, + 2: { + x: 3852, + y: 36 + }, + 3: { + x: 3824, + y: 60 + }, + 4: { + x: 3632, + y: 36 + }, + 5: { + x: 3632, + y: 36 + }, + 6: { + x: 3632, + y: 60 + } + } + }, + warnings: null + }, + { + id: 590, + sourceNodeId: 135, + sourcePortId: 1195, + targetNodeId: 149, + targetPortId: 1196, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 346 + }, + sourceArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 194 + }, + targetDeparture: { + lock: false, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 189 + }, + targetArrival: { + lock: false, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 351 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 48 + }, + { + x: 2590, + y: 48 + }, + { + x: 2402, + y: 48 + }, + { + x: 2338, + y: 48 + } + ], + textPositions: { + 0: { + x: 2636, + y: 36 + }, + 1: { + x: 2608, + y: 60 + }, + 2: { + x: 2356, + y: 60 + }, + 3: { + x: 2384, + y: 36 + }, + 4: { + x: 2496, + y: 36 + }, + 5: { + x: 2496, + y: 36 + }, + 6: { + x: 2496, + y: 60 + } + } + }, + warnings: null + }, + { + id: 591, + sourceNodeId: 149, + sourcePortId: 1197, + targetNodeId: 166, + targetPortId: 1198, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 351 + }, + sourceArrival: { + lock: false, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 189 + }, + targetDeparture: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 184 + }, + targetArrival: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 356 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 48 + }, + { + x: 2174, + y: 48 + }, + { + x: 1954, + y: 48 + }, + { + x: 1890, + y: 48 + } + ], + textPositions: { + 0: { + x: 2220, + y: 36 + }, + 1: { + x: 2192, + y: 60 + }, + 2: { + x: 1908, + y: 60 + }, + 3: { + x: 1936, + y: 36 + }, + 4: { + x: 2064, + y: 36 + }, + 5: { + x: 2064, + y: 36 + }, + 6: { + x: 2064, + y: 60 + } + } + }, + warnings: null + }, + { + id: 592, + sourceNodeId: 148, + sourcePortId: 1199, + targetNodeId: 147, + targetPortId: 1200, + travelTime: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 361 + }, + sourceArrival: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 179 + }, + targetDeparture: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 175 + }, + targetArrival: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 365 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 48 + }, + { + x: 1278, + y: 48 + }, + { + x: 1122, + y: 48 + }, + { + x: 1058, + y: 48 + } + ], + textPositions: { + 0: { + x: 1324, + y: 36 + }, + 1: { + x: 1296, + y: 60 + }, + 2: { + x: 1076, + y: 60 + }, + 3: { + x: 1104, + y: 36 + }, + 4: { + x: 1200, + y: 36 + }, + 5: { + x: 1200, + y: 36 + }, + 6: { + x: 1200, + y: 60 + } + } + }, + warnings: null + }, + { + id: 593, + sourceNodeId: 147, + sourcePortId: 1201, + targetNodeId: 133, + targetPortId: 1202, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 365 + }, + sourceArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 175 + }, + targetDeparture: { + lock: false, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 170 + }, + targetArrival: { + lock: false, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 370 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 112 + }, + { + x: 894, + y: 112 + }, + { + x: 322, + y: 112 + }, + { + x: 258, + y: 112 + } + ], + textPositions: { + 0: { + x: 940, + y: 100 + }, + 1: { + x: 912, + y: 124 + }, + 2: { + x: 276, + y: 124 + }, + 3: { + x: 304, + y: 100 + }, + 4: { + x: 608, + y: 100 + }, + 5: { + x: 608, + y: 100 + }, + 6: { + x: 608, + y: 124 + } + } + }, + warnings: null + }, + { + id: 594, + sourceNodeId: 133, + sourcePortId: 1203, + targetNodeId: 172, + targetPortId: 1204, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 370 + }, + sourceArrival: { + lock: false, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 170 + }, + targetDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 377 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 144 + }, + { + x: -2, + y: 144 + }, + { + x: -446, + y: 144 + }, + { + x: -510, + y: 144 + } + ], + textPositions: { + 0: { + x: 44, + y: 132 + }, + 1: { + x: 16, + y: 156 + }, + 2: { + x: -492, + y: 156 + }, + 3: { + x: -464, + y: 132 + }, + 4: { + x: -224, + y: 132 + }, + 5: { + x: -224, + y: 132 + }, + 6: { + x: -224, + y: 156 + } + } + }, + warnings: null + }, + { + id: 595, + sourceNodeId: 129, + sourcePortId: 1205, + targetNodeId: 171, + targetPortId: 1206, + travelTime: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 390 + }, + sourceArrival: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 150 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 128 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 412 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2146, + y: 144 + }, + { + x: -2210, + y: 144 + }, + { + x: -2398, + y: 304 + }, + { + x: -2462, + y: 304 + } + ], + textPositions: { + 0: { + x: -2164, + y: 132 + }, + 1: { + x: -2192, + y: 156 + }, + 2: { + x: -2444, + y: 316 + }, + 3: { + x: -2416, + y: 292 + }, + 4: { + x: -2304, + y: 212 + }, + 5: { + x: -2304, + y: 212 + }, + 6: { + x: -2304, + y: 236 + } + } + }, + warnings: null + }, + { + id: 596, + sourceNodeId: 128, + sourcePortId: 1207, + targetNodeId: 177, + targetPortId: 1208, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 463 + }, + sourceArrival: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 77 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 472 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3074, + y: 560 + }, + { + x: -3138, + y: 560 + }, + { + x: -3358, + y: 592 + }, + { + x: -3422, + y: 592 + } + ], + textPositions: { + 0: { + x: -3092, + y: 548 + }, + 1: { + x: -3120, + y: 572 + }, + 2: { + x: -3404, + y: 604 + }, + 3: { + x: -3376, + y: 580 + }, + 4: { + x: -3248, + y: 564 + }, + 5: { + x: -3248, + y: 564 + }, + 6: { + x: -3248, + y: 588 + } + } + }, + warnings: null + }, + { + id: 597, + sourceNodeId: 160, + sourcePortId: 1209, + targetNodeId: 161, + targetPortId: 1210, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 501 + }, + sourceArrival: { + lock: true, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 39 + }, + targetDeparture: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 32 + }, + targetArrival: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 508 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3938, + y: 624 + }, + { + x: -4002, + y: 624 + }, + { + x: -4190, + y: 624 + }, + { + x: -4254, + y: 624 + } + ], + textPositions: { + 0: { + x: -3956, + y: 612 + }, + 1: { + x: -3984, + y: 636 + }, + 2: { + x: -4236, + y: 636 + }, + 3: { + x: -4208, + y: 612 + }, + 4: { + x: -4096, + y: 612 + }, + 5: { + x: -4096, + y: 612 + }, + 6: { + x: -4096, + y: 636 + } + } + }, + warnings: null + }, + { + id: 598, + sourceNodeId: 151, + sourcePortId: 1211, + targetNodeId: 137, + targetPortId: 1212, + travelTime: { + lock: false, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 248 + }, + sourceArrival: { + lock: true, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 292 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 248 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 292 + }, + numberOfStops: 4, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3970, + y: 112 + }, + { + x: 4034, + y: 112 + }, + { + x: 4574, + y: 112 + }, + { + x: 4638, + y: 112 + } + ], + textPositions: { + 0: { + x: 3988, + y: 124 + }, + 1: { + x: 4016, + y: 100 + }, + 2: { + x: 4620, + y: 100 + }, + 3: { + x: 4592, + y: 124 + }, + 4: { + x: 4304, + y: 100 + }, + 5: { + x: 4304, + y: 100 + }, + 6: { + x: 4304, + y: 124 + } + } + }, + warnings: null + }, + { + id: 599, + sourceNodeId: 135, + sourcePortId: 1213, + targetNodeId: 150, + targetPortId: 1214, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 125 + }, + sourceArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 295 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 286 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 112 + }, + { + x: 2914, + y: 112 + }, + { + x: 3230, + y: 112 + }, + { + x: 3294, + y: 112 + } + ], + textPositions: { + 0: { + x: 2868, + y: 124 + }, + 1: { + x: 2896, + y: 100 + }, + 2: { + x: 3276, + y: 100 + }, + 3: { + x: 3248, + y: 124 + }, + 4: { + x: 3072, + y: 100 + }, + 5: { + x: 3072, + y: 100 + }, + 6: { + x: 3072, + y: 124 + } + } + }, + warnings: null + }, + { + id: 600, + sourceNodeId: 150, + sourcePortId: 1215, + targetNodeId: 151, + targetPortId: 1216, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 136 + }, + sourceArrival: { + lock: false, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 284 + }, + targetDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 271 + }, + targetArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 149 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3394, + y: 112 + }, + { + x: 3458, + y: 112 + }, + { + x: 3806, + y: 112 + }, + { + x: 3870, + y: 112 + } + ], + textPositions: { + 0: { + x: 3412, + y: 124 + }, + 1: { + x: 3440, + y: 100 + }, + 2: { + x: 3852, + y: 100 + }, + 3: { + x: 3824, + y: 124 + }, + 4: { + x: 3632, + y: 100 + }, + 5: { + x: 3632, + y: 100 + }, + 6: { + x: 3632, + y: 124 + } + } + }, + warnings: null + }, + { + id: 601, + sourceNodeId: 135, + sourcePortId: 1217, + targetNodeId: 149, + targetPortId: 1218, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 302 + }, + sourceArrival: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 118 + }, + targetDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 176 + }, + { + x: 2590, + y: 176 + }, + { + x: 2402, + y: 176 + }, + { + x: 2338, + y: 176 + } + ], + textPositions: { + 0: { + x: 2636, + y: 164 + }, + 1: { + x: 2608, + y: 188 + }, + 2: { + x: 2356, + y: 188 + }, + 3: { + x: 2384, + y: 164 + }, + 4: { + x: 2496, + y: 164 + }, + 5: { + x: 2496, + y: 164 + }, + 6: { + x: 2496, + y: 188 + } + } + }, + warnings: null + }, + { + id: 602, + sourceNodeId: 149, + sourcePortId: 1219, + targetNodeId: 166, + targetPortId: 1220, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 176 + }, + { + x: 2174, + y: 176 + }, + { + x: 1954, + y: 176 + }, + { + x: 1890, + y: 176 + } + ], + textPositions: { + 0: { + x: 2220, + y: 164 + }, + 1: { + x: 2192, + y: 188 + }, + 2: { + x: 1908, + y: 188 + }, + 3: { + x: 1936, + y: 164 + }, + 4: { + x: 2064, + y: 164 + }, + 5: { + x: 2064, + y: 164 + }, + 6: { + x: 2064, + y: 188 + } + } + }, + warnings: null + }, + { + id: 603, + sourceNodeId: 148, + sourcePortId: 1221, + targetNodeId: 147, + targetPortId: 1222, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 320 + }, + sourceArrival: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 100 + }, + targetDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 95 + }, + targetArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 325 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 176 + }, + { + x: 1278, + y: 176 + }, + { + x: 1122, + y: 176 + }, + { + x: 1058, + y: 176 + } + ], + textPositions: { + 0: { + x: 1324, + y: 164 + }, + 1: { + x: 1296, + y: 188 + }, + 2: { + x: 1076, + y: 188 + }, + 3: { + x: 1104, + y: 164 + }, + 4: { + x: 1200, + y: 164 + }, + 5: { + x: 1200, + y: 164 + }, + 6: { + x: 1200, + y: 188 + } + } + }, + warnings: null + }, + { + id: 604, + sourceNodeId: 147, + sourcePortId: 1223, + targetNodeId: 133, + targetPortId: 1224, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 325 + }, + sourceArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 95 + }, + targetDeparture: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetArrival: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 176 + }, + { + x: 894, + y: 176 + }, + { + x: 322, + y: 176 + }, + { + x: 258, + y: 176 + } + ], + textPositions: { + 0: { + x: 940, + y: 164 + }, + 1: { + x: 912, + y: 188 + }, + 2: { + x: 276, + y: 188 + }, + 3: { + x: 304, + y: 164 + }, + 4: { + x: 608, + y: 164 + }, + 5: { + x: 608, + y: 164 + }, + 6: { + x: 608, + y: 188 + } + } + }, + warnings: null + }, + { + id: 605, + sourceNodeId: 133, + sourcePortId: 1225, + targetNodeId: 172, + targetPortId: 1226, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + sourceArrival: { + lock: true, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + targetArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 337 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 240 + }, + { + x: -2, + y: 240 + }, + { + x: -446, + y: 240 + }, + { + x: -510, + y: 240 + } + ], + textPositions: { + 0: { + x: 44, + y: 228 + }, + 1: { + x: 16, + y: 252 + }, + 2: { + x: -492, + y: 252 + }, + 3: { + x: -464, + y: 228 + }, + 4: { + x: -224, + y: 228 + }, + 5: { + x: -224, + y: 228 + }, + 6: { + x: -224, + y: 252 + } + } + }, + warnings: null + }, + { + id: 606, + sourceNodeId: 151, + sourcePortId: 1227, + targetNodeId: 162, + targetPortId: 1228, + travelTime: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 151 + }, + sourceArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 269 + }, + targetDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 218 + }, + targetArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 202 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3970, + y: 48 + }, + { + x: 4034, + y: 48 + }, + { + x: 4574, + y: -176 + }, + { + x: 4638, + y: -176 + } + ], + textPositions: { + 0: { + x: 3988, + y: 60 + }, + 1: { + x: 4016, + y: 36 + }, + 2: { + x: 4620, + y: -188 + }, + 3: { + x: 4592, + y: -164 + }, + 4: { + x: 4304, + y: -76 + }, + 5: { + x: 4304, + y: -76 + }, + 6: { + x: 4304, + y: -52 + } + } + }, + warnings: null + }, + { + id: 607, + sourceNodeId: 135, + sourcePortId: 1229, + targetNodeId: 150, + targetPortId: 1230, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 125 + }, + sourceArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 295 + }, + targetDeparture: { + lock: true, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 286 + }, + targetArrival: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 144 + }, + { + x: 2914, + y: 144 + }, + { + x: 3230, + y: 144 + }, + { + x: 3294, + y: 144 + } + ], + textPositions: { + 0: { + x: 2868, + y: 156 + }, + 1: { + x: 2896, + y: 132 + }, + 2: { + x: 3276, + y: 132 + }, + 3: { + x: 3248, + y: 156 + }, + 4: { + x: 3072, + y: 132 + }, + 5: { + x: 3072, + y: 132 + }, + 6: { + x: 3072, + y: 156 + } + } + }, + warnings: null + }, + { + id: 608, + sourceNodeId: 150, + sourcePortId: 1231, + targetNodeId: 151, + targetPortId: 1232, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 136 + }, + sourceArrival: { + lock: false, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 284 + }, + targetDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 271 + }, + targetArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 149 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3394, + y: 144 + }, + { + x: 3458, + y: 144 + }, + { + x: 3806, + y: 144 + }, + { + x: 3870, + y: 144 + } + ], + textPositions: { + 0: { + x: 3412, + y: 156 + }, + 1: { + x: 3440, + y: 132 + }, + 2: { + x: 3852, + y: 132 + }, + 3: { + x: 3824, + y: 156 + }, + 4: { + x: 3632, + y: 132 + }, + 5: { + x: 3632, + y: 132 + }, + 6: { + x: 3632, + y: 156 + } + } + }, + warnings: null + }, + { + id: 609, + sourceNodeId: 135, + sourcePortId: 1233, + targetNodeId: 149, + targetPortId: 1234, + travelTime: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 302 + }, + sourceArrival: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 118 + }, + targetDeparture: { + lock: true, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 103 + }, + targetArrival: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 317 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 208 + }, + { + x: 2590, + y: 208 + }, + { + x: 2402, + y: 208 + }, + { + x: 2338, + y: 208 + } + ], + textPositions: { + 0: { + x: 2636, + y: 196 + }, + 1: { + x: 2608, + y: 220 + }, + 2: { + x: 2356, + y: 220 + }, + 3: { + x: 2384, + y: 196 + }, + 4: { + x: 2496, + y: 196 + }, + 5: { + x: 2496, + y: 196 + }, + 6: { + x: 2496, + y: 220 + } + } + }, + warnings: null + }, + { + id: 610, + sourceNodeId: 149, + sourcePortId: 1235, + targetNodeId: 166, + targetPortId: 1236, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 317 + }, + sourceArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 103 + }, + targetDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 97 + }, + targetArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 323 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 208 + }, + { + x: 2174, + y: 208 + }, + { + x: 1954, + y: 208 + }, + { + x: 1890, + y: 208 + } + ], + textPositions: { + 0: { + x: 2220, + y: 196 + }, + 1: { + x: 2192, + y: 220 + }, + 2: { + x: 1908, + y: 220 + }, + 3: { + x: 1936, + y: 196 + }, + 4: { + x: 2064, + y: 196 + }, + 5: { + x: 2064, + y: 196 + }, + 6: { + x: 2064, + y: 220 + } + } + }, + warnings: null + }, + { + id: 611, + sourceNodeId: 148, + sourcePortId: 1237, + targetNodeId: 147, + targetPortId: 1238, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + sourceArrival: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 85 + }, + targetArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 335 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 208 + }, + { + x: 1278, + y: 208 + }, + { + x: 1122, + y: 208 + }, + { + x: 1058, + y: 208 + } + ], + textPositions: { + 0: { + x: 1324, + y: 196 + }, + 1: { + x: 1296, + y: 220 + }, + 2: { + x: 1076, + y: 220 + }, + 3: { + x: 1104, + y: 196 + }, + 4: { + x: 1200, + y: 196 + }, + 5: { + x: 1200, + y: 196 + }, + 6: { + x: 1200, + y: 220 + } + } + }, + warnings: null + }, + { + id: 612, + sourceNodeId: 147, + sourcePortId: 1239, + targetNodeId: 133, + targetPortId: 1240, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 335 + }, + sourceArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 85 + }, + targetDeparture: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 80 + }, + targetArrival: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 340 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 208 + }, + { + x: 894, + y: 208 + }, + { + x: 322, + y: 208 + }, + { + x: 258, + y: 208 + } + ], + textPositions: { + 0: { + x: 940, + y: 196 + }, + 1: { + x: 912, + y: 220 + }, + 2: { + x: 276, + y: 220 + }, + 3: { + x: 304, + y: 196 + }, + 4: { + x: 608, + y: 196 + }, + 5: { + x: 608, + y: 196 + }, + 6: { + x: 608, + y: 220 + } + } + }, + warnings: null + }, + { + id: 613, + sourceNodeId: 133, + sourcePortId: 1241, + targetNodeId: 172, + targetPortId: 1242, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 340 + }, + sourceArrival: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 80 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 73 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 272 + }, + { + x: -2, + y: 272 + }, + { + x: -446, + y: 272 + }, + { + x: -510, + y: 272 + } + ], + textPositions: { + 0: { + x: 44, + y: 260 + }, + 1: { + x: 16, + y: 284 + }, + 2: { + x: -492, + y: 284 + }, + 3: { + x: -464, + y: 260 + }, + 4: { + x: -224, + y: 260 + }, + 5: { + x: -224, + y: 260 + }, + 6: { + x: -224, + y: 284 + } + } + }, + warnings: null + }, + { + id: 614, + sourceNodeId: 151, + sourcePortId: 1243, + targetNodeId: 162, + targetPortId: 1244, + travelTime: { + lock: true, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 151 + }, + sourceArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 269 + }, + targetDeparture: { + lock: false, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 228 + }, + targetArrival: { + lock: false, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 192 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3970, + y: 80 + }, + { + x: 4034, + y: 80 + }, + { + x: 4574, + y: -144 + }, + { + x: 4638, + y: -144 + } + ], + textPositions: { + 0: { + x: 3988, + y: 92 + }, + 1: { + x: 4016, + y: 68 + }, + 2: { + x: 4620, + y: -156 + }, + 3: { + x: 4592, + y: -132 + }, + 4: { + x: 4304, + y: -44 + }, + 5: { + x: 4304, + y: -44 + }, + 6: { + x: 4304, + y: -20 + } + } + }, + warnings: null + }, + { + id: 615, + sourceNodeId: 135, + sourcePortId: 1245, + targetNodeId: 150, + targetPortId: 1246, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 95 + }, + sourceArrival: { + lock: true, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 205 + }, + targetDeparture: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 196 + }, + targetArrival: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 104 + }, + numberOfStops: 0, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 208 + }, + { + x: 2914, + y: 208 + }, + { + x: 3230, + y: 208 + }, + { + x: 3294, + y: 208 + } + ], + textPositions: { + 0: { + x: 2868, + y: 220 + }, + 1: { + x: 2896, + y: 196 + }, + 2: { + x: 3276, + y: 196 + }, + 3: { + x: 3248, + y: 220 + }, + 4: { + x: 3072, + y: 196 + }, + 5: { + x: 3072, + y: 196 + }, + 6: { + x: 3072, + y: 220 + } + } + }, + warnings: null + }, + { + id: 616, + sourceNodeId: 150, + sourcePortId: 1247, + targetNodeId: 151, + targetPortId: 1248, + travelTime: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + sourceArrival: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 194 + }, + targetDeparture: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 181 + }, + targetArrival: { + lock: true, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 119 + }, + numberOfStops: 0, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3394, + y: 208 + }, + { + x: 3458, + y: 208 + }, + { + x: 3806, + y: 208 + }, + { + x: 3870, + y: 208 + } + ], + textPositions: { + 0: { + x: 3412, + y: 220 + }, + 1: { + x: 3440, + y: 196 + }, + 2: { + x: 3852, + y: 196 + }, + 3: { + x: 3824, + y: 220 + }, + 4: { + x: 3632, + y: 196 + }, + 5: { + x: 3632, + y: 196 + }, + 6: { + x: 3632, + y: 220 + } + } + }, + warnings: null + }, + { + id: 617, + sourceNodeId: 151, + sourcePortId: 1249, + targetNodeId: 139, + targetPortId: 1250, + travelTime: { + lock: false, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 121 + }, + sourceArrival: { + lock: true, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 179 + }, + targetDeparture: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 130 + }, + targetArrival: { + lock: true, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 170 + }, + numberOfStops: 2, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 3888, + y: 30 + }, + { + x: 3888, + y: -34 + }, + { + x: 4272, + y: -286 + }, + { + x: 4272, + y: -350 + } + ], + textPositions: { + 0: { + x: 3900, + y: 12 + }, + 1: { + x: 3876, + y: -16 + }, + 2: { + x: 4260, + y: -332 + }, + 3: { + x: 4284, + y: -304 + }, + 4: { + x: 4068, + y: -160 + }, + 5: { + x: 4068, + y: -160 + }, + 6: { + x: 4092, + y: -160 + } + } + }, + warnings: null + }, + { + id: 618, + sourceNodeId: 138, + sourcePortId: 1251, + targetNodeId: 163, + targetPortId: 1252, + travelTime: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 0 + }, + sourceArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + targetDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 59 + }, + targetArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + numberOfStops: 0, + trainrunId: 91, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: -1054 + }, + { + x: 2672, + y: -990 + }, + { + x: 2800, + y: -610 + }, + { + x: 2800, + y: -546 + } + ], + textPositions: { + 0: { + x: 2660, + y: -1036 + }, + 1: { + x: 2684, + y: -1008 + }, + 2: { + x: 2812, + y: -564 + }, + 3: { + x: 2788, + y: -592 + }, + 4: { + x: 2748, + y: -800 + }, + 5: { + x: 2748, + y: -800 + }, + 6: { + x: 2724, + y: -800 + } + } + }, + warnings: null + }, + { + id: 619, + sourceNodeId: 163, + sourcePortId: 1253, + targetNodeId: 135, + targetPortId: 1254, + travelTime: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 3 + }, + sourceArrival: { + lock: false, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 57 + }, + targetDeparture: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 56 + }, + targetArrival: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 4 + }, + numberOfStops: 0, + trainrunId: 91, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2800, + y: -478 + }, + { + x: 2800, + y: -414 + }, + { + x: 2704, + y: -34 + }, + { + x: 2704, + y: 30 + } + ], + textPositions: { + 0: { + x: 2788, + y: -460 + }, + 1: { + x: 2812, + y: -432 + }, + 2: { + x: 2716, + y: 12 + }, + 3: { + x: 2692, + y: -16 + }, + 4: { + x: 2740, + y: -224 + }, + 5: { + x: 2740, + y: -224 + }, + 6: { + x: 2764, + y: -224 + } + } + }, + warnings: null + }, + { + id: 620, + sourceNodeId: 135, + sourcePortId: 1255, + targetNodeId: 138, + targetPortId: 1256, + travelTime: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 120 + }, + sourceArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + targetDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 59 + }, + targetArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 121 + }, + numberOfStops: 0, + trainrunId: 92, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 30 + }, + { + x: 2672, + y: -34 + }, + { + x: 2640, + y: -990 + }, + { + x: 2640, + y: -1054 + } + ], + textPositions: { + 0: { + x: 2684, + y: 12 + }, + 1: { + x: 2660, + y: -16 + }, + 2: { + x: 2628, + y: -1036 + }, + 3: { + x: 2652, + y: -1008 + }, + 4: { + x: 2668, + y: -512 + }, + 5: { + x: 2668, + y: -512 + }, + 6: { + x: 2644, + y: -512 + } + } + }, + warnings: null + }, + { + id: 621, + sourceNodeId: 166, + sourcePortId: 1257, + targetNodeId: 148, + targetPortId: 1258, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 356 + }, + sourceArrival: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 184 + }, + targetDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 179 + }, + targetArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 361 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 48 + }, + { + x: 1726, + y: 48 + }, + { + x: 1506, + y: 48 + }, + { + x: 1442, + y: 48 + } + ], + textPositions: { + 0: { + x: 1772, + y: 36 + }, + 1: { + x: 1744, + y: 60 + }, + 2: { + x: 1460, + y: 60 + }, + 3: { + x: 1488, + y: 36 + }, + 4: { + x: 1616, + y: 36 + }, + 5: { + x: 1616, + y: 36 + }, + 6: { + x: 1616, + y: 60 + } + } + }, + warnings: null + }, + { + id: 622, + sourceNodeId: 166, + sourcePortId: 1259, + targetNodeId: 148, + targetPortId: 1260, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 377 + }, + sourceArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetDeparture: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 156 + }, + targetArrival: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 384 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 144 + }, + { + x: 1726, + y: 144 + }, + { + x: 1506, + y: 144 + }, + { + x: 1442, + y: 144 + } + ], + textPositions: { + 0: { + x: 1772, + y: 132 + }, + 1: { + x: 1744, + y: 156 + }, + 2: { + x: 1460, + y: 156 + }, + 3: { + x: 1488, + y: 132 + }, + 4: { + x: 1616, + y: 132 + }, + 5: { + x: 1616, + y: 132 + }, + 6: { + x: 1616, + y: 156 + } + } + }, + warnings: null + }, + { + id: 623, + sourceNodeId: 166, + sourcePortId: 1261, + targetNodeId: 148, + targetPortId: 1262, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + sourceArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + targetDeparture: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 100 + }, + targetArrival: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 320 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 176 + }, + { + x: 1726, + y: 176 + }, + { + x: 1506, + y: 176 + }, + { + x: 1442, + y: 176 + } + ], + textPositions: { + 0: { + x: 1772, + y: 164 + }, + 1: { + x: 1744, + y: 188 + }, + 2: { + x: 1460, + y: 188 + }, + 3: { + x: 1488, + y: 164 + }, + 4: { + x: 1616, + y: 164 + }, + 5: { + x: 1616, + y: 164 + }, + 6: { + x: 1616, + y: 188 + } + } + }, + warnings: null + }, + { + id: 624, + sourceNodeId: 166, + sourcePortId: 1263, + targetNodeId: 148, + targetPortId: 1264, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 325 + }, + sourceArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 95 + }, + targetDeparture: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetArrival: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 330 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 208 + }, + { + x: 1726, + y: 208 + }, + { + x: 1506, + y: 208 + }, + { + x: 1442, + y: 208 + } + ], + textPositions: { + 0: { + x: 1772, + y: 196 + }, + 1: { + x: 1744, + y: 220 + }, + 2: { + x: 1460, + y: 220 + }, + 3: { + x: 1488, + y: 196 + }, + 4: { + x: 1616, + y: 196 + }, + 5: { + x: 1616, + y: 196 + }, + 6: { + x: 1616, + y: 220 + } + } + }, + warnings: null + }, + { + id: 625, + sourceNodeId: 166, + sourcePortId: 1265, + targetNodeId: 148, + targetPortId: 1266, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetDeparture: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 105 + }, + targetArrival: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 315 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 240 + }, + { + x: 1726, + y: 240 + }, + { + x: 1506, + y: 240 + }, + { + x: 1442, + y: 240 + } + ], + textPositions: { + 0: { + x: 1772, + y: 228 + }, + 1: { + x: 1744, + y: 252 + }, + 2: { + x: 1460, + y: 252 + }, + 3: { + x: 1488, + y: 228 + }, + 4: { + x: 1616, + y: 228 + }, + 5: { + x: 1616, + y: 228 + }, + 6: { + x: 1616, + y: 252 + } + } + }, + warnings: null + }, + { + id: 626, + sourceNodeId: 134, + sourcePortId: 1267, + targetNodeId: 164, + targetPortId: 1268, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 11 + }, + sourceArrival: { + lock: false, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 169 + }, + targetDeparture: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 156 + }, + targetArrival: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 24 + }, + numberOfStops: 0, + trainrunId: 93, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 322, + y: -1872 + }, + { + x: 386, + y: -1872 + }, + { + x: 990, + y: -944 + }, + { + x: 1054, + y: -944 + } + ], + textPositions: { + 0: { + x: 340, + y: -1860 + }, + 1: { + x: 368, + y: -1884 + }, + 2: { + x: 1036, + y: -956 + }, + 3: { + x: 1008, + y: -932 + }, + 4: { + x: 688, + y: -1420 + }, + 5: { + x: 688, + y: -1420 + }, + 6: { + x: 688, + y: -1396 + } + } + }, + warnings: null + }, + { + id: 627, + sourceNodeId: 164, + sourcePortId: 1269, + targetNodeId: 165, + targetPortId: 1270, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 25 + }, + sourceArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 155 + }, + targetDeparture: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 146 + }, + targetArrival: { + lock: false, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 34 + }, + numberOfStops: 0, + trainrunId: 93, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1154, + y: -944 + }, + { + x: 1218, + y: -944 + }, + { + x: 1726, + y: -656 + }, + { + x: 1790, + y: -656 + } + ], + textPositions: { + 0: { + x: 1172, + y: -932 + }, + 1: { + x: 1200, + y: -956 + }, + 2: { + x: 1772, + y: -668 + }, + 3: { + x: 1744, + y: -644 + }, + 4: { + x: 1472, + y: -812 + }, + 5: { + x: 1472, + y: -812 + }, + 6: { + x: 1472, + y: -788 + } + } + }, + warnings: null + }, + { + id: 628, + sourceNodeId: 165, + sourcePortId: 1271, + targetNodeId: 166, + targetPortId: 1272, + travelTime: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + sourceArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 145 + }, + targetDeparture: { + lock: false, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 123 + }, + targetArrival: { + lock: false, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 57 + }, + numberOfStops: 0, + trainrunId: 93, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1808, + y: -606 + }, + { + x: 1808, + y: -542 + }, + { + x: 1808, + y: -34 + }, + { + x: 1808, + y: 30 + } + ], + textPositions: { + 0: { + x: 1796, + y: -588 + }, + 1: { + x: 1820, + y: -560 + }, + 2: { + x: 1820, + y: 12 + }, + 3: { + x: 1796, + y: -16 + }, + 4: { + x: 1796, + y: -288 + }, + 5: { + x: 1796, + y: -288 + }, + 6: { + x: 1820, + y: -288 + } + } + }, + warnings: null + }, + { + id: 629, + sourceNodeId: 166, + sourcePortId: 1273, + targetNodeId: 149, + targetPortId: 1274, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + sourceArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 120 + }, + targetDeparture: { + lock: false, + time: 53, + warning: null, + timeFormatter: null, + consecutiveTime: 113 + }, + targetArrival: { + lock: false, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 67 + }, + numberOfStops: 0, + trainrunId: 93, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1890, + y: 272 + }, + { + x: 1954, + y: 272 + }, + { + x: 2174, + y: 272 + }, + { + x: 2238, + y: 272 + } + ], + textPositions: { + 0: { + x: 1908, + y: 284 + }, + 1: { + x: 1936, + y: 260 + }, + 2: { + x: 2220, + y: 260 + }, + 3: { + x: 2192, + y: 284 + }, + 4: { + x: 2064, + y: 260 + }, + 5: { + x: 2064, + y: 260 + }, + 6: { + x: 2064, + y: 284 + } + } + }, + warnings: null + }, + { + id: 630, + sourceNodeId: 149, + sourcePortId: 1275, + targetNodeId: 135, + targetPortId: 1276, + travelTime: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetDeparture: { + lock: false, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 96 + }, + targetArrival: { + lock: false, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 84 + }, + numberOfStops: 0, + trainrunId: 93, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2338, + y: 272 + }, + { + x: 2402, + y: 272 + }, + { + x: 2590, + y: 272 + }, + { + x: 2654, + y: 272 + } + ], + textPositions: { + 0: { + x: 2356, + y: 284 + }, + 1: { + x: 2384, + y: 260 + }, + 2: { + x: 2636, + y: 260 + }, + 3: { + x: 2608, + y: 284 + }, + 4: { + x: 2496, + y: 260 + }, + 5: { + x: 2496, + y: 260 + }, + 6: { + x: 2496, + y: 284 + } + } + }, + warnings: null + }, + { + id: 631, + sourceNodeId: 134, + sourcePortId: 1277, + targetNodeId: 146, + targetPortId: 1278, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 6 + }, + sourceArrival: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 174 + }, + targetDeparture: { + lock: false, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 169 + }, + targetArrival: { + lock: false, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 11 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: -1822 + }, + { + x: 144, + y: -1758 + }, + { + x: 144, + y: -1474 + }, + { + x: 144, + y: -1410 + } + ], + textPositions: { + 0: { + x: 132, + y: -1804 + }, + 1: { + x: 156, + y: -1776 + }, + 2: { + x: 156, + y: -1428 + }, + 3: { + x: 132, + y: -1456 + }, + 4: { + x: 132, + y: -1616 + }, + 5: { + x: 132, + y: -1616 + }, + 6: { + x: 156, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 632, + sourceNodeId: 146, + sourcePortId: 1279, + targetNodeId: 145, + targetPortId: 1280, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 11 + }, + sourceArrival: { + lock: false, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 169 + }, + targetDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 17 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: -1342 + }, + { + x: 144, + y: -1278 + }, + { + x: 144, + y: -994 + }, + { + x: 144, + y: -930 + } + ], + textPositions: { + 0: { + x: 132, + y: -1324 + }, + 1: { + x: 156, + y: -1296 + }, + 2: { + x: 156, + y: -948 + }, + 3: { + x: 132, + y: -976 + }, + 4: { + x: 132, + y: -1136 + }, + 5: { + x: 132, + y: -1136 + }, + 6: { + x: 156, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 633, + sourceNodeId: 145, + sourcePortId: 1281, + targetNodeId: 144, + targetPortId: 1282, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 17 + }, + sourceArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 157 + }, + targetArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 23 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: -862 + }, + { + x: 144, + y: -798 + }, + { + x: 144, + y: -514 + }, + { + x: 144, + y: -450 + } + ], + textPositions: { + 0: { + x: 132, + y: -844 + }, + 1: { + x: 156, + y: -816 + }, + 2: { + x: 156, + y: -468 + }, + 3: { + x: 132, + y: -496 + }, + 4: { + x: 132, + y: -656 + }, + 5: { + x: 132, + y: -656 + }, + 6: { + x: 156, + y: -656 + } + } + }, + warnings: null + }, + { + id: 634, + sourceNodeId: 144, + sourcePortId: 1283, + targetNodeId: 147, + targetPortId: 1284, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 23 + }, + sourceArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 157 + }, + targetDeparture: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 147 + }, + targetArrival: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 33 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 322, + y: -400 + }, + { + x: 386, + y: -400 + }, + { + x: 894, + y: 80 + }, + { + x: 958, + y: 80 + } + ], + textPositions: { + 0: { + x: 340, + y: -388 + }, + 1: { + x: 368, + y: -412 + }, + 2: { + x: 940, + y: 68 + }, + 3: { + x: 912, + y: 92 + }, + 4: { + x: 640, + y: -172 + }, + 5: { + x: 640, + y: -172 + }, + 6: { + x: 640, + y: -148 + } + } + }, + warnings: null + }, + { + id: 635, + sourceNodeId: 147, + sourcePortId: 1285, + targetNodeId: 148, + targetPortId: 1286, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 33 + }, + sourceArrival: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 147 + }, + targetDeparture: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 140 + }, + targetArrival: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 40 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1058, + y: 112 + }, + { + x: 1122, + y: 112 + }, + { + x: 1278, + y: 112 + }, + { + x: 1342, + y: 112 + } + ], + textPositions: { + 0: { + x: 1076, + y: 124 + }, + 1: { + x: 1104, + y: 100 + }, + 2: { + x: 1324, + y: 100 + }, + 3: { + x: 1296, + y: 124 + }, + 4: { + x: 1200, + y: 100 + }, + 5: { + x: 1200, + y: 100 + }, + 6: { + x: 1200, + y: 124 + } + } + }, + warnings: null + }, + { + id: 636, + sourceNodeId: 148, + sourcePortId: 1287, + targetNodeId: 166, + targetPortId: 1288, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 40 + }, + sourceArrival: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 140 + }, + targetDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + targetArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1442, + y: 112 + }, + { + x: 1506, + y: 112 + }, + { + x: 1726, + y: 112 + }, + { + x: 1790, + y: 112 + } + ], + textPositions: { + 0: { + x: 1460, + y: 124 + }, + 1: { + x: 1488, + y: 100 + }, + 2: { + x: 1772, + y: 100 + }, + 3: { + x: 1744, + y: 124 + }, + 4: { + x: 1616, + y: 100 + }, + 5: { + x: 1616, + y: 100 + }, + 6: { + x: 1616, + y: 124 + } + } + }, + warnings: null + }, + { + id: 637, + sourceNodeId: 166, + sourcePortId: 1289, + targetNodeId: 149, + targetPortId: 1290, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + sourceArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 134 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 128 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1890, + y: 112 + }, + { + x: 1954, + y: 112 + }, + { + x: 2174, + y: 112 + }, + { + x: 2238, + y: 112 + } + ], + textPositions: { + 0: { + x: 1908, + y: 124 + }, + 1: { + x: 1936, + y: 100 + }, + 2: { + x: 2220, + y: 100 + }, + 3: { + x: 2192, + y: 124 + }, + 4: { + x: 2064, + y: 100 + }, + 5: { + x: 2064, + y: 100 + }, + 6: { + x: 2064, + y: 124 + } + } + }, + warnings: null + }, + { + id: 638, + sourceNodeId: 149, + sourcePortId: 1291, + targetNodeId: 135, + targetPortId: 1292, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 128 + }, + targetDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 120 + }, + targetArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + numberOfStops: 0, + trainrunId: 94, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2338, + y: 112 + }, + { + x: 2402, + y: 112 + }, + { + x: 2590, + y: 112 + }, + { + x: 2654, + y: 112 + } + ], + textPositions: { + 0: { + x: 2356, + y: 124 + }, + 1: { + x: 2384, + y: 100 + }, + 2: { + x: 2636, + y: 100 + }, + 3: { + x: 2608, + y: 124 + }, + 4: { + x: 2496, + y: 100 + }, + 5: { + x: 2496, + y: 100 + }, + 6: { + x: 2496, + y: 124 + } + } + }, + warnings: null + }, + { + id: 639, + sourceNodeId: 147, + sourcePortId: 1293, + targetNodeId: 148, + targetPortId: 1294, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 54 + }, + sourceArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 126 + }, + targetDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 120 + }, + targetArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + numberOfStops: 0, + trainrunId: 97, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1058, + y: 272 + }, + { + x: 1122, + y: 272 + }, + { + x: 1278, + y: 272 + }, + { + x: 1342, + y: 272 + } + ], + textPositions: { + 0: { + x: 1076, + y: 284 + }, + 1: { + x: 1104, + y: 260 + }, + 2: { + x: 1324, + y: 260 + }, + 3: { + x: 1296, + y: 284 + }, + 4: { + x: 1200, + y: 260 + }, + 5: { + x: 1200, + y: 260 + }, + 6: { + x: 1200, + y: 284 + } + } + }, + warnings: null + }, + { + id: 640, + sourceNodeId: 148, + sourcePortId: 1295, + targetNodeId: 166, + targetPortId: 1296, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 62 + }, + sourceArrival: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 118 + }, + targetDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + numberOfStops: 0, + trainrunId: 97, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1442, + y: 272 + }, + { + x: 1506, + y: 272 + }, + { + x: 1726, + y: 272 + }, + { + x: 1790, + y: 272 + } + ], + textPositions: { + 0: { + x: 1460, + y: 284 + }, + 1: { + x: 1488, + y: 260 + }, + 2: { + x: 1772, + y: 260 + }, + 3: { + x: 1744, + y: 284 + }, + 4: { + x: 1616, + y: 260 + }, + 5: { + x: 1616, + y: 260 + }, + 6: { + x: 1616, + y: 284 + } + } + }, + warnings: null + }, + { + id: 641, + sourceNodeId: 166, + sourcePortId: 1297, + targetNodeId: 149, + targetPortId: 1298, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetDeparture: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 105 + }, + targetArrival: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 75 + }, + numberOfStops: 0, + trainrunId: 97, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1890, + y: 304 + }, + { + x: 1954, + y: 304 + }, + { + x: 2174, + y: 304 + }, + { + x: 2238, + y: 304 + } + ], + textPositions: { + 0: { + x: 1908, + y: 316 + }, + 1: { + x: 1936, + y: 292 + }, + 2: { + x: 2220, + y: 292 + }, + 3: { + x: 2192, + y: 316 + }, + 4: { + x: 2064, + y: 292 + }, + 5: { + x: 2064, + y: 292 + }, + 6: { + x: 2064, + y: 316 + } + } + }, + warnings: null + }, + { + id: 642, + sourceNodeId: 149, + sourcePortId: 1299, + targetNodeId: 135, + targetPortId: 1300, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 75 + }, + sourceArrival: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 105 + }, + targetDeparture: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 98 + }, + targetArrival: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 82 + }, + numberOfStops: 0, + trainrunId: 97, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2338, + y: 304 + }, + { + x: 2402, + y: 304 + }, + { + x: 2590, + y: 304 + }, + { + x: 2654, + y: 304 + } + ], + textPositions: { + 0: { + x: 2356, + y: 316 + }, + 1: { + x: 2384, + y: 292 + }, + 2: { + x: 2636, + y: 292 + }, + 3: { + x: 2608, + y: 316 + }, + 4: { + x: 2496, + y: 292 + }, + 5: { + x: 2496, + y: 292 + }, + 6: { + x: 2496, + y: 316 + } + } + }, + warnings: null + }, + { + id: 643, + sourceNodeId: 134, + sourcePortId: 1301, + targetNodeId: 146, + targetPortId: 1302, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 28 + }, + sourceArrival: { + lock: false, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 272 + }, + targetDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 265 + }, + targetArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: -1822 + }, + { + x: 208, + y: -1758 + }, + { + x: 208, + y: -1474 + }, + { + x: 208, + y: -1410 + } + ], + textPositions: { + 0: { + x: 196, + y: -1804 + }, + 1: { + x: 220, + y: -1776 + }, + 2: { + x: 220, + y: -1428 + }, + 3: { + x: 196, + y: -1456 + }, + 4: { + x: 196, + y: -1616 + }, + 5: { + x: 196, + y: -1616 + }, + 6: { + x: 220, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 644, + sourceNodeId: 146, + sourcePortId: 1303, + targetNodeId: 145, + targetPortId: 1304, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + sourceArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 265 + }, + targetDeparture: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 259 + }, + targetArrival: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: -1342 + }, + { + x: 208, + y: -1278 + }, + { + x: 208, + y: -994 + }, + { + x: 208, + y: -930 + } + ], + textPositions: { + 0: { + x: 196, + y: -1324 + }, + 1: { + x: 220, + y: -1296 + }, + 2: { + x: 220, + y: -948 + }, + 3: { + x: 196, + y: -976 + }, + 4: { + x: 196, + y: -1136 + }, + 5: { + x: 196, + y: -1136 + }, + 6: { + x: 220, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 645, + sourceNodeId: 145, + sourcePortId: 1305, + targetNodeId: 144, + targetPortId: 1306, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + sourceArrival: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 259 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 253 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 47 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 208, + y: -862 + }, + { + x: 208, + y: -798 + }, + { + x: 208, + y: -514 + }, + { + x: 208, + y: -450 + } + ], + textPositions: { + 0: { + x: 196, + y: -844 + }, + 1: { + x: 220, + y: -816 + }, + 2: { + x: 220, + y: -468 + }, + 3: { + x: 196, + y: -496 + }, + 4: { + x: 196, + y: -656 + }, + 5: { + x: 196, + y: -656 + }, + 6: { + x: 220, + y: -656 + } + } + }, + warnings: null + }, + { + id: 646, + sourceNodeId: 144, + sourcePortId: 1307, + targetNodeId: 133, + targetPortId: 1308, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 47 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 253 + }, + targetDeparture: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 245 + }, + targetArrival: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 55 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: -354 + }, + { + x: 144, + y: -290 + }, + { + x: 144, + y: 30 + }, + { + x: 144, + y: 94 + } + ], + textPositions: { + 0: { + x: 132, + y: -336 + }, + 1: { + x: 156, + y: -308 + }, + 2: { + x: 156, + y: 76 + }, + 3: { + x: 132, + y: 48 + }, + 4: { + x: 132, + y: -130 + }, + 5: { + x: 132, + y: -130 + }, + 6: { + x: 156, + y: -130 + } + } + }, + warnings: null + }, + { + id: 647, + sourceNodeId: 133, + sourcePortId: 1309, + targetNodeId: 172, + targetPortId: 1310, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 58 + }, + sourceArrival: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 242 + }, + targetDeparture: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 235 + }, + targetArrival: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 62, + y: 208 + }, + { + x: -2, + y: 208 + }, + { + x: -446, + y: 208 + }, + { + x: -510, + y: 208 + } + ], + textPositions: { + 0: { + x: 44, + y: 196 + }, + 1: { + x: 16, + y: 220 + }, + 2: { + x: -492, + y: 220 + }, + 3: { + x: -464, + y: 196 + }, + 4: { + x: -224, + y: 196 + }, + 5: { + x: -224, + y: 196 + }, + 6: { + x: -224, + y: 220 + } + } + }, + warnings: null + }, + { + id: 648, + sourceNodeId: 129, + sourcePortId: 1311, + targetNodeId: 167, + targetPortId: 1312, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 94 + }, + sourceArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 206 + }, + targetDeparture: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 188 + }, + targetArrival: { + lock: true, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2096, + y: 382 + }, + { + x: -2096, + y: 446 + }, + { + x: -2096, + y: 574 + }, + { + x: -2096, + y: 638 + } + ], + textPositions: { + 0: { + x: -2108, + y: 400 + }, + 1: { + x: -2084, + y: 428 + }, + 2: { + x: -2084, + y: 620 + }, + 3: { + x: -2108, + y: 592 + }, + 4: { + x: -2108, + y: 510 + }, + 5: { + x: -2108, + y: 510 + }, + 6: { + x: -2084, + y: 510 + } + } + }, + warnings: null + }, + { + id: 649, + sourceNodeId: 129, + sourcePortId: 1313, + targetNodeId: 167, + targetPortId: 1314, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 359 + }, + sourceArrival: { + lock: false, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 61 + }, + targetDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 43 + }, + targetArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 377 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2064, + y: 382 + }, + { + x: -2064, + y: 446 + }, + { + x: -2064, + y: 574 + }, + { + x: -2064, + y: 638 + } + ], + textPositions: { + 0: { + x: -2076, + y: 400 + }, + 1: { + x: -2052, + y: 428 + }, + 2: { + x: -2052, + y: 620 + }, + 3: { + x: -2076, + y: 592 + }, + 4: { + x: -2076, + y: 510 + }, + 5: { + x: -2076, + y: 510 + }, + 6: { + x: -2052, + y: 510 + } + } + }, + warnings: null + }, + { + id: 650, + sourceNodeId: 167, + sourcePortId: 1315, + targetNodeId: 168, + targetPortId: 1316, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 114 + }, + sourceArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 186 + }, + targetDeparture: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 178 + }, + targetArrival: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 122 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2096, + y: 706 + }, + { + x: -2096, + y: 770 + }, + { + x: -2096, + y: 862 + }, + { + x: -2096, + y: 926 + } + ], + textPositions: { + 0: { + x: -2108, + y: 724 + }, + 1: { + x: -2084, + y: 752 + }, + 2: { + x: -2084, + y: 908 + }, + 3: { + x: -2108, + y: 880 + }, + 4: { + x: -2108, + y: 816 + }, + 5: { + x: -2108, + y: 816 + }, + 6: { + x: -2084, + y: 816 + } + } + }, + warnings: null + }, + { + id: 651, + sourceNodeId: 168, + sourcePortId: 1317, + targetNodeId: 131, + targetPortId: 1318, + travelTime: { + lock: true, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 124 + }, + sourceArrival: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 176 + }, + targetDeparture: { + lock: false, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 152 + }, + targetArrival: { + lock: false, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 148 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2014, + y: 944 + }, + { + x: -1950, + y: 944 + }, + { + x: -1154, + y: 944 + }, + { + x: -1090, + y: 944 + } + ], + textPositions: { + 0: { + x: -1996, + y: 956 + }, + 1: { + x: -1968, + y: 932 + }, + 2: { + x: -1108, + y: 932 + }, + 3: { + x: -1136, + y: 956 + }, + 4: { + x: -1552, + y: 932 + }, + 5: { + x: -1552, + y: 932 + }, + 6: { + x: -1552, + y: 956 + } + } + }, + warnings: null + }, + { + id: 652, + sourceNodeId: 167, + sourcePortId: 1319, + targetNodeId: 168, + targetPortId: 1320, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 379 + }, + sourceArrival: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + targetDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 31 + }, + targetArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 389 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2064, + y: 706 + }, + { + x: -2064, + y: 770 + }, + { + x: -2064, + y: 862 + }, + { + x: -2064, + y: 926 + } + ], + textPositions: { + 0: { + x: -2076, + y: 724 + }, + 1: { + x: -2052, + y: 752 + }, + 2: { + x: -2052, + y: 908 + }, + 3: { + x: -2076, + y: 880 + }, + 4: { + x: -2076, + y: 816 + }, + 5: { + x: -2076, + y: 816 + }, + 6: { + x: -2052, + y: 816 + } + } + }, + warnings: null + }, + { + id: 653, + sourceNodeId: 168, + sourcePortId: 1321, + targetNodeId: 132, + targetPortId: 1322, + travelTime: { + lock: true, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 391 + }, + sourceArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 29 + }, + targetDeparture: { + lock: false, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 4 + }, + targetArrival: { + lock: false, + time: 56, + warning: null, + timeFormatter: null, + consecutiveTime: 416 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2096, + y: 1022 + }, + { + x: -2096, + y: 1086 + }, + { + x: -2096, + y: 1374 + }, + { + x: -2096, + y: 1438 + } + ], + textPositions: { + 0: { + x: -2108, + y: 1040 + }, + 1: { + x: -2084, + y: 1068 + }, + 2: { + x: -2084, + y: 1420 + }, + 3: { + x: -2108, + y: 1392 + }, + 4: { + x: -2108, + y: 1230 + }, + 5: { + x: -2108, + y: 1230 + }, + 6: { + x: -2084, + y: 1230 + } + } + }, + warnings: null + }, + { + id: 654, + sourceNodeId: 132, + sourcePortId: 1323, + targetNodeId: 168, + targetPortId: 1324, + travelTime: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 149 + }, + sourceArrival: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 151 + }, + targetDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 125 + }, + targetArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 175 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2128, + y: 1438 + }, + { + x: -2128, + y: 1374 + }, + { + x: -2128, + y: 1086 + }, + { + x: -2128, + y: 1022 + } + ], + textPositions: { + 0: { + x: -2116, + y: 1420 + }, + 1: { + x: -2140, + y: 1392 + }, + 2: { + x: -2140, + y: 1040 + }, + 3: { + x: -2116, + y: 1068 + }, + 4: { + x: -2140, + y: 1230 + }, + 5: { + x: -2140, + y: 1230 + }, + 6: { + x: -2116, + y: 1230 + } + } + }, + warnings: null + }, + { + id: 655, + sourceNodeId: 168, + sourcePortId: 1325, + targetNodeId: 167, + targetPortId: 1326, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 178 + }, + sourceArrival: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 122 + }, + targetDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 114 + }, + targetArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 186 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2128, + y: 926 + }, + { + x: -2128, + y: 862 + }, + { + x: -2128, + y: 770 + }, + { + x: -2128, + y: 706 + } + ], + textPositions: { + 0: { + x: -2116, + y: 908 + }, + 1: { + x: -2140, + y: 880 + }, + 2: { + x: -2140, + y: 724 + }, + 3: { + x: -2116, + y: 752 + }, + 4: { + x: -2140, + y: 816 + }, + 5: { + x: -2140, + y: 816 + }, + 6: { + x: -2116, + y: 816 + } + } + }, + warnings: null + }, + { + id: 656, + sourceNodeId: 167, + sourcePortId: 1327, + targetNodeId: 129, + targetPortId: 1328, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 188 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 112 + }, + targetDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 94 + }, + targetArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 206 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2128, + y: 638 + }, + { + x: -2128, + y: 574 + }, + { + x: -2128, + y: 446 + }, + { + x: -2128, + y: 382 + } + ], + textPositions: { + 0: { + x: -2116, + y: 620 + }, + 1: { + x: -2140, + y: 592 + }, + 2: { + x: -2140, + y: 400 + }, + 3: { + x: -2116, + y: 428 + }, + 4: { + x: -2140, + y: 510 + }, + 5: { + x: -2140, + y: 510 + }, + 6: { + x: -2116, + y: 510 + } + } + }, + warnings: null + }, + { + id: 657, + sourceNodeId: 129, + sourcePortId: 1329, + targetNodeId: 178, + targetPortId: 1330, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 214 + }, + sourceArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 86 + }, + targetDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + targetArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 217 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2014, + y: 176 + }, + { + x: -1950, + y: 176 + }, + { + x: -1762, + y: 176 + }, + { + x: -1698, + y: 176 + } + ], + textPositions: { + 0: { + x: -1996, + y: 188 + }, + 1: { + x: -1968, + y: 164 + }, + 2: { + x: -1716, + y: 164 + }, + 3: { + x: -1744, + y: 188 + }, + 4: { + x: -1856, + y: 164 + }, + 5: { + x: -1856, + y: 164 + }, + 6: { + x: -1856, + y: 188 + } + } + }, + warnings: null + }, + { + id: 658, + sourceNodeId: 133, + sourcePortId: 1331, + targetNodeId: 144, + targetPortId: 1332, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 245 + }, + sourceArrival: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 55 + }, + targetDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 47 + }, + targetArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 253 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: 94 + }, + { + x: 112, + y: 30 + }, + { + x: 112, + y: -290 + }, + { + x: 112, + y: -354 + } + ], + textPositions: { + 0: { + x: 124, + y: 76 + }, + 1: { + x: 100, + y: 48 + }, + 2: { + x: 100, + y: -336 + }, + 3: { + x: 124, + y: -308 + }, + 4: { + x: 100, + y: -130 + }, + 5: { + x: 100, + y: -130 + }, + 6: { + x: 124, + y: -130 + } + } + }, + warnings: null + }, + { + id: 659, + sourceNodeId: 144, + sourcePortId: 1333, + targetNodeId: 145, + targetPortId: 1334, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 253 + }, + sourceArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 47 + }, + targetDeparture: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + targetArrival: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 259 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: -450 + }, + { + x: 176, + y: -514 + }, + { + x: 176, + y: -798 + }, + { + x: 176, + y: -862 + } + ], + textPositions: { + 0: { + x: 188, + y: -468 + }, + 1: { + x: 164, + y: -496 + }, + 2: { + x: 164, + y: -844 + }, + 3: { + x: 188, + y: -816 + }, + 4: { + x: 164, + y: -656 + }, + 5: { + x: 164, + y: -656 + }, + 6: { + x: 188, + y: -656 + } + } + }, + warnings: null + }, + { + id: 660, + sourceNodeId: 145, + sourcePortId: 1335, + targetNodeId: 146, + targetPortId: 1336, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 259 + }, + sourceArrival: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + targetDeparture: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + targetArrival: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 265 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: -930 + }, + { + x: 176, + y: -994 + }, + { + x: 176, + y: -1278 + }, + { + x: 176, + y: -1342 + } + ], + textPositions: { + 0: { + x: 188, + y: -948 + }, + 1: { + x: 164, + y: -976 + }, + 2: { + x: 164, + y: -1324 + }, + 3: { + x: 188, + y: -1296 + }, + 4: { + x: 164, + y: -1136 + }, + 5: { + x: 164, + y: -1136 + }, + 6: { + x: 188, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 661, + sourceNodeId: 146, + sourcePortId: 1337, + targetNodeId: 134, + targetPortId: 1338, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 265 + }, + sourceArrival: { + lock: false, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 35 + }, + targetDeparture: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 28 + }, + targetArrival: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 272 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: -1410 + }, + { + x: 176, + y: -1474 + }, + { + x: 176, + y: -1758 + }, + { + x: 176, + y: -1822 + } + ], + textPositions: { + 0: { + x: 188, + y: -1428 + }, + 1: { + x: 164, + y: -1456 + }, + 2: { + x: 164, + y: -1804 + }, + 3: { + x: 188, + y: -1776 + }, + 4: { + x: 164, + y: -1616 + }, + 5: { + x: 164, + y: -1616 + }, + 6: { + x: 188, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 662, + sourceNodeId: 129, + sourcePortId: 1339, + targetNodeId: 167, + targetPortId: 1340, + travelTime: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 368 + }, + sourceArrival: { + lock: true, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + targetDeparture: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 33 + }, + targetArrival: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 387 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2032, + y: 382 + }, + { + x: -2032, + y: 446 + }, + { + x: -2032, + y: 574 + }, + { + x: -2032, + y: 638 + } + ], + textPositions: { + 0: { + x: -2044, + y: 400 + }, + 1: { + x: -2020, + y: 428 + }, + 2: { + x: -2020, + y: 620 + }, + 3: { + x: -2044, + y: 592 + }, + 4: { + x: -2044, + y: 510 + }, + 5: { + x: -2044, + y: 510 + }, + 6: { + x: -2020, + y: 510 + } + } + }, + warnings: null + }, + { + id: 663, + sourceNodeId: 167, + sourcePortId: 1341, + targetNodeId: 168, + targetPortId: 1342, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 388 + }, + sourceArrival: { + lock: false, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 32 + }, + targetDeparture: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 22 + }, + targetArrival: { + lock: true, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 398 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2032, + y: 706 + }, + { + x: -2032, + y: 770 + }, + { + x: -2032, + y: 862 + }, + { + x: -2032, + y: 926 + } + ], + textPositions: { + 0: { + x: -2044, + y: 724 + }, + 1: { + x: -2020, + y: 752 + }, + 2: { + x: -2020, + y: 908 + }, + 3: { + x: -2044, + y: 880 + }, + 4: { + x: -2044, + y: 816 + }, + 5: { + x: -2044, + y: 816 + }, + 6: { + x: -2020, + y: 816 + } + } + }, + warnings: null + }, + { + id: 664, + sourceNodeId: 168, + sourcePortId: 1343, + targetNodeId: 131, + targetPortId: 1344, + travelTime: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 399 + }, + sourceArrival: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 21 + }, + targetDeparture: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 0 + }, + targetArrival: { + lock: false, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 420 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2014, + y: 976 + }, + { + x: -1950, + y: 976 + }, + { + x: -1154, + y: 976 + }, + { + x: -1090, + y: 976 + } + ], + textPositions: { + 0: { + x: -1996, + y: 988 + }, + 1: { + x: -1968, + y: 964 + }, + 2: { + x: -1108, + y: 964 + }, + 3: { + x: -1136, + y: 988 + }, + 4: { + x: -1552, + y: 964 + }, + 5: { + x: -1552, + y: 964 + }, + 6: { + x: -1552, + y: 988 + } + } + }, + warnings: null + }, + { + id: 665, + sourceNodeId: 169, + sourcePortId: 1345, + targetNodeId: 153, + targetPortId: 1346, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 48, + warning: null, + timeFormatter: null, + consecutiveTime: 48 + }, + sourceArrival: { + lock: true, + time: 12, + warning: null, + timeFormatter: null, + consecutiveTime: 252 + }, + targetDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 243 + }, + targetArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 57 + }, + numberOfStops: 0, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1954, + y: 1776 + }, + { + x: 2018, + y: 1776 + }, + { + x: 2590, + y: 1360 + }, + { + x: 2654, + y: 1360 + } + ], + textPositions: { + 0: { + x: 1972, + y: 1788 + }, + 1: { + x: 2000, + y: 1764 + }, + 2: { + x: 2636, + y: 1348 + }, + 3: { + x: 2608, + y: 1372 + }, + 4: { + x: 2304, + y: 1556 + }, + 5: { + x: 2304, + y: 1556 + }, + 6: { + x: 2304, + y: 1580 + } + } + }, + warnings: null + }, + { + id: 666, + sourceNodeId: 169, + sourcePortId: 1347, + targetNodeId: 153, + targetPortId: 1348, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 18 + }, + sourceArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 42 + }, + targetDeparture: { + lock: false, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 32 + }, + targetArrival: { + lock: false, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 28 + }, + numberOfStops: 0, + trainrunId: 80, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1954, + y: 1744 + }, + { + x: 2018, + y: 1744 + }, + { + x: 2590, + y: 1328 + }, + { + x: 2654, + y: 1328 + } + ], + textPositions: { + 0: { + x: 1972, + y: 1756 + }, + 1: { + x: 2000, + y: 1732 + }, + 2: { + x: 2636, + y: 1316 + }, + 3: { + x: 2608, + y: 1340 + }, + 4: { + x: 2304, + y: 1524 + }, + 5: { + x: 2304, + y: 1524 + }, + 6: { + x: 2304, + y: 1548 + } + } + }, + warnings: null + }, + { + id: 667, + sourceNodeId: 169, + sourcePortId: 1349, + targetNodeId: 142, + targetPortId: 1350, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 453 + }, + sourceArrival: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 147 + }, + targetDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 138 + }, + targetArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 462 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1854, + y: 1776 + }, + { + x: 1790, + y: 1776 + }, + { + x: 290, + y: 1776 + }, + { + x: 226, + y: 1776 + } + ], + textPositions: { + 0: { + x: 1836, + y: 1764 + }, + 1: { + x: 1808, + y: 1788 + }, + 2: { + x: 244, + y: 1788 + }, + 3: { + x: 272, + y: 1764 + }, + 4: { + x: 1040, + y: 1764 + }, + 5: { + x: 1040, + y: 1764 + }, + 6: { + x: 1040, + y: 1788 + } + } + }, + warnings: null + }, + { + id: 668, + sourceNodeId: 169, + sourcePortId: 1351, + targetNodeId: 142, + targetPortId: 1352, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 273 + }, + sourceArrival: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 87 + }, + targetDeparture: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 78 + }, + targetArrival: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 282 + }, + numberOfStops: 0, + trainrunId: 75, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1854, + y: 1744 + }, + { + x: 1790, + y: 1744 + }, + { + x: 290, + y: 1744 + }, + { + x: 226, + y: 1744 + } + ], + textPositions: { + 0: { + x: 1836, + y: 1732 + }, + 1: { + x: 1808, + y: 1756 + }, + 2: { + x: 244, + y: 1756 + }, + 3: { + x: 272, + y: 1732 + }, + 4: { + x: 1040, + y: 1732 + }, + 5: { + x: 1040, + y: 1732 + }, + 6: { + x: 1040, + y: 1756 + } + } + }, + warnings: null + }, + { + id: 669, + sourceNodeId: 170, + sourcePortId: 1353, + targetNodeId: 135, + targetPortId: 1354, + travelTime: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 74 + }, + sourceArrival: { + lock: true, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 226 + }, + targetDeparture: { + lock: true, + time: 35, + warning: null, + timeFormatter: null, + consecutiveTime: 215 + }, + targetArrival: { + lock: true, + time: 25, + warning: null, + timeFormatter: null, + consecutiveTime: 85 + }, + numberOfStops: 0, + trainrunId: 79, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2832, + y: 734 + }, + { + x: 2832, + y: 670 + }, + { + x: 2832, + y: 414 + }, + { + x: 2832, + y: 350 + } + ], + textPositions: { + 0: { + x: 2844, + y: 716 + }, + 1: { + x: 2820, + y: 688 + }, + 2: { + x: 2820, + y: 368 + }, + 3: { + x: 2844, + y: 396 + }, + 4: { + x: 2820, + y: 542 + }, + 5: { + x: 2820, + y: 542 + }, + 6: { + x: 2844, + y: 542 + } + } + }, + warnings: null + }, + { + id: 670, + sourceNodeId: 170, + sourcePortId: 1355, + targetNodeId: 135, + targetPortId: 1356, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 43 + }, + sourceArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 17 + }, + targetDeparture: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 10 + }, + targetArrival: { + lock: true, + time: 50, + warning: null, + timeFormatter: null, + consecutiveTime: 50 + }, + numberOfStops: 0, + trainrunId: 80, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2800, + y: 734 + }, + { + x: 2800, + y: 670 + }, + { + x: 2800, + y: 414 + }, + { + x: 2800, + y: 350 + } + ], + textPositions: { + 0: { + x: 2812, + y: 716 + }, + 1: { + x: 2788, + y: 688 + }, + 2: { + x: 2788, + y: 368 + }, + 3: { + x: 2812, + y: 396 + }, + 4: { + x: 2788, + y: 542 + }, + 5: { + x: 2788, + y: 542 + }, + 6: { + x: 2812, + y: 542 + } + } + }, + warnings: null + }, + { + id: 671, + sourceNodeId: 170, + sourcePortId: 1357, + targetNodeId: 135, + targetPortId: 1358, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetDeparture: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 5 + }, + targetArrival: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 355 + }, + numberOfStops: 0, + trainrunId: 78, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2768, + y: 734 + }, + { + x: 2768, + y: 670 + }, + { + x: 2768, + y: 414 + }, + { + x: 2768, + y: 350 + } + ], + textPositions: { + 0: { + x: 2780, + y: 716 + }, + 1: { + x: 2756, + y: 688 + }, + 2: { + x: 2756, + y: 368 + }, + 3: { + x: 2780, + y: 396 + }, + 4: { + x: 2756, + y: 542 + }, + 5: { + x: 2756, + y: 542 + }, + 6: { + x: 2780, + y: 542 + } + } + }, + warnings: null + }, + { + id: 672, + sourceNodeId: 170, + sourcePortId: 1359, + targetNodeId: 135, + targetPortId: 1360, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 107 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 13 + }, + targetDeparture: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 5 + }, + targetArrival: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 115 + }, + numberOfStops: 0, + trainrunId: 76, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2672, + y: 734 + }, + { + x: 2672, + y: 670 + }, + { + x: 2672, + y: 414 + }, + { + x: 2672, + y: 350 + } + ], + textPositions: { + 0: { + x: 2684, + y: 716 + }, + 1: { + x: 2660, + y: 688 + }, + 2: { + x: 2660, + y: 368 + }, + 3: { + x: 2684, + y: 396 + }, + 4: { + x: 2660, + y: 542 + }, + 5: { + x: 2660, + y: 542 + }, + 6: { + x: 2684, + y: 542 + } + } + }, + warnings: null + }, + { + id: 673, + sourceNodeId: 170, + sourcePortId: 1361, + targetNodeId: 140, + targetPortId: 1362, + travelTime: { + lock: true, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 75 + }, + sourceArrival: { + lock: false, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 285 + }, + targetDeparture: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 238 + }, + targetArrival: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 122 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 752 + }, + { + x: 2914, + y: 752 + }, + { + x: 4574, + y: 1200 + }, + { + x: 4638, + y: 1200 + } + ], + textPositions: { + 0: { + x: 2868, + y: 764 + }, + 1: { + x: 2896, + y: 740 + }, + 2: { + x: 4620, + y: 1188 + }, + 3: { + x: 4592, + y: 1212 + }, + 4: { + x: 3744, + y: 964 + }, + 5: { + x: 3744, + y: 964 + }, + 6: { + x: 3744, + y: 988 + } + } + }, + warnings: null + }, + { + id: 674, + sourceNodeId: 170, + sourcePortId: 1363, + targetNodeId: 140, + targetPortId: 1364, + travelTime: { + lock: false, + time: 61, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 141 + }, + sourceArrival: { + lock: true, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 279 + }, + targetDeparture: { + lock: true, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 218 + }, + targetArrival: { + lock: true, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 202 + }, + numberOfStops: 5, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2850, + y: 784 + }, + { + x: 2914, + y: 784 + }, + { + x: 4574, + y: 1232 + }, + { + x: 4638, + y: 1232 + } + ], + textPositions: { + 0: { + x: 2868, + y: 796 + }, + 1: { + x: 2896, + y: 772 + }, + 2: { + x: 4620, + y: 1220 + }, + 3: { + x: 4592, + y: 1244 + }, + 4: { + x: 3744, + y: 996 + }, + 5: { + x: 3744, + y: 996 + }, + 6: { + x: 3744, + y: 1020 + } + } + }, + warnings: null + }, + { + id: 675, + sourceNodeId: 142, + sourcePortId: 1365, + targetNodeId: 141, + targetPortId: 1366, + travelTime: { + lock: true, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 475 + }, + sourceArrival: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 125 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 494 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: 1726 + }, + { + x: 144, + y: 1662 + }, + { + x: 144, + y: 1314 + }, + { + x: 144, + y: 1250 + } + ], + textPositions: { + 0: { + x: 156, + y: 1708 + }, + 1: { + x: 132, + y: 1680 + }, + 2: { + x: 132, + y: 1268 + }, + 3: { + x: 156, + y: 1296 + }, + 4: { + x: 132, + y: 1488 + }, + 5: { + x: 132, + y: 1488 + }, + 6: { + x: 156, + y: 1488 + } + } + }, + warnings: null + }, + { + id: 676, + sourceNodeId: 141, + sourcePortId: 1367, + targetNodeId: 143, + targetPortId: 1368, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 494 + }, + sourceArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + targetDeparture: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 99 + }, + targetArrival: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 501 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 144, + y: 1182 + }, + { + x: 144, + y: 1118 + }, + { + x: 144, + y: 866 + }, + { + x: 144, + y: 802 + } + ], + textPositions: { + 0: { + x: 156, + y: 1164 + }, + 1: { + x: 132, + y: 1136 + }, + 2: { + x: 132, + y: 820 + }, + 3: { + x: 156, + y: 848 + }, + 4: { + x: 132, + y: 992 + }, + 5: { + x: 132, + y: 992 + }, + 6: { + x: 156, + y: 992 + } + } + }, + warnings: null + }, + { + id: 677, + sourceNodeId: 143, + sourcePortId: 1369, + targetNodeId: 133, + targetPortId: 1370, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 503 + }, + sourceArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 97 + }, + targetDeparture: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 90 + }, + targetArrival: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 510 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: 734 + }, + { + x: 112, + y: 670 + }, + { + x: 112, + y: 414 + }, + { + x: 112, + y: 350 + } + ], + textPositions: { + 0: { + x: 124, + y: 716 + }, + 1: { + x: 100, + y: 688 + }, + 2: { + x: 100, + y: 368 + }, + 3: { + x: 124, + y: 396 + }, + 4: { + x: 100, + y: 542 + }, + 5: { + x: 100, + y: 542 + }, + 6: { + x: 124, + y: 542 + } + } + }, + warnings: null + }, + { + id: 678, + sourceNodeId: 133, + sourcePortId: 1371, + targetNodeId: 144, + targetPortId: 1372, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 32, + warning: null, + timeFormatter: null, + consecutiveTime: 512 + }, + sourceArrival: { + lock: true, + time: 28, + warning: null, + timeFormatter: null, + consecutiveTime: 88 + }, + targetDeparture: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 78 + }, + targetArrival: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 522 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 176, + y: 94 + }, + { + x: 176, + y: 30 + }, + { + x: 176, + y: -290 + }, + { + x: 176, + y: -354 + } + ], + textPositions: { + 0: { + x: 188, + y: 76 + }, + 1: { + x: 164, + y: 48 + }, + 2: { + x: 164, + y: -336 + }, + 3: { + x: 188, + y: -308 + }, + 4: { + x: 164, + y: -130 + }, + 5: { + x: 164, + y: -130 + }, + 6: { + x: 188, + y: -130 + } + } + }, + warnings: null + }, + { + id: 679, + sourceNodeId: 144, + sourcePortId: 1373, + targetNodeId: 145, + targetPortId: 1374, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 522 + }, + sourceArrival: { + lock: false, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 78 + }, + targetDeparture: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 73 + }, + targetArrival: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 527 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 240, + y: -450 + }, + { + x: 240, + y: -514 + }, + { + x: 240, + y: -798 + }, + { + x: 240, + y: -862 + } + ], + textPositions: { + 0: { + x: 252, + y: -468 + }, + 1: { + x: 228, + y: -496 + }, + 2: { + x: 228, + y: -844 + }, + 3: { + x: 252, + y: -816 + }, + 4: { + x: 228, + y: -656 + }, + 5: { + x: 228, + y: -656 + }, + 6: { + x: 252, + y: -656 + } + } + }, + warnings: null + }, + { + id: 680, + sourceNodeId: 145, + sourcePortId: 1375, + targetNodeId: 146, + targetPortId: 1376, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 527 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 73 + }, + targetDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 532 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 240, + y: -930 + }, + { + x: 240, + y: -994 + }, + { + x: 240, + y: -1278 + }, + { + x: 240, + y: -1342 + } + ], + textPositions: { + 0: { + x: 252, + y: -948 + }, + 1: { + x: 228, + y: -976 + }, + 2: { + x: 228, + y: -1324 + }, + 3: { + x: 252, + y: -1296 + }, + 4: { + x: 228, + y: -1136 + }, + 5: { + x: 228, + y: -1136 + }, + 6: { + x: 252, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 681, + sourceNodeId: 146, + sourcePortId: 1377, + targetNodeId: 134, + targetPortId: 1378, + travelTime: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 532 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 63 + }, + targetArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 537 + }, + numberOfStops: 0, + trainrunId: 77, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 240, + y: -1410 + }, + { + x: 240, + y: -1474 + }, + { + x: 240, + y: -1758 + }, + { + x: 240, + y: -1822 + } + ], + textPositions: { + 0: { + x: 252, + y: -1428 + }, + 1: { + x: 228, + y: -1456 + }, + 2: { + x: 228, + y: -1804 + }, + 3: { + x: 252, + y: -1776 + }, + 4: { + x: 228, + y: -1616 + }, + 5: { + x: 228, + y: -1616 + }, + 6: { + x: 252, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 682, + sourceNodeId: 171, + sourcePortId: 1379, + targetNodeId: 128, + targetPortId: 1380, + travelTime: { + lock: false, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 387 + }, + sourceArrival: { + lock: true, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 153 + }, + targetDeparture: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 104 + }, + targetArrival: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 436 + }, + numberOfStops: 2, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2562, + y: 336 + }, + { + x: -2626, + y: 336 + }, + { + x: -2910, + y: 592 + }, + { + x: -2974, + y: 592 + } + ], + textPositions: { + 0: { + x: -2580, + y: 324 + }, + 1: { + x: -2608, + y: 348 + }, + 2: { + x: -2956, + y: 604 + }, + 3: { + x: -2928, + y: 580 + }, + 4: { + x: -2768, + y: 452 + }, + 5: { + x: -2768, + y: 452 + }, + 6: { + x: -2768, + y: 476 + } + } + }, + warnings: null + }, + { + id: 683, + sourceNodeId: 171, + sourcePortId: 1381, + targetNodeId: 128, + targetPortId: 1382, + travelTime: { + lock: true, + time: 44, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 414 + }, + sourceArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 126 + }, + targetDeparture: { + lock: false, + time: 22, + warning: null, + timeFormatter: null, + consecutiveTime: 82 + }, + targetArrival: { + lock: false, + time: 38, + warning: null, + timeFormatter: null, + consecutiveTime: 458 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -2562, + y: 304 + }, + { + x: -2626, + y: 304 + }, + { + x: -2910, + y: 560 + }, + { + x: -2974, + y: 560 + } + ], + textPositions: { + 0: { + x: -2580, + y: 292 + }, + 1: { + x: -2608, + y: 316 + }, + 2: { + x: -2956, + y: 572 + }, + 3: { + x: -2928, + y: 548 + }, + 4: { + x: -2768, + y: 420 + }, + 5: { + x: -2768, + y: 420 + }, + 6: { + x: -2768, + y: 444 + } + } + }, + warnings: null + }, + { + id: 684, + sourceNodeId: 172, + sourcePortId: 1383, + targetNodeId: 178, + targetPortId: 1384, + travelTime: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 339 + }, + sourceArrival: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 201 + }, + targetDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 185 + }, + targetArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 355 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 304 + }, + { + x: -674, + y: 304 + }, + { + x: -1534, + y: 304 + }, + { + x: -1598, + y: 304 + } + ], + textPositions: { + 0: { + x: -628, + y: 292 + }, + 1: { + x: -656, + y: 316 + }, + 2: { + x: -1580, + y: 316 + }, + 3: { + x: -1552, + y: 292 + }, + 4: { + x: -1104, + y: 292 + }, + 5: { + x: -1104, + y: 292 + }, + 6: { + x: -1104, + y: 316 + } + } + }, + warnings: null + }, + { + id: 685, + sourceNodeId: 172, + sourcePortId: 1385, + targetNodeId: 174, + targetPortId: 1386, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 343 + }, + sourceArrival: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 77 + }, + targetDeparture: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 69 + }, + targetArrival: { + lock: true, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 351 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 336 + }, + { + x: -674, + y: 336 + }, + { + x: -830, + y: 368 + }, + { + x: -894, + y: 368 + } + ], + textPositions: { + 0: { + x: -628, + y: 324 + }, + 1: { + x: -656, + y: 348 + }, + 2: { + x: -876, + y: 380 + }, + 3: { + x: -848, + y: 356 + }, + 4: { + x: -752, + y: 340 + }, + 5: { + x: -752, + y: 340 + }, + 6: { + x: -752, + y: 364 + } + } + }, + warnings: null + }, + { + id: 686, + sourceNodeId: 172, + sourcePortId: 1387, + targetNodeId: 178, + targetPortId: 1388, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 47, + warning: null, + timeFormatter: null, + consecutiveTime: 347 + }, + sourceArrival: { + lock: false, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 73 + }, + targetDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + targetArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 355 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 272 + }, + { + x: -674, + y: 272 + }, + { + x: -1534, + y: 272 + }, + { + x: -1598, + y: 272 + } + ], + textPositions: { + 0: { + x: -628, + y: 260 + }, + 1: { + x: -656, + y: 284 + }, + 2: { + x: -1580, + y: 284 + }, + 3: { + x: -1552, + y: 260 + }, + 4: { + x: -1104, + y: 260 + }, + 5: { + x: -1104, + y: 260 + }, + 6: { + x: -1104, + y: 284 + } + } + }, + warnings: null + }, + { + id: 687, + sourceNodeId: 172, + sourcePortId: 1389, + targetNodeId: 178, + targetPortId: 1390, + travelTime: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 337 + }, + sourceArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + targetDeparture: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 66 + }, + targetArrival: { + lock: true, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 354 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 240 + }, + { + x: -674, + y: 240 + }, + { + x: -1534, + y: 240 + }, + { + x: -1598, + y: 240 + } + ], + textPositions: { + 0: { + x: -628, + y: 228 + }, + 1: { + x: -656, + y: 252 + }, + 2: { + x: -1580, + y: 252 + }, + 3: { + x: -1552, + y: 228 + }, + 4: { + x: -1104, + y: 228 + }, + 5: { + x: -1104, + y: 228 + }, + 6: { + x: -1104, + y: 252 + } + } + }, + warnings: null + }, + { + id: 688, + sourceNodeId: 172, + sourcePortId: 1391, + targetNodeId: 178, + targetPortId: 1392, + travelTime: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + sourceArrival: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 235 + }, + targetDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 217 + }, + targetArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 208 + }, + { + x: -674, + y: 208 + }, + { + x: -1534, + y: 208 + }, + { + x: -1598, + y: 208 + } + ], + textPositions: { + 0: { + x: -628, + y: 196 + }, + 1: { + x: -656, + y: 220 + }, + 2: { + x: -1580, + y: 220 + }, + 3: { + x: -1552, + y: 196 + }, + 4: { + x: -1104, + y: 196 + }, + 5: { + x: -1104, + y: 196 + }, + 6: { + x: -1104, + y: 220 + } + } + }, + warnings: null + }, + { + id: 689, + sourceNodeId: 172, + sourcePortId: 1393, + targetNodeId: 133, + targetPortId: 1394, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 234 + }, + sourceArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 66 + }, + targetDeparture: { + lock: true, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 58 + }, + targetArrival: { + lock: true, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 242 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -510, + y: 176 + }, + { + x: -446, + y: 176 + }, + { + x: -2, + y: 176 + }, + { + x: 62, + y: 176 + } + ], + textPositions: { + 0: { + x: -492, + y: 188 + }, + 1: { + x: -464, + y: 164 + }, + 2: { + x: 44, + y: 164 + }, + 3: { + x: 16, + y: 188 + }, + 4: { + x: -224, + y: 164 + }, + 5: { + x: -224, + y: 164 + }, + 6: { + x: -224, + y: 188 + } + } + }, + warnings: null + }, + { + id: 690, + sourceNodeId: 172, + sourcePortId: 1395, + targetNodeId: 178, + targetPortId: 1396, + travelTime: { + lock: true, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 377 + }, + sourceArrival: { + lock: false, + time: 43, + warning: null, + timeFormatter: null, + consecutiveTime: 163 + }, + targetDeparture: { + lock: false, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 154 + }, + targetArrival: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 386 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -610, + y: 144 + }, + { + x: -674, + y: 144 + }, + { + x: -1534, + y: 144 + }, + { + x: -1598, + y: 144 + } + ], + textPositions: { + 0: { + x: -628, + y: 132 + }, + 1: { + x: -656, + y: 156 + }, + 2: { + x: -1580, + y: 156 + }, + 3: { + x: -1552, + y: 132 + }, + 4: { + x: -1104, + y: 132 + }, + 5: { + x: -1104, + y: 132 + }, + 6: { + x: -1104, + y: 156 + } + } + }, + warnings: null + }, + { + id: 691, + sourceNodeId: 173, + sourcePortId: 1397, + targetNodeId: 178, + targetPortId: 1398, + travelTime: { + lock: true, + time: 10, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 11, + warning: null, + timeFormatter: null, + consecutiveTime: 371 + }, + sourceArrival: { + lock: true, + time: 49, + warning: null, + timeFormatter: null, + consecutiveTime: 49 + }, + targetDeparture: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 39 + }, + targetArrival: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 381 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1346, + y: 368 + }, + { + x: -1410, + y: 368 + }, + { + x: -1534, + y: 336 + }, + { + x: -1598, + y: 336 + } + ], + textPositions: { + 0: { + x: -1364, + y: 356 + }, + 1: { + x: -1392, + y: 380 + }, + 2: { + x: -1580, + y: 348 + }, + 3: { + x: -1552, + y: 324 + }, + 4: { + x: -1472, + y: 340 + }, + 5: { + x: -1472, + y: 340 + }, + 6: { + x: -1472, + y: 364 + } + } + }, + warnings: null + }, + { + id: 692, + sourceNodeId: 174, + sourcePortId: 1399, + targetNodeId: 173, + targetPortId: 1400, + travelTime: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 352 + }, + sourceArrival: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetDeparture: { + lock: false, + time: 51, + warning: null, + timeFormatter: null, + consecutiveTime: 51 + }, + targetArrival: { + lock: false, + time: 9, + warning: null, + timeFormatter: null, + consecutiveTime: 369 + }, + numberOfStops: 1, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -994, + y: 368 + }, + { + x: -1058, + y: 368 + }, + { + x: -1182, + y: 368 + }, + { + x: -1246, + y: 368 + } + ], + textPositions: { + 0: { + x: -1012, + y: 356 + }, + 1: { + x: -1040, + y: 380 + }, + 2: { + x: -1228, + y: 380 + }, + 3: { + x: -1200, + y: 356 + }, + 4: { + x: -1120, + y: 356 + }, + 5: { + x: -1120, + y: 356 + }, + 6: { + x: -1120, + y: 380 + } + } + }, + warnings: null + }, + { + id: 693, + sourceNodeId: 135, + sourcePortId: 1401, + targetNodeId: 149, + targetPortId: 1402, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 300 + }, + sourceArrival: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 60 + }, + targetDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + targetArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2654, + y: 80 + }, + { + x: 2590, + y: 80 + }, + { + x: 2402, + y: 80 + }, + { + x: 2338, + y: 80 + } + ], + textPositions: { + 0: { + x: 2636, + y: 68 + }, + 1: { + x: 2608, + y: 92 + }, + 2: { + x: 2356, + y: 92 + }, + 3: { + x: 2384, + y: 68 + }, + 4: { + x: 2496, + y: 68 + }, + 5: { + x: 2496, + y: 68 + }, + 6: { + x: 2496, + y: 92 + } + } + }, + warnings: null + }, + { + id: 694, + sourceNodeId: 149, + sourcePortId: 1403, + targetNodeId: 166, + targetPortId: 1404, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 308 + }, + sourceArrival: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 52 + }, + targetDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 2238, + y: 80 + }, + { + x: 2174, + y: 80 + }, + { + x: 1954, + y: 80 + }, + { + x: 1890, + y: 80 + } + ], + textPositions: { + 0: { + x: 2220, + y: 68 + }, + 1: { + x: 2192, + y: 92 + }, + 2: { + x: 1908, + y: 92 + }, + 3: { + x: 1936, + y: 68 + }, + 4: { + x: 2064, + y: 68 + }, + 5: { + x: 2064, + y: 68 + }, + 6: { + x: 2064, + y: 92 + } + } + }, + warnings: null + }, + { + id: 695, + sourceNodeId: 166, + sourcePortId: 1405, + targetNodeId: 148, + targetPortId: 1406, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 314 + }, + sourceArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 46 + }, + targetDeparture: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 40 + }, + targetArrival: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 320 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1790, + y: 80 + }, + { + x: 1726, + y: 80 + }, + { + x: 1506, + y: 80 + }, + { + x: 1442, + y: 80 + } + ], + textPositions: { + 0: { + x: 1772, + y: 68 + }, + 1: { + x: 1744, + y: 92 + }, + 2: { + x: 1460, + y: 92 + }, + 3: { + x: 1488, + y: 68 + }, + 4: { + x: 1616, + y: 68 + }, + 5: { + x: 1616, + y: 68 + }, + 6: { + x: 1616, + y: 92 + } + } + }, + warnings: null + }, + { + id: 696, + sourceNodeId: 148, + sourcePortId: 1407, + targetNodeId: 147, + targetPortId: 1408, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 20, + warning: null, + timeFormatter: null, + consecutiveTime: 320 + }, + sourceArrival: { + lock: false, + time: 40, + warning: null, + timeFormatter: null, + consecutiveTime: 40 + }, + targetDeparture: { + lock: false, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 34 + }, + targetArrival: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 326 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1342, + y: 80 + }, + { + x: 1278, + y: 80 + }, + { + x: 1122, + y: 80 + }, + { + x: 1058, + y: 80 + } + ], + textPositions: { + 0: { + x: 1324, + y: 68 + }, + 1: { + x: 1296, + y: 92 + }, + 2: { + x: 1076, + y: 92 + }, + 3: { + x: 1104, + y: 68 + }, + 4: { + x: 1200, + y: 68 + }, + 5: { + x: 1200, + y: 68 + }, + 6: { + x: 1200, + y: 92 + } + } + }, + warnings: null + }, + { + id: 697, + sourceNodeId: 147, + sourcePortId: 1409, + targetNodeId: 144, + targetPortId: 1410, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 326 + }, + sourceArrival: { + lock: false, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 34 + }, + targetDeparture: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 27 + }, + targetArrival: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 333 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 958, + y: 48 + }, + { + x: 894, + y: 48 + }, + { + x: 386, + y: -432 + }, + { + x: 322, + y: -432 + } + ], + textPositions: { + 0: { + x: 940, + y: 36 + }, + 1: { + x: 912, + y: 60 + }, + 2: { + x: 340, + y: -420 + }, + 3: { + x: 368, + y: -444 + }, + 4: { + x: 640, + y: -204 + }, + 5: { + x: 640, + y: -204 + }, + 6: { + x: 640, + y: -180 + } + } + }, + warnings: null + }, + { + id: 698, + sourceNodeId: 144, + sourcePortId: 1411, + targetNodeId: 145, + targetPortId: 1412, + travelTime: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 33, + warning: null, + timeFormatter: null, + consecutiveTime: 333 + }, + sourceArrival: { + lock: false, + time: 27, + warning: null, + timeFormatter: null, + consecutiveTime: 27 + }, + targetDeparture: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 21 + }, + targetArrival: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 339 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: -450 + }, + { + x: 112, + y: -514 + }, + { + x: 112, + y: -798 + }, + { + x: 112, + y: -862 + } + ], + textPositions: { + 0: { + x: 124, + y: -468 + }, + 1: { + x: 100, + y: -496 + }, + 2: { + x: 100, + y: -844 + }, + 3: { + x: 124, + y: -816 + }, + 4: { + x: 100, + y: -656 + }, + 5: { + x: 100, + y: -656 + }, + 6: { + x: 124, + y: -656 + } + } + }, + warnings: null + }, + { + id: 699, + sourceNodeId: 145, + sourcePortId: 1413, + targetNodeId: 146, + targetPortId: 1414, + travelTime: { + lock: true, + time: 7, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 339 + }, + sourceArrival: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 21 + }, + targetDeparture: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 14 + }, + targetArrival: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 346 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: -930 + }, + { + x: 112, + y: -994 + }, + { + x: 112, + y: -1278 + }, + { + x: 112, + y: -1342 + } + ], + textPositions: { + 0: { + x: 124, + y: -948 + }, + 1: { + x: 100, + y: -976 + }, + 2: { + x: 100, + y: -1324 + }, + 3: { + x: 124, + y: -1296 + }, + 4: { + x: 100, + y: -1136 + }, + 5: { + x: 100, + y: -1136 + }, + 6: { + x: 124, + y: -1136 + } + } + }, + warnings: null + }, + { + id: 700, + sourceNodeId: 146, + sourcePortId: 1415, + targetNodeId: 134, + targetPortId: 1416, + travelTime: { + lock: true, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 346 + }, + sourceArrival: { + lock: false, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 14 + }, + targetDeparture: { + lock: true, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 6 + }, + targetArrival: { + lock: true, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 354 + }, + numberOfStops: 0, + trainrunId: 85, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 112, + y: -1410 + }, + { + x: 112, + y: -1474 + }, + { + x: 112, + y: -1758 + }, + { + x: 112, + y: -1822 + } + ], + textPositions: { + 0: { + x: 124, + y: -1428 + }, + 1: { + x: 100, + y: -1456 + }, + 2: { + x: 100, + y: -1804 + }, + 3: { + x: 124, + y: -1776 + }, + 4: { + x: 100, + y: -1616 + }, + 5: { + x: 100, + y: -1616 + }, + 6: { + x: 124, + y: -1616 + } + } + }, + warnings: null + }, + { + id: 701, + sourceNodeId: 175, + sourcePortId: 1417, + targetNodeId: 130, + targetPortId: 1418, + travelTime: { + lock: true, + time: 13, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 421 + }, + sourceArrival: { + lock: true, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 119 + }, + targetDeparture: { + lock: true, + time: 46, + warning: null, + timeFormatter: null, + consecutiveTime: 106 + }, + targetArrival: { + lock: true, + time: 14, + warning: null, + timeFormatter: null, + consecutiveTime: 434 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: -16 + }, + { + x: -1762, + y: -16 + }, + { + x: -2366, + y: -16 + }, + { + x: -2430, + y: -16 + } + ], + textPositions: { + 0: { + x: -1716, + y: -28 + }, + 1: { + x: -1744, + y: -4 + }, + 2: { + x: -2412, + y: -4 + }, + 3: { + x: -2384, + y: -28 + }, + 4: { + x: -2064, + y: -28 + }, + 5: { + x: -2064, + y: -28 + }, + 6: { + x: -2064, + y: -4 + } + } + }, + warnings: null + }, + { + id: 702, + sourceNodeId: 137, + sourcePortId: 1419, + targetNodeId: 176, + targetPortId: 1420, + travelTime: { + lock: true, + time: 16, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 245 + }, + sourceArrival: { + lock: true, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 295 + }, + targetDeparture: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 279 + }, + targetArrival: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 261 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 4738, + y: 112 + }, + { + x: 4802, + y: 112 + }, + { + x: 5310, + y: 112 + }, + { + x: 5374, + y: 112 + } + ], + textPositions: { + 0: { + x: 4756, + y: 124 + }, + 1: { + x: 4784, + y: 100 + }, + 2: { + x: 5356, + y: 100 + }, + 3: { + x: 5328, + y: 124 + }, + 4: { + x: 5056, + y: 100 + }, + 5: { + x: 5056, + y: 100 + }, + 6: { + x: 5056, + y: 124 + } + } + }, + warnings: null + }, + { + id: 703, + sourceNodeId: 177, + sourcePortId: 1421, + targetNodeId: 160, + targetPortId: 1422, + travelTime: { + lock: false, + time: 30, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: true, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 451 + }, + sourceArrival: { + lock: true, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 89 + }, + targetDeparture: { + lock: true, + time: 59, + warning: null, + timeFormatter: null, + consecutiveTime: 59 + }, + targetArrival: { + lock: true, + time: 1, + warning: null, + timeFormatter: null, + consecutiveTime: 481 + }, + numberOfStops: 1, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3522, + y: 624 + }, + { + x: -3586, + y: 624 + }, + { + x: -3774, + y: 688 + }, + { + x: -3838, + y: 688 + } + ], + textPositions: { + 0: { + x: -3540, + y: 612 + }, + 1: { + x: -3568, + y: 636 + }, + 2: { + x: -3820, + y: 700 + }, + 3: { + x: -3792, + y: 676 + }, + 4: { + x: -3680, + y: 644 + }, + 5: { + x: -3680, + y: 644 + }, + 6: { + x: -3680, + y: 668 + } + } + }, + warnings: null + }, + { + id: 704, + sourceNodeId: 177, + sourcePortId: 1423, + targetNodeId: 160, + targetPortId: 1424, + travelTime: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 52, + warning: null, + timeFormatter: null, + consecutiveTime: 472 + }, + sourceArrival: { + lock: false, + time: 8, + warning: null, + timeFormatter: null, + consecutiveTime: 68 + }, + targetDeparture: { + lock: true, + time: 42, + warning: null, + timeFormatter: null, + consecutiveTime: 42 + }, + targetArrival: { + lock: true, + time: 18, + warning: null, + timeFormatter: null, + consecutiveTime: 498 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3522, + y: 560 + }, + { + x: -3586, + y: 560 + }, + { + x: -3774, + y: 624 + }, + { + x: -3838, + y: 624 + } + ], + textPositions: { + 0: { + x: -3540, + y: 548 + }, + 1: { + x: -3568, + y: 572 + }, + 2: { + x: -3820, + y: 636 + }, + 3: { + x: -3792, + y: 612 + }, + 4: { + x: -3680, + y: 580 + }, + 5: { + x: -3680, + y: 580 + }, + 6: { + x: -3680, + y: 604 + } + } + }, + warnings: null + }, + { + id: 705, + sourceNodeId: 177, + sourcePortId: 1425, + targetNodeId: 160, + targetPortId: 1426, + travelTime: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 19, + warning: null, + timeFormatter: null, + consecutiveTime: 499 + }, + sourceArrival: { + lock: false, + time: 41, + warning: null, + timeFormatter: null, + consecutiveTime: 41 + }, + targetDeparture: { + lock: true, + time: 15, + warning: null, + timeFormatter: null, + consecutiveTime: 15 + }, + targetArrival: { + lock: true, + time: 45, + warning: null, + timeFormatter: null, + consecutiveTime: 525 + }, + numberOfStops: 0, + trainrunId: 87, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -3522, + y: 592 + }, + { + x: -3586, + y: 592 + }, + { + x: -3774, + y: 656 + }, + { + x: -3838, + y: 656 + } + ], + textPositions: { + 0: { + x: -3540, + y: 580 + }, + 1: { + x: -3568, + y: 604 + }, + 2: { + x: -3820, + y: 668 + }, + 3: { + x: -3792, + y: 644 + }, + 4: { + x: -3680, + y: 612 + }, + 5: { + x: -3680, + y: 612 + }, + 6: { + x: -3680, + y: 636 + } + } + }, + warnings: null + }, + { + id: 706, + sourceNodeId: 178, + sourcePortId: 1427, + targetNodeId: 129, + targetPortId: 1428, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 21, + warning: null, + timeFormatter: null, + consecutiveTime: 381 + }, + sourceArrival: { + lock: false, + time: 39, + warning: null, + timeFormatter: null, + consecutiveTime: 39 + }, + targetDeparture: { + lock: true, + time: 36, + warning: null, + timeFormatter: null, + consecutiveTime: 36 + }, + targetArrival: { + lock: true, + time: 24, + warning: null, + timeFormatter: null, + consecutiveTime: 384 + }, + numberOfStops: 0, + trainrunId: 86, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 336 + }, + { + x: -1762, + y: 336 + }, + { + x: -1950, + y: 336 + }, + { + x: -2014, + y: 336 + } + ], + textPositions: { + 0: { + x: -1716, + y: 324 + }, + 1: { + x: -1744, + y: 348 + }, + 2: { + x: -1996, + y: 348 + }, + 3: { + x: -1968, + y: 324 + }, + 4: { + x: -1856, + y: 324 + }, + 5: { + x: -1856, + y: 324 + }, + 6: { + x: -1856, + y: 348 + } + } + }, + warnings: null + }, + { + id: 707, + sourceNodeId: 178, + sourcePortId: 1429, + targetNodeId: 129, + targetPortId: 1430, + travelTime: { + lock: true, + time: 4, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 355 + }, + sourceArrival: { + lock: false, + time: 5, + warning: { + title: "Quelle Ankunft Warnung", + description: "Quellankunftszeit kann nicht erreicht werden" + }, + timeFormatter: null, + consecutiveTime: 185 + }, + targetDeparture: { + lock: true, + time: 0, + warning: null, + timeFormatter: null, + consecutiveTime: 180 + }, + targetArrival: { + lock: true, + time: 0, + warning: { + title: "Ziel Ankunft Warnung", + description: "Zielankunftszeit kann nicht erreicht werden" + }, + timeFormatter: null, + consecutiveTime: 360 + }, + numberOfStops: 0, + trainrunId: 81, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 304 + }, + { + x: -1762, + y: 304 + }, + { + x: -1950, + y: 304 + }, + { + x: -2014, + y: 304 + } + ], + textPositions: { + 0: { + x: -1716, + y: 292 + }, + 1: { + x: -1744, + y: 316 + }, + 2: { + x: -1996, + y: 316 + }, + 3: { + x: -1968, + y: 292 + }, + 4: { + x: -1856, + y: 292 + }, + 5: { + x: -1856, + y: 292 + }, + 6: { + x: -1856, + y: 316 + } + } + }, + warnings: null + }, + { + id: 708, + sourceNodeId: 178, + sourcePortId: 1431, + targetNodeId: 129, + targetPortId: 1432, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 55, + warning: null, + timeFormatter: null, + consecutiveTime: 355 + }, + sourceArrival: { + lock: false, + time: 5, + warning: null, + timeFormatter: null, + consecutiveTime: 65 + }, + targetDeparture: { + lock: false, + time: 2, + warning: null, + timeFormatter: null, + consecutiveTime: 62 + }, + targetArrival: { + lock: false, + time: 58, + warning: null, + timeFormatter: null, + consecutiveTime: 358 + }, + numberOfStops: 0, + trainrunId: 90, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 272 + }, + { + x: -1762, + y: 272 + }, + { + x: -1950, + y: 272 + }, + { + x: -2014, + y: 272 + } + ], + textPositions: { + 0: { + x: -1716, + y: 260 + }, + 1: { + x: -1744, + y: 284 + }, + 2: { + x: -1996, + y: 284 + }, + 3: { + x: -1968, + y: 260 + }, + 4: { + x: -1856, + y: 260 + }, + 5: { + x: -1856, + y: 260 + }, + 6: { + x: -1856, + y: 284 + } + } + }, + warnings: null + }, + { + id: 709, + sourceNodeId: 178, + sourcePortId: 1433, + targetNodeId: 129, + targetPortId: 1434, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 354 + }, + sourceArrival: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 66 + }, + targetDeparture: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 63 + }, + targetArrival: { + lock: true, + time: 57, + warning: null, + timeFormatter: null, + consecutiveTime: 357 + }, + numberOfStops: 0, + trainrunId: 89, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 240 + }, + { + x: -1762, + y: 240 + }, + { + x: -1950, + y: 240 + }, + { + x: -2014, + y: 240 + } + ], + textPositions: { + 0: { + x: -1716, + y: 228 + }, + 1: { + x: -1744, + y: 252 + }, + 2: { + x: -1996, + y: 252 + }, + 3: { + x: -1968, + y: 228 + }, + 4: { + x: -1856, + y: 228 + }, + 5: { + x: -1856, + y: 228 + }, + 6: { + x: -1856, + y: 252 + } + } + }, + warnings: null + }, + { + id: 710, + sourceNodeId: 178, + sourcePortId: 1435, + targetNodeId: 129, + targetPortId: 1436, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + sourceArrival: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 217 + }, + targetDeparture: { + lock: true, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 214 + }, + targetArrival: { + lock: true, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 86 + }, + numberOfStops: 0, + trainrunId: 95, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 208 + }, + { + x: -1762, + y: 208 + }, + { + x: -1950, + y: 208 + }, + { + x: -2014, + y: 208 + } + ], + textPositions: { + 0: { + x: -1716, + y: 196 + }, + 1: { + x: -1744, + y: 220 + }, + 2: { + x: -1996, + y: 220 + }, + 3: { + x: -1968, + y: 196 + }, + 4: { + x: -1856, + y: 196 + }, + 5: { + x: -1856, + y: 196 + }, + 6: { + x: -1856, + y: 220 + } + } + }, + warnings: null + }, + { + id: 711, + sourceNodeId: 178, + sourcePortId: 1437, + targetNodeId: 172, + targetPortId: 1438, + travelTime: { + lock: true, + time: 17, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 37, + warning: null, + timeFormatter: null, + consecutiveTime: 217 + }, + sourceArrival: { + lock: false, + time: 23, + warning: null, + timeFormatter: null, + consecutiveTime: 83 + }, + targetDeparture: { + lock: false, + time: 6, + warning: null, + timeFormatter: null, + consecutiveTime: 66 + }, + targetArrival: { + lock: false, + time: 54, + warning: null, + timeFormatter: null, + consecutiveTime: 234 + }, + numberOfStops: 0, + trainrunId: 96, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1598, + y: 176 + }, + { + x: -1534, + y: 176 + }, + { + x: -674, + y: 176 + }, + { + x: -610, + y: 176 + } + ], + textPositions: { + 0: { + x: -1580, + y: 188 + }, + 1: { + x: -1552, + y: 164 + }, + 2: { + x: -628, + y: 164 + }, + 3: { + x: -656, + y: 188 + }, + 4: { + x: -1104, + y: 164 + }, + 5: { + x: -1104, + y: 164 + }, + 6: { + x: -1104, + y: 188 + } + } + }, + warnings: null + }, + { + id: 712, + sourceNodeId: 178, + sourcePortId: 1439, + targetNodeId: 129, + targetPortId: 1440, + travelTime: { + lock: true, + time: 3, + warning: null, + timeFormatter: null, + consecutiveTime: 1 + }, + sourceDeparture: { + lock: false, + time: 26, + warning: null, + timeFormatter: null, + consecutiveTime: 386 + }, + sourceArrival: { + lock: false, + time: 34, + warning: null, + timeFormatter: null, + consecutiveTime: 154 + }, + targetDeparture: { + lock: false, + time: 31, + warning: null, + timeFormatter: null, + consecutiveTime: 151 + }, + targetArrival: { + lock: false, + time: 29, + warning: null, + timeFormatter: null, + consecutiveTime: 389 + }, + numberOfStops: 0, + trainrunId: 88, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: -1698, + y: 144 + }, + { + x: -1762, + y: 144 + }, + { + x: -1950, + y: 144 + }, + { + x: -2014, + y: 144 + } + ], + textPositions: { + 0: { + x: -1716, + y: 132 + }, + 1: { + x: -1744, + y: 156 + }, + 2: { + x: -1996, + y: 156 + }, + 3: { + x: -1968, + y: 132 + }, + 4: { + x: -1856, + y: 132 + }, + 5: { + x: -1856, + y: 132 + }, + 6: { + x: -1856, + y: 156 + } + } + }, + warnings: null + } + ], + trainruns: [ + { + id: 75, + name: "21", + categoryId: 1, + frequencyId: 4, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 76, + name: "2", + categoryId: 1, + frequencyId: 4, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 77, + name: "26", + categoryId: 2, + frequencyId: 5, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 78, + name: "46", + categoryId: 2, + frequencyId: 4, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 79, + name: "75", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 80, + name: "70", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 81, + name: "15", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 82, + name: "27", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 83, + name: "26", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 84, + name: "13", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 85, + name: "3", + categoryId: 1, + frequencyId: 4, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 86, + name: "35", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 87, + name: "5", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 88, + name: "1", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 89, + name: "8", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 90, + name: "81", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 91, + name: "48", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 1, + 9, + 5 + ] + }, + { + id: 92, + name: "", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 1, + 9, + 5 + ] + }, + { + id: 93, + name: "36", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 94, + name: "3", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 95, + name: "61", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 96, + name: "6", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + }, + { + id: 97, + name: "37", + categoryId: 2, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [ + 3, + 8, + 4 + ] + } + ], + resources: [ + { + id: 88, + capacity: 2 + }, + { + id: 89, + capacity: 2 + }, + { + id: 90, + capacity: 2 + }, + { + id: 91, + capacity: 2 + }, + { + id: 92, + capacity: 2 + }, + { + id: 93, + capacity: 2 + }, + { + id: 94, + capacity: 2 + }, + { + id: 95, + capacity: 2 + }, + { + id: 96, + capacity: 2 + }, + { + id: 97, + capacity: 2 + }, + { + id: 98, + capacity: 2 + }, + { + id: 99, + capacity: 2 + }, + { + id: 100, + capacity: 2 + }, + { + id: 101, + capacity: 2 + }, + { + id: 102, + capacity: 2 + }, + { + id: 103, + capacity: 2 + }, + { + id: 104, + capacity: 2 + }, + { + id: 105, + capacity: 2 + }, + { + id: 106, + capacity: 2 + }, + { + id: 107, + capacity: 2 + }, + { + id: 108, + capacity: 2 + }, + { + id: 109, + capacity: 2 + }, + { + id: 110, + capacity: 2 + }, + { + id: 111, + capacity: 2 + }, + { + id: 112, + capacity: 2 + }, + { + id: 113, + capacity: 2 + }, + { + id: 114, + capacity: 2 + }, + { + id: 115, + capacity: 2 + }, + { + id: 116, + capacity: 2 + }, + { + id: 117, + capacity: 2 + }, + { + id: 118, + capacity: 2 + }, + { + id: 119, + capacity: 2 + }, + { + id: 120, + capacity: 2 + }, + { + id: 121, + capacity: 2 + }, + { + id: 122, + capacity: 2 + }, + { + id: 123, + capacity: 2 + }, + { + id: 124, + capacity: 2 + }, + { + id: 125, + capacity: 2 + }, + { + id: 126, + capacity: 2 + }, + { + id: 127, + capacity: 2 + }, + { + id: 128, + capacity: 2 + }, + { + id: 129, + capacity: 2 + }, + { + id: 130, + capacity: 2 + }, + { + id: 131, + capacity: 2 + }, + { + id: 132, + capacity: 2 + }, + { + id: 133, + capacity: 2 + }, + { + id: 134, + capacity: 2 + }, + { + id: 135, + capacity: 2 + }, + { + id: 136, + capacity: 2 + }, + { + id: 137, + capacity: 2 + }, + { + id: 138, + capacity: 2 + }, + { + id: 139, + capacity: 2 + }, + { + id: 140, + capacity: 2 + }, + { + id: 141, + capacity: 2 + }, + { + id: 142, + capacity: 2 + }, + { + id: 143, + capacity: 2 + }, + { + id: 144, + capacity: 2 + }, + { + id: 145, + capacity: 2 + }, + { + id: 146, + capacity: 2 + }, + { + id: 147, + capacity: 2 + }, + { + id: 148, + capacity: 2 + }, + { + id: 149, + capacity: 2 + }, + { + id: 150, + capacity: 2 + }, + { + id: 151, + capacity: 2 + }, + { + id: 152, + capacity: 2 + }, + { + id: 153, + capacity: 2 + }, + { + id: 154, + capacity: 2 + }, + { + id: 155, + capacity: 2 + }, + { + id: 156, + capacity: 2 + }, + { + id: 157, + capacity: 2 + }, + { + id: 158, + capacity: 2 + }, + { + id: 159, + capacity: 2 + }, + { + id: 160, + capacity: 2 + }, + { + id: 161, + capacity: 2 + }, + { + id: 162, + capacity: 2 + }, + { + id: 163, + capacity: 2 + }, + { + id: 164, + capacity: 2 + }, + { + id: 165, + capacity: 2 + }, + { + id: 166, + capacity: 2 + }, + { + id: 167, + capacity: 2 + }, + { + id: 168, + capacity: 2 + }, + { + id: 169, + capacity: 2 + }, + { + id: 170, + capacity: 2 + }, + { + id: 171, + capacity: 2 + }, + { + id: 172, + capacity: 2 + }, + { + id: 173, + capacity: 2 + }, + { + id: 174, + capacity: 2 + }, + { + id: 175, + capacity: 2 + }, + { + id: 176, + capacity: 2 + }, + { + id: 177, + capacity: 2 + }, + { + id: 178, + capacity: 2 + }, + { + id: 179, + capacity: 2 + }, + { + id: 180, + capacity: 2 + }, + { + id: 181, + capacity: 2 + }, + { + id: 182, + capacity: 2 + }, + { + id: 183, + capacity: 2 + }, + { + id: 184, + capacity: 2 + }, + { + id: 185, + capacity: 2 + }, + { + id: 186, + capacity: 2 + }, + { + id: 187, + capacity: 2 + }, + { + id: 188, + capacity: 2 + }, + { + id: 189, + capacity: 2 + }, + { + id: 190, + capacity: 2 + }, + { + id: 191, + capacity: 2 + }, + { + id: 192, + capacity: 2 + }, + { + id: 193, + capacity: 2 + }, + { + id: 194, + capacity: 2 + }, + { + id: 195, + capacity: 2 + }, + { + id: 196, + capacity: 2 + }, + { + id: 197, + capacity: 2 + }, + { + id: 198, + capacity: 2 + }, + { + id: 199, + capacity: 2 + }, + { + id: 200, + capacity: 2 + }, + { + id: 201, + capacity: 2 + }, + { + id: 202, + capacity: 2 + } + ], + metadata: { + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + } + }, + trainrunCategories: [ + { + id: 0, + order: 0, + shortName: "EC", + name: "International", + colorRef: "EC", + fachCategory: HaltezeitFachCategories.IPV, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, // -> Gruppe ROT + { + id: 1, + order: 1, + shortName: "IC", + name: "InterCity", + colorRef: "IC", + fachCategory: HaltezeitFachCategories.A, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, // -> Gruppe ROT + { + id: 2, + order: 2, + shortName: "IR", + name: "InterRegio", + colorRef: "IR", + fachCategory: HaltezeitFachCategories.B, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, // -> Gruppe BLAU + { + id: 3, + order: 3, + shortName: "RE", + name: "RegioExpress", + colorRef: "RE", + fachCategory: HaltezeitFachCategories.C, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, // -> Gruppe GRÜN + { + id: 4, + order: 4, + shortName: "S", + name: "RegioUndSBahnverkehr", + colorRef: "S", + fachCategory: HaltezeitFachCategories.D, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, // -> Gruppe SCHWARZ + { + id: 5, + order: 5, + shortName: "GEX", + name: "GüterExpress", + colorRef: "GEX", + fachCategory: HaltezeitFachCategories.Uncategorized, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 3, + nodeHeadwayNonStop: 3, + sectionHeadway: 3, + }, // -> Gruppe BLAUVIOLETT + { + id: 6, + order: 6, + shortName: "G", + name: "Güterverkehr", + colorRef: "G", + fachCategory: HaltezeitFachCategories.Uncategorized, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 3, + nodeHeadwayNonStop: 3, + sectionHeadway: 3, + }, // -> Gruppe BLAUVIOLETT + ], + trainrunFrequencies: [ + { + id: 0, + order: 0, + frequency: 15, + offset: 0, + shortName: "15", + name: "verkehrt viertelstündlich", + linePatternRef: LinePatternRefs.Freq15, + }, + { + id: 1, + order: 0, + frequency: 20, + offset: 0, + shortName: "20", + name: "verkehrt im 20 Minuten Takt", + linePatternRef: LinePatternRefs.Freq20, + }, + { + id: 2, + order: 0, + frequency: 30, + offset: 0, + shortName: "30", + name: "verkehrt halbstündlich", + linePatternRef: LinePatternRefs.Freq30, + }, + { + id: 3, + order: 0, + frequency: 60, + offset: 0, + shortName: "60", + name: "verkehrt stündlich", + linePatternRef: LinePatternRefs.Freq60, + }, + { + id: 4, + order: 0, + frequency: 120, + offset: 0, + shortName: "120", + name: "verkehrt zweistündlich (gerade)", + linePatternRef: LinePatternRefs.Freq120, + }, + { + id: 5, + order: 0, + frequency: 120, + offset: 60, + shortName: "120+", + name: "verkehrt zweistündlich (ungerade)", + linePatternRef: LinePatternRefs.Freq120, + }, + ], + trainrunTimeCategories: [ + { + id: 0, + order: 0, + shortName: "7/24", + name: "verkehrt uneingeschränkt", + dayTimeInterval: [], + weekday: [1, 2, 3, 4, 5, 6, 7], + linePatternRef: LinePatternRefs.TimeCat7_24, + }, + { + id: 1, + order: 0, + shortName: "HVZ", + name: "verkehrt zur Hauptverkehrszeit", + dayTimeInterval: [ + {from: 360, to: 420}, + {from: 960, to: 1140}, + ], + weekday: [1, 2, 3, 4, 5, 6, 7], + linePatternRef: LinePatternRefs.TimeCatHVZ, + }, + { + id: 2, + order: 0, + shortName: "zeitweise", + name: "verkehrt zeitweise", + dayTimeInterval: [], + weekday: [], + linePatternRef: LinePatternRefs.TimeZeitweise, + }, + ], + netzgrafikColors: [], + }, + freeFloatingTexts: [], + labels: [], + labelGroups: [], + filterData: { + filterSettings: [], + }, + }; + } +} diff --git a/src/app/services/auth/auth.service.ts b/src/app/services/auth/auth.service.ts index 854e73b4..246f8119 100644 --- a/src/app/services/auth/auth.service.ts +++ b/src/app/services/auth/auth.service.ts @@ -30,27 +30,28 @@ export class AuthService { private router: Router, location: Location, ) { - this.oauthService.configure(environment.authConfig); - this.oauthService.setupAutomaticSilentRefresh(); - // If the user should not be forcefully logged in (e.g. if you have pages, which can be - // accessed anonymously), change loadDiscoveryDocumentAndLogin to - // loadDiscoveryDocumentAndTryLogin and have a login functionality in the - // template of the component injecting the AuthService which calls the login() method. - this.initialized = this.oauthService - .loadDiscoveryDocumentAndLogin({state: location.path()}) - // If the user is not logged in, he will be forwarded to the identity provider - // and this promise will not resolve. After being redirected from the identity - // provider, the login promise will return true. - .then((v) => (v ? true : new Promise(() => {}))); - // Redirect the user to the url configured with state above or in a separate login call. - this.oauthService.events - .pipe(first((e) => e.type === "token_received")) - .subscribe(() => { - const state = decodeURIComponent(this.oauthService.state || ""); - if (state && state !== "/") { - this.router.navigate([state]); - } - }); + if (environment.disableBackend) return; + this.oauthService.configure(environment.authConfig); + this.oauthService.setupAutomaticSilentRefresh(); + // If the user should not be forcefully logged in (e.g. if you have pages, which can be + // accessed anonymously), change loadDiscoveryDocumentAndLogin to + // loadDiscoveryDocumentAndTryLogin and have a login functionality in the + // template of the component injecting the AuthService which calls the login() method. + this.initialized = this.oauthService + .loadDiscoveryDocumentAndLogin({state: location.path()}) + // If the user is not logged in, he will be forwarded to the identity provider + // and this promise will not resolve. After being redirected from the identity + // provider, the login promise will return true. + .then((v) => (v ? true : new Promise(() => {}))); + // Redirect the user to the url configured with state above or in a separate login call. + this.oauthService.events + .pipe(first((e) => e.type === "token_received")) + .subscribe(() => { + const state = decodeURIComponent(this.oauthService.state || ""); + if (state && state !== "/") { + this.router.navigate([state]); + } + }); } logOut() { diff --git a/src/app/services/data/label.serivce.ts b/src/app/services/data/label.serivce.ts index 23a20fb1..385d4cdf 100644 --- a/src/app/services/data/label.serivce.ts +++ b/src/app/services/data/label.serivce.ts @@ -1,4 +1,4 @@ -import {Injectable, OnDestroy} from "@angular/core"; +import {Injectable, OnDestroy, EventEmitter} from "@angular/core"; import {BehaviorSubject, Subject} from "rxjs"; import {LogService} from "../../logger/log.service"; import { @@ -7,6 +7,11 @@ import { } from "../../data-structures/business.data.structures"; import {Label} from "../../models/label.model"; import {LabelGroupService} from "./labelgroup.service"; +import { + LabelOperation, + Operation, + OperationType, +} from "src/app/models/operation.model"; @Injectable({ providedIn: "root", @@ -16,6 +21,8 @@ export class LabelService implements OnDestroy { readonly labels = this.labelSubject.asObservable(); private labelStore: {labels: Label[]} = {labels: []}; // store the data in memory + readonly operation = new EventEmitter(); + private destroyed = new Subject(); constructor( @@ -36,6 +43,7 @@ export class LabelService implements OnDestroy { labelObject.setLabel(newLabelValue); } this.labelUpdated(); + this.operation.emit(new LabelOperation(OperationType.update, labelObject)); } doUserDefinedLabelsOrdering(labelIds: number[]) { diff --git a/src/app/services/data/netzgrafikColoring.service.ts b/src/app/services/data/netzgrafikColoring.service.ts index f649643f..a874ddcb 100644 --- a/src/app/services/data/netzgrafikColoring.service.ts +++ b/src/app/services/data/netzgrafikColoring.service.ts @@ -35,20 +35,20 @@ export class NetzgrafikColoringService { ) { [ "path.edge_line.layer_3.Freq_30." + - StaticDomTags.TAG_UI_DIALOG + - " { stroke: whitesmoke; }", + StaticDomTags.TAG_UI_DIALOG + + " { stroke: var(--sbb-header-lean-background-color); }", "path.edge_line.layer_2.Freq_20." + - StaticDomTags.TAG_UI_DIALOG + - " { stroke: whitesmoke; }", + StaticDomTags.TAG_UI_DIALOG + + " { stroke: var(--sbb-header-lean-background-color); }", "path.edge_line.layer_1.Freq_15." + - StaticDomTags.TAG_UI_DIALOG + - " { stroke: whitesmoke; }", + StaticDomTags.TAG_UI_DIALOG + + " { stroke: var(--sbb-header-lean-background-color); }", "path.edge_line.layer_3.Freq_15." + - StaticDomTags.TAG_UI_DIALOG + - " { stroke: whitesmoke; }", + StaticDomTags.TAG_UI_DIALOG + + " { stroke: var(--sbb-header-lean-background-color); }", "path.edge_line.layer_3.Freq_15." + - StaticDomTags.TAG_UI_DIALOG + - " { stroke: whitesmoke; }", + StaticDomTags.TAG_UI_DIALOG + + " { stroke: var(--sbb-header-lean-background-color); }", ].forEach((rule) => { sheet.insertRule(rule, sheet.cssRules.length); if (verbose) { @@ -87,16 +87,8 @@ export class NetzgrafikColoringService { { tag: "", color: - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - colorRef + - "_" + - StaticDomTags.TAG_FOCUS.toUpperCase(), + "NODE_TEXT_FOCUS", backgroundColor: - StaticDomTags.TAG_UI_DIALOG + - "_" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_" + colorRef + @@ -106,16 +98,8 @@ export class NetzgrafikColoringService { { tag: StaticDomTags.TAG_SELECTED, color: - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - colorRef + - "_" + - StaticDomTags.TAG_MUTED.toUpperCase(), + "sbb-color-white", backgroundColor: - StaticDomTags.TAG_UI_DIALOG + - "_" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_" + colorRef + @@ -304,6 +288,11 @@ export class NetzgrafikColoringService { setDarkMode(darkMode) { this.isDarkMode = darkMode; this.generateColors(); + + document.documentElement.style.setProperty( + "--Button_TrainrunDialog_opacity", + this.isDarkMode ? "0.6" : "0.9", + ); } generateColors() { @@ -312,80 +301,80 @@ export class NetzgrafikColoringService { document.documentElement.style.setProperty( "--" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef(), + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef(), colors.color, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_FOCUS.toUpperCase(), + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_FOCUS.toUpperCase(), colors.colorFocus, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_MUTED.toUpperCase(), + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_MUTED.toUpperCase(), colors.colorMuted, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_RELATED.toUpperCase(), + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_RELATED.toUpperCase(), colors.colorRelated, ); const uiColors = netzgrafikColor.getColors(false); document.documentElement.style.setProperty( "--" + - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef(), + StaticDomTags.TAG_UI_DIALOG + + "_" + + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef(), uiColors.color, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_FOCUS.toUpperCase(), + StaticDomTags.TAG_UI_DIALOG + + "_" + + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_FOCUS.toUpperCase(), uiColors.colorFocus, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_MUTED.toUpperCase(), + StaticDomTags.TAG_UI_DIALOG + + "_" + + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_MUTED.toUpperCase(), uiColors.colorMuted, ); document.documentElement.style.setProperty( "--" + - StaticDomTags.TAG_UI_DIALOG + - "_" + - StaticDomTags.PREFIX_COLOR_VARIABLE + - "_" + - netzgrafikColor.getColorRef() + - "_" + - StaticDomTags.TAG_RELATED.toUpperCase(), + StaticDomTags.TAG_UI_DIALOG + + "_" + + StaticDomTags.PREFIX_COLOR_VARIABLE + + "_" + + netzgrafikColor.getColorRef() + + "_" + + StaticDomTags.TAG_RELATED.toUpperCase(), uiColors.colorRelated, ); }); @@ -547,8 +536,8 @@ export class NetzgrafikColoringService { colorRef, "fill", StaticDomTags.EDGE_LINE_STOPS_DOM_REF + - "." + - StaticDomTags.EDGE_LINE_STOPS_FILL, + "." + + StaticDomTags.EDGE_LINE_STOPS_FILL, verbose, ); NetzgrafikColoringService.generateColors( @@ -577,8 +566,8 @@ export class NetzgrafikColoringService { colorRef, "fill", StaticDomTags.EDGE_LINE_STOP_ICON_CLASS_DOM_REF + - "." + - StaticDomTags.TAG_FILL, + "." + + StaticDomTags.TAG_FILL, verbose, ); NetzgrafikColoringService.generateColors( @@ -597,21 +586,21 @@ export class NetzgrafikColoringService { ); // TODO - Knotenauslastung refactoring will impact this part - NetzgrafikColoringService.generateUIColors( + NetzgrafikColoringService.generateColors( sheetKnotenauslastung, colorRef, "stroke", StaticDomTags.KNOTENAUSLASTUNG_DATA_GROUP_PATH, verbose, ); - NetzgrafikColoringService.generateUIColors( + NetzgrafikColoringService.generateColors( sheetKnotenauslastung, colorRef, "fill", StaticDomTags.KNOTENAUSLASTUNG_DATA_GROUP_PATH, verbose, ); - NetzgrafikColoringService.generateUIColors( + NetzgrafikColoringService.generateColors( sheetKnotenauslastung, colorRef, "fill", diff --git a/src/app/services/data/node.service.ts b/src/app/services/data/node.service.ts index 4875e311..c49bce1a 100644 --- a/src/app/services/data/node.service.ts +++ b/src/app/services/data/node.service.ts @@ -1,4 +1,4 @@ -import {Injectable, OnDestroy} from "@angular/core"; +import {EventEmitter, Injectable, OnDestroy} from "@angular/core"; import {Node} from "../../models/node.model"; import { LabelDto, @@ -31,6 +31,7 @@ import {LabelService} from "./label.serivce"; import {FilterService} from "../ui/filter.service"; import {ConnectionDto} from "../../data-structures/technical.data.structures"; import {TrainrunsectionValidator} from "../util/trainrunsection.validator"; +import {NodeOperation, Operation, OperationType, TrainrunOperation} from "../../models/operation.model"; @Injectable({ providedIn: "root", @@ -45,6 +46,8 @@ export class NodeService implements OnDestroy { connectionsSubject = new BehaviorSubject([]); readonly connections = this.connectionsSubject.asObservable(); + readonly operation = new EventEmitter(); + private dataService: DataService = null; private destroyed = new Subject(); @@ -272,6 +275,7 @@ export class NodeService implements OnDestroy { if (enforceUpdate) { this.nodesUpdated(); } + this.operation.emit(new NodeOperation(OperationType.create, node)); return node; } @@ -282,10 +286,11 @@ export class NodeService implements OnDestroy { this.makeLabelIDCounterMap(this.getNodes()), ); this.filterService.clearDeletetFilterNodeLabels(deletetLabelIds); - this.deleteNodeWithoutUpdate(nodeId); + this.deleteNodeWithoutUpdate(nodeId, enforceUpdate); if (enforceUpdate) { this.nodesUpdated(); } + this.operation.emit(new NodeOperation(OperationType.delete, node)); } deleteAllVisibleNodes() { @@ -388,6 +393,10 @@ export class NodeService implements OnDestroy { const port2 = node.getPort(transition.getPortId2()); const trainrunSection1 = port1.getTrainrunSection(); const trainrunSection2 = port2.getTrainrunSection(); + const timeLock1 = trainrunSection1.getSourceNodeId() !== node.getId() ? + trainrunSection1.getSourceDepartureLock() : trainrunSection1.getTargetDepartureLock(); + const timeLock2 = trainrunSection2.getSourceNodeId() !== node.getId() ? + trainrunSection2.getSourceDepartureLock() : trainrunSection2.getTargetDepartureLock(); const oppNodeTrainrunSection1 = node.getOppositeNode(trainrunSection1); const oppNodeTrainrunSection2 = node.getOppositeNode(trainrunSection2); @@ -414,6 +423,11 @@ export class NodeService implements OnDestroy { trainrunSection2.getId(), false, ); + + // temporary store the source/target node information for updating the locks + const isTargetNodeEqToNodeId = trainrunSection1.getTargetNodeId() === node.getId(); + + // compute the new reconnected trainrun sections (create / fusion) this.trainrunSectionService.reconnectTrainrunSection( trainrunSection1.getTargetNodeId() === node.getId() ? trainrunSection1.getSourceNodeId() @@ -426,23 +440,47 @@ export class NodeService implements OnDestroy { trainrunSection1.getSourceNodeId(), false, ); + + // update the arrival and departure times node.setArrivalTime(trainrunSection1, trainrunSection2.getTargetArrival()); node.setDepartureTime( trainrunSection1, trainrunSection2.getTargetDeparture(), ); + // update the travel time const travelTime = trainrunSection1.getTravelTime() + trainrunSection2.getTravelTime() + transitionTravelTime; trainrunSection1.setTravelTime(travelTime); + + // update the number of stops trainrunSection1.setNumberOfStops( trainrunSection2.getNumberOfStops() + trainrunSection1.getNumberOfStops() + (isNonStop ? 0 : 1), ); + // update the time Locks + if (isTargetNodeEqToNodeId) { + this.trainrunSectionService.updateTrainrunSectionTimeLock( + trainrunSection1.getId(), + timeLock1, + timeLock2, + trainrunSection1.getTravelTimeLock(), + enforceUpdate + ); + } else { + this.trainrunSectionService.updateTrainrunSectionTimeLock( + trainrunSection1.getId(), + timeLock2, + timeLock1, + trainrunSection1.getTravelTimeLock(), + enforceUpdate + ); + } + const transitionNew1 = oppNodeTrainrunSection1.getTransition( trainrunSection1.getId(), ); @@ -544,9 +582,8 @@ export class NodeService implements OnDestroy { } if (isForwardPathLocked && isBackwardPathLocked) { - const warningTitle = "Durchfahrt geändert"; - const warningDescription = - "Zeiten können nicht angepasst werden, beidseitger Lock gefunden"; + const warningTitle = $localize`:@@app.services.data.node.transit-modified.title:Transition changed`; + const warningDescription = $localize`:@@app.services.data.node.transit-modified.description:Times cannot be adjusted, lock found on both sides`; this.trainrunSectionService.setWarningOnNode( trainrunSections.trainrunSection1.getId(), node.getId(), @@ -564,6 +601,7 @@ export class NodeService implements OnDestroy { TransitionValidator.validateTransition(node, transitionId); this.transitionsUpdated(); this.nodesUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSections.trainrunSection1.getTrainrun())); } checkExistsNoCycleTrainrunAfterFreePortsConnecting( @@ -929,40 +967,39 @@ export class NodeService implements OnDestroy { node.setConnectionTime(stammdaten.getConnectionTime()); } this.nodesUpdated(); + this.operation.emit(new NodeOperation(OperationType.update, node)); } changeNodeFullName(nodeId: number, name: string) { this.getNodeFromId(nodeId).setFullName(name); this.nodesUpdated(); + this.operation.emit(new NodeOperation(OperationType.update, this.getNodeFromId(nodeId))); } changeConnectionTime(nodeId: number, connectionTime: number) { this.getNodeFromId(nodeId).setConnectionTime(connectionTime); this.nodesUpdated(); - } - - changeLabelsIfNotEqualsLength(nodeId: number, labels: string[]) { - const labelIds = this.getNodeFromId(nodeId).getLabelIds(); - if (labelIds.length !== labels.length) { - this.changeLabels(nodeId, labels); - } + this.operation.emit(new NodeOperation(OperationType.update, this.getNodeFromId(nodeId))); } changeLabels(nodeId: number, labels: string[]) { const node = this.getNodeFromId(nodeId); - const labelIds: number[] = []; - labels.forEach((label) => { - labelIds.push( - this.labelService.getOrCreateLabel(label, LabelRef.Node).getId(), - ); - }); - const deletetLabelIds = this.labelService.clearLabel( + + // ensure uniqueness of input labels + const uniqueLabels = Array.from(new Set(labels)); + const labelIds = uniqueLabels.map(label => + this.labelService.getOrCreateLabel(label, LabelRef.Node).getId() + ); + const deletedLabelIds = this.labelService.clearLabel( this.findClearedLabel(node, labelIds), this.makeLabelIDCounterMap(this.getNodes()), ); - this.filterService.clearDeletetFilterNodeLabels(deletetLabelIds); + this.filterService.clearDeletetFilterNodeLabels(deletedLabelIds); node.setLabelIds(labelIds); this.nodesUpdated(); + if (uniqueLabels.length === labels.length) { + this.operation.emit(new NodeOperation(OperationType.update, node)); + } } visibleNodesDeleteLabel(labelRef: string) { @@ -1194,6 +1231,14 @@ export class NodeService implements OnDestroy { return Object.assign({}, this.nodesStore).nodes; } + getVisibleNodes(): Node[] { + return this.getNodes().filter((n) => this.filterService.filterNode(n)); + } + + getSelectedNodes(): Node[] { + return this.getNodes().filter((n) => n.selected()); + } + getAllNodeLabels(): string[] { let nodeLabels = []; this.getNodes().forEach((n) => @@ -1206,12 +1251,39 @@ export class NodeService implements OnDestroy { return nodeLabels; } - private deleteNodeWithoutUpdate(nodeId: number) { + getNetzgrafikBoundingBox() { + let minX; + let maxX; + let minY; + let maxY; + this.nodesStore.nodes.forEach((n) => { + minX = + minX === undefined + ? n.getPositionX() + : Math.min(minX, n.getPositionX()); + maxX = + maxX === undefined + ? n.getPositionX() + n.getNodeWidth() + : Math.max(maxX, n.getPositionX() + n.getNodeWidth()); + minY = + minY === undefined + ? n.getPositionY() + : Math.min(minY, n.getPositionY()); + maxY = + maxY === undefined + ? n.getPositionY() + n.getNodeHeight() + : Math.max(maxY, n.getPositionY() + n.getNodeHeight()); + }); + return {minCoordX: minX, minCoordY: minY, maxCoordX: maxX, maxCoordY: maxY}; + } + + private deleteNodeWithoutUpdate(nodeId: number, enforceUpdate = true) { const node = this.getNodeFromId(nodeId); const connectedTrainrunSections = node.getConnectedTrainrunSections(); if (connectedTrainrunSections.length !== 0) { this.trainrunSectionService.deleteListOfTrainrunSections( node.getConnectedTrainrunSections(), + enforceUpdate ); } this.nodesStore.nodes = this.nodesStore.nodes.filter( @@ -1247,6 +1319,7 @@ export class NodeService implements OnDestroy { ); }); node.reorderAllPorts(); + this.operation.emit(new NodeOperation(OperationType.update, node)); } node.updateTransitionsRouting(); node.updateConnectionsRouting(); diff --git a/src/app/services/data/note.service.ts b/src/app/services/data/note.service.ts index 4ae57072..786020d8 100644 --- a/src/app/services/data/note.service.ts +++ b/src/app/services/data/note.service.ts @@ -56,7 +56,7 @@ export class NoteService { }); } - addNote(position: Vec2D, title = "Titel", text = "Text"): Note { + addNote(position: Vec2D, title = $localize`:@@app.models.note.default-title:Note title`, text = $localize`:@@app.models.note.default-text:Note text`): Note { const newNote = new Note(); newNote.setPosition(position.getX(), position.getY()); newNote.setTitle(title); @@ -188,17 +188,17 @@ export class NoteService { setLabels(noteId: number, labels: string[]) { const note = this.getNoteFromId(noteId); - const labelIds: number[] = []; - labels.forEach((label) => { - labelIds.push( - this.labelService.getOrCreateLabel(label, LabelRef.Note).getId(), - ); - }); - const deletetLabelIds = this.labelService.clearLabel( + + // ensure uniqueness of input labels + const uniqueLabels = Array.from(new Set(labels)); + const labelIds = uniqueLabels.map(label => + this.labelService.getOrCreateLabel(label, LabelRef.Note).getId() + ); + const deletedLabelIds = this.labelService.clearLabel( this.findClearedLabel(note, labelIds), this.makeLabelIDCounterMap(this.getNotes()), ); - this.filterService.clearDeletetFilterNoteLabels(deletetLabelIds); + this.filterService.clearDeletetFilterNoteLabels(deletedLabelIds); note.setLabelIds(labelIds); this.notesUpdated(); } diff --git a/src/app/services/data/trainrun-section-times.service.ts b/src/app/services/data/trainrun-section-times.service.ts index afb821a5..4d95b2d4 100644 --- a/src/app/services/data/trainrun-section-times.service.ts +++ b/src/app/services/data/trainrun-section-times.service.ts @@ -491,22 +491,22 @@ export class TrainrunSectionTimesService { this.initialLeftAndRightElement === LeftAndRightElement.LeftRightTrainrunName ) { - this.timeStructure.leftDepartureTime = + this.timeStructure.leftDepartureTime = this.timeStructure.leftDepartureTime === null ? null : (this.timeStructure.leftDepartureTime + this.offset) % 60; - this.timeStructure.rightArrivalTime = + this.timeStructure.rightArrivalTime = this.timeStructure.rightArrivalTime === null ? null : (this.timeStructure.rightArrivalTime + this.offset) % 60; - this.timeStructure.leftArrivalTime = + this.timeStructure.leftArrivalTime = this.timeStructure.leftArrivalTime === null ? null : (maxMinutes + this.timeStructure.leftArrivalTime - this.offset) % 60; - this.timeStructure.rightDepartureTime = + this.timeStructure.rightDepartureTime = this.timeStructure.rightDepartureTime === null ? null : (maxMinutes + this.timeStructure.rightDepartureTime - this.offset) % 60; } else { - this.timeStructure.leftDepartureTime = + this.timeStructure.leftDepartureTime = this.timeStructure.leftDepartureTime === null ? null : (maxMinutes + this.timeStructure.leftDepartureTime - this.offset) % 60; - this.timeStructure.rightArrivalTime = + this.timeStructure.rightArrivalTime = this.timeStructure.rightArrivalTime === null ? null : (maxMinutes + this.timeStructure.rightArrivalTime - this.offset) % 60; - this.timeStructure.leftArrivalTime = + this.timeStructure.leftArrivalTime = this.timeStructure.leftArrivalTime === null ? null : (this.timeStructure.leftArrivalTime + this.offset) % 60; - this.timeStructure.rightDepartureTime = + this.timeStructure.rightDepartureTime = this.timeStructure.rightDepartureTime === null ? null : (this.timeStructure.rightDepartureTime + this.offset) % 60; } this.offsetTransformationActive = true; @@ -569,25 +569,26 @@ export class TrainrunSectionTimesService { this.timeStructure.travelTime, timeDisplayPrecision, ); + // Populate travel time here, otherwise it'll be up to + // setTimeStructureToTrainrunSections() and it may overwrite values entered + // by the user + const minTravelTime = 1.0 / Math.pow(10, this.filterService.getTimeDisplayPrecision()); + if (this.timeStructure.travelTime < 0.1) { + this.timeStructure.travelTime = 0.1; + } } private fixAllTimesPrecision() { const timeDisplayPrecision = 1000; - this.timeStructure.leftArrivalTime = - Math.round(this.timeStructure.leftArrivalTime * timeDisplayPrecision) / - timeDisplayPrecision; - this.timeStructure.leftDepartureTime = - Math.round(this.timeStructure.leftDepartureTime * timeDisplayPrecision) / - timeDisplayPrecision; - this.timeStructure.rightArrivalTime = - Math.round(this.timeStructure.rightArrivalTime * timeDisplayPrecision) / - timeDisplayPrecision; - this.timeStructure.rightDepartureTime = - Math.round(this.timeStructure.rightDepartureTime * timeDisplayPrecision) / - timeDisplayPrecision; - this.timeStructure.travelTime = - Math.round(this.timeStructure.travelTime * timeDisplayPrecision) / - timeDisplayPrecision; + const fixPrecision = (time) => { + if (time === null) return null; + return Math.round(time * timeDisplayPrecision) / timeDisplayPrecision; + }; + this.timeStructure.leftArrivalTime = fixPrecision(this.timeStructure.leftArrivalTime); + this.timeStructure.leftDepartureTime = fixPrecision(this.timeStructure.leftDepartureTime); + this.timeStructure.rightArrivalTime = fixPrecision(this.timeStructure.rightArrivalTime); + this.timeStructure.rightDepartureTime = fixPrecision(this.timeStructure.rightDepartureTime); + this.timeStructure.travelTime = fixPrecision(this.timeStructure.travelTime); } private updateTrainrunSectionTime() { diff --git a/src/app/services/data/trainrun.service.spec.ts b/src/app/services/data/trainrun.service.spec.ts index d531043d..07b9c004 100644 --- a/src/app/services/data/trainrun.service.spec.ts +++ b/src/app/services/data/trainrun.service.spec.ts @@ -344,19 +344,104 @@ describe("TrainrunService", () => { trainrunService.splitTrainrunIntoTwoParts(n.getTransition(0)); const trainrunSections2 = - trainrunSectionService.getAllTrainrunSectionsForTrainrun(ts0.getTrainrunId()); + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts0.getTrainrunId(), + ); expect(trainrunSections2.length).toBe(1); const trainrunSections3 = - trainrunSectionService.getAllTrainrunSectionsForTrainrun(ts1.getTrainrunId()); + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts1.getTrainrunId(), + ); expect(trainrunSections3.length).toBe(1); - trainrunService.combineTwoTrainruns(n, + trainrunService.combineTwoTrainruns( + n, n.getPortOfTrainrunSection(0), - n.getPortOfTrainrunSection(1)); + n.getPortOfTrainrunSection(1), + ); const trainrunSections4 = - trainrunSectionService.getAllTrainrunSectionsForTrainrun(ts1.getTrainrunId()); + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts1.getTrainrunId(), + ); expect(trainrunSections4.length).toBe(2); }); + it("combineTwoTrainruns - 002 - two trainrun segments tests", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTesting.getUnitTestNetzgrafik(), + ); + + trainrunSectionService.deleteTrainrunSection(4); + + const ts5: TrainrunSection = + trainrunSectionService.getTrainrunSectionFromId(5); + const ts7: TrainrunSection = + trainrunSectionService.getTrainrunSectionFromId(7); + + const node2: Node = nodeService.getNodeFromId(2); + + const trainrunSections5 = + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts5.getTrainrunId(), + ); + const trainrunSections7 = + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts7.getTrainrunId(), + ); + + trainrunService.combineTwoTrainruns( + node2, + node2.getPortOfTrainrunSection(7), + node2.getPortOfTrainrunSection(5), + ); + + const trainrunSections75 = + trainrunSectionService.getAllTrainrunSectionsForTrainrun( + ts7.getTrainrunId(), + ); + + expect(trainrunSections75.length).toBe( + trainrunSections5.length + + trainrunSections7.length); + expect(trainrunSections75.length).toBe(3); + }); + + it("getRootIterators", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTesting.getUnitTestNetzgrafik(), + ); + + const iterators = trainrunService.getRootIterators(); + + // trainrun 0: 0 -> 1 -> 2 + // root: 0 + expect(iterators.get(0).current().trainrunSection.getSourceNodeId()).toBe( + 0, + ); + + // trainrun 1: 1 -> 2 + // root: 1 + expect(iterators.get(1).current().trainrunSection.getSourceNodeId()).toBe( + 1, + ); + + // trainrun 2: 0 -> 1 -> 2 -> 3 + // root: 0 + expect(iterators.get(2).current().trainrunSection.getSourceNodeId()).toBe( + 0, + ); + + // trainrun 3: 4 -> 2 + // root: 4 + expect(iterators.get(3).current().trainrunSection.getSourceNodeId()).toBe( + 4, + ); + + // trainrun 4: 4 -> 2 + // root: 4 + expect(iterators.get(4).current().trainrunSection.getSourceNodeId()).toBe( + 4, + ); + }); }); diff --git a/src/app/services/data/trainrun.service.ts b/src/app/services/data/trainrun.service.ts index f340c640..92c256d8 100644 --- a/src/app/services/data/trainrun.service.ts +++ b/src/app/services/data/trainrun.service.ts @@ -8,7 +8,7 @@ import { TrainrunFrequency, TrainrunTimeCategory, } from "../../data-structures/business.data.structures"; -import {Injectable} from "@angular/core"; +import {EventEmitter, Injectable} from "@angular/core"; import {BehaviorSubject} from "rxjs"; import {NodeService} from "./node.service"; import {TrainrunSectionService} from "./trainrunsection.service"; @@ -23,6 +23,7 @@ import {FilterService} from "../ui/filter.service"; import {Transition} from "../../models/transition.model"; import {Port} from "../../models/port.model"; import {Connection} from "../../models/connection.model"; +import {Operation, OperationType, TrainrunOperation} from "../../models/operation.model"; @Injectable({ providedIn: "root", @@ -34,6 +35,8 @@ export class TrainrunService { trainrunsStore: { trainruns: Trainrun[] } = {trainruns: []}; // store the data in memory + readonly operation = new EventEmitter(); + private dataService: DataService = null; private nodeService: NodeService = null; private trainrunSectionService: TrainrunSectionService = null; @@ -180,6 +183,7 @@ export class TrainrunService { if (enforceUpdate) { this.trainrunsUpdated(); } + this.operation.emit(new TrainrunOperation(OperationType.delete, trainrun)); } getSelectedTrainrun(): Trainrun { @@ -242,6 +246,7 @@ export class TrainrunService { targetArrival, (60 - targetArrival) % 60, ts.getTravelTime(), + false, // disable event emission since UpdateTrainrunOperation is emitted below ); }); @@ -250,6 +255,7 @@ export class TrainrunService { this.trainrunSectionService.trainrunSectionsUpdated(); this.trainrunsUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrun)); return freqOffset; } @@ -257,6 +263,7 @@ export class TrainrunService { this.getTrainrunFromId(trainrun.getId()).setTrainrunCategory(category); this.nodeService.reorderPortsOnNodesForTrainrun(trainrun); this.trainrunsUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrun)); } updateTrainrunTimeCategory( @@ -268,18 +275,24 @@ export class TrainrunService { ); this.nodeService.reorderPortsOnNodesForTrainrun(trainrun); this.trainrunsUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrun)); } updateTrainrunTitle(trainrun: Trainrun, title: string) { this.getTrainrunFromId(trainrun.getId()).setTitle(title); this.nodeService.reorderPortsOnNodesForTrainrun(trainrun); this.trainrunsUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrun)); } getTrainruns(): Trainrun[] { return Object.assign({}, this.trainrunsStore).trainruns; } + getVisibleTrainruns(): Trainrun[] { + return this.getTrainruns().filter((t) => this.filterService.filterTrainrun(t)); + } + getAllTrainrunLabels(): string[] { let trainrunLabels = []; this.getTrainruns().forEach((t) => @@ -426,7 +439,7 @@ export class TrainrunService { port2.getTrainrunSection().getSourceDeparture(); let frequencyOffset = 0; - while ( 60 + arrivalTimeAtNode > departTimeAtNode + frequencyOffset) { + while (60 + arrivalTimeAtNode > departTimeAtNode + frequencyOffset) { frequencyOffset += port1.getTrainrunSection().getFrequency(); } @@ -451,7 +464,7 @@ export class TrainrunService { const trans2 = node.getTransitionFromPortId(port2.getId()); if (trans1 === undefined && trans2 === undefined) { const trans = node.addTransitionAndComputeRouting(port1, port2, trainrun1); - if (60 + arrivalTimeAtNode === departTimeAtNode+frequencyOffset) { + if (60 + arrivalTimeAtNode === departTimeAtNode + frequencyOffset) { trans.setIsNonStopTransit(true); } else { trans.setIsNonStopTransit(false); @@ -471,6 +484,13 @@ export class TrainrunService { trainrun1.unselect(); trainrun2.unselect(); + // Change all trainrun sections' trainrunId reference from trainrun2 to trainrun1 + // There can be some other "unconnected" trainrun segments left; those have to be moved to + // trainrun1, which will "survive". + this.trainrunSectionService.getAllTrainrunSectionsForTrainrun(trainrun2.getId()).forEach( + (ts: TrainrunSection) => ts.setTrainrun(trainrun1) + ); + // remove empty trainrun this.deleteTrainrun(trainrun2, false); @@ -501,6 +521,7 @@ export class TrainrunService { copiedtrainrun.setTitle(trainrun.getTitle() + postfix); copiedtrainrun.setLabelIds(trainrun.getLabelIds()); this.trainrunsStore.trainruns.push(copiedtrainrun); + this.operation.emit(new TrainrunOperation(OperationType.create, copiedtrainrun)); return copiedtrainrun; } @@ -525,19 +546,22 @@ export class TrainrunService { setLabels(trainrunId: number, labels: string[]) { const trainrun = this.getTrainrunFromId(trainrunId); - const labelIds: number[] = []; - labels.forEach((label) => { - labelIds.push( - this.labelService.getOrCreateLabel(label, LabelRef.Trainrun).getId(), - ); - }); - const deletetLabelIds = this.labelService.clearLabel( + + // ensure uniqueness of input labels + const uniqueLabels = Array.from(new Set(labels)); + const labelIds = uniqueLabels.map(label => + this.labelService.getOrCreateLabel(label, LabelRef.Trainrun).getId() + ); + const deletedLabelIds = this.labelService.clearLabel( this.findClearedLabel(trainrun, labelIds), this.makeLabelIDCounterMap(this.getTrainruns()), ); - this.filterService.clearDeletetFilterTrainrunLabels(deletetLabelIds); + this.filterService.clearDeletetFilterTrainrunLabels(deletedLabelIds); trainrun.setLabelIds(labelIds); this.trainrunsUpdated(); + if (uniqueLabels.length === labels.length) { + this.operation.emit(new TrainrunOperation(OperationType.update, trainrun)); + } } trainrunsUpdated() { @@ -558,48 +582,74 @@ export class TrainrunService { this.propagateConsecutiveTimesForTrainrun(ts.getId()); } + getBothEndNodesFromTrainrunPart(trainrunSection: TrainrunSection): + { + endNode1: Node; + endNode2: Node; + } { + const sourceNode = trainrunSection.getSourceNode(); + const targetNode = trainrunSection.getTargetNode(); + const endNode1 = this.getEndNode(sourceNode, trainrunSection); + const endNode2 = this.getEndNode(targetNode, trainrunSection); + return {endNode1, endNode2}; + } + propagateConsecutiveTimesForTrainrun(trainrunSectionId: number) { - const trainrunSection = + const inTrainrunSection = this.trainrunSectionService.getTrainrunSectionFromId(trainrunSectionId); - if (trainrunSection === undefined) { + if (inTrainrunSection === undefined) { return; } - // propagate Consecutive Times Forward - const bothEndNodes = this.getBothEndNodesWithTrainrunId( - trainrunSection.getTrainrunId(), - ); - const startForwardNode = GeneralViewFunctions.getLeftOrTopNode( - bothEndNodes.endNode1, - bothEndNodes.endNode2, - ); - const startBackwardNode = - bothEndNodes.endNode1.getId() === startForwardNode.getId() - ? bothEndNodes.endNode2 - : bothEndNodes.endNode1; - const arrivalTime = this.propagateConsecutiveTimes( - startForwardNode, - startForwardNode.getStartTrainrunSection( - trainrunSection.getTrainrunId(), - true - ), - trainrunSection.getFrequencyOffset(), - ); - // propagate Consecutive Times Backward - const freq = trainrunSection.getTrainrun().getTrainrunFrequency().frequency; - const restFreqArrivalTime = Math.floor(arrivalTime / freq) * freq; - const freqDependantArrivalTime = arrivalTime - restFreqArrivalTime; - let offset = freq - freqDependantArrivalTime; - offset += restFreqArrivalTime; - offset = Math.floor(offset / 60) * 60; - - this.propagateConsecutiveTimes( - startBackwardNode, - startBackwardNode.getStartTrainrunSection( - trainrunSection.getTrainrunId(), - false - ), - offset, - ); + + let alltrainrunsections = + this.trainrunSectionService + .getAllTrainrunSectionsForTrainrun(inTrainrunSection.getTrainrunId()); + + while (alltrainrunsections.length > 0) { + // propagate Consecutive Times Forward + const trainrunSection = alltrainrunsections[0]; + const bothEndNodes = + this.getBothEndNodesFromTrainrunPart(trainrunSection); + + const startForwardBackwardNode = + GeneralViewFunctions.getStartForwardAndBackwardNode( + bothEndNodes.endNode1, + bothEndNodes.endNode2, + ); + + const propDataForward = this.propagateConsecutiveTimes( + startForwardBackwardNode.startForwardNode, + startForwardBackwardNode.startForwardNode.getStartTrainrunSection( + trainrunSection.getTrainrunId(), + true + ), + trainrunSection.getFrequencyOffset(), + ); + const arrivalTime = propDataForward.cumTime; + + // propagate Consecutive Times Backward + const freq = trainrunSection.getTrainrun().getTrainrunFrequency().frequency; + const restFreqArrivalTime = Math.floor(arrivalTime / freq) * freq; + const freqDependantArrivalTime = arrivalTime - restFreqArrivalTime; + let offset = freq - freqDependantArrivalTime; + offset += restFreqArrivalTime; + offset = Math.floor(offset / 60) * 60; + + const propDataBackward = this.propagateConsecutiveTimes( + startForwardBackwardNode.startBackwardNode, + startForwardBackwardNode.startBackwardNode.getStartTrainrunSection( + trainrunSection.getTrainrunId(), + false + ), + offset, + ); + + // filter all still visited trainrun sections + alltrainrunsections = alltrainrunsections.filter(ts => + propDataForward.visitedTrainrunSections.indexOf(ts) === -1 && + propDataBackward.visitedTrainrunSections.indexOf(ts) === -1 + ); + } } getStartNodeWithTrainrunId(trainrunId: number): Node { @@ -756,17 +806,42 @@ export class TrainrunService { return new NonStopTrainrunIterator(this.logService, node, trainrunSection); } + // For each trainrun, get iterator from the smallest consecutiveTime. + public getRootIterators(): Map { + const trainrunSections = this.trainrunSectionService.getTrainrunSections(); + const iterators = new Map(); + const consecutiveTimes = new Map(); + trainrunSections.forEach((ts) => { + const trainrunId = ts.getTrainrunId(); + let node = ts.getSourceNode(); + if (node.isEndNode(ts)) { + const it = iterators.get(trainrunId); + const consecutiveTime = ts.getSourceDepartureDto().consecutiveTime; + if (it === undefined || consecutiveTimes.get(trainrunId) > consecutiveTime) { + iterators.set(trainrunId, this.getIterator(node, ts)); + consecutiveTimes.set(trainrunId, consecutiveTime); + } + } + node = ts.getTargetNode(); + if (node.isEndNode(ts)) { + const it = iterators.get(trainrunId); + const consecutiveTime = ts.getTargetDepartureDto().consecutiveTime; + if (it === undefined || consecutiveTimes.get(trainrunId) > consecutiveTime) { + iterators.set(trainrunId, this.getIterator(node, ts)); + consecutiveTimes.set(trainrunId, consecutiveTime); + } + } + }); + return iterators; + } + getBothEndNodesWithTrainrunId(trainrunId: number) { const trainrunSections: TrainrunSection[] = this.trainrunSectionService.getTrainrunSections(); const trainrunSection = trainrunSections.find( (trs) => trs.getTrainrunId() === trainrunId, ); - const sourceNode = trainrunSection.getSourceNode(); - const targetNode = trainrunSection.getTargetNode(); - const endNode1 = this.getEndNode(sourceNode, trainrunSection); - const endNode2 = this.getEndNode(targetNode, trainrunSection); - return {endNode1, endNode2}; + return this.getBothEndNodesFromTrainrunPart(trainrunSection); } private createNewTrainrunFromDto(trainrun: TrainrunDto): Trainrun { @@ -790,9 +865,16 @@ export class TrainrunService { node: Node, trainrunSection: TrainrunSection, offset: number, - ): number { + ): { + cumTime: number; + visitedTrainrunSections: TrainrunSection[]; + } { + const visitedTrainrunSections: TrainrunSection[] = [trainrunSection]; if (trainrunSection === undefined) { - return 0; + return { + cumTime: 0, + visitedTrainrunSections: visitedTrainrunSections + }; } let accumulatedTime = node.getDepartureTime(trainrunSection) + offset; const iterator = this.getIterator(node, trainrunSection); @@ -839,8 +921,12 @@ export class TrainrunService { : nextDeparture - oldArrival; } accumulatedTime += halteZeit; + visitedTrainrunSections.push(nextPair.trainrunSection); } - return accumulatedTime; + return { + cumTime: accumulatedTime, + visitedTrainrunSections: visitedTrainrunSections + }; } private findClearedLabel(trainrun: Trainrun, labelIds: number[]) { diff --git a/src/app/services/data/trainrunsection.service.ts b/src/app/services/data/trainrunsection.service.ts index 71299be6..3da71e2c 100644 --- a/src/app/services/data/trainrunsection.service.ts +++ b/src/app/services/data/trainrunsection.service.ts @@ -5,7 +5,7 @@ import { TrainrunSectionDto, } from "../../data-structures/business.data.structures"; import {Node} from "../../models/node.model"; -import {Injectable, OnDestroy} from "@angular/core"; +import {EventEmitter, Injectable, OnDestroy} from "@angular/core"; import {BehaviorSubject, Subject} from "rxjs"; import {TrainrunService} from "./trainrun.service"; import {NodeService} from "./node.service"; @@ -22,6 +22,11 @@ import {Transition} from "../../models/transition.model"; import {takeUntil} from "rxjs/operators"; import {FilterService} from "../ui/filter.service"; import {TrainrunSectionNodePair} from "../util/trainrun.iterator"; +import { + Operation, + OperationType, + TrainrunOperation, +} from "../../models/operation.model"; interface DepartureAndArrivalTimes { nodeFromDepartureTime: number; @@ -46,6 +51,8 @@ export class TrainrunSectionService implements OnDestroy { trainrunSections: [], }; // store the data in memory + readonly operation = new EventEmitter(); + informSelectedTrainrunClickSubject = new BehaviorSubject({ trainrunSectionId: undefined, @@ -70,11 +77,14 @@ export class TrainrunSectionService implements OnDestroy { }); } + static TIME_PRECISION = 10; + static computeArrivalAndDeparture( nodeArrival: number, trainrunSection: TrainrunSection, nonStop: boolean, halteZeiten: TrainrunCategoryHaltezeit, + precision: number = 10 ): DepartureAndArrivalTimes { let haltezeit = halteZeiten[ @@ -83,19 +93,19 @@ export class TrainrunSectionService implements OnDestroy { haltezeit = nonStop ? 0 : haltezeit; const fromDepartureTime = MathUtils.round( (nodeArrival + haltezeit) % 60, - 1, + precision, ); const fromArrivalTime = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(fromDepartureTime), - 1, + precision, ); const toArrivalTime = MathUtils.round( (fromDepartureTime + (trainrunSection.getTravelTime() % 60)) % 60, - 1, + precision, ); const toDepartureTime = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(toArrivalTime), - 1, + precision, ); return { @@ -158,6 +168,7 @@ export class TrainrunSectionService implements OnDestroy { trainrunSection, false, halteZeit, + TrainrunSectionService.TIME_PRECISION ); if (trainrunSection.getSourceNodeId() === nodeFrom.getId()) { @@ -191,11 +202,11 @@ export class TrainrunSectionService implements OnDestroy { // first or unconnected section - special case const targetArrivalTime = MathUtils.round( (trainrunSection.getSourceDeparture() + (trainrunSection.getTravelTime() % 60)) % 60, - 1, + TrainrunSectionService.TIME_PRECISION ); const targetDepartureTime = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(targetArrivalTime), - 1, + TrainrunSectionService.TIME_PRECISION ); trainrunSection.setTargetDeparture(targetDepartureTime); trainrunSection.setTargetArrival(targetArrivalTime); @@ -321,6 +332,7 @@ export class TrainrunSectionService implements OnDestroy { const trainrunSection = this.getTrainrunSectionFromId(trs.getId()); trainrunSection.setNumberOfStops(numberOfStops); this.trainrunSectionsUpdated(); + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSection.getTrainrun())); } updateTrainrunSectionTime( @@ -330,6 +342,7 @@ export class TrainrunSectionService implements OnDestroy { targetArrival: number, targetDeparture: number, travelTime: number, + emit: boolean = true ) { const trainrunSection = this.getTrainrunSectionFromId(trsId); trainrunSection.setSourceArrival(sourceArrivalTime); @@ -343,6 +356,9 @@ export class TrainrunSectionService implements OnDestroy { ); this.nodeService.validateConnections(trainrunSection.getSourceNode()); this.nodeService.validateConnections(trainrunSection.getTargetNode()); + if (emit) { + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSection.getTrainrun())); + } } private propagateTimeAlongTrainrunFixStartTrainrunSection( @@ -431,11 +447,11 @@ export class TrainrunSectionService implements OnDestroy { // ---------------------------------------------------------------------------------- const depTimeAtSource = MathUtils.round( (arrivalTimeAtSource + halteZeit) % 60, - 1, + TrainrunSectionService.TIME_PRECISION ); const arrTimeAtSource = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(depTimeAtSource), - 1, + TrainrunSectionService.TIME_PRECISION ); pair.trainrunSection.setSourceDeparture(depTimeAtSource); pair.trainrunSection.setSourceArrival(arrTimeAtSource); @@ -447,11 +463,11 @@ export class TrainrunSectionService implements OnDestroy { // Target is not locked -> update the Target Arrival Time const arrTimeAtTarget = MathUtils.round( (depTimeAtSource + pair.trainrunSection.getTravelTime()) % 60, - 1, + TrainrunSectionService.TIME_PRECISION ); const depTimeAtTarget = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(arrTimeAtTarget), - 1, + TrainrunSectionService.TIME_PRECISION ); pair.trainrunSection.setTargetArrival(arrTimeAtTarget); pair.trainrunSection.setTargetDeparture(depTimeAtTarget); @@ -505,11 +521,11 @@ export class TrainrunSectionService implements OnDestroy { // ---------------------------------------------------------------------------------- const depTimeAtTarget = MathUtils.round( (arrivalTimeAtTarget + halteZeit) % 60, - 1, + TrainrunSectionService.TIME_PRECISION ); const arrTimeAtTarget = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(depTimeAtTarget), - 1, + TrainrunSectionService.TIME_PRECISION ); pair.trainrunSection.setTargetDeparture(depTimeAtTarget); pair.trainrunSection.setTargetArrival(arrTimeAtTarget); @@ -521,11 +537,11 @@ export class TrainrunSectionService implements OnDestroy { // Target is not locked -> update the Target Arrival Time const arrTimeAtSource = MathUtils.round( (depTimeAtTarget + pair.trainrunSection.getTravelTime()) % 60, - 1, + TrainrunSectionService.TIME_PRECISION ); const depTimeAtSource = MathUtils.round( TrainrunsectionHelper.getSymmetricTime(arrTimeAtSource), - 1, + TrainrunSectionService.TIME_PRECISION ); pair.trainrunSection.setSourceArrival(arrTimeAtSource); pair.trainrunSection.setSourceDeparture(depTimeAtSource); @@ -576,6 +592,7 @@ export class TrainrunSectionService implements OnDestroy { pair.trainrunSection, isNonStop, halteZeit, + TrainrunSectionService.TIME_PRECISION ); if ( @@ -668,6 +685,8 @@ export class TrainrunSectionService implements OnDestroy { createTrainrunSection(sourceNodeId: number, targetNodeId: number, retrieveTravelTimeFromEdge: boolean = false) { const trainrunSection: TrainrunSection = new TrainrunSection(); + const initialTrainrunsLength = this.trainrunService.trainrunsStore.trainruns.length; + trainrunSection.setTrainrun( this.trainrunService.getSelectedOrNewTrainrun(), ); @@ -678,8 +697,27 @@ export class TrainrunSectionService implements OnDestroy { ); } - const sourceNode = this.nodeService.getNodeFromId(sourceNodeId); - const targetNode = this.nodeService.getNodeFromId(targetNodeId); + let sourceNode = this.nodeService.getNodeFromId(sourceNodeId); + let targetNode = this.nodeService.getNodeFromId(targetNodeId); + + // Enforce [source → target] [source → target] sections, disallow + // [source → target] [target → source] and [target → source] [source → target] + const isUpdate = this.trainrunSectionsStore.trainrunSections.some((s) => + trainrunSection.getTrainrunId() === s.getTrainrunId() + ); + if (isUpdate) { + const { + endNode1: trainrunTargetNode, + endNode2: trainrunSourceNode + } = this.trainrunService.getBothEndNodesWithTrainrunId( + trainrunSection.getTrainrunId() + ); + if (sourceNode.getId() === trainrunSourceNode.getId() || + targetNode.getId() === trainrunTargetNode.getId()) { + [sourceNode, targetNode] = [targetNode, sourceNode]; + } + } + trainrunSection.setSourceAndTargetNodeReference(sourceNode, targetNode); this.trainrunSectionsStore.trainrunSections.push(trainrunSection); this.logger.log( @@ -698,6 +736,12 @@ export class TrainrunSectionService implements OnDestroy { this.propagateTimesForNewTrainrunSection(trainrunSection); //this.trainrunSectionsUpdated(); this.trainrunService.trainrunsUpdated(); + + if (initialTrainrunsLength !== this.trainrunService.trainrunsStore.trainruns.length) { + this.operation.emit(new TrainrunOperation(OperationType.create, trainrunSection.getTrainrun())); + } else { + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSection.getTrainrun())); + } } reconnectTrainrunSection( @@ -786,33 +830,49 @@ export class TrainrunSectionService implements OnDestroy { this.nodeService.transitionsUpdated(); this.trainrunSectionsUpdated(); } + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSection.getTrainrun())); } - deleteListOfTrainrunSections(trainrunSections: TrainrunSection[]) { + deleteListOfTrainrunSections(trainrunSections: TrainrunSection[], enforceUpdate = true) { trainrunSections.forEach((trainrunSection) => { - this.deleteTrainrunSectionAndCleanupNodes(trainrunSection); + this.deleteTrainrunSectionAndCleanupNodes(trainrunSection, false); }); - this.trainrunSectionsUpdated(); + if (enforceUpdate) { + this.nodeService.transitionsUpdated(); + this.nodeService.connectionsUpdated(); + this.trainrunService.trainrunsUpdated(); + this.trainrunSectionsUpdated(); + } } - deleteAllVisibleTrainrunSections() { + deleteAllVisibleTrainrunSections(enforceUpdate = true) { const allTrainrunSections = this.trainrunSectionsStore.trainrunSections; allTrainrunSections.forEach((trainrunSection: TrainrunSection) => { if (this.filterService.filterTrainrunsection(trainrunSection)) { - this.deleteTrainrunSectionAndCleanupNodes(trainrunSection); + this.deleteTrainrunSectionAndCleanupNodes(trainrunSection, false); } }); - this.trainrunSectionsUpdated(); + if (enforceUpdate){ + this.nodeService.transitionsUpdated(); + this.nodeService.connectionsUpdated(); + this.trainrunService.trainrunsUpdated(); + this.trainrunSectionsUpdated(); + } } - deleteAllNonVisibleTrainrunSections() { + deleteAllNonVisibleTrainrunSections(enforceUpdate = true) { const allTrainrunSections = this.trainrunSectionsStore.trainrunSections; allTrainrunSections.forEach((trainrunSection: TrainrunSection) => { if (!this.filterService.filterTrainrunsection(trainrunSection)) { - this.deleteTrainrunSectionAndCleanupNodes(trainrunSection); + this.deleteTrainrunSectionAndCleanupNodes(trainrunSection, false); } }); - this.trainrunSectionsUpdated(); + if (enforceUpdate) { + this.nodeService.transitionsUpdated(); + this.nodeService.connectionsUpdated(); + this.trainrunService.trainrunsUpdated(); + this.trainrunSectionsUpdated(); + } } deleteTrainrunSection(trainrunSectionId: number, enforceUpdate = true) { @@ -841,6 +901,9 @@ export class TrainrunSectionService implements OnDestroy { this.nodeService.connectionsUpdated(); this.trainrunSectionsUpdated(); } + if (this.getTrainrunSections().length) { + this.operation.emit(new TrainrunOperation(OperationType.update, trainrunSection.getTrainrun())); + } } getDtos() { @@ -886,7 +949,7 @@ export class TrainrunSectionService implements OnDestroy { const oldTotalTravelTime = this.trainrunService.getCumulativeTravelTime(trainrunSection); - const travelTimeFactor = newTotalTravelTime / oldTotalTravelTime; + const travelTimeFactor = newTotalTravelTime / (oldTotalTravelTime || 1); // prepare data structure for the first trainrunsection const bothLastNonStopNodes = @@ -1103,24 +1166,12 @@ export class TrainrunSectionService implements OnDestroy { origTravelTime || travelTimeIssue ) { - const description = - "Zwischenhalteumwandlung führte bei der Vergabe der Zeiten zu inkonsistenzen!"; - trainrunSection1.setTargetArrivalWarning( - "Zwischenhalteumwandlung", - description, - ); - trainrunSection1.setTargetDepartureWarning( - "Zwischenhalteumwandlung", - description, - ); - trainrunSection2.setSourceArrivalWarning( - "Zwischenhalteumwandlung", - description, - ); - trainrunSection2.setSourceDepartureWarning( - "Zwischenhalteumwandlung", - description, - ); + const title = $localize`:@@app.services.data.trainrunsection.intermediate-stop-replacement.title:Intermediate stop replacement`; + const description = $localize`:@@app.services.data.trainrunsection.intermediate-stop-replacement.description:Intermediate stop replacement led to inconsistencies in the allocation of times!`; + trainrunSection1.setTargetArrivalWarning(title, description); + trainrunSection1.setTargetDepartureWarning(title, description); + trainrunSection2.setSourceArrivalWarning(title, description); + trainrunSection2.setSourceDepartureWarning(title, description); } const transitionNew1 = node1.getTransition(trainrunSection1.getId()); diff --git a/src/app/services/data/undo.service.ts b/src/app/services/data/undo.service.ts index 492d4a56..2afce25f 100644 --- a/src/app/services/data/undo.service.ts +++ b/src/app/services/data/undo.service.ts @@ -128,4 +128,8 @@ export class UndoService implements OnDestroy { } this.currentVariantId = variantId; } + + public getCurrentVariantId():number{ + return this.currentVariantId; + } } diff --git a/src/app/services/data/version-control.service.ts b/src/app/services/data/version-control.service.ts index 8c266712..621d8e41 100644 --- a/src/app/services/data/version-control.service.ts +++ b/src/app/services/data/version-control.service.ts @@ -13,6 +13,7 @@ import {AutoSaveService} from "./auto-save.service"; import {LogService} from "../../logger/log.service"; import {VersionId} from "../../view/variant/variant-view/variant-history/model"; import {UndoService} from "./undo.service"; +import {environment} from "../../../environments/environment"; @Injectable({ providedIn: "root", @@ -26,6 +27,9 @@ export class VersionControlService implements OnDestroy { private readonly destroyed = new Subject(); + private previousVariantDto: VariantDto = undefined; + private variantChanged = false; + constructor( private readonly variantsBackendService: VariantControllerBackendService, private readonly versionsBackendService: VersionControllerBackendService, @@ -34,15 +38,17 @@ export class VersionControlService implements OnDestroy { private readonly undoService: UndoService, private readonly logService: LogService, ) { - autoSaveService.autosaveTrigger$ - .pipe( - takeUntil(this.destroyed), - filter(() => this.variant.isWritable), - ) - .subscribe(() => { - logService.debug("auto saving changes"); - this.createSnapshot(); - }); + if (!environment.disableBackend) { + autoSaveService.autosaveTrigger$ + .pipe( + takeUntil(this.destroyed), + filter(() => this.variant.isWritable), + ) + .subscribe(() => { + logService.debug("auto saving changes"); + this.createSnapshot(); + }); + } } get variant(): VariantDto { @@ -59,6 +65,7 @@ export class VersionControlService implements OnDestroy { .getVariant(variantId) .pipe(takeUntil(this.destroyed)) .subscribe((variant) => { + this.updateVarianteChangedInfo(variant); this.variantSubject.next(variant); if (loadModel) { this.loadModel(variant.latestVersion); @@ -69,10 +76,23 @@ export class VersionControlService implements OnDestroy { }); } + loadNetzgrafikDTO(netzgrafik: NetzgrafikDto) { + this.dataService.loadNetzgrafikDto(netzgrafik); + this.autoSaveService.reset(); + this.undoService.reset(this.undoService.getCurrentVariantId() + 1); + } + reload(loadModel = false): void { this.load(this.variant.id, loadModel); } + getVariantIsWritable(): boolean { + if (this.variant === null) { + return true; + } + return this.variant.isWritable; + } + createSnapshot(newName?: string): void { const name = newName || this.variant.latestVersion.name; this.versionsBackendService @@ -169,4 +189,24 @@ export class VersionControlService implements OnDestroy { .deleteVariant(this.variant.id) .pipe(map(() => null)); } + + getAndClearVarianteChangedSignal(): boolean { + const retVal = this.variantChanged; + this.variantChanged = false; + return retVal; + } + + private updateVarianteChangedInfo(variant: VariantDto) { + if (variant === null) { + return; + } + if (this.previousVariantDto === undefined) { + this.previousVariantDto = variant; + this.variantChanged = true; + return; + } + this.variantChanged = this.previousVariantDto.projectId !== variant.projectId && + this.previousVariantDto.id !== variant.id; + this.previousVariantDto = variant; + } } diff --git a/src/app/services/ui/filter.service.ts b/src/app/services/ui/filter.service.ts index 2e9bda05..4d0d132e 100644 --- a/src/app/services/ui/filter.service.ts +++ b/src/app/services/ui/filter.service.ts @@ -129,7 +129,7 @@ export class FilterService implements OnDestroy { const fs = this.activeFilterSetting.copy(); this.filterSettingStore.filterSettings.push(fs); this.activateFilterSetting(fs.getId()); - this.setActiveFilterSettingName("Neuer Filter", fs.getId()); + this.setActiveFilterSettingName($localize`:@@app.services.ui.newFilter:New filter`, fs.getId()); this.filterSettingUpdated(); return fs; } diff --git a/src/app/services/ui/ui.interaction.service.ts b/src/app/services/ui/ui.interaction.service.ts index 2174c6c2..80773b0d 100644 --- a/src/app/services/ui/ui.interaction.service.ts +++ b/src/app/services/ui/ui.interaction.service.ts @@ -135,6 +135,16 @@ export class UiInteractionService implements OnDestroy { private loadPerlenketteService: LoadPerlenketteService, ) { this.activeTheme = null; + this.loadActiveTheme(); + + // listen for browser setting update + window + .matchMedia("(prefers-color-scheme: dark)") + .addEventListener("change", event => { + this.activeTheme = null; + this.loadActiveTheme(); + }); + this.activeStreckengrafikRenderingType = null; this.activeTravelTimeCreationEstimatorType = null; @@ -207,10 +217,33 @@ export class UiInteractionService implements OnDestroy { this.windowViewboxPropertiesMap[key] = Object.assign({}, viewboxProperties); } + isLocalStoredColorTheme() { + const serializedState = localStorage.getItem("UiInteractionService"); + if ( + serializedState === null || + serializedState === undefined || + serializedState === "undefined" + ) { + return false; + } + return true; + } + + resetLocalStoredColorData() { + localStorage.removeItem("UiInteractionService"); + this.activeTheme = null; + this.loadActiveTheme(); + } + loadActiveTheme() { this.loadUserSettingFromLocalStorage(); if (this.activeTheme === null) { - this.activeTheme = new ThemeFach(); + // detect at initialization + if (false && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { + this.setActiveTheme(new ThemeFachDark(), false); + } else { + this.setActiveTheme(new ThemeFach(), false); + } this.netzgrafikColoringService.setDarkMode(this.activeTheme.isDark); } if (this.activeStreckengrafikRenderingType === null) { @@ -322,6 +355,14 @@ export class UiInteractionService implements OnDestroy { this.moveNetzgrafikEditorViewFocalPointSubject.next(center); } + viewportCenteringOnNodesBoundingBox() { + const bb = this.nodeService.getNetzgrafikBoundingBox(); + const center = new Vec2D( + (bb.minCoordX + bb.maxCoordX) / 2.0, + (bb.minCoordY + bb.maxCoordY) / 2.0 + ); + this.moveNetzgrafikEditorFocalViewPoint(center); + } showOrCloseFilter(type: FilterWindowType) { if (this.isFilterWindowType(type)) { this.closeFilter(); @@ -399,7 +440,7 @@ export class UiInteractionService implements OnDestroy { return this.editorMode; } - disableMultiSelectedNodesCorridor(){ + disableMultiSelectedNodesCorridor() { this.isMultiSelectedNodesCorridor = false; } @@ -407,14 +448,24 @@ export class UiInteractionService implements OnDestroy { this.isMultiSelectedNodesCorridor = true; } - isMultiSelectedNodesCorridorEnabled(){ + isMultiSelectedNodesCorridorEnabled() { return this.isMultiSelectedNodesCorridor; } - private setActiveTheme(theme: ThemeBase) { + private setActiveTheme(theme: ThemeBase, updateLocalStorage = true) { this.activeTheme = theme; this.netzgrafikColoringService.setDarkMode(this.activeTheme.isDark); - this.saveUserSettingToLocalStorage(); + if (updateLocalStorage) { + this.saveUserSettingToLocalStorage(); + } + this.updateLightDark(); + } + + updateLightDark() { + const el = document.getElementById("NetzgrafikRootHtml"); + if (el) { + el.className = "sbb-lean" + (this.getActiveTheme().isDark ? " sbb-dark" : " sbb-light"); + } } private loadUserSettingFromLocalStorage() { @@ -428,7 +479,6 @@ export class UiInteractionService implements OnDestroy { return; } const localStoredInfo = JSON.parse(serializedState); - console.log(localStoredInfo); const activeTheme = localStoredInfo.activeTheme; this.createTheme( activeTheme.themeRegistration, diff --git a/src/app/services/util/connection.validator.ts b/src/app/services/util/connection.validator.ts index fda99447..c4d9adf2 100644 --- a/src/app/services/util/connection.validator.ts +++ b/src/app/services/util/connection.validator.ts @@ -29,8 +29,8 @@ export class ConnectionValidator { if (nonStopConnectionError) { connection.setWarning( - "Anschluss auf Durchfahrt gezeichnet!", - "Anschluss auf Durchfahrt gezeichnet!", + $localize`:@@app.services.util.connection-validator.connection-marked-for-transit.title:Connection marked for transition!`, + $localize`:@@app.services.util.connection-validator.connection-marked-for-transit.description:Connection marked for transition!` ); } else { connection.resetWarning(); diff --git a/src/app/services/util/trainrun.iterator.ts b/src/app/services/util/trainrun.iterator.ts index 045dd1e1..bafebaa6 100644 --- a/src/app/services/util/trainrun.iterator.ts +++ b/src/app/services/util/trainrun.iterator.ts @@ -58,7 +58,7 @@ export class TrainrunIterator { this.pointerElement = new TrainrunSectionNodePair(undefined, undefined); // log the issue this.logService.error( - "Iterator has detected an infinity loop. The iteration terminated early!", + $localize`:@@app.services.util.trainrun-iteration.error.infinity-loop:Iterator has detected an infinity loop. The iteration terminated early!`, new Error().stack, ); return this.currentElement; diff --git a/src/app/services/util/trainrunsection.helper.spec.ts b/src/app/services/util/trainrunsection.helper.spec.ts index a7c04a79..0f66978d 100644 --- a/src/app/services/util/trainrunsection.helper.spec.ts +++ b/src/app/services/util/trainrunsection.helper.spec.ts @@ -109,22 +109,22 @@ describe("TrainrunsectionHelper", () => { }); it("getTravelTime -- 001", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false); + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false, 0); expect(tt).toBe(1); }); it("getTravelTime -- 002", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, true); + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, true, 0); expect(tt).toBe(12); }); it("getTravelTime -- 003", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false); + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false, 0); expect(tt).toBe(1); }); it("getTravelTime -- 004", () => { - const tt = TrainrunsectionHelper.getTravelTime(8, 10, 2, 12, false); + const tt = TrainrunsectionHelper.getTravelTime(8, 10, 2, 12, false, 0); expect(tt).toBe(1); }); @@ -226,23 +226,23 @@ describe("TrainrunsectionHelper", () => { expect(d.leftArrivalTime).toBe(larts.leftArrivalTime); }); - it("getTravelTime -- 001", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false); + it("getTravelTime -- 2 -- 001", () => { + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false, 0); expect(tt).toBe(1); }); - it("getTravelTime -- 002", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, true); + it("getTravelTime -- 2 -- 002", () => { + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, true, 0); expect(tt).toBe(12); }); - it("getTravelTime -- 003", () => { - const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false); + it("getTravelTime -- 2 -- 003", () => { + const tt = TrainrunsectionHelper.getTravelTime(10, 10, 1, 12, false, 0); expect(tt).toBe(1); }); - it("getTravelTime -- 004", () => { - const tt = TrainrunsectionHelper.getTravelTime(8, 10, 2, 12, false); + it("getTravelTime -- 2 -- 004", () => { + const tt = TrainrunsectionHelper.getTravelTime(8, 10, 2, 12, false, 0); expect(tt).toBe(1); }); diff --git a/src/app/services/util/trainrunsection.helper.ts b/src/app/services/util/trainrunsection.helper.ts index f0c0a91f..9942cfc4 100644 --- a/src/app/services/util/trainrunsection.helper.ts +++ b/src/app/services/util/trainrunsection.helper.ts @@ -8,6 +8,7 @@ import { import {MathUtils} from "../../utils/math"; import {TrainrunSectionText} from "../../data-structures/technical.data.structures"; import {TrainrunService} from "../data/trainrun.service"; +import {TrainrunSectionService} from "../data/trainrunsection.service"; export enum LeftAndRightElement { LeftDeparture, @@ -45,10 +46,10 @@ export class TrainrunsectionHelper { travelTimeFactor: number, trsTravelTime: number, isRightNodeNonStopTransit: boolean, - precision = 0 + precision = TrainrunSectionService.TIME_PRECISION ): number { if (isRightNodeNonStopTransit) { - return Math.max(MathUtils.round(trsTravelTime * travelTimeFactor, 0), + return Math.max(MathUtils.round(trsTravelTime * travelTimeFactor, precision), 1.0 / Math.pow(10, precision)); } else { return Math.max( @@ -60,21 +61,21 @@ export class TrainrunsectionHelper { static getRightArrivalTime( timeStructure: LeftAndRightTimeStructure, - precision = 0 + precision = TrainrunSectionService.TIME_PRECISION ): number { return MathUtils.round( (timeStructure.leftDepartureTime + (timeStructure.travelTime % 60)) % 60, - precision, + precision ); } static getRightDepartureTime( timeStructure: LeftAndRightTimeStructure, - precision = 0 + precision = TrainrunSectionService.TIME_PRECISION ): number { return MathUtils.round( this.getSymmetricTime(timeStructure.rightArrivalTime), - precision, + precision ); } @@ -103,14 +104,14 @@ export class TrainrunsectionHelper { getLeftRightSections(trainrunSection: TrainrunSection) { const bothLastNonStopTransitNodes = this.trainrunService.getBothLastNonStopNodes(trainrunSection); - const lastLeftNode = GeneralViewFunctions.getLeftOrTopNode( - bothLastNonStopTransitNodes.lastNonStopNode1, - bothLastNonStopTransitNodes.lastNonStopNode2, - ); - const lastRightNode = - lastLeftNode.getId() === bothLastNonStopTransitNodes.lastNonStopNode1.getId() ? - bothLastNonStopTransitNodes.lastNonStopNode2 : - bothLastNonStopTransitNodes.lastNonStopNode1; + + const startForwardBackwardNode = + GeneralViewFunctions.getStartForwardAndBackwardNode( + bothLastNonStopTransitNodes.lastNonStopNode1, + bothLastNonStopTransitNodes.lastNonStopNode2, + ); + const lastLeftNode = startForwardBackwardNode.startForwardNode; + const lastRightNode = startForwardBackwardNode.startBackwardNode; const towardsSource = this.trainrunService.getLastNonStopTrainrunSection( @@ -302,7 +303,7 @@ export class TrainrunsectionHelper { leftArrivalTime: lastLeftNode.getArrivalTime(leftTrainrunSection), rightDepartureTime: lastRightNode.getDepartureTime(rightTrainrunSection), rightArrivalTime: lastRightNode.getArrivalTime(rightTrainrunSection), - travelTime: cumulativeTravelTime, + travelTime: cumulativeTravelTime || null, }; } @@ -320,10 +321,11 @@ export class TrainrunsectionHelper { ) !== undefined; let leftNode; if (!bothNodesFound) { - leftNode = GeneralViewFunctions.getLeftOrTopNode( + /*leftNode = GeneralViewFunctions.getLeftOrTopNode( bothLastNonStopNodes.lastNonStopNode1, bothLastNonStopNodes.lastNonStopNode2, - ); + );*/ + leftNode = bothLastNonStopNodes.lastNonStopNode2; } else { leftNode = GeneralViewFunctions.getLeftNodeAccordingToOrder( orderedNodes, @@ -348,10 +350,11 @@ export class TrainrunsectionHelper { ) !== undefined; let rightNode; if (!bothNodesFound) { - rightNode = GeneralViewFunctions.getRightOrBottomNode( + /*rightNode = GeneralViewFunctions.getRightOrBottomNode( bothLastNonStopNodes.lastNonStopNode1, bothLastNonStopNodes.lastNonStopNode2, - ); + );*/ + rightNode = bothLastNonStopNodes.lastNonStopNode1; } else { rightNode = GeneralViewFunctions.getRightNodeAccordingToOrder( orderedNodes, diff --git a/src/app/services/util/trainrunsection.validator.ts b/src/app/services/util/trainrunsection.validator.ts index 8c25a014..3fd32912 100644 --- a/src/app/services/util/trainrunsection.validator.ts +++ b/src/app/services/util/trainrunsection.validator.ts @@ -1,40 +1,66 @@ import {TrainrunSection} from "../../models/trainrunsection.model"; +import {MathUtils} from "../../utils/math"; export class TrainrunsectionValidator { static validateOneSection(trainrunSection: TrainrunSection) { trainrunSection.resetSourceDepartureWarning(); trainrunSection.resetTargetDepartureWarning(); + TrainrunsectionValidator.validateTravelTimeOneSection(trainrunSection); + TrainrunsectionValidator.validateUnsymmetricTimesOneSection(trainrunSection); + } + + static validateTravelTimeOneSection(trainrunSection: TrainrunSection) { const calculatedTargetArrivalTime = - (trainrunSection.getSourceDeparture() + trainrunSection.getTravelTime()) % - 60; - if (calculatedTargetArrivalTime !== trainrunSection.getTargetArrival()) { + (trainrunSection.getSourceDeparture() + trainrunSection.getTravelTime()) % 60; + if (Math.abs(calculatedTargetArrivalTime - trainrunSection.getTargetArrival()) > 1 / 60) { trainrunSection.setTargetArrivalWarning( - "Target Arrival Warning", - "Target arrival time cannot be reached", + $localize`:@@app.services.util.trainrunsection-validator.target-arrival-not-reacheable.title:Target Arrival Warning`, + $localize`:@@app.services.util.trainrunsection-validator.target-arrival-not-reacheable.description:Target arrival time cannot be reached`, ); } else { trainrunSection.resetTargetArrivalWarning(); } const calculatedSourceArrivalTime = - (trainrunSection.getTargetDeparture() + trainrunSection.getTravelTime()) % - 60; - if (calculatedSourceArrivalTime !== trainrunSection.getSourceArrival()) { + (trainrunSection.getTargetDeparture() + trainrunSection.getTravelTime()) % 60; + if (Math.abs(calculatedSourceArrivalTime - trainrunSection.getSourceArrival()) > 1 / 60) { trainrunSection.setSourceArrivalWarning( - "Source Arrival Warning", - "Target arrival time cannot be reached", + $localize`:@@app.services.util.trainrunsection-validator.source-arrival-not-reacheable.title:Source Arrival Warning`, + $localize`:@@app.services.util.trainrunsection-validator.source-arrival-not-reacheable.description:Source arrival time cannot be reached`, ); } else { trainrunSection.resetSourceArrivalWarning(); } } + static validateUnsymmetricTimesOneSection(trainrunSection: TrainrunSection) { + // check for broken symmetry (times) + trainrunSection.resetSourceDepartureWarning(); + trainrunSection.resetTargetDepartureWarning(); + const sourceSum = MathUtils.round(trainrunSection.getSourceArrival() + trainrunSection.getSourceDeparture(), 4); + const sourceSymmetricCheck = Math.abs(sourceSum % 60) < 1 / 60; + if (!sourceSymmetricCheck) { + trainrunSection.setSourceArrivalWarning($localize`:@@app.services.util.trainrunsection-validator.broken-symmetry:Broken symmetry`, + "" + (trainrunSection.getSourceArrival() + " + " + trainrunSection.getSourceDeparture()) + " = " + sourceSum); + trainrunSection.setSourceDepartureWarning($localize`:@@app.services.util.trainrunsection-validator.broken-symmetry:Broken symmetry`, + "" + (trainrunSection.getSourceArrival() + " + " + trainrunSection.getSourceDeparture()) + " = " + sourceSum); + } + const targetSum = MathUtils.round(trainrunSection.getTargetArrival() + trainrunSection.getTargetDeparture(), 4); + const targetSymmetricCheck = Math.abs(targetSum % 60) < 1 / 60; + if (!targetSymmetricCheck) { + trainrunSection.setTargetArrivalWarning($localize`:@@app.services.util.trainrunsection-validator.broken-symmetry:Broken symmetry`, + "" + (trainrunSection.getTargetArrival() + " + " + trainrunSection.getTargetDeparture()) + " = " + targetSum); + trainrunSection.setTargetDepartureWarning($localize`:@@app.services.util.trainrunsection-validator.broken-symmetry:Broken symmetry`, + "" + (trainrunSection.getTargetArrival() + " + " + trainrunSection.getTargetDeparture()) + " = " + targetSum); + } + } + static validateTravelTime(trainrunSection: TrainrunSection) { if (trainrunSection.getTravelTime() < 1) { trainrunSection.setTravelTimeWarning( - "Travel Time Warning", - "Travel time must be greater-equal than 1", + $localize`:@@app.services.util.trainrunsection-validator.travel-time-less-than-1.title:Travel Time less than 1`, + $localize`:@@app.services.util.trainrunsection-validator.travel-time-less-than-1.description:Travel time must be greater than or equal to 1`, ); } else { trainrunSection.resetTravelTimeWarning(); diff --git a/src/app/services/util/transition.validator.spec.ts b/src/app/services/util/transition.validator.spec.ts index 1b26244b..a90efb83 100644 --- a/src/app/services/util/transition.validator.spec.ts +++ b/src/app/services/util/transition.validator.spec.ts @@ -184,16 +184,16 @@ describe("TransitionValidator", () => { nodeHaltezeiten[ trainrunSections.trainrunSection1.getTrainrun().getTrainrunCategory() .fachCategory - ].haltezeit; + ].haltezeit; trainrunSections.trainrunSection2.setSourceDeparture( trainrunSections.trainrunSection1.getSourceArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection2.setTargetDeparture( trainrunSections.trainrunSection1.getTargetArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.resetTargetArrivalWarning(); @@ -276,16 +276,16 @@ describe("TransitionValidator", () => { nodeHaltezeiten[ trainrunSections.trainrunSection2.getTrainrun().getTrainrunCategory() .fachCategory - ].haltezeit; + ].haltezeit; trainrunSections.trainrunSection1.setSourceDeparture( trainrunSections.trainrunSection2.getSourceArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.setTargetDeparture( trainrunSections.trainrunSection2.getTargetArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.resetTargetArrivalWarning(); @@ -386,16 +386,16 @@ describe("TransitionValidator", () => { nodeHaltezeiten[ trainrunSections.trainrunSection2.getTrainrun().getTrainrunCategory() .fachCategory - ].haltezeit; + ].haltezeit; trainrunSections.trainrunSection1.setSourceDeparture( trainrunSections.trainrunSection2.getSourceArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.setTargetDeparture( trainrunSections.trainrunSection2.getTargetArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.resetTargetArrivalWarning(); @@ -496,16 +496,16 @@ describe("TransitionValidator", () => { nodeHaltezeiten[ trainrunSections.trainrunSection2.getTrainrun().getTrainrunCategory() .fachCategory - ].haltezeit; + ].haltezeit; trainrunSections.trainrunSection1.setSourceDeparture( trainrunSections.trainrunSection2.getSourceArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.setTargetDeparture( trainrunSections.trainrunSection2.getTargetArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.resetTargetArrivalWarning(); @@ -606,16 +606,16 @@ describe("TransitionValidator", () => { nodeHaltezeiten[ trainrunSections.trainrunSection2.getTrainrun().getTrainrunCategory() .fachCategory - ].haltezeit; + ].haltezeit; trainrunSections.trainrunSection1.setSourceDeparture( trainrunSections.trainrunSection2.getSourceArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection2.setTargetDeparture( trainrunSections.trainrunSection1.getTargetArrival() - - trainrunHaltezeit - - 1, + trainrunHaltezeit - + 1, ); trainrunSections.trainrunSection1.resetTargetArrivalWarning(); @@ -682,4 +682,15 @@ describe("TransitionValidator", () => { false, ); }); + + it("Validate Test - 007", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTesting.getUnitTestNetzgrafik(), + ); + const ts1 = trainrunSectionService.getTrainrunSectionFromId(4); + ts1.setSourceDeparture((ts1.getSourceDeparture() + 1) % 60); + const a = ts1.getSourceArrival(); + const b = ts1.getSourceDeparture(); + expect(ts1.getSourceArrivalWarning().description).toBe("" + a + " + " + b + " = " + (a + b)); + }); }); diff --git a/src/app/services/util/transition.validator.ts b/src/app/services/util/transition.validator.ts index 7f5fb703..cd74aff1 100644 --- a/src/app/services/util/transition.validator.ts +++ b/src/app/services/util/transition.validator.ts @@ -36,42 +36,42 @@ export class TransitionValidator { trainrunSections.trainrunSection1.getSourceNodeId() === node.getId() ) { trainrunSections.trainrunSection1.setSourceArrivalWarning( - "Source Arrival Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.source-arrival-not-reacheable.title:Source Arrival Warning`, + $localize`:@@app.services.util.transition-validator.source-arrival-not-reacheable.description:Source arrival time cannot be reached`, ); trainrunSections.trainrunSection1.setSourceDepartureWarning( - "Source Departure Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.source-departure-not-reacheable.title:Source Departure Warning`, + $localize`:@@app.services.util.transition-validator.source-departure-not-reacheable.description:Source departure time cannot be reached`, ); } else { trainrunSections.trainrunSection1.setTargetArrivalWarning( - "Target Arrival Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.target-arrival-not-reacheable.title:Target Arrival Warning`, + $localize`:@@app.services.util.transition-validator.target-arrival-not-reacheable.description:Target arrival time cannot be reached`, ); trainrunSections.trainrunSection1.setTargetDepartureWarning( - "Target Departure Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.target-departure-not-reacheable.title:Target Departure Warning`, + $localize`:@@app.services.util.transition-validator.target-departure-not-reacheable.description:Target departure time cannot be reached`, ); } if ( trainrunSections.trainrunSection2.getSourceNodeId() === node.getId() ) { trainrunSections.trainrunSection2.setSourceArrivalWarning( - "Source Arrival Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.source-arrival-not-reacheable.title:Source Arrival Warning`, + $localize`:@@app.services.util.transition-validator.source-arrival-not-reacheable.description:Source arrival time cannot be reached`, ); trainrunSections.trainrunSection2.setSourceDepartureWarning( - "Source Departure Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.source-departure-not-reacheable.title:Source Departure Warning`, + $localize`:@@app.services.util.transition-validator.source-departure-not-reacheable.description:Source departure time cannot be reached`, ); } else { trainrunSections.trainrunSection2.setTargetArrivalWarning( - "Target Arrival Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.target-arrival-not-reacheable.title:Target Arrival Warning`, + $localize`:@@app.services.util.transition-validator.target-arrival-not-reacheable.description:Target arrival time cannot be reached`, ); trainrunSections.trainrunSection2.setTargetDepartureWarning( - "Target Departure Warning", - "Time cannot be reached", + $localize`:@@app.services.util.transition-validator.target-departure-not-reacheable.title:Target Departure Warning`, + $localize`:@@app.services.util.transition-validator.target-departure-not-reacheable.description:Target departure time cannot be reached`, ); } } else { diff --git a/src/app/streckengrafik/components/streckengrafik.component.html b/src/app/streckengrafik/components/streckengrafik.component.html index 0cce5300..d98d5646 100644 --- a/src/app/streckengrafik/components/streckengrafik.component.html +++ b/src/app/streckengrafik/components/streckengrafik.component.html @@ -8,7 +8,7 @@
@@ -25,7 +25,7 @@ @@ -151,37 +151,37 @@
diff --git a/src/app/streckengrafik/components/streckengrafik.component.ts b/src/app/streckengrafik/components/streckengrafik.component.ts index 05e52a8b..2cf4e930 100644 --- a/src/app/streckengrafik/components/streckengrafik.component.ts +++ b/src/app/streckengrafik/components/streckengrafik.component.ts @@ -149,36 +149,36 @@ export class StreckengrafikComponent return this.streckengrafikDisplayElementService.isRailTrackSliderVisible(); } - getRailTrackliderButtonText(): string { + getRailTrackSliderButtonText(): string { if (!this.streckengrafikDisplayElementService.isRailTrackSliderVisible()) { - return "\u{2610} Streckengleis"; + return `\u{2610} ${$localize`:@@app.streckengrafik.components.rail-track-slider:Rail track slider`}`; } - return "\u{2611} Streckengleis"; + return `\u{2611} ${$localize`:@@app.streckengrafik.components.rail-track-slider:Rail track slider`}`; } getHeadwayBandButtonText(): string { if (!this.streckengrafikDisplayElementService.isHeadwayBandVisible()) { - return "\u{2610} Zugfolgezeiten"; + return `\u{2610} ${$localize`:@@app.streckengrafik.components.headway-band:Headway band`}`; } - return "\u{2611} Zugfolgezeiten"; + return `\u{2611} ${$localize`:@@app.streckengrafik.components.headway-band:Headway band`}`; } getTimeButtonText(): string { if ( this.streckengrafikDisplayElementService.isFilterStreckengrafikTimeNotFocusNorEnabled() ) { - return "\u{2610} Zeit"; + return `\u{2610} ${$localize`:@@app.streckengrafik.components.time:Time`}`; } - return "\u{2611} Zeit"; + return `\u{2611} ${$localize`:@@app.streckengrafik.components.time:Time`}`; } getNameButtonText(): string { if ( this.streckengrafikDisplayElementService.isFilterStreckengrafikNameNotFocusNorEnabled() ) { - return "\u{2610} Name"; + return `\u{2610} ${$localize`:@@app.streckengrafik.components.name:Name`}`; } - return "\u{2611} Name"; + return `\u{2611} ${$localize`:@@app.streckengrafik.components.name:Name`}`; } getZoomButtonClassTag(tag: string, zoomFactor: number): string { diff --git a/src/app/streckengrafik/components/train-run-item/train-run-item.component.html b/src/app/streckengrafik/components/train-run-item/train-run-item.component.html index 76e48a1b..44bbe2dd 100644 --- a/src/app/streckengrafik/components/train-run-item/train-run-item.component.html +++ b/src/app/streckengrafik/components/train-run-item/train-run-item.component.html @@ -1,7 +1,7 @@ - + true); + const loadeddata = this.loadTrainrunItem(ts, true); + this.cachedTrainrunItems = loadeddata.trainrunItem; } } } @@ -378,63 +381,94 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { ); } + private determineForwardBackwardNodes( + trainrunSection: TrainrunSection, + onlyForward: boolean): { + startForwardNode: Node; + startBackwardNode: Node; + visitedTrainrunSections: TrainrunSection[]; + } { + let visitedTrainrunSections: TrainrunSection[] = []; + const trainrun = trainrunSection.getTrainrun(); + + const bothEndNodes = + this.trainrunService.getBothEndNodesFromTrainrunPart(trainrunSection); + + const startForwardBackwardNode = GeneralViewFunctions.getStartForwardAndBackwardNode( + bothEndNodes.endNode1, + bothEndNodes.endNode2, + ); + + if (onlyForward) { + const tsg = this.trainrunSectionGroup( + trainrun.getId(), + startForwardBackwardNode.startForwardNode, + true + ); + this.forwardTrainrunSectionGroup = tsg.trainrunSectionGroups; + visitedTrainrunSections = tsg.visitedTrainrunSections; + } else { + const extractedInfo = this.isTrainRunWayDirectionBackward( + trainrun, + startForwardBackwardNode.startForwardNode, + startForwardBackwardNode.startBackwardNode, + this.forwardTrainrunSectionGroup, + ); + visitedTrainrunSections = extractedInfo.visitedTrainrunSections; + if (extractedInfo.check) { + const nextStartForwardNode = startForwardBackwardNode.startBackwardNode; + const nextStartBackwardNode = startForwardBackwardNode.startForwardNode; + startForwardBackwardNode.startForwardNode = nextStartForwardNode; + startForwardBackwardNode.startBackwardNode = nextStartBackwardNode; + } + } + return { + startForwardNode: startForwardBackwardNode.startForwardNode, + startBackwardNode: startForwardBackwardNode.startBackwardNode, + visitedTrainrunSections: visitedTrainrunSections, + }; + } + private loadTrainrunItem( - trainrun: Trainrun, + trainrunSection: TrainrunSection, onlyForward: boolean, - ): TrainrunItem { + ): { + trainrunItem: TrainrunItem; + visitedTrainrunSections: TrainrunSection[]; + } { + let visitedTrainrunSections: TrainrunSection[] = []; let index = 0; let trainrunStartTime = 0; let trainrunEndTime = 0; + + const trainrun: Trainrun = + this.trainrunService.getTrainrunFromId(trainrunSection.getTrainrunId()); + const pathItems: PathItem[] = []; if ( this.trainrunService.getTrainrunFromId(trainrun.getId()) === undefined ) { return undefined; } - const bothEndNodes = this.trainrunService.getBothEndNodesWithTrainrunId( - trainrun.getId(), - ); - let startForwardNode = GeneralViewFunctions.getLeftOrTopNode( - bothEndNodes.endNode1, - bothEndNodes.endNode2, - ); - let startBackwardNode = - bothEndNodes.endNode1.getId() === startForwardNode.getId() - ? bothEndNodes.endNode2 - : bothEndNodes.endNode1; - if (onlyForward) { - this.forwardTrainrunSectionGroup = this.trainrunSectionGroup( - trainrun.getId(), - startForwardNode, - true - ); - } else { - if ( - this.isTrainRunWayDirectionBackward( - trainrun, - startForwardNode, - startBackwardNode, - this.forwardTrainrunSectionGroup, - ) - ) { - const nextStartForwardNode = startBackwardNode; - const nextStartBackwardNode = startForwardNode; - startForwardNode = nextStartForwardNode; - startBackwardNode = nextStartBackwardNode; - } - } + const forwardBackwardNodes = + this.determineForwardBackwardNodes(trainrunSection, onlyForward); - const forwardTrainrunSectionGroup = this.trainrunSectionGroup( + const tsgForward = this.trainrunSectionGroup( trainrun.getId(), - startForwardNode, + forwardBackwardNodes.startForwardNode, true ); - const backwardTrainrunSectionGroup = this.trainrunSectionGroup( + const forwardTrainrunSectionGroup = tsgForward.trainrunSectionGroups; + visitedTrainrunSections = visitedTrainrunSections.concat(tsgForward.visitedTrainrunSections); + + const tsgBackward = this.trainrunSectionGroup( trainrun.getId(), - startBackwardNode, + forwardBackwardNodes.startBackwardNode, false ); + const backwardTrainrunSectionGroup = tsgBackward.trainrunSectionGroups; + visitedTrainrunSections = visitedTrainrunSections.concat(tsgBackward.visitedTrainrunSections); let forwardStartNode: PathNode = undefined; let forwardEndNode: PathNode = undefined; @@ -453,7 +487,7 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { } // First Node; - if (fromNode.getId() === startForwardNode.getId()) { + if (fromNode.getId() === forwardBackwardNodes.startForwardNode.getId()) { const sourcePathNode = new PathNode( fromNode.getDepartureConsecutiveTime(trainrunSection), this.getTurnaroundStartNodeForward( @@ -498,7 +532,7 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { !this.filterService.filterNode(toNode), ); - if (toNode.getId() === startBackwardNode.getId()) { + if (toNode.getId() === forwardBackwardNodes.startBackwardNode.getId()) { targetPathNode.departureTime = this.getTurnaroundEndNodeForward( toNode, trainrunSection, @@ -520,7 +554,7 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { trainrunSectionGroup.toTrainrunSectionWithNodes.trainrunSection; } // Erster Node - if (fromNode.getId() === startBackwardNode.getId()) { + if (fromNode.getId() === forwardBackwardNodes.startBackwardNode.getId()) { const sourcePathNode = new PathNode( fromNode.getDepartureConsecutiveTime(trainrunSection), this.getTurnaroundStartNodeBackward( @@ -565,7 +599,7 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { !this.filterService.filterNode(toNode), ); - if (toNode.getId() === startForwardNode.getId()) { + if (toNode.getId() === forwardBackwardNodes.startForwardNode.getId()) { targetPathNode.departureTime = this.getTurnaroundEndNodeBackward( toNode, trainrunSection, @@ -624,33 +658,56 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { } }); - return new TrainrunItem( - trainrun.getId(), - trainrun.getFrequency(), - trainrun.getFrequencyOffset(), - trainrunStartTime, - trainrunEndTime, - trainrun.getTitle(), - trainrun.getCategoryShortName(), - trainrun.getCategoryColorRef(), - pathItems, - ); + return { + trainrunItem: new TrainrunItem( + trainrun.getId(), + trainrun.getFrequency(), + trainrun.getFrequencyOffset(), + trainrunStartTime, + trainrunEndTime, + trainrun.getTitle(), + trainrun.getCategoryShortName(), + trainrun.getCategoryColorRef(), + pathItems + ), + visitedTrainrunSections: visitedTrainrunSections + }; } public loadTrainrunItems( templateTrainrunItem: TrainrunItem, ): TrainrunItem[] { + // Extract for all trainruns the sections which are part of the + // template path (along which the graphical timetable is projected) and it does + // support current for those trains with partial cancellations. const trainrunItems: TrainrunItem[] = []; if (this.trainruns) { this.trainruns.forEach((trainrun: Trainrun) => { if (this.filterService.filterTrainrun(trainrun)) { - const trainrunItem = this.loadTrainrunItem(trainrun, false); - this.sortTrainrunItemAndRotateAlongTemplatePath( - trainrun, - trainrunItem, - templateTrainrunItem, - ); - trainrunItems.push(trainrunItem); + // get all trainrun section for given trainrun + let alltrainrunsections = this.trainrunSectionService + .getAllTrainrunSectionsForTrainrun(trainrun.getId()); + + // As long not all trainrun section are visited (process) continue + // this part of code supports partial cancellations, e.g., trainrun runs from + // A - B - C [ partial canceled ] D - E + while (alltrainrunsections.length > 0) { + const ts: TrainrunSection = alltrainrunsections.find(ts => true); + const loadeddata = this.loadTrainrunItem(ts, false); + + // correct projections directions + this.sortTrainrunItemAndRotateAlongTemplatePath( + trainrun, + loadeddata.trainrunItem, + templateTrainrunItem, + ); + trainrunItems.push(loadeddata.trainrunItem); + + // filter all still visited trainrun sections + alltrainrunsections = alltrainrunsections.filter(ts => + loadeddata.visitedTrainrunSections.indexOf(ts) === -1 + ); + } } }); } @@ -902,17 +959,27 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { startForwardNode, startBackwardNode, selectedForwardTrainrunSectionGroups: TrainrunSectionGroup[], - ): boolean { - const forwardTrainrunSectionGroups = this.trainrunSectionGroup( + ): { + check: boolean; + visitedTrainrunSections: TrainrunSection[]; + } { + let visitedTrainrunSections: TrainrunSection[] = []; + + const tsgForward = this.trainrunSectionGroup( trainrun.getId(), startForwardNode, true ); - const backwardTrainrunSectionGroups = this.trainrunSectionGroup( + const forwardTrainrunSectionGroups = tsgForward.trainrunSectionGroups; + visitedTrainrunSections = visitedTrainrunSections.concat(tsgForward.visitedTrainrunSections); + + const tsgBackward = this.trainrunSectionGroup( trainrun.getId(), startBackwardNode, false ); + const backwardTrainrunSectionGroups = tsgBackward.trainrunSectionGroups; + visitedTrainrunSections = visitedTrainrunSections.concat(tsgBackward.visitedTrainrunSections); const selectedPaths = this.betriebspunktNamePaths( selectedForwardTrainrunSectionGroups, @@ -942,7 +1009,10 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { this.addStartEnde(backwardPaths), ); } - return rateForward < rateBackward; + return { + check: rateForward < rateBackward, + visitedTrainrunSections: visitedTrainrunSections + }; } setDataOnlyForTestPurpose() { @@ -1140,7 +1210,11 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { trainrunId: number, node: Node, returnForwardStartNode: boolean - ): TrainrunSectionGroup[] { + ): { + trainrunSectionGroups: TrainrunSectionGroup[]; + visitedTrainrunSections: TrainrunSection[]; + } { + const visitedTrainrunSections: TrainrunSection[] = []; const trainrunSectionGroups: TrainrunSectionGroup[] = []; let trainrunSection = undefined; let trainrunSectionGroup: TrainrunSectionGroup = undefined; @@ -1149,14 +1223,20 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { const startTrainrunSection = node.getStartTrainrunSection(trainrunId, returnForwardStartNode); if (startTrainrunSection === undefined) { - return trainrunSectionGroups; + return { + trainrunSectionGroups: trainrunSectionGroups, + visitedTrainrunSections: visitedTrainrunSections + }; } const iterator: TrainrunIterator = this.trainrunService.getIterator( node, startTrainrunSection, ); + visitedTrainrunSections.push(startTrainrunSection); while (iterator.hasNext()) { const currentTrainrunSectionNodePair = iterator.next(); + visitedTrainrunSections.push(currentTrainrunSectionNodePair.trainrunSection); + if (trainrunSectionGroup) { trainrunSectionGroup.toTrainrunSectionWithNodes = new TrainrunSectionWithNodes( @@ -1192,7 +1272,10 @@ export class Sg1LoadTrainrunItemService implements OnDestroy { trainrunSectionGroups.push(trainrunSectionGroup); } - return trainrunSectionGroups; + return { + trainrunSectionGroups: trainrunSectionGroups, + visitedTrainrunSections: visitedTrainrunSections + }; } } diff --git a/src/app/streckengrafik/services/sg-6-track.service.ts b/src/app/streckengrafik/services/sg-6-track.service.ts index 9c5decad..3d87f3c9 100644 --- a/src/app/streckengrafik/services/sg-6-track.service.ts +++ b/src/app/streckengrafik/services/sg-6-track.service.ts @@ -274,7 +274,7 @@ export class Sg6TrackService implements OnDestroy { for (let distCellIdx = 0; distCellIdx < nDistanceCells; distCellIdx++) { // unroll frequency to get the trains - generated out of the "template" train for ( - let freqLoop = 0; + let freqLoop = -this.maxFrequency; freqLoop <= this.maxFrequency; freqLoop = freqLoop + d.trainrun.frequency ) { @@ -443,7 +443,10 @@ export class Sg6TrackService implements OnDestroy { // special case - when the turnaround time is too small - enforce a second train ond a // second track // tag / mark for further processing - forwardNode.unrollOnlyEvenFrequencyOffsets = 0; + let estimateFreqOffset = + (backwardNode.departureTime - forwardNode.arrivalTime) / trainrun.frequency; + estimateFreqOffset = Math.floor(estimateFreqOffset); + forwardNode.unrollOnlyEvenFrequencyOffsets = estimateFreqOffset % 2; backwardNode.unrollOnlyEvenFrequencyOffsets = 1; forwardNode.maxUnrollOnlyEvenFrequencyOffsets = 1; backwardNode.maxUnrollOnlyEvenFrequencyOffsets = 1; diff --git a/src/app/utils/data-migration.ts b/src/app/utils/data-migration.ts index ab46188e..87a21599 100644 --- a/src/app/utils/data-migration.ts +++ b/src/app/utils/data-migration.ts @@ -80,6 +80,11 @@ export class DataMigration { NetzgrafikDefault.getDefaultNetzgrafik().metadata.netzgrafikColors; } + if (netzgrafikDto.metadata.analyticsSettings === undefined) { + netzgrafikDto.metadata.analyticsSettings = + NetzgrafikDefault.getDefaultNetzgrafik().metadata.analyticsSettings; + } + if (netzgrafikDto.freeFloatingTexts === undefined) { netzgrafikDto.freeFloatingTexts = NetzgrafikDefault.getDefaultNetzgrafik().freeFloatingTexts; diff --git a/src/app/utils/navigation-parameters.ts b/src/app/utils/navigation-parameters.ts index d7e51173..994d3445 100644 --- a/src/app/utils/navigation-parameters.ts +++ b/src/app/utils/navigation-parameters.ts @@ -11,7 +11,7 @@ export class NavigationParameters { getProjectId(): number { const id = this.tryGetProjectId(); if (!id) { - throw new Error("No project ID available"); + throw new Error($localize`:@@app.utils.navigation-parameters.no-project-id:No project ID available`); } return id; } @@ -24,7 +24,7 @@ export class NavigationParameters { getVariantId(): number { const id = this.tryGetVariantId(); if (!id) { - throw new Error("No variant ID available"); + throw new Error($localize`:@@app.utils.navigation-parameters.no-variant-id:No variant ID available`); } return id; } @@ -37,7 +37,7 @@ export class NavigationParameters { getVersionId(): number { const id = this.tryGetVersionId(); if (!id) { - throw new Error("No variant ID available"); + throw new Error($localize`:@@app.utils.navigation-parameters.no-version-id:No version ID available`); } return id; } diff --git a/src/app/view/card-grid/card/card.component.html b/src/app/view/card-grid/card/card.component.html index 5eefe084..b785e62c 100644 --- a/src/app/view/card-grid/card/card.component.html +++ b/src/app/view/card-grid/card/card.component.html @@ -8,7 +8,7 @@
{{ subtitle }}
-
öffnen + {{ 'app.view.card-grid.card.open' | translate }}
- +
diff --git a/src/app/view/dialogs/filterable-labels-dialog/filterable-labels-form/filterable-label-form.component.ts b/src/app/view/dialogs/filterable-labels-dialog/filterable-labels-form/filterable-label-form.component.ts index b30679fa..cd405ae4 100644 --- a/src/app/view/dialogs/filterable-labels-dialog/filterable-labels-form/filterable-label-form.component.ts +++ b/src/app/view/dialogs/filterable-labels-dialog/filterable-labels-form/filterable-label-form.component.ts @@ -31,7 +31,7 @@ export class FilterableLabelFormComponent implements OnInit { export interface FilterableLabelsFormComponentModel { name: string; - dialogTitel: string; + dialogTitle: string; saveLabelCallback; deleteLabelCallback; transferLabelCallback; diff --git a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.html b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.html index 4ec876a5..1a497738 100644 --- a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.html +++ b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.html @@ -3,10 +3,10 @@
@@ -16,8 +16,8 @@ setClassedTag(color) }}" (click)="onColor(color)" - title="{{ getColorTitle(color) }}" - style="{{ getColorStyle(color) }}" + [title]="getColorTitle(color)" + [style]="getColorStyle(color)" [ngClass]="{'NgxEditor__Color--Active': setActiveColor(color)}" > {{ getColorButtonText(color) }} @@ -29,11 +29,11 @@ cdkFocusInitial [editor]="editor" [formControl]="model.getControl('noteText')" - [placeholder]="'Kommentar hier eingeben...'" + [placeholder]="'app.view.dialogs.note-dialog.html-editor.editor-placeholder' | translate" (focusout)="onUpdate()" (keydown)="onKeydown($event)" > Pflichtfeld{{ 'app.view.dialogs.note-dialog.html-editor.mandatory-field' | translate }}
diff --git a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.scss b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.scss index e06b1526..5143a7a9 100644 --- a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.scss +++ b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.scss @@ -9,7 +9,7 @@ border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid rgba(0, 0, 0, 0.2); - background: whitesmoke; + background: var(--sbb-header-lean-background-color); } .NgxEditor { @@ -33,6 +33,8 @@ max-height: 150px; min-height: 150px; overflow-y: auto; + background: var(--sbb-header-lean-background-color); + color: var(--NODE_TEXT_FOCUS); } } @@ -42,9 +44,9 @@ display: inline-flex; flex-wrap: wrap; margin: 1px; - background: whitesmoke; - border-right: 1px solid rgba(0, 0, 0, 0.2); - border-bottom: 1px solid rgba(0, 0, 0, 0.2); + background: var(--sbb-header-lean-background-color); + border-right: 1px solid var(--sbb-header-lean-border-bottom-color); + border-bottom: 1px solid var(--sbb-header-lean-border-bottom-color); } ::ng-deep button.ngx-html-editor-color { @@ -60,7 +62,7 @@ } ::ng-deep button.ngx-html-editor-color { - opacity: 0.5; + opacity: 0.66; } ::ng-deep button.ngx-html-editor-color:hover { @@ -74,3 +76,9 @@ ::ng-deep button.ngx-html-editor-color.active:hover { opacity: 0.85; } + +::ng-deep button.trash { + background: var(--sbb-header-lean-background-color); + color: var(--NODE_TEXT_FOCUS); + transform: translate(2px, 2px); +} diff --git a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.ts b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.ts index 4bb5aefd..7059c0bb 100644 --- a/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.ts +++ b/src/app/view/dialogs/note-dialog/htmlEditor/html-editor.component.ts @@ -19,45 +19,45 @@ export class HtmlEditorComponent implements OnInit, OnDestroy { toolbar: Toolbar = [["bold", "italic"], ["bullet_list"], ["link"]]; colorPresets: HtmlEditorColor[] = [ new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für EC", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.ec.title:Use color of the color scheme for EC`, "EC", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für IC", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.ic.title:Use color of the color scheme for IC`, "IC", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für IR", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.ir.title:Use color of the color scheme for IR`, "IR", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für RE", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.re.title:Use color of the color scheme for RE`, "RE", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für S", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.s.title:Use color of the color scheme for S`, "S", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für GEX", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.gex.title:Use color of the color scheme for GEX`, "GEX", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), new HtmlEditorColor( - "Verwende die Frabe des Frabschemas für G", + $localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.g.title:Use color of the color scheme for G`, "G", - "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G)", + "var(--" + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_" + StaticDomTags.TAG_FOCUS.toUpperCase() + ")", ), - new HtmlEditorColor("grün", "", "green"), - new HtmlEditorColor("blau", "", "blue"), - new HtmlEditorColor("rosa", "", "magenta"), - new HtmlEditorColor("rot", "", "red"), - new HtmlEditorColor("Warnung", "!", "var(--COLOR_Warning)"), + new HtmlEditorColor($localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.green.title:green`, "", "green"), + new HtmlEditorColor($localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.blue.title:blue`, "", "blue"), + new HtmlEditorColor($localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.magenta.title:magenta`, "", "magenta"), + new HtmlEditorColor($localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.red.title:red`, "", "red"), + new HtmlEditorColor($localize`:@@app.view.dialogs.note-dialog.html-editor.color-presets.warning.title:warning color`, "!", "var(--COLOR_Warning)"), ]; updateSubscription: Subscription; @@ -107,11 +107,11 @@ export class HtmlEditorComponent implements OnInit, OnDestroy { getColorStyle(color: HtmlEditorColor): string { if (color === undefined) { if (this.textBasedActiveColor.length > 0) { - return "background: #e8f0fe;"; + return "opactiy: 1.0"; } - return ""; + return "opacity: 0.25"; } - return "background: " + color.colorCode + ";"; + return "background: " + color.colorCode + "; color: var(--sbb-color-white);"; } setClassedTag(color: HtmlEditorColor): string { diff --git a/src/app/view/dialogs/note-dialog/note-dialog.component.html b/src/app/view/dialogs/note-dialog/note-dialog.component.html index 931e8ba8..f7356fa9 100644 --- a/src/app/view/dialogs/note-dialog/note-dialog.component.html +++ b/src/app/view/dialogs/note-dialog/note-dialog.component.html @@ -9,19 +9,21 @@
- + - + (); private deleteNoteCallback = null; private saveNoteCallback = null; diff --git a/src/app/view/dialogs/note-dialog/note-edit-element.component.html b/src/app/view/dialogs/note-dialog/note-edit-element.component.html index 477b3e31..67cfb45c 100644 --- a/src/app/view/dialogs/note-dialog/note-edit-element.component.html +++ b/src/app/view/dialogs/note-dialog/note-edit-element.component.html @@ -1,9 +1,9 @@
- +
- +
@@ -11,7 +11,7 @@ class="FunctionButton" tabindex="-1" mode="icon" - title="Kommentar löschen" + [title]="'app.view.dialogs.note-dialog.delete-note' | translate" (click)="onDeleteNote()" > (); - formmodel: FormModel; + formModel: FormModel; private destroyed = new Subject(); private deleteNoteCallback = null; private saveNoteCallback = null; ngOnInit(): void { - this.formmodel = new FormModel( + this.formModel = new FormModel( this.noteDialogParameter.noteFormComponentModel ?? { id: 0, noteTitle: "", @@ -62,11 +62,11 @@ export class NoteEditElementComponent implements OnInit, OnDestroy { } private updateNote() { - this.formmodel.tryGetValid(); - const newNoteTitle: string = this.formmodel.getControl("noteTitle").value; - const newNoteText: string = this.formmodel.getControl("noteText").value; - const newNoteHeight: string = this.formmodel.getControl("noteHeight").value; - const newNoteWidth: string = this.formmodel.getControl("noteWidth").value; + this.formModel.tryGetValid(); + const newNoteTitle: string = this.formModel.getControl("noteTitle").value; + const newNoteText: string = this.formModel.getControl("noteText").value; + const newNoteHeight: string = this.formModel.getControl("noteHeight").value; + const newNoteWidth: string = this.formModel.getControl("noteWidth").value; this.saveNoteCallback( this.noteDialogParameter.noteFormComponentModel.id, newNoteTitle, diff --git a/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.html b/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.html index 445febee..6bc4046c 100644 --- a/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.html +++ b/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.html @@ -1,7 +1,6 @@
- + @@ -14,7 +13,7 @@ diff --git a/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.ts b/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.ts index 8a0017b3..def2ce54 100644 --- a/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.ts +++ b/src/app/view/dialogs/note-dialog/note-filter-tab/note-filter-tab.component.ts @@ -30,9 +30,11 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { public note: Note; public noteLabels: string[]; + private initialNoteLabels: string[]; noteLabelsAutoCompleteOptions: string[] = []; readonly separatorKeysCodes = [ENTER, COMMA]; private destroyed = new Subject(); + private isLabelBeingEdited = false; constructor( public dataService: DataService, @@ -47,6 +49,11 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { this.noteService.notes.pipe(takeUntil(this.destroyed)).subscribe(() => { this.updateNoteLabelsAutoCompleteOptions(); }); + this.noteService.notes + .pipe(takeUntil(this.destroyed)) + .subscribe(() => { + this.initializeWithCurrentNote(); + }); this.updateNoteLabelsAutoCompleteOptions(); } @@ -64,7 +71,9 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { this.noteLabels = this.noteLabels.filter( (labels) => labels !== valueDelete, ); - this.noteService.setLabels(this.note.getId(), this.noteLabels); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; } add(chipInputEvent: SbbChipInputEvent): void { @@ -73,11 +82,15 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { return; } this.noteLabels.push(value); - this.noteService.setLabels(this.note.getId(), this.noteLabels); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; chipInputEvent.chipInput!.clear(); } onLabelsFocusout() { + if (this.isLabelBeingEdited) return; + const keyboardEvent = new KeyboardEvent("keydown", { code: "Enter", key: "Enter", @@ -87,6 +100,7 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { bubbles: true, }); document.getElementById("noteLabelsInput").dispatchEvent(keyboardEvent); + this.checkAndSetLabels(); } onDeleteNote(): void { @@ -104,16 +118,32 @@ export class NoteFilterTabComponent implements OnInit, OnDestroy { } private initializeWithCurrentNote() { + if (this.note === null) return; this.note = this.noteService.getNoteFromId( this.noteDialogParameter.noteFormComponentModel.id, ); this.noteLabels = this.labelService.getTextLabelsFromIds( this.note.getLabelIds(), ); + this.initialNoteLabels = [...this.noteLabels]; // initialize labels } private updateNoteLabelsAutoCompleteOptions() { this.noteLabelsAutoCompleteOptions = this.getAutoCompleteLabels(); this.cd.detectChanges(); } + + // set labels only if any of it has changed + private checkAndSetLabels() { + if ( + this.noteLabels.length !== this.initialNoteLabels.length || + !this.noteLabels.every((label, index) => label === this.initialNoteLabels[index]) + ) { + this.noteService.setLabels( + this.note.getId(), + this.noteLabels + ); + this.initialNoteLabels = [...this.noteLabels]; + } + } } diff --git a/src/app/view/dialogs/note-dialog/note-form/note-form.component.html b/src/app/view/dialogs/note-dialog/note-form/note-form.component.html index 26999fdb..3f0f1446 100644 --- a/src/app/view/dialogs/note-dialog/note-form/note-form.component.html +++ b/src/app/view/dialogs/note-dialog/note-form/note-form.component.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/view/dialogs/stammdaten-dialog/stammdaten-dialog.component.html b/src/app/view/dialogs/stammdaten-dialog/stammdaten-dialog.component.html index afc7a914..7389ceac 100644 --- a/src/app/view/dialogs/stammdaten-dialog/stammdaten-dialog.component.html +++ b/src/app/view/dialogs/stammdaten-dialog/stammdaten-dialog.component.html @@ -1,18 +1,18 @@
- Stammdaten + {{ 'app.view.dialogs.stammdaten-dialog.base-data' | translate }}
- + - + - + - + - + - + - + - + - + - + - + - +
Betriebspunkt{{ 'app.view.dialogs.stammdaten-dialog.operationalPoint' | translate }} {{ element.betriebspunkt }} Haltezeit IPV{{ 'app.view.dialogs.stammdaten-dialog.ipv-stop-time' | translate }}
{{ element["HaltezeitIPV"].haltezeit }} @@ -21,7 +21,7 @@
Haltezeit A{{ 'app.view.dialogs.stammdaten-dialog.a-stop-time' | translate }}
{{ element["HaltezeitA"].haltezeit }} @@ -30,7 +30,7 @@
Haltezeit B{{ 'app.view.dialogs.stammdaten-dialog.b-stop-time' | translate }}
{{ element["HaltezeitB"].haltezeit }} @@ -39,7 +39,7 @@
Haltezeit C{{ 'app.view.dialogs.stammdaten-dialog.c-stop-time' | translate }}
{{ element["HaltezeitC"].haltezeit }} @@ -48,7 +48,7 @@
Haltezeit D{{ 'app.view.dialogs.stammdaten-dialog.d-stop-time' | translate }}
{{ element["HaltezeitD"].haltezeit }} @@ -57,7 +57,7 @@
ZAZ{{ 'app.view.dialogs.stammdaten-dialog.zaz' | translate }}
{{ element.zaz }} @@ -66,7 +66,7 @@
Connection Time{{ 'app.view.dialogs.stammdaten-dialog.connection-time' | translate }}
{{ element.connection_time }} @@ -75,7 +75,7 @@
Region{{ 'app.view.dialogs.stammdaten-dialog.region' | translate }}
{{ element.region }} @@ -84,7 +84,7 @@
Kategorie{{ 'app.view.dialogs.stammdaten-dialog.category' | translate }}
{{ element.kategorie }} @@ -93,7 +93,7 @@
Filterbare Labels{{ 'app.view.dialogs.stammdaten-dialog.filterable-labels' | translate }}
{{ element.filterableLabels }} @@ -102,7 +102,7 @@
Position{{ 'app.view.dialogs.stammdaten-dialog.position' | translate }}
{{ element.pos.getX() }}
@@ -118,7 +118,7 @@
diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.html b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.html index 2dce8809..4fa3ffdd 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.html +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.html @@ -34,7 +34,8 @@ [trainrunDialogParameter]="data" > - + diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.scss b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.scss index 1836c723..cf74286e 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.scss +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-and-section-dialog.component.scss @@ -8,15 +8,15 @@ ::ng-deep .MainTrainrunTabViewDialog { position: relative; padding-top: 4px; // optical alignment - border: 1px solid #000000; + border: 1px solid var(--sbb-menu-item-label); min-height: 385px; max-height: 385px; - background-color: white; + background-color: var(--sbb-header-lean-background-color); &:before, &:after { border: 16px solid transparent; - border-top-color: #000000; + border-top-color: var(--sbb-menu-item-label); content: ""; position: absolute; top: 100%; @@ -27,7 +27,7 @@ &:after { margin-top: -0.75px; - border-top-color: #ffffff; + border-top-color: var(--sbb-header-lean-background-color); } .TrainrunTabGrupe { diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.html b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.html index 8bfa3661..2351c5b4 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.html +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.html @@ -1,7 +1,6 @@ -
- +
+ @@ -14,7 +13,7 @@
-
+
@@ -44,7 +44,7 @@ class="FunctionButton" tabindex="-1" (click)="onDeleteTrainrun()" - title="Zuglauf löschen" + [title]="'app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.trainrunDelete' | translate" > diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.scss b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.scss index 9fe2cd35..71459021 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.scss +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.scss @@ -15,3 +15,11 @@ max-height: 48px; min-height: 48px; } + +::ng-deep div.EditTrainrunFilterableLabelsDialogTabContent.readonly { + pointer-events: none; +} + +::ng-deep div.EditTrainrunDialogTabFooter.readonly { + pointer-events: none; +} diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.ts b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.ts index c2ddbadc..1637a72d 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.ts +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-filter-tab/trainrun-filter-tab.component.ts @@ -19,6 +19,7 @@ import {Subject} from "rxjs"; import {takeUntil} from "rxjs/operators"; import {SbbChipEvent, SbbChipInputEvent} from "@sbb-esta/angular/chips"; import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {VersionControlService} from "../../../../services/data/version-control.service"; @Component({ selector: "sbb-trainrun-filter-tab", @@ -30,9 +31,11 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { public selectedTrainrun: Trainrun; public trainrunLabels: string[]; + private initialTrainrunLabels: string[]; trainrunLabelsAutoCompleteOptions: string[] = []; readonly separatorKeysCodes = [ENTER, COMMA]; private destroyed = new Subject(); + private isLabelBeingEdited = false; constructor( public dataService: DataService, @@ -41,6 +44,7 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { private labelService: LabelService, private labelGroupService: LabelGroupService, private uiInteractionService: UiInteractionService, + private versionControlService: VersionControlService, private cd: ChangeDetectorRef, ) { this.initializeWithCurrentSelectedTrainrun(); @@ -67,6 +71,23 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { this.destroyed.complete(); } + getContentClassTag() : string { + const retVal = "EditTrainrunFilterableLabelsDialogTabContent"; + if (this.versionControlService.getVariantIsWritable()){ + return retVal; + } + return retVal + " readonly"; + } + + getContentFooterClassTag(): string { + const retVal: string = "EditTrainrunDialogTabFooter"; + if (this.versionControlService.getVariantIsWritable()) { + return retVal; + } + return retVal + " readonly"; + } + + remove(chipEvent: SbbChipEvent): void { const valueDelete = chipEvent.chip.value as string; const value = (valueDelete || "").trim(); @@ -76,10 +97,9 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { this.trainrunLabels = this.trainrunLabels.filter( (labels) => labels !== valueDelete, ); - this.trainrunService.setLabels( - this.selectedTrainrun.getId(), - this.trainrunLabels, - ); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; } add(inputEvent: SbbChipInputEvent): void { @@ -87,18 +107,16 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { if (!value) { return; } - console.log("add", value); this.trainrunLabels.push(value); - this.trainrunService.setLabels( - this.selectedTrainrun.getId(), - this.trainrunLabels, - ); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; inputEvent.chipInput!.clear(); } onDeleteTrainrun() { - const dialogTitle = "Löschen"; - const dialogContent = "Soll der gesamte Zuglauf definitiv gelöscht werden?"; + const dialogTitle = $localize`:@@app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.delete:Delete`; + const dialogContent = $localize`:@@app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.deleteConfirmationQuestion:Should the entire train route be definitively deleted?`; const confirmationDialogParamter = new ConfirmationDialogParameter( dialogTitle, dialogContent, @@ -121,6 +139,8 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { } onLabelsFocusout() { + if (this.isLabelBeingEdited) return; + const keyboardEvent = new KeyboardEvent("keydown", { code: "Enter", key: "Enter", @@ -130,10 +150,7 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { bubbles: true, }); document.getElementById("trainrunLabelsInput").dispatchEvent(keyboardEvent); - this.trainrunService.setLabels( - this.selectedTrainrun.getId(), - this.trainrunLabels, - ); + this.checkAndSetLabels(); } getAutoCompleteLabels(): string[] { @@ -145,13 +162,29 @@ export class TrainrunFilterTabComponent implements OnInit, OnDestroy { private initializeWithCurrentSelectedTrainrun() { this.selectedTrainrun = this.trainrunService.getSelectedTrainrun(); + if (this.selectedTrainrun === null) return; this.trainrunLabels = this.labelService.getTextLabelsFromIds( this.selectedTrainrun.getLabelIds(), ); + this.initialTrainrunLabels = [...this.trainrunLabels]; // initialize labels } private updateTrainrunLabelsAutoCompleteOptions() { this.trainrunLabelsAutoCompleteOptions = this.getAutoCompleteLabels(); this.cd.detectChanges(); } + + // set labels only if any of it has changed + private checkAndSetLabels() { + if ( + this.trainrunLabels.length !== this.initialTrainrunLabels.length || + !this.trainrunLabels.every((label, index) => label === this.initialTrainrunLabels[index]) + ) { + this.trainrunService.setLabels( + this.selectedTrainrun.getId(), + this.trainrunLabels + ); + this.initialTrainrunLabels = [...this.trainrunLabels]; + } + } } diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.html b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.html index 18d48ebd..df35d7e2 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.html +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.html @@ -1,5 +1,5 @@ -
- +
+ - Kategorie + {{ 'app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.category' | translate }}
- Verkehrt + {{ 'app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.verkehrt' | translate }}
-
+
@@ -72,7 +73,7 @@ class="FunctionButton" tabindex="-1" (click)="onDeleteTrainrun()" - title="Zuglauf löschen" + [title]="'app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.trainrunDelete' | translate" > diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.scss b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.scss index 6b93ca59..7f7ddfc9 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.scss +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.scss @@ -1,6 +1,14 @@ @import "../../../rastering/definitions"; @import "../../../../../variables"; +::ng-deep .sbb-tab-body-wrapper { + background: var(--sbb-header-lean-background-color); +} + +::ng-deep div.sbb-tab-label { + background: var(--sbb-header-lean-background-color); +} + ::ng-deep .sbb-trainrun-chip-group { display: flex; } @@ -20,10 +28,24 @@ border-radius: 16px; background-color: $COLOR_BACKGROUND; + + opacity: var(--Button_TrainrunDialog_opacity); + + &.FilterableLabel { + opacity: 1.0; + } + + &.EditorToolButton { + opacity: 1.0; + border: none; + } + &.selected { color: $COLOR_Focus; background-color: white; border-color: $COLOR_Focus; + + opacity: 1.0; } } @@ -48,27 +70,31 @@ } ::ng-deep button.Frequency { - color: black; - background-color: whitesmoke; + color: var(--NODE_TEXT_FOCUS); + background-color: var(--NODE_COLOR_BACKGROUND); border-color: transparent; + opacity: 1.0; } ::ng-deep button.Frequency.selected { color: white; background-color: $COLOR_Default; border-color: transparent; + opacity: 1.0; } ::ng-deep button.TimeCategory { - color: black; - background-color: whitesmoke; + color: var(--NODE_TEXT_FOCUS); + background-color: var(--NODE_COLOR_BACKGROUND); border-color: transparent; + opacity: 1.0; } ::ng-deep button.TimeCategory.selected { color: white; background-color: $COLOR_Default; border-color: transparent; + opacity: 1.0; } ::ng-deep div.EditTrainrunDialogTabContent { @@ -87,3 +113,13 @@ padding: 0px; min-height: 270px; } + + +::ng-deep div.EditTrainrunDialogTabContent.readonly { + pointer-events: none; +} + +::ng-deep div.EditTrainrunDialogTabFooter.readonly { + pointer-events: none; + opacity: 0.5; +} diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.ts b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.ts index 0d5a38d5..86b8da9a 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.ts +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component.ts @@ -14,6 +14,7 @@ import {StaticDomTags} from "../../../editor-main-view/data-views/static.dom.tag import {takeUntil} from "rxjs/operators"; import {Subject} from "rxjs"; import {TrainrunDialogParameter} from "../trainrun-and-section-dialog.component"; +import {VersionControlService} from "../../../../services/data/version-control.service"; @Component({ selector: "sbb-trainrun-tab", @@ -39,6 +40,7 @@ export class TrainrunTabComponent implements OnDestroy { private trainrunService: TrainrunService, private trainrunSectionService: TrainrunSectionService, private uiInteractionService: UiInteractionService, + private versionControlService: VersionControlService, ) { this.initializeWithCurrentSelectedTrainrun(); this.trainrunService.trainruns @@ -53,13 +55,23 @@ export class TrainrunTabComponent implements OnDestroy { this.destroyed.complete(); } - getDialogContentClassTag(): string { + getContentClassTag(): string { + const readonlyTag: string = this.versionControlService.getVariantIsWritable() ? " " : " readonly"; if (this.isIntegratedComponent) { - return "EditTrainrunDialogTabContent IntegratedComponent"; + return "EditTrainrunDialogTabContent IntegratedComponent" + readonlyTag; } - return "EditTrainrunDialogTabContent"; + return "EditTrainrunDialogTabContent" + readonlyTag; } + getContentFooterClassTag(): string { + const retVal: string = "EditTrainrunDialogTabFooter"; + if (this.versionControlService.getVariantIsWritable()) { + return retVal; + } + return retVal + " readonly"; + } + + getFrequencyClassname(trainrunFrequency: TrainrunFrequency): string { if (trainrunFrequency.id === this.selectedFrequency.id) { return ( @@ -161,8 +173,8 @@ export class TrainrunTabComponent implements OnDestroy { } onDeleteTrainrun() { - const dialogTitle = "Löschen"; - const dialogContent = "Soll der gesamte Zuglauf definitiv gelöscht werden?"; + const dialogTitle = $localize`:@@app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.delete:Delete`; + const dialogContent = $localize`:@@app.view.dialogs.trainrun-and-section-dialog.trainrun-tab.deleteConfirmationQuestion:Should the entire train route be definitively deleted?`; const confirmationDialogParamter = new ConfirmationDialogParameter( dialogTitle, dialogContent, diff --git a/src/app/view/dialogs/trainrun-and-section-dialog/trainrunsection-tab/trainrun-section-tab.component.html b/src/app/view/dialogs/trainrun-and-section-dialog/trainrunsection-tab/trainrun-section-tab.component.html index 289478df..479e96a7 100644 --- a/src/app/view/dialogs/trainrun-and-section-dialog/trainrunsection-tab/trainrun-section-tab.component.html +++ b/src/app/view/dialogs/trainrun-and-section-dialog/trainrunsection-tab/trainrun-section-tab.component.html @@ -1,4 +1,4 @@ -
+
@@ -467,13 +467,13 @@
-
+
- Alle nicht sichtbare Elemente löschen + {{ 'app.view.editor-edit-tools-view-component.delete-all-non-visible-elements' | translate }}

- Sichtbare Elemente + {{ 'app.view.editor-edit-tools-view-component.visible-elements' | translate }}
- Alle sichtbare Züge löschen + {{ 'app.view.editor-edit-tools-view-component.delete-all-visible-trainruns' | translate }}
- Alle sichtbare Kommentare löschen + {{ 'app.view.editor-edit-tools-view-component.delete-all-visible-notes' | translate }}
- Alle sichtbare Elemente löschen + {{ 'app.view.editor-edit-tools-view-component.delete-all-visible-elements' | translate }} - + - Netzgrafik - Zusammenführen + {{ 'app.view.editor-edit-tools-view-component.merge-netzgrafik-title' | translate }}
- Züge als Kopie einfügen + {{ 'app.view.editor-edit-tools-view-component.add-netzgrafik-as-copy' | translate }} Bearbeiten
- Züge durch Zusammenführen einfügen + {{ 'app.view.editor-edit-tools-view-component.merge-netzgrafik' | translate }} (); + readonly disableBackend = environment.disableBackend; + constructor( private dataService: DataService, private nodeService: NodeService, @@ -43,6 +47,7 @@ export class EditorEditToolsViewComponent implements OnDestroy { private logger: LogService, public filterService: FilterService, private uiInteractionService: UiInteractionService, + private versionControlService : VersionControlService ) { this.nodeLabelGroups = this.labelGroupService.getLabelGroupsFromLabelRef( LabelRef.Node, @@ -73,13 +78,14 @@ export class EditorEditToolsViewComponent implements OnDestroy { this.destroyed.complete(); } + getVariantIsWritable() { + return this.versionControlService.getVariantIsWritable(); + } + onClearAllFiltered() { - const dialogTitle = "Löschen"; - const dialogContent = - "Sollen alle nicht sichtbare Elemene aus der Netzgrafik definitiv gelöscht werden?"; const confirmationDialogParamter = new ConfirmationDialogParameter( - dialogTitle, - dialogContent, + $localize`:@@app.view.editor-edit-tools-view-component.delete:Delete`, + $localize`:@@app.view.editor-edit-tools-view-component.on-clear-delete-all-non-visible-elements:Should all non-visible elements be permanently deleted from the netzgrafik?`, ); this.uiInteractionService .showConfirmationDiagramDialog(confirmationDialogParamter) @@ -93,12 +99,9 @@ export class EditorEditToolsViewComponent implements OnDestroy { } onClear() { - const dialogTitle = "Löschen"; - const dialogContent = - "Sollen alle sichtbare Elemene aus der Netzgrafik definitiv gelöscht werden?"; const confirmationDialogParamter = new ConfirmationDialogParameter( - dialogTitle, - dialogContent, + $localize`:@@app.view.editor-edit-tools-view-component.delete:Delete`, + $localize`:@@app.view.editor-edit-tools-view-component.on-clear-delete-all-visible-elements:Should all visible elements be permanently deleted from the netzgrafik?`, ); this.uiInteractionService .showConfirmationDiagramDialog(confirmationDialogParamter) @@ -112,12 +115,9 @@ export class EditorEditToolsViewComponent implements OnDestroy { } onClearAllTrainruns() { - const dialogTitle = "Löschen"; - const dialogContent = - "Sollen alle sichtbare Züge definitiv gelöscht werden?"; const confirmationDialogParamter = new ConfirmationDialogParameter( - dialogTitle, - dialogContent, + $localize`:@@app.view.editor-edit-tools-view-component.delete:Delete`, + $localize`:@@app.view.editor-edit-tools-view-component.on-clear-delete-all-visible-trainruns:Should all visible trainruns be permanently deleted from the netzgrafik?`, ); this.uiInteractionService .showConfirmationDiagramDialog(confirmationDialogParamter) @@ -129,12 +129,9 @@ export class EditorEditToolsViewComponent implements OnDestroy { } onClearAllNotes() { - const dialogTitle = "Löschen"; - const dialogContent = - "Sollen alle sichtbare Kommentare definitiv gelöscht werden?"; const confirmationDialogParamter = new ConfirmationDialogParameter( - dialogTitle, - dialogContent, + $localize`:@@app.view.editor-edit-tools-view-component.delete:Delete`, + $localize`:@@app.view.editor-edit-tools-view-component.on-clear-delete-all-visible-notes:Should all visible notes be permanently deleted from the netzgrafik?`, ); this.uiInteractionService .showConfirmationDiagramDialog(confirmationDialogParamter) diff --git a/src/app/view/editor-edit-tools-view-component/label-drop-list/label-drop-list.component.html b/src/app/view/editor-edit-tools-view-component/label-drop-list/label-drop-list.component.html index 0d0abdfd..25c7cf71 100644 --- a/src/app/view/editor-edit-tools-view-component/label-drop-list/label-drop-list.component.html +++ b/src/app/view/editor-edit-tools-view-component/label-drop-list/label-drop-list.component.html @@ -1,6 +1,6 @@
    Keine Labels vorhanden.    {{ 'app.view.editor-edit-tools-view-component.label-drop-list.no-labels-available' | translate }}
@@ -68,7 +68,7 @@
- Takt + {{ 'app.view.editor-filter-view.frequency' | translate }}
- Verkehrt + {{ 'app.view.editor-filter-view.time-category' | translate }}
- Filterbare Labels: Züge + {{ 'app.view.editor-filter-view.filterable-labels-trainruns' | translate }} - + @@ -81,10 +81,10 @@

Filter

- Filterbare Labels: Knoten + {{ 'app.view.editor-filter-view.filterable-labels-nodes' | translate }} - + @@ -93,13 +93,13 @@

Filter

>
- + - Filterbare Labels: Kommentare + {{ 'app.view.editor-filter-view.filterable-labels-notes' | translate }} - + @@ -110,15 +110,15 @@

Filter

- Anzeigen + {{ 'app.view.editor-filter-view.display' | translate }} - + - Zeiten + {{ 'app.view.editor-filter-view.times' | translate }}
- + Filter Abfahrt- und Ankuftszeiten anzeigen + >{{ 'app.view.editor-filter-view.display-arrival-departure-times' | translate }} - Abfahrt- und Ankuftszeiten für Durchfahrten anzeigen + {{ 'app.view.editor-filter-view.display-arrival-departure-times-for-connections' | translate }} Fahrzeiten anzeigen + >{{ 'app.view.editor-filter-view.display-travel-times' | translate }} Zugname anzeigen + >{{ 'app.view.editor-filter-view.display-trainrun-name' | translate }}

- Anschlüsse + {{ 'app.view.editor-filter-view.connections' | translate }}
Anschlüsse anzeigen + >{{ 'app.view.editor-filter-view.display-connections' | translate }}

- Knoten + {{ 'app.view.editor-filter-view.nodes' | translate }}
Knoten ohne (angezeigte) Züge anzeigen + >{{ 'app.view.editor-filter-view.display-nodes-without-visible-trainruns' | translate }} Knoten mit nur durchfahrenden Züge anzeigen + >{{ 'app.view.editor-filter-view.display-nodes-with-only-stopping-trainruns' | translate }}
-
- Kommentare -
- Kommentare anzeigen - -
+ +
+ {{ 'app.view.editor-filter-view.notes' | translate }} +
+ {{ 'app.view.editor-filter-view.display-notes' | translate }} + +
+
- - - Gespeicherte Filter - -
- - - + + + + {{ 'app.view.editor-filter-view.saved-filters' | translate }} + +
+ + + - + + + + + + - - - - + + +
- -
- - -
-
+
+
+
@@ -299,9 +308,9 @@

Filter

sbb-secondary-button class="sbb-mt-m" [disabled]="!this.filterService.isAnyFilterActive()" - title="Alle Anzeigefilter zurücksetzen" + [title]="'app.view.editor-filter-view.reset-all-display-filters' | translate" (click)="onResetAllFilter()" > - Alle Anzeigefilter zurücksetzen + {{ 'app.view.editor-filter-view.reset-all-display-filters' | translate }}
diff --git a/src/app/view/editor-filter-view/editor-filter-view.component.scss b/src/app/view/editor-filter-view/editor-filter-view.component.scss index 97a55ebf..7926573f 100644 --- a/src/app/view/editor-filter-view/editor-filter-view.component.scss +++ b/src/app/view/editor-filter-view/editor-filter-view.component.scss @@ -3,18 +3,12 @@ @import "../dialogs/trainrun-and-section-dialog/trainrun-tab/trainrun-tab.component"; ::ng-deep .TrainrunDialog.EditorToolButton { - background: $COLOR_Default; - border: $COLOR_Default; - color: white; max-width: none; min-height: 38px; margin-bottom: 16px; } ::ng-deep .TrainrunDialog.EditorToolButton:active { - background: lightgrey; - color: $COLOR_Default; - border: lightgrey; } ::ng-deep .SummaryTitle { @@ -27,29 +21,21 @@ border-radius: 10px; border: 1px; height: 32px; - color: black; text-align: center; text-decoration: none; display: inline-block; cursor: pointer; - background-color: white; - border-color: darkgrey; border-style: solid; font-family: "SBBWeb Light", "Helvetica Neue", Helvetica, Arial, sans-serif; } ::ng-deep button.NetzgrafikButton:hover { - background-color: whitesmoke; } ::ng-deep button.NetzgrafikButton:active { - background-color: lightgray; } ::ng-deep button.NetzgrafikButton:disabled { - background-color: white; - color: lightgray; - border-color: whitesmoke; } ::ng-deep .sbb-expansion-panel-body h4:first-child { @@ -98,33 +84,20 @@ cursor: pointer; border: 1px solid transparent; border-radius: 16px; - background-color: whitesmoke; &.selected { - color: white; - background-color: $COLOR_Default; - border-color: white; } &.add_button { - background: whitesmoke; - color: black; - border: white; } &.function { - background: white; - color: black; - border: white; min-width: 40px; max-width: 40px; } } ::ng-deep .FilterSettting:active { - background: $COLOR_Default; - color: white; - border: lightgrey; } .sbb-filtersetting-chip-group { diff --git a/src/app/view/editor-filter-view/editor-filter-view.component.ts b/src/app/view/editor-filter-view/editor-filter-view.component.ts index 2d5d8ef3..1c00ad4f 100644 --- a/src/app/view/editor-filter-view/editor-filter-view.component.ts +++ b/src/app/view/editor-filter-view/editor-filter-view.component.ts @@ -12,6 +12,8 @@ import {Subject} from "rxjs"; import {FilterSetting} from "../../models/filterSettings.model"; import {takeUntil} from "rxjs/operators"; import {StaticDomTags} from "../editor-main-view/data-views/static.dom.tags"; +import {environment} from "../../../environments/environment"; +import {VersionControlService} from "../../services/data/version-control.service"; @Component({ selector: "sbb-editor-filter-view", @@ -36,12 +38,15 @@ export class EditorFilterViewComponent implements OnInit, OnDestroy { activeFilterName: string; activeEditFilterSettingId: number; + readonly disableBackend = environment.disableBackend; + private destroyed = new Subject(); constructor( public dataService: DataService, public uiInteractionService: UiInteractionService, public filterService: FilterService, + public versionControlService : VersionControlService, ) { this.activeFilterName = undefined; this.activeEditFilterSettingId = undefined; @@ -152,9 +157,9 @@ export class EditorFilterViewComponent implements OnInit, OnDestroy { getFilterSettingTooltip(filterSetting: FilterSetting): string { if (!this.filterService.isFilterSettingEnabled(filterSetting.getId())) { - return filterSetting.name + " laden"; + return $localize`:@@app.view.editor-filter-view.load-filter:Load ${filterSetting.name}`; } - return filterSetting.name + " neu laden"; + return $localize`:@@app.view.editor-filter-view.reload-filter:Reload ${filterSetting.name}`; } isTrainrunFilteringActive(): boolean { @@ -300,18 +305,18 @@ export class EditorFilterViewComponent implements OnInit, OnDestroy { getCategoryTooltip(trainrunCategory: TrainrunCategory): string { if (!this.filterService.isFilterTrainrunCategoryEnabled(trainrunCategory)) { - return trainrunCategory.name + " einblenden"; + return $localize`:@@app.view.editor-filter-view.show-trainrun-category:Show ${trainrunCategory.name}:trainrunCategory:`; } - return trainrunCategory.name + " ausblenden"; + return $localize`:@@app.view.editor-filter-view.hide-trainrun-category:Hide ${trainrunCategory.name}:trainrunCategory:`; } getTimeCategoryTooltip(trainrunTimeCategory: TrainrunTimeCategory): string { /* if (!this.filterService.isFilterTrainrunCategoryEnabled(trainrunTimeCategory)) { - return trainrunTimeCategory.name + ' einblenden'; + return $localize`:@@app.view.editor-filter-view.show-trainrun-time-category:Show ${trainrunTimeCategory.name}:trainrunTimeCategory:`; } */ - return trainrunTimeCategory.name + " ausblenden"; + return $localize`:@@app.view.editor-filter-view.hide-trainrun-time-category:Hide ${trainrunTimeCategory.name}:trainrunTimeCategory:`; } makeCategoryButtonLabel(trainrunCategory: TrainrunCategory): string { @@ -380,9 +385,9 @@ export class EditorFilterViewComponent implements OnInit, OnDestroy { if ( !this.filterService.isFilterTrainrunFrequencyEnabled(trainrunFrequency) ) { - return trainrunFrequency.name + " einblenden"; + return $localize`:@@app.view.editor-filter-view.show-trainrun-frequency:Show ${trainrunFrequency.name}:trainrunFrequency:`; } - return trainrunFrequency.name + " ausblenden"; + return $localize`:@@app.view.editor-filter-view.hide-trainrun-frequency:Hide ${trainrunFrequency.name}:trainrunFrequency:`; } makeFrequencyButtonLabel(trainrunFrequency: TrainrunFrequency): string { diff --git a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.html b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.html index 8858cce6..a8045272 100644 --- a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.html +++ b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.html @@ -1,5 +1,5 @@
- Keine Labels vorhanden. + {{ 'app.view.editor-filter-view.filterable-label-filter.no-labels-available' | translate }}
@@ -11,7 +11,7 @@ class="TrainrunDialog FilterableLabel LogicalOperator" (click)="enableLogicalFilterOperatorAnd(nodeLabelGrp)" > - Oder + {{ 'app.view.editor-filter-view.filterable-label-filter.or' | translate }} @@ -19,7 +19,7 @@ class="TrainrunDialog FilterableLabel LogicalOperator" (click)="enableLogicalFilterOperatorOr(nodeLabelGrp)" > - Und + {{ 'app.view.editor-filter-view.filterable-label-filter.and' | translate }}
@@ -46,9 +46,9 @@ sbb-secondary-button class="sbb-mt-m" [disabled]="isFilteringLabels()" - title="Alles anzeigen" + [title]="'app.view.editor-filter-view.filterable-label-filter.show-all' | translate" (click)="OnResetFilterableLabels()" > - Filter zurücksetzen + {{ 'app.view.editor-filter-view.filterable-label-filter.reset-filter' | translate }}
diff --git a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.scss b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.scss index a96b9854..b2121243 100644 --- a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.scss +++ b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.scss @@ -4,7 +4,7 @@ ::ng-deep button.TrainrunDialog.FilterableLabel { background-color: $COLOR_Default; - color: whitesmoke; + color: white; border: whitesmoke; max-width: none; min-height: 38px; @@ -16,18 +16,19 @@ } ::ng-deep button.TrainrunDialog.FilterableLabel.selected { - background-color: whitesmoke; - color: $COLOR_Focus; - border: whitesmoke; + background-color: var(--NODE_COLOR_BACKGROUND); + color: var(--NODE_TEXT_FOCUS); + border: 1px solid var(--NODE_COLOR_BACKGROUND); } + ::ng-deep button.TrainrunDialog.FilterableLabel.LogicalOperator { - background-color: white; + background-color: var(--sbb-expansion-panel-background-color-open); color: $COLOR_Default; margin: 4px; } ::ng-deep button.TrainrunDialog.FilterableLabel.LogicalOperator:active { - background-color: whitesmoke; + background-color: var(--COLOR_GRAYEDOUT); color: $COLOR_Default; } @@ -48,7 +49,7 @@ width: 330px; min-width: 330px; max-width: 330px; - background: white; + background: var(--sbb-expansion-panel-background-color-open); border-radius: 4px; overflow: hidden; float: right; diff --git a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.ts b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.ts index 21202f66..859175ac 100644 --- a/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.ts +++ b/src/app/view/editor-filter-view/filterable-label-filter/filterable-label-filter.component.ts @@ -165,9 +165,9 @@ export class FilterableLabelFilterComponent implements OnInit, OnDestroy { (filterLabel) => filterLabel === labelObject.getId(), ) !== undefined ) { - return labelObject.getLabel() + ": einblenden"; + return labelObject.getLabel() + ": " + $localize`:@@app.view.editor-filter-view.filterable-label-filter.show:show`; } - return labelObject.getLabel() + ": ausblenden"; + return labelObject.getLabel() + ": " + $localize`:@@app.view.editor-filter-view.filterable-label-filter.hide:hide`; } isFilteringLabels(): boolean { diff --git a/src/app/view/editor-main-view/data-views/connectionViewObject.ts b/src/app/view/editor-main-view/data-views/connectionViewObject.ts index 739d536f..6c4899d5 100644 --- a/src/app/view/editor-main-view/data-views/connectionViewObject.ts +++ b/src/app/view/editor-main-view/data-views/connectionViewObject.ts @@ -52,7 +52,9 @@ export class ConnectionsViewObject { "_" + editorView.isTemporaryDisableFilteringOfItemsInViewEnabled() + "_" + - editorView.getLevelOfDetail(); + editorView.getLevelOfDetail() + + "_" + + editorView.trainrunSectionPreviewLineView.getVariantIsWritable(); connection.getPath().forEach((p) => { key += p.toString(); diff --git a/src/app/view/editor-main-view/data-views/d3.utils.spec.ts b/src/app/view/editor-main-view/data-views/d3.utils.spec.ts index 28a5b4ac..35bf64b1 100644 --- a/src/app/view/editor-main-view/data-views/d3.utils.spec.ts +++ b/src/app/view/editor-main-view/data-views/d3.utils.spec.ts @@ -151,7 +151,8 @@ describe("3d.Utils.tests", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); new EditorView( @@ -166,7 +167,8 @@ describe("3d.Utils.tests", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); controller.bindViewToServices(); editorView = controller.editorView; diff --git a/src/app/view/editor-main-view/data-views/data.view.spec.ts b/src/app/view/editor-main-view/data-views/data.view.spec.ts index ed59d7ed..62b35666 100644 --- a/src/app/view/editor-main-view/data-views/data.view.spec.ts +++ b/src/app/view/editor-main-view/data-views/data.view.spec.ts @@ -156,7 +156,8 @@ describe("Editor-DataView", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); new EditorView( @@ -171,7 +172,8 @@ describe("Editor-DataView", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); controller.bindViewToServices(); @@ -187,7 +189,7 @@ describe("Editor-DataView", () => { const cvo = new ConnectionsViewObject(editorView, con, node, false, false); expect(cvo.key).toBe( - "#2@false_15_9_false_(832,144)_(774.4,144)_(793.6,144)_(736,144)_false_false_false_0(832,144)(774.4,144)(793.6,144)(736,144)", + "#2@false_15_9_false_(832,144)_(774.4,144)_(793.6,144)_(736,144)_false_false_false_0_false(832,144)(774.4,144)(793.6,144)(736,144)", ); }); @@ -198,10 +200,10 @@ describe("Editor-DataView", () => { const node = nodeService.getNodeFromId(2); const cvo1 = new NodeViewObject(editorView, node, false); - expect(cvo1.key).toBe("#2@736_64_ZUE_6_5_96_124_false_2_false_true_false_0"); + expect(cvo1.key).toBe("#2@736_64_ZUE_6_5_96_124_false_2_false_true_false_0_false"); const cvo2 = new NodeViewObject(editorView, node, true); - expect(cvo2.key).toBe("#2@736_64_ZUE_6_5_96_124_false_2_true_true_false_0"); + expect(cvo2.key).toBe("#2@736_64_ZUE_6_5_96_124_false_2_true_true_false_0_false"); }); it("NodeViewObject - 001", () => { @@ -211,7 +213,7 @@ describe("Editor-DataView", () => { const note = noteService.getNoteFromId(3); const cvo1 = new NoteViewObject(editorView, note); expect(cvo1.key).toBe( - "#3@1312_160_64_192_

Folgendes

spannend

FETT_Frabcodierter Text_false_0_false_false_0", + "#3@1312_160_64_192_

Folgendes

spannend

FETT_Frabcodierter Text_false_0_false_false_0_false", ); }); @@ -232,7 +234,7 @@ describe("Editor-DataView", () => { false, ); expect(cvo1.key).toBe( - "#3@1234_false_0_39_49_1_21_39_0_39_141_39_0_39_0_20_0_S_20_7/24_4_1_0_S_20_7/24_20_0_false_false_false_false_false_false_false_false_true_true_true_false_false_true_true_0_2_true_true_true_1_false_true_true_0_false_true_true(130,80)(194,80)(254,80)(318,80)", + "#3@1234_false_0_39_49_1_21_39_0_39_141_39_0_39_0_20_0_S_20_7/24_4_1_0_S_20_7/24_20_0_false_false_false_false_false_false_false_false_true_true_true_false_false_true_true_0_false_2_true_true_true_1_false_true_true_0_false_true_true(130,80)(194,80)(254,80)(318,80)", ); }); @@ -243,7 +245,7 @@ describe("Editor-DataView", () => { const trans = nodeService.getNodeFromId(1).getTransitions()[0]; const cvo1 = new TransitionViewObject(editorView, trans, false); expect(cvo1.key).toBe( - "#0@false_false_IC_60_7/24_1_3_0_IC_60_7/24_60_false_false_(320,48)(324,48)(412,48)(416,48)", + "#0@false_false_IC_60_7/24_1_3_0_IC_60_7/24_60_false_false_false(320,48)(324,48)(412,48)(416,48)", ); }); diff --git a/src/app/view/editor-main-view/data-views/editor.keyEvents.ts b/src/app/view/editor-main-view/data-views/editor.keyEvents.ts index f5ad4b65..de57b37d 100644 --- a/src/app/view/editor-main-view/data-views/editor.keyEvents.ts +++ b/src/app/view/editor-main-view/data-views/editor.keyEvents.ts @@ -193,16 +193,26 @@ export class EditorKeyEvents { } private onInsertAllVisibleElementsFromCopyCache(): boolean { + if (!this.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return true; + } this.copyService.insertCopiedNetzgrafik(); return false; } private onRevertLastChange(): boolean { + if (!this.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return true; + } this.undoService.undo(); return true; } private onDuplicate(): boolean { + if (!this.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return true; + } + if (this.doDuplicateTrainrun()) { return true; } @@ -490,6 +500,10 @@ export class EditorKeyEvents { } private onKeyPressedInsert(): boolean { + if (!this.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return true; + } + if (this.onDuplicate()) { return true; } @@ -544,7 +558,9 @@ export class EditorKeyEvents { } } }); - this.nodeSerivce.nodesUpdated(); + + this.netzgrafikElementsUpdated(); + if (selectedNodeDeleted) { this.uiInteractionService.closeNodeStammdaten(); } @@ -558,7 +574,7 @@ export class EditorKeyEvents { this.nodeSerivce.deleteNode(n.getId(), false); } }); - this.nodeSerivce.nodesUpdated(); + if (selectedNodeDeleted) { this.uiInteractionService.closeNodeStammdaten(); } @@ -573,6 +589,9 @@ export class EditorKeyEvents { } private onKeyPressedDelete(): boolean { + if (!this.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return true; + } const selectedTrainrunSectionId = this.getSelectedTrainSectionId(); const connections = this.nodeSerivce.getAllSelectedConnections(); @@ -600,18 +619,10 @@ export class EditorKeyEvents { /* handle Nodes and Trainruns/TrainrunSections */ if (this.filterService.isAnyFilterActive()) { this.deleteTrainrunsAndEmptyNodesIfFilteringActive(); - this.trainrunSectionService.trainrunSectionsUpdated(); - this.trainrunService.trainrunsUpdated(); - this.nodeSerivce.transitionsUpdated(); - this.nodeSerivce.connectionsUpdated(); - this.nodeSerivce.nodesUpdated(); - this.noteSerivce.notesUpdated(); } else { this.removeAllSelectedNodes(); - this.nodeSerivce.transitionsUpdated(); - this.nodeSerivce.connectionsUpdated(); - this.nodeSerivce.nodesUpdated(); } + this.netzgrafikElementsUpdated(); /* handle Notes */ this.removeAllSelectedNotes(); @@ -648,4 +659,13 @@ export class EditorKeyEvents { return false; } + + + private netzgrafikElementsUpdated() { + this.trainrunSectionService.trainrunSectionsUpdated(); + this.trainrunService.trainrunsUpdated(); + this.nodeSerivce.transitionsUpdated(); + this.nodeSerivce.connectionsUpdated(); + this.nodeSerivce.nodesUpdated(); + } } diff --git a/src/app/view/editor-main-view/data-views/editor.view.ts b/src/app/view/editor-main-view/data-views/editor.view.ts index 659cfb5c..12d2e7c3 100644 --- a/src/app/view/editor-main-view/data-views/editor.view.ts +++ b/src/app/view/editor-main-view/data-views/editor.view.ts @@ -33,6 +33,7 @@ import {CopyService} from "../../../services/data/copy.service"; import {StreckengrafikDrawingContext} from "../../../streckengrafik/model/util/streckengrafik.drawing.context"; import {LevelOfDetail, LevelOfDetailService} from "../../../services/ui/level.of.detail.service"; import {ViewportCullService} from "../../../services/ui/viewport.cull.service"; +import {VersionControlService} from "../../../services/data/version-control.service"; export class EditorView implements SVGMouseControllerObserver { static svgName = "graphContainer"; @@ -128,7 +129,8 @@ export class EditorView implements SVGMouseControllerObserver { private copyService: CopyService, private logService: LogService, private viewportCullService: ViewportCullService, - private levelOfDetailService: LevelOfDetailService + private levelOfDetailService: LevelOfDetailService, + private versionControlService : VersionControlService ) { this.controller = controller; this.svgMouseController = new SVGMouseController(EditorView.svgName, this); @@ -139,6 +141,7 @@ export class EditorView implements SVGMouseControllerObserver { this.trainrunSectionPreviewLineView = new TrainrunSectionPreviewLineView( nodeService, filterService, + versionControlService ); this.multiSelectRenderer = new MultiSelectRenderer(); this.notesView = new NotesView(this); diff --git a/src/app/view/editor-main-view/data-views/nodeViewObject.ts b/src/app/view/editor-main-view/data-views/nodeViewObject.ts index b8e42c70..e58752e7 100644 --- a/src/app/view/editor-main-view/data-views/nodeViewObject.ts +++ b/src/app/view/editor-main-view/data-views/nodeViewObject.ts @@ -45,7 +45,9 @@ export class NodeViewObject { "_" + editorView.isTemporaryDisableFilteringOfItemsInViewEnabled() + "_" + - editorView.getLevelOfDetail() + editorView.getLevelOfDetail() + + "_" + + editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ); } } diff --git a/src/app/view/editor-main-view/data-views/nodes.view.scss b/src/app/view/editor-main-view/data-views/nodes.view.scss index 7be45f8e..c82bccca 100644 --- a/src/app/view/editor-main-view/data-views/nodes.view.scss +++ b/src/app/view/editor-main-view/data-views/nodes.view.scss @@ -55,6 +55,10 @@ font-size: $BP_LABEL_FONT_SIZE; } +::ng-deep text.node_text.readonly { + cursor: default; +} + ::ng-deep text.node_text.hover { fill: $COLOR_Edit; } @@ -209,6 +213,10 @@ transform: translateX(-64px) translateY(-32px); } +::ng-deep rect.node_hover_drag_root_background.readonly { + cursor: default; +} + ::ng-deep path.node_edit_button { opacity: 0.01; stroke: None; diff --git a/src/app/view/editor-main-view/data-views/nodes.view.spec.ts b/src/app/view/editor-main-view/data-views/nodes.view.spec.ts index 04cee133..664456bb 100644 --- a/src/app/view/editor-main-view/data-views/nodes.view.spec.ts +++ b/src/app/view/editor-main-view/data-views/nodes.view.spec.ts @@ -150,7 +150,8 @@ describe("Nodes-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); new EditorView( @@ -166,6 +167,7 @@ describe("Nodes-View", () => { logService, viewportCullSerivce, levelOfDetailService, + undefined ); controller.bindViewToServices(); editorView = controller.editorView; diff --git a/src/app/view/editor-main-view/data-views/nodes.view.ts b/src/app/view/editor-main-view/data-views/nodes.view.ts index fbfea1f6..1f43766b 100644 --- a/src/app/view/editor-main-view/data-views/nodes.view.ts +++ b/src/app/view/editor-main-view/data-views/nodes.view.ts @@ -324,9 +324,10 @@ export class NodesView { } private makeHoverDragBackground(groupEnter: any) { - - groupEnter - .append(StaticDomTags.NODE_HOVER_DRAG_AREA_BACKGROUND_SVG) + const added= + groupEnter + .append(StaticDomTags.NODE_HOVER_DRAG_AREA_BACKGROUND_SVG); + added .attr("class", StaticDomTags.NODE_HOVER_DRAG_AREA_BACKGROUND_CLASS) .classed(StaticDomTags.TAG_SELECTED, (n: NodeViewObject) => n.node.selected(), @@ -340,7 +341,17 @@ export class NodesView { "y", (n: NodeViewObject) => n.node.getNodeHeight() - NODE_TEXT_AREA_HEIGHT, ) - .call(this.draggable) + .classed( + StaticDomTags.NODE_READONLY, + !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() + ); + + if ( this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + added + .call(this.draggable); + } + + added .on("mouseover", (n: NodeViewObject, i, a) => this.onNodeMouseoverDragButton(n.node, a[i]), ) @@ -352,7 +363,9 @@ export class NodesView { } private makeHoverDragRoot(groupEnter: any) { - + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + return; + } groupEnter .append(StaticDomTags.NODE_HOVER_DRAG_AREA_SVG) .attr("class", StaticDomTags.NODE_HOVER_DRAG_AREA_CLASS) @@ -561,9 +574,9 @@ export class NodesView { } private makeLabelText(groupEnter: any) { - - groupEnter - .append(StaticDomTags.NODE_LABELAREA_TEXT_SVG) + const added = groupEnter + .append(StaticDomTags.NODE_LABELAREA_TEXT_SVG); + added .attr("class", StaticDomTags.NODE_LABELAREA_TEXT_CLASS) .attr(StaticDomTags.NODE_ID, (n: NodeViewObject) => n.node.getId()) .attr("x", NODE_TEXT_LEFT_SPACING) @@ -576,6 +589,16 @@ export class NodesView { StaticDomTags.NODE_HAS_CONNECTIONS, (n: NodeViewObject) => n.node.getConnections().length > 0, ) + .classed( + StaticDomTags.NODE_READONLY, + !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() + ); + + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + return; + } + + added .call(this.draggable) .on("mouseover", (n: NodeViewObject, i, a) => this.onNodeLabelAreaMouseover(n.node, a[i]), diff --git a/src/app/view/editor-main-view/data-views/noteViewObject.ts b/src/app/view/editor-main-view/data-views/noteViewObject.ts index d1bc1378..0cc8d755 100644 --- a/src/app/view/editor-main-view/data-views/noteViewObject.ts +++ b/src/app/view/editor-main-view/data-views/noteViewObject.ts @@ -36,7 +36,9 @@ export class NoteViewObject { "_" + editorView.isTemporaryDisableFilteringOfItemsInViewEnabled() + "_" + - editorView.getLevelOfDetail() + editorView.getLevelOfDetail() + + "_" + + editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ); } } diff --git a/src/app/view/editor-main-view/data-views/notes.view.spec.ts b/src/app/view/editor-main-view/data-views/notes.view.spec.ts index cc0253cf..882e579e 100644 --- a/src/app/view/editor-main-view/data-views/notes.view.spec.ts +++ b/src/app/view/editor-main-view/data-views/notes.view.spec.ts @@ -150,7 +150,8 @@ describe("Notes-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); new EditorView( @@ -165,7 +166,8 @@ describe("Notes-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); controller.bindViewToServices(); editorView = controller.editorView; diff --git a/src/app/view/editor-main-view/data-views/notes.view.ts b/src/app/view/editor-main-view/data-views/notes.view.ts index 0cc47553..4e0dd6d5 100644 --- a/src/app/view/editor-main-view/data-views/notes.view.ts +++ b/src/app/view/editor-main-view/data-views/notes.view.ts @@ -227,9 +227,9 @@ export class NotesView { } private makeNoteHoverRoot(groupEnter: any) { - - groupEnter - .append(StaticDomTags.NOTE_HOVER_ROOT_SVG) + const added = groupEnter + .append(StaticDomTags.NOTE_HOVER_ROOT_SVG); + added .attr("class", StaticDomTags.NOTE_HOVER_ROOT_CLASS) .attr(StaticDomTags.NOTE_ID, (n: NoteViewObject) => n.note.getId()) .attr( @@ -241,7 +241,13 @@ export class NotesView { (n: NoteViewObject) => NotesView.extractTextBasedHeight(n.note) + 48, ) .attr("x", -24) - .attr("y", -24) + .attr("y", -24); + + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + return; + } + + added .call(this.draggable) .on("mouseout", (n: NoteViewObject) => this.onNoteMouseout(n.note, null)) .on("mouseover", (n: NoteViewObject, i, a) => @@ -377,8 +383,10 @@ export class NotesView { private makeNoteDragAreaBackground(groupEnter: any) { - groupEnter - .append(StaticDomTags.NOTE_HOVER_DRAG_AREA_BACKGROUND_SVG) + const added = groupEnter + .append(StaticDomTags.NOTE_HOVER_DRAG_AREA_BACKGROUND_SVG); + + added .attr("class", StaticDomTags.NOTE_HOVER_DRAG_AREA_BACKGROUND_CLASS) .classed(StaticDomTags.TAG_SELECTED, (n: NoteViewObject) => n.note.selected(), @@ -388,7 +396,13 @@ export class NotesView { .attr("width", 28) .attr("height", 28) .attr("x", 0) - .attr("y", 0) + .attr("y", 0); + + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + return; + } + + added .on("mouseout", (n: NoteViewObject) => this.onNoteMouseoutDragButton(n.note, null), ) @@ -399,7 +413,9 @@ export class NotesView { } private makeNoteDragArea(groupEnter: any) { - + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + return; + } groupEnter .append(StaticDomTags.NOTE_HOVER_DRAG_AREA_SVG) .attr("class", StaticDomTags.NOTE_HOVER_DRAG_AREA_CLASS) @@ -427,6 +443,11 @@ export class NotesView { } onNoteMousedown(note: Note) { + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + d3.event.stopPropagation(); + return; + } + if (this.editorView.editorMode === EditorMode.MultiNodeMoving) { const multiSelected = this.editorView.isNoteSelected(note.getId()); if (multiSelected) { @@ -439,6 +460,11 @@ export class NotesView { } onNoteMouseup(note: Note, domObj: any) { + if ( !this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable() ){ + d3.event.stopPropagation(); + return; + } + const rect: DOMRect = d3.select(domObj).node().getBoundingClientRect(); const clickPosition = new Vec2D( rect.x + rect.width / 2, diff --git a/src/app/view/editor-main-view/data-views/static.dom.tags.ts b/src/app/view/editor-main-view/data-views/static.dom.tags.ts index 35ea7546..c3e19c57 100644 --- a/src/app/view/editor-main-view/data-views/static.dom.tags.ts +++ b/src/app/view/editor-main-view/data-views/static.dom.tags.ts @@ -77,6 +77,7 @@ export class StaticDomTags { static NODE_TAG_REQ_FOR_DRAGGING = "req_for_dragging"; static NODE_TAG_JUNCTION_ONLY = "junction_only"; static NODE_HAS_CONNECTIONS = "has_connections"; + static NODE_READONLY = "readonly"; static NODE_HOVER_ROOT_SVG = "rect"; static NODE_HOVER_ROOT_CLASS = "node_hover_root"; diff --git a/src/app/view/editor-main-view/data-views/trainrunSectionViewObject.ts b/src/app/view/editor-main-view/data-views/trainrunSectionViewObject.ts index 1643abae..7099f834 100644 --- a/src/app/view/editor-main-view/data-views/trainrunSectionViewObject.ts +++ b/src/app/view/editor-main-view/data-views/trainrunSectionViewObject.ts @@ -135,7 +135,9 @@ export class TrainrunSectionViewObject { "_" + editorView.checkFilterNode(d.getTargetNode()) + "_" + - editorView.getLevelOfDetail(); + editorView.getLevelOfDetail() + + "_" + + editorView.trainrunSectionPreviewLineView.getVariantIsWritable(); cumulativeTravelTimeData.forEach((data) => { key += "_" + data.node.getId(); diff --git a/src/app/view/editor-main-view/data-views/trainrunsection.previewline.view.ts b/src/app/view/editor-main-view/data-views/trainrunsection.previewline.view.ts index 529d584b..d51f7353 100644 --- a/src/app/view/editor-main-view/data-views/trainrunsection.previewline.view.ts +++ b/src/app/view/editor-main-view/data-views/trainrunsection.previewline.view.ts @@ -8,6 +8,7 @@ import {Transition} from "../../../models/transition.model"; import {SimpleTrainrunSectionRouter} from "../../../services/util/trainrunsection.routing"; import {NodeService} from "../../../services/data/node.service"; import {FilterService} from "../../../services/ui/filter.service"; +import {VersionControlService} from "../../../services/data/version-control.service"; export enum PreviewLineMode { NotDragging, @@ -55,6 +56,7 @@ export class TrainrunSectionPreviewLineView { constructor( private nodeService: NodeService, private filterService: FilterService, + private versionControlService : VersionControlService ) {} static setGroup(nodeGroup: d3.Selector) { @@ -69,6 +71,13 @@ export class TrainrunSectionPreviewLineView { .attr("class", StaticDomTags.PREVIEW_CONNECTION_LINE_ROOT_CLASS); } + getVariantIsWritable() : boolean { + if ( !this.versionControlService?.getVariantIsWritable()){ + return false; + } + return true; + } + getMode(): PreviewLineMode { return this.mode; } @@ -93,6 +102,9 @@ export class TrainrunSectionPreviewLineView { dragIntermediateStopInfo: DragIntermediateStopInfo, startPosition: Vec2D, ) { + if ( !this.versionControlService?.getVariantIsWritable()){ + return; + } this.mode = PreviewLineMode.DragIntermediateStop; this.dragIntermediateStopInfo = dragIntermediateStopInfo; this.startIntermediatePos = startPosition; @@ -105,6 +117,9 @@ export class TrainrunSectionPreviewLineView { dragTransition: DragTransitionInfo, startPosition: Vec2D, ) { + if ( !this.versionControlService?.getVariantIsWritable()){ + return; + } this.filterService.switchOffTemporaryEmptyAndNonStopFiltering(); this.mode = PreviewLineMode.DragTransition; this.dragTransitionInfo = dragTransition; @@ -143,6 +158,9 @@ export class TrainrunSectionPreviewLineView { } startPreviewLine(nodeId: number) { + if ( !this.versionControlService?.getVariantIsWritable()){ + return; + } this.mode = PreviewLineMode.DragNewTrainrunSection; const mousePosition = d3.mouse( d3.select(StaticDomTags.PREVIEW_LINE_ROOT_DOM_REF).node(), @@ -153,6 +171,9 @@ export class TrainrunSectionPreviewLineView { } startPreviewLineAtPosition(startNode: Node, startPosition: Vec2D) { + if ( !this.versionControlService?.getVariantIsWritable()){ + return; + } this.mode = PreviewLineMode.DragExistingTrainrunSection; this.startNode = startNode; this.startPos = startPosition; @@ -253,6 +274,9 @@ export class TrainrunSectionPreviewLineView { false, ); } + if (this.existingTrainrunSection !== null){ + D3Utils.removeGrayout(this.existingTrainrunSection); + } if (this.startNode !== null) { D3Utils.unhighlightNode(this.startNode); } diff --git a/src/app/view/editor-main-view/data-views/trainrunsections.view.scss b/src/app/view/editor-main-view/data-views/trainrunsections.view.scss index cb218e8c..442bdbf2 100644 --- a/src/app/view/editor-main-view/data-views/trainrunsections.view.scss +++ b/src/app/view/editor-main-view/data-views/trainrunsections.view.scss @@ -279,3 +279,7 @@ opacity: 1; stroke-width: 0.5px; } + +::ng-deep .SourceArrival, ::ng-deep .TargetDeparture { + display: none; +} diff --git a/src/app/view/editor-main-view/data-views/trainrunsections.view.spec.ts b/src/app/view/editor-main-view/data-views/trainrunsections.view.spec.ts index 84b3101b..5c4befa2 100644 --- a/src/app/view/editor-main-view/data-views/trainrunsections.view.spec.ts +++ b/src/app/view/editor-main-view/data-views/trainrunsections.view.spec.ts @@ -155,7 +155,8 @@ describe("TrainrunSection-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); new EditorView( @@ -170,7 +171,8 @@ describe("TrainrunSection-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); controller.bindViewToServices(); diff --git a/src/app/view/editor-main-view/data-views/trainrunsections.view.ts b/src/app/view/editor-main-view/data-views/trainrunsections.view.ts index 99d9ddeb..087a05b3 100644 --- a/src/app/view/editor-main-view/data-views/trainrunsections.view.ts +++ b/src/app/view/editor-main-view/data-views/trainrunsections.view.ts @@ -178,6 +178,31 @@ export class TrainrunSectionsView { } } + static getWarning( + trainrunSection: TrainrunSection, + textElement: TrainrunSectionText, + ): string { + if (!TrainrunSectionsView.hasWarning(trainrunSection, textElement)) { + return ""; + } + switch (textElement) { + case TrainrunSectionText.SourceDeparture: + return trainrunSection.getSourceDepartureWarning().title + ": " + trainrunSection.getSourceDepartureWarning().description; + case TrainrunSectionText.SourceArrival: + return trainrunSection.getSourceArrivalWarning().title + ": " + trainrunSection.getSourceArrivalWarning().description; + case TrainrunSectionText.TargetDeparture: + return trainrunSection.getTargetDepartureWarning().title + ": " + trainrunSection.getTargetDepartureWarning().description; + case TrainrunSectionText.TargetArrival: + return trainrunSection.getTargetArrivalWarning().title + ": " + trainrunSection.getTargetArrivalWarning().description; + case TrainrunSectionText.TrainrunSectionTravelTime: + return trainrunSection.getTravelTimeWarning().title + ": " + trainrunSection.getTravelTimeWarning().description; + case TrainrunSectionText.TrainrunSectionName: + default: + return ""; + } + return ""; + } + static getTime( trainrunSection: TrainrunSection, textElement: TrainrunSectionText, @@ -1221,7 +1246,9 @@ export class TrainrunSectionsView { connectedTrainIds: any, atSource: boolean, ) { - + if (!this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable()) { + return; + } groupEnter .append(StaticDomTags.EDGE_LINE_PIN_SVG) .attr("class", StaticDomTags.EDGE_LINE_PIN_CLASS) @@ -1312,21 +1339,21 @@ export class TrainrunSectionsView { ); } - createTrainrunSectionElement( + private createInternTrainrunSectionElementFilteringWarningElements( groupEnter: d3.Selector, selectedTrainrun: Trainrun, connectedTrainIds: any, textElement: TrainrunSectionText, - enableEvents = true + enableEvents = true, + hasWarning = true ) { - const atSource = textElement === TrainrunSectionText.SourceArrival || textElement === TrainrunSectionText.SourceDeparture; const isArrival = textElement === TrainrunSectionText.SourceArrival || textElement === TrainrunSectionText.TargetArrival; - groupEnter + const renderingObjects = groupEnter .filter( (d: TrainrunSectionViewObject) => this.filterTrainrunsectionAtNode(d.trainrunSection, atSource) && @@ -1334,7 +1361,8 @@ export class TrainrunSectionsView { d.trainrunSection, atSource, isArrival, - ), + ) && + TrainrunSectionsView.hasWarning(d.trainrunSection, textElement) === hasWarning ) .append(StaticDomTags.EDGE_LINE_TEXT_SVG) .attr("class", (d: TrainrunSectionViewObject) => @@ -1415,6 +1443,32 @@ export class TrainrunSectionsView { ); } }); + + if (hasWarning) { + renderingObjects + .append("svg:title") + .text((d: TrainrunSectionViewObject) => { + return TrainrunSectionsView.getWarning(d.trainrunSection, textElement); + }); + } + } + + createTrainrunSectionElement( + groupEnter: d3.Selector, + selectedTrainrun: Trainrun, + connectedTrainIds: any, + textElement: TrainrunSectionText, + enableEvents = true + ) { + // pass(1) : render all elements without warnings + this.createInternTrainrunSectionElementFilteringWarningElements( + groupEnter, selectedTrainrun, connectedTrainIds, textElement, enableEvents, false + ); + // pass(2) : render all elements with warnings + // especially warning_msg + this.createInternTrainrunSectionElementFilteringWarningElements( + groupEnter, selectedTrainrun, connectedTrainIds, textElement, enableEvents, true + ); } createTrainrunSectionGotoInfoElement( diff --git a/src/app/view/editor-main-view/data-views/transitionViewObject.ts b/src/app/view/editor-main-view/data-views/transitionViewObject.ts index da69cf39..30098f5f 100644 --- a/src/app/view/editor-main-view/data-views/transitionViewObject.ts +++ b/src/app/view/editor-main-view/data-views/transitionViewObject.ts @@ -52,7 +52,8 @@ export class TransitionViewObject { editorView.isTemporaryDisableFilteringOfItemsInViewEnabled() + "_" + isMuted + - "_"; + "_" + + editorView.trainrunSectionPreviewLineView.getVariantIsWritable(); transition.getPath().forEach((p) => { key += p.toString(); diff --git a/src/app/view/editor-main-view/data-views/transitions.view.spec.ts b/src/app/view/editor-main-view/data-views/transitions.view.spec.ts index d4a8e722..9a168d30 100644 --- a/src/app/view/editor-main-view/data-views/transitions.view.spec.ts +++ b/src/app/view/editor-main-view/data-views/transitions.view.spec.ts @@ -150,7 +150,8 @@ describe("Transitions-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); @@ -166,7 +167,8 @@ describe("Transitions-View", () => { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + undefined ); controller.bindViewToServices(); diff --git a/src/app/view/editor-main-view/data-views/transitions.view.ts b/src/app/view/editor-main-view/data-views/transitions.view.ts index 8a6f166a..4788acc6 100644 --- a/src/app/view/editor-main-view/data-views/transitions.view.ts +++ b/src/app/view/editor-main-view/data-views/transitions.view.ts @@ -151,6 +151,9 @@ export class TransitionsView { selectedTrainrun: Trainrun, connectedTrainIds: any, ) { + if (!this.editorView.trainrunSectionPreviewLineView.getVariantIsWritable()){ + return; + } grpEnter .append(StaticDomTags.TRANSITION_BUTTON_SVG) .attr( diff --git a/src/app/view/editor-main-view/editor-main-view.component.ts b/src/app/view/editor-main-view/editor-main-view.component.ts index f059f788..1e3caa73 100644 --- a/src/app/view/editor-main-view/editor-main-view.component.ts +++ b/src/app/view/editor-main-view/editor-main-view.component.ts @@ -43,6 +43,7 @@ import {TravelTimeCreationEstimatorType} from "../themes/editor-trainrun-travelt import {Port} from "../../models/port.model"; import {LevelOfDetailService} from "../../services/ui/level.of.detail.service"; import {ViewportCullService} from "../../services/ui/viewport.cull.service"; +import {VersionControlService} from "../../services/data/version-control.service"; @Component({ selector: "sbb-editor-main-view", @@ -76,7 +77,7 @@ export class EditorMainViewComponent implements AfterViewInit, OnDestroy { private logService: LogService, private viewportCullSerivce: ViewportCullService, private levelOfDetailService: LevelOfDetailService, - + private versionControlService: VersionControlService, ) { this.editorView = new EditorView( this, @@ -90,7 +91,8 @@ export class EditorMainViewComponent implements AfterViewInit, OnDestroy { copyService, logService, viewportCullSerivce, - levelOfDetailService + levelOfDetailService, + versionControlService ); this.uiInteractionService.zoomInObservable .pipe(takeUntil(this.destroyed)) @@ -594,6 +596,12 @@ export class EditorMainViewComponent implements AfterViewInit, OnDestroy { }); } + private handleVariantChanged() { + if (this.versionControlService?.getAndClearVarianteChangedSignal()) { + this.uiInteractionService.viewportCenteringOnNodesBoundingBox(); + } + } + private subscribeViewToServices() { this.nodeService.nodes .pipe(takeUntil(this.destroyed)) @@ -631,5 +639,11 @@ export class EditorMainViewComponent implements AfterViewInit, OnDestroy { this.editorView.notesView.displayNotes(updatedNotes); this.editorView.postDisplayRendering(); }); + + this.nodeService.nodes + .pipe(takeUntil(this.destroyed)) + .subscribe(() => { + this.handleVariantChanged(); + }); } } diff --git a/src/app/view/editor-menu/editor-menu.component.html b/src/app/view/editor-menu/editor-menu.component.html index e7abfd1f..2f8a789f 100644 --- a/src/app/view/editor-menu/editor-menu.component.html +++ b/src/app/view/editor-menu/editor-menu.component.html @@ -1,5 +1,5 @@

-
+
{{ label$ | async }} @@ -7,16 +7,16 @@
- Speichere Änderungen + {{ 'app.view.editor-menu.save-changes' | translate }} - Änderungen gespeichert + {{ 'app.view.editor-menu.changes-saved' | translate }} - Lese-Modus + {{ 'app.view.editor-menu.read-mode' | translate }}
@@ -34,7 +34,7 @@ mode="icon" class="ButtonFilter" (click)="onFilter()" - title="Filter ein-/ausblenden" + [title]="'app.view.editor-menu.show-hide-filter' | translate" > - @@ -125,7 +125,7 @@ mode="ghost" class="ButtonZoomIn" (click)="onZoomIn()" - title="Hereinzoomen" + [title]="'app.view.editor-menu.zoom-in' | translate" > + @@ -142,9 +142,10 @@ [class.isStreckengrafikEditing]=" isStreckengrafikEditing() || isAnalytics() " - [disabled]="isStreckengrafikEditing() || isAnalytics()" + [class.readonly]="isStreckengrafikEditing() || isAnalytics() || !getVariantIsWritable()" + [disabled]="isStreckengrafikEditing() || isAnalytics() || !getVariantIsWritable()" (click)="onTopologieEditor()" - title="Topologie Editor deaktiviert" + [title]="'app.view.editor-menu.topology-editor-disabled' | translate" > @@ -235,16 +236,17 @@ class="NoteEditor" [class.isStreckengrafikEditing]="isStreckengrafikEditing()" > - + - +

Einstellungen

+

{{ 'app.view.editor-properties-view-component.settings' | translate }}

- Farbschema - Theme + {{ 'app.view.editor-properties-view-component.color-scheme' | translate }} + {{ 'app.view.editor-properties-view-component.theme' | translate }}
Einstellungen
- Hintergrundfarbe -
+ {{ 'app.view.editor-properties-view-component.background-color' | translate }} Einstellungen  

+ + +
- Editor - Fahrzeitvoreinstellungs (Heuristik) + {{ 'app.view.editor-properties-view-component.editor' | translate }} + {{ 'app.view.editor-properties-view-component.travel-time-presetting-default' | translate }}
Einstellungen
- Streckengrafik - Achsenskalierung (Distanz) + {{ 'app.view.editor-properties-view-component.graphicTimetable' | translate }} + {{ 'app.view.editor-properties-view-component.axis-scaling-distance' | translate }}
- Stammdaten - + {{ 'app.view.editor-side-view.editor-node-detail-view.base-data' | translate }} + - + - + - - Auslastung + + {{ 'app.view.editor-side-view.editor-node-detail-view.occupancy' | translate }}
- +
- Filterbare Labels - + {{ 'app.view.editor-side-view.editor-node-detail-view.filterable-labels' | translate }} + @@ -66,7 +80,7 @@

- Haltezeiten + {{ 'app.view.editor-side-view.editor-node-detail-view.stopping-times' | translate }} - Haltezeit pro Produkt + {{ 'app.view.editor-side-view.editor-node-detail-view.stopping-time-per-product' | translate }} - +
- + - + - + - + - +
IPV{{ 'app.view.editor-side-view.editor-node-detail-view.ipv' | translate }}
.no_halt " (change)="haltezeitIPVNoHaltChanged()" - >Kein Halt + >{{ 'app.view.editor-side-view.editor-node-detail-view.no-stop' | translate }}
A{{ 'app.view.editor-side-view.editor-node-detail-view.a' | translate }}
nodeProperties.nodeTrainrunCategoryHaltezeit['HaltezeitA'].no_halt " (change)="haltezeitANoHaltChanged()" - >Kein Halt + >{{ 'app.view.editor-side-view.editor-node-detail-view.no-stop' | translate }}
B{{ 'app.view.editor-side-view.editor-node-detail-view.b' | translate }}
nodeProperties.nodeTrainrunCategoryHaltezeit['HaltezeitB'].no_halt " (change)="haltezeitBNoHaltChanged()" - >Kein Halt + >{{ 'app.view.editor-side-view.editor-node-detail-view.no-stop' | translate }}
C{{ 'app.view.editor-side-view.editor-node-detail-view.c' | translate }}
nodeProperties.nodeTrainrunCategoryHaltezeit['HaltezeitC'].no_halt " (change)="haltezeitCNoHaltChanged()" - >Kein Halt + >{{ 'app.view.editor-side-view.editor-node-detail-view.no-stop' | translate }}
D{{ 'app.view.editor-side-view.editor-node-detail-view.d' | translate }}
nodeProperties.nodeTrainrunCategoryHaltezeit['HaltezeitD'].no_halt " (change)="haltezeitDNoHaltChanged()" - >Kein Halt + >{{ 'app.view.editor-side-view.editor-node-detail-view.no-stop' | translate }}
- - Links + + {{ 'app.view.editor-side-view.editor-node-detail-view.links' | translate }} - + + + diff --git a/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.scss b/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.scss index 2e851d09..95497863 100644 --- a/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.scss +++ b/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.scss @@ -61,3 +61,13 @@ } } } + +sbb-form-field.readonly { + pointer-events: none; + cursor: default; +} + +table.NodeDataTable.readonly { + pointer-events: none; + cursor: default; +} diff --git a/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.ts b/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.ts index 26228a61..1ac22d36 100644 --- a/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.ts +++ b/src/app/view/editor-side-view/editor-node-detail-view/editor-node-detail-view.component.ts @@ -22,6 +22,8 @@ import {LabelService} from "../../../services/data/label.serivce"; import {LabelGroupService} from "../../../services/data/labelgroup.service"; import {SbbChipEvent, SbbChipInputEvent} from "@sbb-esta/angular/chips"; import {COMMA, ENTER} from "@angular/cdk/keycodes"; +import {environment} from "../../../../environments/environment"; +import {VersionControlService} from "../../../services/data/version-control.service"; interface NodeProperties { nodeId: number; @@ -54,10 +56,15 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { labels: [], }; + private initialNodeLabels: string[]; + readonly separatorKeysCodes = [ENTER, COMMA]; nodeLabelsAutoCompleteOptions: string[] = []; + readonly disableBackend = environment.disableBackend; + private destroyed = new Subject(); + private isLabelBeingEdited = false; constructor( private uiInteractionService: UiInteractionService, @@ -65,6 +72,7 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { private nodeService: NodeService, private labelService: LabelService, private labelGroupService: LabelGroupService, + public versionControlService : VersionControlService, private cd: ChangeDetectorRef, ) {} @@ -92,7 +100,6 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { this.nodeProperties.nodeId, event.target.value, ); - this.nodeProperties.nodeBetriebspunktName = event.target.value; this.uiInteractionService.updateNodeStammdaten(); } @@ -101,7 +108,6 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { this.nodeProperties.nodeId, event.target.value, ); - this.nodeProperties.nodeBetriebspunktFullName = event.target.value; } onConnectionTimeChanged() { @@ -117,10 +123,9 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { return; } this.nodeProperties.labels.push(value); - this.nodeService.changeLabels( - this.nodeProperties.nodeId, - this.nodeProperties.labels, - ); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; chipInputEvent.chipInput!.clear(); } @@ -133,13 +138,14 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { this.nodeProperties.labels = this.nodeProperties.labels.filter( (labels) => labels !== valueDelete, ); - this.nodeService.changeLabels( - this.nodeProperties.nodeId, - this.nodeProperties.labels, - ); + this.isLabelBeingEdited = true; + this.checkAndSetLabels(); + this.isLabelBeingEdited = false; } onLabelsFocusout() { + if (this.isLabelBeingEdited) return; + const keyboardEvent = new KeyboardEvent("keydown", { code: "Enter", key: "Enter", @@ -149,10 +155,7 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { bubbles: true, }); document.getElementById("nodeLabelsInput").dispatchEvent(keyboardEvent); - this.nodeService.changeLabels( - this.nodeProperties.nodeId, - this.nodeProperties.labels, - ); + this.checkAndSetLabels(); } onCapacityChanged() { @@ -174,16 +177,9 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { onDeleteNode() { const node = this.nodeService.getSelectedNode(); - const dialogTitle = "Löschen"; - const dialogContent = - "Soll der Knoten " + - node.getBetriebspunktName() + - " (" + - node.getFullName() + - ") definitiv gelöscht werden?"; const confirmationDialogParamter = new ConfirmationDialogParameter( - dialogTitle, - dialogContent, + $localize`:@@app.view.editor-side-view.editor-node-detail-view.delete:Delete`, + $localize`:@@app.view.editor-side-view.editor-node-detail-view.deleteNodeDialog:Should the node ${node.getBetriebspunktName()}:operationalPointShortName: (${node.getFullName()}:operationalPointName:) be definitely deleted?` ); this.uiInteractionService .showConfirmationDiagramDialog(confirmationDialogParamter) @@ -268,6 +264,21 @@ export class EditorNodeDetailViewComponent implements OnInit, OnDestroy { selectedNode.getLabelIds(), ), }; + this.initialNodeLabels = [...this.nodeProperties.labels]; // initialize labels + } + } + + // set labels only if any of it has changed + private checkAndSetLabels() { + if ( + this.nodeProperties.labels.length !== this.initialNodeLabels.length || + !this.nodeProperties.labels.every((label, index) => label === this.initialNodeLabels[index]) + ) { + this.nodeService.changeLabels( + this.nodeProperties.nodeId, + this.nodeProperties.labels + ); + this.initialNodeLabels = [...this.nodeProperties.labels]; } } } diff --git a/src/app/view/editor-tools-view-component/editor-tools-view.component.html b/src/app/view/editor-tools-view-component/editor-tools-view.component.html index 6b0d45c7..f480d622 100644 --- a/src/app/view/editor-tools-view-component/editor-tools-view.component.html +++ b/src/app/view/editor-tools-view-component/editor-tools-view.component.html @@ -1,89 +1,105 @@ -

Weitere Funktionen

+

{{ 'app.view.editor-side-view.editor-tools-view-component.more-functions' | translate }}

- Exportieren + {{ 'app.view.editor-side-view.editor-tools-view-component.export' | translate }} - Exportieren als SVG + {{ 'app.view.editor-side-view.editor-tools-view-component.export-as-svg' | translate }}
- Exportieren als PNG + {{ 'app.view.editor-side-view.editor-tools-view-component.export-as-png' | translate }}
- Drucken + {{ 'app.view.editor-side-view.editor-tools-view-component.print' | translate }}
- Netzgrafik + {{ 'app.view.editor-side-view.editor-tools-view-component.netzgrafik' | translate }} - Netzgrafik als JSON exportieren + {{ 'app.view.editor-side-view.editor-tools-view-component.export-netzgrafik-as-json' | translate }} +
- - Netzgrafik aus JSON importieren + {{ 'app.view.editor-side-view.editor-tools-view-component.export-trainruns-as-csv' | translate }} + {{ 'app.view.editor-side-view.editor-tools-view-component.export-trainruns-as-csv-excel' | translate }}
- Zuglauf als .csv exportieren - In Exel : Daten -> Aus Text/CSV -> Filename ... importieren. + {{ 'app.view.editor-side-view.editor-tools-view-component.export-origin-destination-as-csv' | translate }}
- Stammdaten + {{ 'app.view.editor-side-view.editor-tools-view-component.base-data' | translate }} + + - Stammdaten exportieren + {{ 'app.view.editor-side-view.editor-tools-view-component.export-base-data' | translate }}
diff --git a/src/app/view/editor-tools-view-component/editor-tools-view.component.ts b/src/app/view/editor-tools-view-component/editor-tools-view.component.ts index 97988596..36c2891d 100644 --- a/src/app/view/editor-tools-view-component/editor-tools-view.component.ts +++ b/src/app/view/editor-tools-view-component/editor-tools-view.component.ts @@ -13,7 +13,9 @@ import {VersionControlService} from "../../services/data/version-control.service import { HaltezeitFachCategories, NetzgrafikDto, + NodeDto, TrainrunCategoryHaltezeit, + TrainrunSectionDto, } from "../../data-structures/business.data.structures"; import {downloadBlob} from "../util/download-utils"; import {map} from "rxjs/operators"; @@ -21,6 +23,13 @@ import {LabelService} from "../../services/data/label.serivce"; import {NetzgrafikColoringService} from "../../services/data/netzgrafikColoring.service"; import {ViewportCullService} from "../../services/ui/viewport.cull.service"; import {LevelOfDetailService} from "../../services/ui/level.of.detail.service"; +import { + buildEdges, + computeNeighbors, + computeShortestPaths, + topoSort +} from "../util/origin-destination-graph"; +import {TrainrunsectionValidator} from "../../services/util/trainrunsection.validator"; @Component({ selector: "sbb-editor-tools-view-component", @@ -65,7 +74,21 @@ export class EditorToolsViewComponent { const file = param.target.files[0]; const reader = new FileReader(); reader.onload = () => { - const netzgrafikDto = JSON.parse(reader.result.toString()); + let netzgrafikDto: any; + try { + netzgrafikDto = JSON.parse(reader.result.toString()); + } catch (err: any) { + const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`; + this.logger.error(msg); + return; + } + + if (netzgrafikDto === undefined) { + const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`; + this.logger.error(msg); + return; + } + if ( "nodes" in netzgrafikDto && "trainrunSections" in netzgrafikDto && @@ -73,13 +96,12 @@ export class EditorToolsViewComponent { "resources" in netzgrafikDto && "metadata" in netzgrafikDto ) { - this.logger.log("onLoad; load netzgrafik: ", netzgrafikDto); - this.uiInteractionService.showNetzgrafik(); - this.uiInteractionService.closeNodeStammdaten(); - this.uiInteractionService.closePerlenkette(); - this.nodeService.unselectAllNodes(); - this.dataService.loadNetzgrafikDto(netzgrafikDto); + this.processNetzgrafikJSON(netzgrafikDto); + return; } + + const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-error:JSON error`; + this.logger.error(msg); }; reader.readAsText(file); @@ -90,7 +112,7 @@ export class EditorToolsViewComponent { onSave() { const data: NetzgrafikDto = this.dataService.getNetzgrafikDto(); const blob = new Blob([JSON.stringify(data)], {type: "application/json"}); - downloadBlob(blob, "netzgrafik.json"); + downloadBlob(blob, $localize`:@@app.view.editor-side-view.editor-tools-view-component.netzgrafikFile:netzgrafik` + ".json"); } onExportNetzgrafikSVG() { @@ -109,7 +131,7 @@ export class EditorToolsViewComponent { const a = document.createElement("a"); document.body.appendChild(a); a.href = uri; - a.download = "netzgrafik.svg"; + a.download = $localize`:@@app.view.editor-side-view.editor-tools-view-component.netzgrafikFile:netzgrafik` + ".svg"; a.click(); URL.revokeObjectURL(a.href); a.remove(); @@ -135,7 +157,7 @@ export class EditorToolsViewComponent { const containerInfo = this.getContainertoExport(); svg.saveSvgAsPng( containerInfo.documentToExport, - "netzgrafik.png", + $localize`:@@app.view.editor-side-view.editor-tools-view-component.netzgrafikFile:netzgrafik` + ".png", containerInfo.exportParameter, ); //containerInfo.documentToExport.setAttribute('style', containerInfo.documentSavedStyle); @@ -162,17 +184,23 @@ export class EditorToolsViewComponent { } onExportStammdaten() { - const filename = "stammdaten.csv"; + const filename = $localize`:@@app.view.editor-side-view.editor-tools-view-component.baseDataFile:baseData` + ".csv"; const csvData = this.convertToStammdatenCSV(); this.onExport(filename, csvData); } onExportZuglauf() { - const filename = "zuglauf.csv"; + const filename = $localize`:@@app.view.editor-side-view.editor-tools-view-component.trainrunFile:trainrun` + ".csv"; const csvData = this.convertToZuglaufCSV(); this.onExport(filename, csvData); } + onExportOriginDestination() { + const filename = $localize`:@@app.view.editor-side-view.editor-tools-view-component.originDestinationFile:originDestination` + ".csv"; + const csvData = this.convertToOriginDestinationCSV(); + this.onExport(filename, csvData); + } + onExport(filename: string, csvData: string) { const blob = new Blob([csvData], { type: "text/csv", @@ -193,29 +221,43 @@ export class EditorToolsViewComponent { window.URL.revokeObjectURL(url); } - private convertToStammdatenCSV(): string { - const separator = ";"; - const comma = ","; - const headers: string[] = []; - headers.push("BP"); - headers.push("Bahnhof"); - headers.push("Kategorie"); - headers.push("Region"); - headers.push("Fahrgastwechselzeit_IPV"); - headers.push("Fahrgastwechselzeit_A"); - headers.push("Fahrgastwechselzeit_B"); - headers.push("Fahrgastwechselzeit_C"); - headers.push("Fahrgastwechselzeit_D"); - headers.push("ZAZ"); - headers.push("Umsteigezeit"); - headers.push("Labels"); - headers.push("X"); - headers.push("Y"); - headers.push("Erstellen"); + getVariantIsWritable() { + return this.versionControlService.getVariantIsWritable(); + } + + private buildCSVString(headers: string[], rows: string[][]): string { + const separator = ";"; const contentData: string[] = []; contentData.push(headers.join(separator)); + rows.forEach((row) => { + contentData.push(row.join(separator)); + }); + return contentData.join("\n"); + } + + private convertToStammdatenCSV(): string { + const comma = ","; + + const headers: string[] = []; + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.bp:BP`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.station:Station`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.category:category`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.region:Region`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.passengerConnectionTimeIPV:passengerConnectionTimeIPV`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.passengerConnectionTimeA:Passenger_connection_time_A`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.passengerConnectionTimeB:Passenger_connection_time_B`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.passengerConnectionTimeC:Passenger_connection_time_C`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.passengerConnectionTimeD:Passenger_connection_time_D`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.ZAZ:ZAZ`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.transferTime:Transfer_time`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.labels:Labels`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.X:X`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.Y:Y`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.create:Create`); + + const rows: string[][] = []; this.nodeService.getNodes().forEach((nodeElement) => { const trainrunCategoryHaltezeit: TrainrunCategoryHaltezeit = nodeElement.getTrainrunCategoryHaltezeit(); @@ -284,9 +326,9 @@ export class EditorToolsViewComponent { row.push("" + nodeElement.getPositionX()); row.push("" + nodeElement.getPositionY()); row.push(erstellen); - contentData.push(row.join(separator)); + rows.push(row); }); - return contentData.join("\n"); + return this.buildCSVString(headers, rows); } private getContainertoExport() { @@ -300,7 +342,7 @@ export class EditorToolsViewComponent { htmlElementToExport = document.getElementById("graphContainer"); console.log("Try -2- (graphContainer): ", htmlElementToExport !== null); - const boundingBox = this.getNetzgrafikBoundingBox(); + const boundingBox = this.nodeService.getNetzgrafikBoundingBox(); param = { encoderOptions: 1.0, scale: 2.0, @@ -350,55 +392,27 @@ export class EditorToolsViewComponent { }; } - private getNetzgrafikBoundingBox() { - let minX; - let maxX; - let minY; - let maxY; - this.nodeService.nodesStore.nodes.forEach((n) => { - minX = - minX === undefined - ? n.getPositionX() - : Math.min(minX, n.getPositionX()); - maxX = - maxX === undefined - ? n.getPositionX() + n.getNodeWidth() - : Math.max(maxX, n.getPositionX() + n.getNodeWidth()); - minY = - minY === undefined - ? n.getPositionY() - : Math.min(minY, n.getPositionY()); - maxY = - maxY === undefined - ? n.getPositionY() + n.getNodeHeight() - : Math.max(maxY, n.getPositionY() + n.getNodeHeight()); - }); - return {minCoordX: minX, minCoordY: minY, maxCoordX: maxX, maxCoordY: maxY}; - } - private convertToZuglaufCSV(): string { - const separator = ";"; const comma = ","; - const contentData: string[] = []; const headers: string[] = []; - headers.push("Zugkategorie"); - headers.push("Zugname"); - headers.push("Startbahnhof"); - headers.push("Zielbahnhof"); - headers.push("Verkehrsperiode"); - headers.push("Takt"); - headers.push("Abfahrtsminute am Start Knoten)"); - headers.push("Fahrzeit Start-Ziel"); - headers.push("Ankuntsminute am Ziel Knoten)"); - headers.push("Wendezeit Zielbahnhof"); - headers.push("Abfahrtsminute am Ziel Knoten"); - headers.push("Fahrzeit Ziel-Start"); - headers.push("Ankuntsminute am Start Knoten"); - headers.push("Wendezeit Startbahnhof"); - headers.push("Umlaufzeit"); - headers.push("Labels"); - - contentData.push(headers.join(separator)); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.trainCategory:Train category`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.trainName:Train name`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.startStation:Start station`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.destinationStation:Destination station`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.trafficPeriod:Traffic period`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.frequence:Frequence`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.departureMinuteAtStart:Minute of departure at start node`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.travelTimeStartDestination:Travel time start-destination`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.arrivalMinuteAtDestination:Arrival minute at destination node`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.turnaroundTimeDestination:Turnaround time at destination station`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.departureMinuteDeparture:Departure minute at destination node`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.travelTimeDestinationStart:Travel time destination-start`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.arrivalMinuteAtStart:Arrival minute at start node`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.turnaroundTimeStart:Turnaround time at start station`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.turnaroundTime:Turnaround time`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.labels:Labels`); + + const rows: string[][] = []; this.trainrunService .getTrainruns() .filter((trainrun) => this.filterService.filterTrainrun(trainrun)) @@ -499,8 +513,157 @@ export class EditorToolsViewComponent { .join(comma), ); - contentData.push(row.join(separator)); + rows.push(row); }); - return contentData.join("\n"); + return this.buildCSVString(headers, rows); + } + + // TODO: this may be incorrect for trainruns going through the same node several times. + private convertToOriginDestinationCSV(): string { + // Duration of the schedule to consider (in minutes). + // TODO: ideally this would be 24 hours, but performance is a concern. + // One idea to optimize would be to consider the minimum time window before the schedule repeats (LCM). + // Draft here: https://colab.research.google.com/drive/1Z1r2uU2pgffWxCbG_wt2zoLStZKzWleE#scrollTo=F6vOevK6znee + const timeLimit = 16 * 60; + + const headers: string[] = []; + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.origin:Origin`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.destination:Destination`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.travelTime:Travel time`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.transfers:Transfers`); + headers.push($localize`:@@app.view.editor-side-view.editor-tools-view-component.totalCost:Total cost`); + + const metadata = this.dataService.getNetzgrafikDto().metadata; + // The cost to add for each connection. + const connectionPenalty = metadata.analyticsSettings.originDestinationSettings.connectionPenalty; + const nodes = this.nodeService.getNodes(); + const selectedNodes = this.nodeService.getSelectedNodes(); + const odNodes = selectedNodes.length > 0 ? selectedNodes : this.nodeService.getVisibleNodes(); + const trainruns = this.trainrunService.getVisibleTrainruns(); + + const edges = buildEdges(nodes, odNodes, trainruns, connectionPenalty, this.trainrunService, timeLimit); + + const neighbors = computeNeighbors(edges); + const vertices = topoSort(neighbors); + // In theory we could parallelize the pathfindings, but the overhead might be too big. + const res = new Map(); + odNodes.forEach((origin) => { + computeShortestPaths(origin.getId(), neighbors, vertices).forEach((value, key) => { + res.set([origin.getId(), key].join(","), value); + }); + }); + + const rows = []; + odNodes.sort((a, b) => a.getBetriebspunktName().localeCompare(b.getBetriebspunktName())); + odNodes.forEach((origin) => { + odNodes.forEach((destination) => { + if (origin.getId() === destination.getId()) { + return; + } + const costs = res.get([origin.getId(), destination.getId()].join(",")); + if (costs === undefined) { + // Keep empty if no path is found. + rows.push([origin.getBetriebspunktName(), destination.getBetriebspunktName(), "", "", ""]); + return; + } + const [totalCost, connections] = costs; + const row = [origin.getBetriebspunktName(), destination.getBetriebspunktName(), + (totalCost - connections * connectionPenalty).toString(), + connections.toString(), totalCost.toString()]; + rows.push(row); + }); + }); + + return this.buildCSVString(headers, rows); + } + + private detectNetzgrafikJSON3rdParty(netzgrafikDto: NetzgrafikDto): boolean { + return netzgrafikDto.nodes.find((n: NodeDto) => + n.ports === undefined) !== undefined + || + netzgrafikDto.nodes.filter((n: NodeDto) => + n.ports?.length === 0).length === netzgrafikDto.nodes.length + || + netzgrafikDto.trainrunSections.find((ts: TrainrunSectionDto) => + ts.path === undefined || + ts.path?.path === undefined || + ts.path?.path?.length === 0 + ) !== undefined; + } + + private processNetzgrafikJSON3rdParty(netzgrafikDto: NetzgrafikDto) { + // -------------------------------------------------------------------------------- + // 3rd party generated JSON detected + // -------------------------------------------------------------------------------- + console.log("Import: Automatic Port Alignment Detection - 3rd Party Data Import."); + const msg = $localize`:@@app.view.editor-side-view.editor-tools-view-component.import-netzgrafik-as-json-info-3rd-party:3rd party import`; + this.logger.info(msg); + + + // -------------------------------------------------------------------------------- + // (Step 1) Import only nodes + const netzgrafikOnlyNodeDto: NetzgrafikDto = Object.assign({}, netzgrafikDto); + netzgrafikOnlyNodeDto.trainruns = []; + netzgrafikOnlyNodeDto.trainrunSections = []; + this.dataService.loadNetzgrafikDto(netzgrafikOnlyNodeDto); + + // (Step 2) Import nodes and trainrunSectiosn by trainrun inseration (copy => create) + this.dataService.insertCopyNetzgrafikDto(netzgrafikDto); + + // step(3) Check whether a transitions object was given when not + // departureTime - arrivatelTime == 0 => non-stop + this.nodeService.getNodes().forEach((n) => { + n.getTransitions().forEach((trans) => { + const p1 = n.getPort(trans.getPortId1()); + const p2 = n.getPort(trans.getPortId2()); + let arrivalTime = p1.getTrainrunSection().getTargetArrival(); + if (p1.getTrainrunSection().getSourceNodeId() === n.getId()) { + arrivalTime = p1.getTrainrunSection().getSourceArrival(); + } + let departureTime = p2.getTrainrunSection().getTargetDeparture(); + if (p2.getTrainrunSection().getSourceNodeId() === n.getId()) { + departureTime = p2.getTrainrunSection().getSourceDeparture(); + } + trans.setIsNonStopTransit(arrivalTime - departureTime === 0); + }); + }); + + // step(4) Recalc/propagate consecutive times + this.trainrunService.propagateInitialConsecutiveTimes(); + + // step(5) Validate all trainrun sections + this.trainrunSectionService.getTrainrunSections().forEach((ts) => { + TrainrunsectionValidator.validateOneSection(ts); + TrainrunsectionValidator.validateTravelTime(ts); + }); + } + + private processNetzgrafikJSON(netzgrafikDto: NetzgrafikDto) { + // prepare JSON import + this.uiInteractionService.showNetzgrafik(); + this.uiInteractionService.closeNodeStammdaten(); + this.uiInteractionService.closePerlenkette(); + this.nodeService.unselectAllNodes(); + + // import data + if ( + netzgrafikDto.trainrunSections.length === 0 + || + !this.detectNetzgrafikJSON3rdParty(netzgrafikDto) + ) { + // ----------------------------------------------- + // Default: Netzgrafik-Editor exported JSON + // ----------------------------------------------- + this.dataService.loadNetzgrafikDto(netzgrafikDto); + // ----------------------------------------------- + } else { + // ----------------------------------------------- + // 3rd Party: Netzgrafik-Editor exported JSON + // ----------------------------------------------- + this.processNetzgrafikJSON3rdParty(netzgrafikDto); + } + + // recompute viewport + this.uiInteractionService.viewportCenteringOnNodesBoundingBox(); } } diff --git a/src/app/view/error-view/error-view.component.html b/src/app/view/error-view/error-view.component.html index fa15a935..e70c6eb9 100644 --- a/src/app/view/error-view/error-view.component.html +++ b/src/app/view/error-view/error-view.component.html @@ -1,4 +1,4 @@ -

Fehler

+

{{ 'app.view.error-view.error' | translate}}

{{ error | async }}

diff --git a/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.scss b/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.scss index bbd17c63..f0282e43 100644 --- a/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.scss +++ b/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.scss @@ -2,7 +2,8 @@ ::ng-deep path.KnotenAuslastungResourceGroup { stroke: none; - fill: whitesmoke; + fill: var(--sbb-header-lean-border-bottom-color); + opacity: 0.25; } ::ng-deep path.KnotenAuslastungDataGroup { @@ -17,14 +18,15 @@ ::ng-deep text.KnotenAuslastungNbrTrackGroup { font-size: 12px; font-weight: bold; - fill: gray; + fill: var(--NODE_TEXT_FOCUS); } ::ng-deep text.KnotenAuslastungTimeGroup { font-size: 12px; - fill: lightgray; + fill: var(--NODE_TEXT_FOCUS); } ::ng-deep path.KnotenAuslastungResourceGroup.capacityLimitReached { - fill: #fff7eb; + fill: var(--sbb-header-lean-border-bottom-color); + opacity: 0.5; } diff --git a/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.ts b/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.ts index 735b2b68..f0b23a5a 100644 --- a/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.ts +++ b/src/app/view/knoten-auslastung-view/knoten-auslastung-view.component.ts @@ -66,7 +66,7 @@ export class KnotenAuslastungViewComponent implements AfterViewInit, OnDestroy { trainrunSection.getFrequencyLinePatternRef(), ) + StaticDomTags.makeClassTag( - StaticDomTags.TAG_UI_DIALOG + "_" + StaticDomTags.TAG_COLOR_REF, + StaticDomTags.TAG_COLOR_REF, trainrunSection.getTrainrun().getCategoryColorRef(), ); @@ -77,14 +77,12 @@ export class KnotenAuslastungViewComponent implements AfterViewInit, OnDestroy { classAttribute += " " + StaticDomTags.TAG_SELECTED; } if ( - !KnotenAuslastungViewComponent.isMuted( + KnotenAuslastungViewComponent.isMuted( trainrunSection, selectedTrainrun, connectedTrainIds, ) ) { - classAttribute += " " + StaticDomTags.TAG_FOCUS; - } else { classAttribute += " " + StaticDomTags.TAG_MUTED; } return classAttribute; @@ -296,9 +294,9 @@ export class KnotenAuslastungViewComponent implements AfterViewInit, OnDestroy { "" + Math.round( (100 * d) / - this.resourceService - .getResource(selectedNode.getResourceId()) - .getCapacity(), + this.resourceService + .getResource(selectedNode.getResourceId()) + .getCapacity(), ) + "%", ); diff --git a/src/app/view/navigation-bar/navigation-bar.component.spec.ts b/src/app/view/navigation-bar/navigation-bar.component.spec.ts index ed4eab09..4bc818c2 100644 --- a/src/app/view/navigation-bar/navigation-bar.component.spec.ts +++ b/src/app/view/navigation-bar/navigation-bar.component.spec.ts @@ -9,6 +9,7 @@ import {NavigationEnd, Router, RouterEvent} from "@angular/router"; import {NavigationService} from "../../services/ui/navigation.service"; import {NEVER} from "rxjs"; import {map} from "rxjs/operators"; +import {I18nModule} from "../../core/i18n/i18n.module"; describe("NavigationBarComponent", () => { let component: NavigationBarComponent; @@ -25,6 +26,7 @@ describe("NavigationBarComponent", () => { await TestBed.configureTestingModule({ declarations: [NavigationBarComponent], + imports: [I18nModule], providers: [ {provide: Router, useValue: router}, {provide: NavigationService, useValue: {}}, diff --git a/src/app/view/navigation-bar/navigation-bar.component.ts b/src/app/view/navigation-bar/navigation-bar.component.ts index 92d44422..743d036d 100644 --- a/src/app/view/navigation-bar/navigation-bar.component.ts +++ b/src/app/view/navigation-bar/navigation-bar.component.ts @@ -23,7 +23,7 @@ export class NavigationBarComponent implements OnInit { { name: this.projectsBackendService .getProject(params[0].asNumber()) - .pipe(map((project) => `Projekt «${project.name}»`)), + .pipe(map((project) => $localize`:@@app.view.navigation-bar.project-name:Project «${project.name}:name:»`)), route: this.navigationService.getRouteToVariants( params[0].asNumber(), ), @@ -39,8 +39,8 @@ export class NavigationBarComponent implements OnInit { .pipe( map((project) => project.isArchived === false - ? `Projekt «${project.name}»` - : `Projekt «${project.name}» (archiviert)`, + ? $localize`:@@app.view.navigation-bar.project-name:Project «${project.name}:name:»` + : $localize`:@@app.view.navigation-bar.project-name-archived:Project «${project.name}:name:» (archived)`, ), ), route: this.navigationService.getRouteToVariants( @@ -53,8 +53,8 @@ export class NavigationBarComponent implements OnInit { .pipe( map((variant) => variant.isArchived === false - ? `Variante «${variant.latestVersion.name}»` - : `Variante «${variant.latestVersion.name}» (archiviert)`, + ? $localize`:@@app.view.navigation-bar.variant-name:Variant «${variant.latestVersion.name}:name:»` + : $localize`:@@app.view.navigation-bar.variant-name-archived:Variant «${variant.latestVersion.name}:name:» (archived)`, ), ), route: this.navigationService.getRouteToEditor( diff --git a/src/app/view/project/project-dialog/project-dialog.component.html b/src/app/view/project/project-dialog/project-dialog.component.html index 63952acd..5c7d95ca 100644 --- a/src/app/view/project/project-dialog/project-dialog.component.html +++ b/src/app/view/project/project-dialog/project-dialog.component.html @@ -1,9 +1,9 @@
- Projekt erstellen - Projekt bearbeiten + {{ 'app.view.project.project-dialog.create-project' | translate }} + {{ 'app.view.project.project-dialog.edit-project' | translate }}
- +
- +
diff --git a/src/app/view/project/project-dialog/project-dialog.component.spec.ts b/src/app/view/project/project-dialog/project-dialog.component.spec.ts index 7b34cf88..c9f2a22b 100644 --- a/src/app/view/project/project-dialog/project-dialog.component.spec.ts +++ b/src/app/view/project/project-dialog/project-dialog.component.spec.ts @@ -2,6 +2,7 @@ import {ComponentFixture, TestBed} from "@angular/core/testing"; import {ProjectDialogComponent} from "./project-dialog.component"; import {SBB_DIALOG_DATA, SbbDialogRef} from "@sbb-esta/angular/dialog"; +import {I18nModule} from "../../../core/i18n/i18n.module"; describe("ProjectDialogComponent", () => { let component: ProjectDialogComponent; @@ -10,6 +11,7 @@ describe("ProjectDialogComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ProjectDialogComponent], + imports:[I18nModule], providers: [ {provide: SbbDialogRef, useValue: {}}, {provide: SBB_DIALOG_DATA, useValue: {}}, diff --git a/src/app/view/project/project-dialog/project-dialog.component.ts b/src/app/view/project/project-dialog/project-dialog.component.ts index 5c2a6a03..5b54ac22 100644 --- a/src/app/view/project/project-dialog/project-dialog.component.ts +++ b/src/app/view/project/project-dialog/project-dialog.component.ts @@ -15,7 +15,7 @@ import {filter} from "rxjs/operators"; styleUrls: ["./project-dialog.component.scss"], }) export class ProjectDialogComponent { - readonly formmodel: FormModel; + readonly formModel: FormModel; readonly isNewProject: boolean; constructor( @@ -25,7 +25,7 @@ export class ProjectDialogComponent { >, @Inject(SBB_DIALOG_DATA) data?: ProjectFormComponentModel, ) { - this.formmodel = new FormModel( + this.formModel = new FormModel( data ?? { name: "", description: "", @@ -48,10 +48,10 @@ export class ProjectDialogComponent { } onCreateClicked(): void { - const formdata = this.formmodel.tryGetValid(); + const formData = this.formModel.tryGetValid(); - if (formdata) { - this.dialogRef.close(formdata); + if (formData) { + this.dialogRef.close(formData); } } diff --git a/src/app/view/project/project-dialog/project-form/project-form.component.html b/src/app/view/project/project-dialog/project-form/project-form.component.html index 72c6a45f..f37f23ed 100644 --- a/src/app/view/project/project-dialog/project-form/project-form.component.html +++ b/src/app/view/project/project-dialog/project-form/project-form.component.html @@ -1,40 +1,38 @@
- + Pflichtfeld{{ 'app.view.project.project-dialog.project-form.mandatory-field' | translate }} - + - + - Benutzer müssen mit ihrer U/E-Nummer angegeben werden (bsp. u123456 - e654321). Eingabe pro Nummer jeweils mit 'Enter' bestätigen. - Kleinschreibung beachten! + {{ 'app.view.project.project-dialog.project-form.tooltip' | translate }} - Benutzer mit Schreibzugriff + {{ 'app.view.project.project-dialog.project-form.user-with-write-access' | translate }} - - Ungültige Werte: - {{ model.getControl("writeUsers").errors?.invalidUserIds }} + + {{ 'app.view.project.project-dialog.project-form.invalid-values' | translate }}: + {{ model.getControl("writeUsers").errors?.invalidUserIdAsEmails }} - Benutzer mit Lesezugriff + {{ 'app.view.project.project-dialog.project-form.user-with-read-access' | translate }} - - Ungültige Werte: - {{ model.getControl("readUsers").errors?.invalidUserIds }} + + {{ 'app.view.project.project-dialog.project-form.invalid-values' | translate }}: + {{ model.getControl("readUsers").errors?.invalidUserIdAsEmails }}
diff --git a/src/app/view/project/project-dialog/project-form/project-form.component.spec.ts b/src/app/view/project/project-dialog/project-form/project-form.component.spec.ts index 64cd5ba8..8e4f5802 100644 --- a/src/app/view/project/project-dialog/project-form/project-form.component.spec.ts +++ b/src/app/view/project/project-dialog/project-form/project-form.component.spec.ts @@ -3,8 +3,11 @@ import {ComponentFixture, TestBed} from "@angular/core/testing"; import { ProjectFormComponent, ProjectFormComponentModel, + userIdsAsEmailValidator, } from "./project-form.component"; import {FormModel} from "../../../../utils/form-model"; +import {I18nModule} from "../../../../core/i18n/i18n.module"; +import {UntypedFormControl} from "@angular/forms"; describe("ProjectFormComponent", () => { let component: ProjectFormComponent; @@ -13,6 +16,7 @@ describe("ProjectFormComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ProjectFormComponent], + imports: [I18nModule], }).compileComponents(); }); @@ -32,4 +36,99 @@ describe("ProjectFormComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("validEMailExamples test", () => { + const validEMailExamples = [ + "franz@nix.com", + "adrian@example.com", + "muster.hans@example.test.zurich", + "name.vorname.vorname2@mail.domain.ch", + "fun@data.cloud", + "adrian@ai.org", + "1234@x.org", + "x@1234.org", + "1234@1234.org", + "123a4@1234.org", + "123a4@1234abc123zsd.a123sb.org", + "u123456", + "ue123456", + "e123456", + "u000000" + ]; + + validEMailExamples.forEach((e) => { + const test = new UntypedFormControl(); + test.setValue([e]); + expect(userIdsAsEmailValidator(test)).toBeNull(); + }); + }); + + it("invalidEMailExamples test", () => { + const invalidEMailExamples = [ + "u12345z", + "U123456", + "name.vorname.vorname2#mail.domain.ch", + "a", + "u", + "ue", + "e"]; + invalidEMailExamples.forEach((e) => { + const test = new UntypedFormControl(); + test.setValue([e]); + expect(userIdsAsEmailValidator(test).invalidUserIdAsEmails).toBe(e); + }); + }); + + it("validEMailExamples batch - test", () => { + const validEMailExamples = [ + "adrian@example.com", + "name.vorname.vorname2@mail.domain.ch", + "fun@data.cloud", + "adrian@ai.org", + "1234@x.org", + "x@1234.org", + "1234@1234.org", + "123a4@1234.org", + "Franz@nix.com", + "Adrian@ai.org", + "aDrian@ai.org", + "ADRIAN@AI.ORG", + "adrian@AI.ORG", + "adrian@ai.ORG", + "adrian@AI.org", + "adrian@AI.orG"]; + + const test = new UntypedFormControl(); + test.setValue(validEMailExamples); + expect(userIdsAsEmailValidator(test)).toBeNull(); + }); + + it("invalidEMailExamples batch - test", () => { + const invalidEMailExamples = [ + "u123456", + "name.vorname.vorname2#mail.domain.ch", + ""]; + const test = new UntypedFormControl(); + test.setValue(invalidEMailExamples); + expect(userIdsAsEmailValidator(test).invalidUserIdAsEmails.length).toBe(38); + }); + + it("mixedValInvalidExamples - batch - test", () => { + const mixedValInvalidExamples = [ + "adrian@example.com", + "name.vorname.vorname2@mail.domain.ch", + "fun@data.cloud", + "adrian@ai.org", + "u123456", + "1234@x.org", + "x@1234.org", + "a2#b.ch", + "1234@1234.org", + "123a4@1234.org", + ""]; + const test = new UntypedFormControl(); + test.setValue(mixedValInvalidExamples); + console.log(userIdsAsEmailValidator(test).invalidUserIdAsEmails); + expect(userIdsAsEmailValidator(test).invalidUserIdAsEmails.length).toBe(9); + }); }); diff --git a/src/app/view/project/project-dialog/project-form/project-form.component.ts b/src/app/view/project/project-dialog/project-form/project-form.component.ts index 1c1867b1..efb23e2c 100644 --- a/src/app/view/project/project-dialog/project-form/project-form.component.ts +++ b/src/app/view/project/project-dialog/project-form/project-form.component.ts @@ -15,8 +15,8 @@ export class ProjectFormComponent implements OnInit { ngOnInit(): void { this.model.registerValidator("name", Validators.required); - this.model.registerValidator("writeUsers", userIdsValidator); - this.model.registerValidator("readUsers", userIdsValidator); + this.model.registerValidator("writeUsers", userIdsAsEmailValidator); + this.model.registerValidator("readUsers", userIdsAsEmailValidator); } onLabelsFocusoutWrite() { @@ -31,7 +31,7 @@ export class ProjectFormComponent implements OnInit { document.getElementById("userWriteInput").dispatchEvent(keyboardEvent); } - onLabelsFocusoutReade() { + onLabelsFocusoutRead() { const keyboardEvent = new KeyboardEvent("keydown", { code: "Enter", key: "Enter", @@ -44,17 +44,25 @@ export class ProjectFormComponent implements OnInit { } } -const userIdsValidator = (control: UntypedFormControl) => { +export const userIdsAsEmailValidator = (control: UntypedFormControl) => { if (!control) { return null; } const userIds: string[] = control.value; - const invalidIds = userIds.filter((id) => !id.match(/^(u|ue|e)\d+$/)); - if (invalidIds.length === 0) { + // email adresse validator: regex to match emails using the expression + const invalidEmailPattern = userIds.filter((id) => { + const retVal = + id.match(/^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)|(u|ue|e)\d+$/); + if (retVal === null) { + return true; + } + return retVal[0] !== id; + }); + + if (invalidEmailPattern.length === 0) { return null; } - - return {invalidUserIds: invalidIds.join(", ")}; + return {invalidUserIdAsEmails: invalidEmailPattern.join(", ")}; }; export interface ProjectFormComponentModel { diff --git a/src/app/view/project/projects-view/projects-view.component.html b/src/app/view/project/projects-view/projects-view.component.html index 37271645..2074345e 100644 --- a/src/app/view/project/projects-view/projects-view.component.html +++ b/src/app/view/project/projects-view/projects-view.component.html @@ -1,5 +1,5 @@ -

Projekte

+

{{ 'app.view.project.projects-view.projects' | translate }}

Projekte

class="search" type="text" sbbInput - placeholder="Projekt suchen" + [placeholder]="'app.view.project.projects-view.search-project' | translate" />
Archiv anzeigen{{ 'app.view.project.projects-view.show-archive' | translate }}
@@ -24,7 +24,7 @@

Projekte

> diff --git a/src/app/view/project/projects-view/projects-view.component.spec.ts b/src/app/view/project/projects-view/projects-view.component.spec.ts index d1abce98..bdcf5484 100644 --- a/src/app/view/project/projects-view/projects-view.component.spec.ts +++ b/src/app/view/project/projects-view/projects-view.component.spec.ts @@ -6,6 +6,7 @@ import {ProjectsViewService} from "./projects-view.service"; import {SbbDialogModule} from "@sbb-esta/angular/dialog"; import {ProjectControllerBackendService} from "../../../api/generated"; import {NavigationService} from "../../../services/ui/navigation.service"; +import {I18nModule} from "../../../core/i18n/i18n.module"; describe("ProjectsViewComponent", () => { let component: ProjectsViewComponent; @@ -20,7 +21,7 @@ describe("ProjectsViewComponent", () => { await TestBed.configureTestingModule({ declarations: [ProjectsViewComponent], - imports: [SbbDialogModule], + imports: [SbbDialogModule, I18nModule], providers: [ {provide: ProjectsViewService, useValue: projectViewService}, { diff --git a/src/app/view/project/projects-view/projects-view.component.ts b/src/app/view/project/projects-view/projects-view.component.ts index 5dcc08fd..0627a909 100644 --- a/src/app/view/project/projects-view/projects-view.component.ts +++ b/src/app/view/project/projects-view/projects-view.component.ts @@ -103,8 +103,8 @@ export class ProjectsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Projekt archivieren", - "Möchten Sie das Projekt jetzt archivieren?", + $localize`:@@app.view.project.projects-view.archive-project.title:Archive project`, + $localize`:@@app.view.project.projects-view.archive-project.content:Would you like to archive the project now?`, ), ) .pipe( @@ -124,8 +124,8 @@ export class ProjectsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Archivierung rückgängig machen", - "Möchten Sie die Archivierung des Projekts rückgängig machen?", + $localize`:@@app.view.project.projects-view.undo-archiving-project.title:Undo archiving`, + $localize`:@@app.view.project.projects-view.undo-archiving-project.content:Would you like to undo the archiving the project now?`, ), ) .pipe( @@ -147,7 +147,7 @@ export class ProjectsViewComponent implements OnDestroy { if (project.isArchived) { return of([ { - name: "Archivierung rückgängig machen", + name: $localize`:@@app.view.project.projects-view.undo-archiving:Undo archiving`, icon: "arrow-circle-eye-small", action: () => this.onUnarchiveProjectClicked(project), }, @@ -155,12 +155,12 @@ export class ProjectsViewComponent implements OnDestroy { } return of([ { - name: "Bearbeiten", + name: $localize`:@@app.view.project.projects-view.edit:Edit`, icon: "pen-small", action: () => this.onEditProjectClicked(project), }, { - name: "Archivieren", + name: $localize`:@@app.view.project.projects-view.archive:Archive`, icon: "archive-box-small", action: () => this.onArchiveProjectClicked(project), }, diff --git a/src/app/view/rastering/definitions.scss b/src/app/view/rastering/definitions.scss index 067499d3..7d56373c 100644 --- a/src/app/view/rastering/definitions.scss +++ b/src/app/view/rastering/definitions.scss @@ -28,7 +28,7 @@ $COLOR_Warning: var(--COLOR_Warning); $COLOR_BACKGROUND: var(--COLOR_BACKGROUND); $COLOR_STRECKENGRAPHIK_BACKGROUND: var(--COLOR_STRECKENGRAPHIK_BACKGROUND); -$COLOR_MUTED_SILVER: var(--COLOR_MUTED_SILVER); +$COLOR_MUTED_SILVER: var(--sbb-header-lean-border-bottom-color); $COLOR_Warning_BACKGROUND: var(--COLOR_Warning_BACKGROUND); diff --git a/src/app/view/slots-view/slot/slot.component.spec.ts b/src/app/view/slots-view/slot/slot.component.spec.ts index 279ac63a..152bd265 100644 --- a/src/app/view/slots-view/slot/slot.component.spec.ts +++ b/src/app/view/slots-view/slot/slot.component.spec.ts @@ -1,6 +1,7 @@ import {ComponentFixture, TestBed} from "@angular/core/testing"; import {SlotComponent} from "./slot.component"; import {SbbMenu} from "@sbb-esta/angular/menu"; +import {I18nModule} from "../../../core/i18n/i18n.module"; describe("SlotComponent", () => { let component: SlotComponent; @@ -9,6 +10,7 @@ describe("SlotComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [SlotComponent], + imports:[I18nModule], }).compileComponents(); }); diff --git a/src/app/view/themes/theme-default-ux-dark.ts b/src/app/view/themes/theme-default-ux-dark.ts index 7539c423..144c0236 100644 --- a/src/app/view/themes/theme-default-ux-dark.ts +++ b/src/app/view/themes/theme-default-ux-dark.ts @@ -5,8 +5,8 @@ import {StaticDomTags} from "../editor-main-view/data-views/static.dom.tags"; export class ThemeDefaultUxDark extends ThemeBase { constructor( - backgroundColor = "whitesmoke", - backgroundStreckengraphikColor = "white", + backgroundColor = "var(--sbb-header-lean-background-color)", + backgroundStreckengraphikColor = "var(--sbb-header-lean-background-color)", ) { super( ThemeRegistration.ThemeDefaultUxDark, @@ -34,42 +34,42 @@ export class ThemeDefaultUxDark extends ThemeBase { "CONNECTION_COLOR_WARNING: #959595", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL: #767676", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #DCDCDC", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #9c9a9a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_MUTED: #000000", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_RELATED: #767676", StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC: #B38BBD", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #E1D2E5", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #b782c4", StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_MUTED: #715878", StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_RELATED: #B38BBD", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC: #B38BBD", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #E1D2E5", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #b782c4", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_MUTED: #715878", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_RELATED: #B38BBD", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #DAA4C4", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #F0DBE8", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #cb83ae", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #db88ba", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_MUTED: #7e5e71", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_RELATED: #DAA4C4", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE: #9193BA", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #D4D5E4", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #999bcf", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_MUTED: #2D327D", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_RELATED: #9193BA", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S: #79B8E1", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #CBE3F3", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #69b2e0", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_MUTED: #143A85", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_RELATED: #79B8E1", StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX: #a7a2a2", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #DCDCDC", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #a19a9a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_MUTED: #444444", StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_RELATED: #DCDCDC", StaticDomTags.PREFIX_COLOR_VARIABLE + "_G: #a7a2a2", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #DCDCDC", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #a19a9a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_MUTED: #444444", StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_RELATED: #DCDCDC", diff --git a/src/app/view/themes/theme-fach-dark.ts b/src/app/view/themes/theme-fach-dark.ts index 3a9f35ba..a3b85108 100644 --- a/src/app/view/themes/theme-fach-dark.ts +++ b/src/app/view/themes/theme-fach-dark.ts @@ -5,8 +5,8 @@ import {StaticDomTags} from "../editor-main-view/data-views/static.dom.tags"; export class ThemeFachDark extends ThemeBase { constructor( - backgroundColor = "whitesmoke", - backgroundStreckengraphikColor = "white", + backgroundColor = "var(--sbb-header-lean-background-color)", + backgroundStreckengraphikColor = "var(--sbb-header-lean-background-color)", ) { super( ThemeRegistration.ThemeFachDark, @@ -32,42 +32,42 @@ export class ThemeFachDark extends ThemeBase { "CONNECTION_COLOR_WARNING: #959595", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL: #767676", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #DCDCDC", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #9c9a9a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_MUTED: #000000", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_RELATED: #767676", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC: #f09f9f", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #ffdfdc", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC: #f06f6f", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #ff3b3b", StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_MUTED: #724040", StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_RELATED: #ef6950", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC: #f09f9f", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #ffdfdc", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC: #f06f6f", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #ff3b3b", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_MUTED: #724040", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_RELATED: #ef6950", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #f09f9f", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #ffdfdc", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #f06f6f", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #ff3b3b", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_MUTED: #724040", StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_RELATED: #ef6950", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE: #71d573", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #c4e5c4", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #3fa341", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_MUTED: #2e582f", StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_RELATED: #9ed267", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S: #9d9d9d", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #e4e4e4", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S: #7d7d7d", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #565353", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_MUTED: #3a3a3a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_RELATED: #797979", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX: #b197cb", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #e9dae8", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX: #B77FEF", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #782FBF", StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_MUTED: #473c51", StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_RELATED: #b197cb", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G: #6888c9", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #a6c3cd", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G: #4545ff", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #0000d0", StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_MUTED: #384869", StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_RELATED: #6888c9", diff --git a/src/app/view/themes/theme-fach.ts b/src/app/view/themes/theme-fach.ts index 56fae2ef..a53a9919 100644 --- a/src/app/view/themes/theme-fach.ts +++ b/src/app/view/themes/theme-fach.ts @@ -31,44 +31,44 @@ export class ThemeFach extends ThemeBase { "CONNECTION_COLOR_WARNING: #767676", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL: #767676", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #000000", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: #9c9a9a", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_MUTED: #DCDCDC", StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_RELATED: #767676", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC: #ea7b7b", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #f00000", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_MUTED: #ffdfdc", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_RELATED: #ef6950", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC: #f05b40", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: #ec1e24", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_MUTED: #fcc0c0", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_RELATED: #f58467", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC: #ea7b7b", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #f00000", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_MUTED: #ffdfdc", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_RELATED: #ef6950", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC: #f05b40", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: #ec1e24", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_MUTED: #fcc0c0", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_RELATED: #f58467", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #ea7b7b", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #f00000", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_MUTED: #ffdfdc", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_RELATED: #ef6950", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR: #f05b40", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: #ec1e24", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_MUTED: #fcc0c0", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_RELATED: #f58467", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE: #3bc43d", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #2f9d31", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_MUTED: #c4e5c4", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_RELATED: #9ed267", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE: #13ab13", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_FOCUS: #0f9d0f", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_MUTED: #c9d9c9", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_RE_RELATED: #00ce00", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S: #808080", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #3a3a3a", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_MUTED: #e4e4e4", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S: #565353", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_FOCUS: #3c3c3c", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_MUTED: #cccbcb", StaticDomTags.PREFIX_COLOR_VARIABLE + "_S_RELATED: #797979", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX: #8c66b2", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #4c4488", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_MUTED: #e6ddee", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_RELATED: #8c66b2", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX: #756baf", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: #5b52a2", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_MUTED: #d2cee7", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_RELATED: #8f87bf", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G: #567fd2", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #2b52a1", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_MUTED: #d7e1f4", - StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_RELATED: #86a4df", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G: #6783c1", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: #436fb5", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_MUTED: #d1d6ec", + StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_RELATED: #879acd", "COLOR_GRAYEDOUT: white", "COLOR_TRANSITION_GRAYEDOUT: whitesmoke", diff --git a/src/app/view/themes/theme-gray-dark.ts b/src/app/view/themes/theme-gray-dark.ts index cbd3d1fa..d8134c7a 100644 --- a/src/app/view/themes/theme-gray-dark.ts +++ b/src/app/view/themes/theme-gray-dark.ts @@ -6,8 +6,8 @@ import {StaticDomTags} from "../editor-main-view/data-views/static.dom.tags"; export class ThemeGrayDark extends ThemeBase { constructor( - backgroundColor = "whitesmoke", - backgroundStreckengraphikColor = "white", + backgroundColor = "var(--sbb-header-lean-background-color)", + backgroundStreckengraphikColor = "var(--sbb-header-lean-background-color)", ) { super( ThemeRegistration.ThemeGrayDark, @@ -21,7 +21,7 @@ export class ThemeGrayDark extends ThemeBase { static getThemeGrayDarkColors(): string[] { const normal = 40; - const focus = 100; + const focus = 0; const muted = 0; const related = 20; @@ -42,7 +42,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#666666", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#dddddd", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#666666", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_NORMAL_MUTED: " + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), @@ -57,7 +57,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#dddddd", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_EC_MUTED: " + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), @@ -72,7 +72,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#dddddd", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_IC_MUTED: " + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), @@ -87,7 +87,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#dddddd", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_IR_MUTED: " + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), @@ -132,7 +132,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#888888", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#999999", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#888888", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_GEX_MUTED: " + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), @@ -147,7 +147,7 @@ export class ThemeGrayDark extends ThemeBase { d3.scaleLinear().domain([0, 100]).range(["#666666", "#FFFFFF"])(normal), StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_FOCUS: " + - d3.scaleLinear().domain([0, 100]).range(["#777777", "#FFFFFF"])(focus), + d3.scaleLinear().domain([0, 100]).range(["#666666", "#FFFFFF"])(focus), StaticDomTags.PREFIX_COLOR_VARIABLE + "_G_MUTED:" + d3.scaleLinear().domain([0, 100]).range(["#333333", "#FFFFFF"])(muted), diff --git a/src/app/view/themes/theme-gray.ts b/src/app/view/themes/theme-gray.ts index 8e716c2e..e5a54f35 100644 --- a/src/app/view/themes/theme-gray.ts +++ b/src/app/view/themes/theme-gray.ts @@ -20,7 +20,7 @@ export class ThemeGray extends ThemeBase { static getThemeGrayColors(): string[] { const normal = 30; - const focus = 100; + const focus = 20; const muted = 0; const related = 30; diff --git a/src/app/view/themes/theme.spec.ts b/src/app/view/themes/theme.spec.ts index 42d2b28e..a58d0791 100644 --- a/src/app/view/themes/theme.spec.ts +++ b/src/app/view/themes/theme.spec.ts @@ -172,10 +172,10 @@ describe("Theme Tests", () => { const t1 = new ThemeDefaultUxDark(); const t2 = new ThemeDefaultUxDark("red"); const t3 = new ThemeDefaultUxDark("yellow", "blue"); - expect(t1.backgroundColor).toBe("whitesmoke"); - expect(t1.backgroundStreckengraphikColor).toBe("white"); + expect(t1.backgroundColor).toBe("var(--sbb-header-lean-background-color)"); + expect(t1.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t2.backgroundColor).toBe("red"); - expect(t2.backgroundStreckengraphikColor).toBe("white"); + expect(t2.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t3.backgroundColor).toBe("yellow"); expect(t3.backgroundStreckengraphikColor).toBe("blue"); }); @@ -196,10 +196,10 @@ describe("Theme Tests", () => { const t1 = new ThemeFachDark(); const t2 = new ThemeFachDark("red"); const t3 = new ThemeFachDark("yellow", "blue"); - expect(t1.backgroundColor).toBe("whitesmoke"); - expect(t1.backgroundStreckengraphikColor).toBe("white"); + expect(t1.backgroundColor).toBe("var(--sbb-header-lean-background-color)"); + expect(t1.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t2.backgroundColor).toBe("red"); - expect(t2.backgroundStreckengraphikColor).toBe("white"); + expect(t2.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t3.backgroundColor).toBe("yellow"); expect(t3.backgroundStreckengraphikColor).toBe("blue"); }); @@ -232,10 +232,10 @@ describe("Theme Tests", () => { const t1 = new ThemeGrayDark(); const t2 = new ThemeGrayDark("red"); const t3 = new ThemeGrayDark("yellow", "blue"); - expect(t1.backgroundColor).toBe("whitesmoke"); - expect(t1.backgroundStreckengraphikColor).toBe("white"); + expect(t1.backgroundColor).toBe("var(--sbb-header-lean-background-color)"); + expect(t1.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t2.backgroundColor).toBe("red"); - expect(t2.backgroundStreckengraphikColor).toBe("white"); + expect(t2.backgroundStreckengraphikColor).toBe("var(--sbb-header-lean-background-color)"); expect(t3.backgroundColor).toBe("yellow"); expect(t3.backgroundStreckengraphikColor).toBe("blue"); }); diff --git a/src/app/view/util/generalViewFunctions.ts b/src/app/view/util/generalViewFunctions.ts index 44af47a8..610cfb7b 100644 --- a/src/app/view/util/generalViewFunctions.ts +++ b/src/app/view/util/generalViewFunctions.ts @@ -81,6 +81,26 @@ export class GeneralViewFunctions { } } + static getStartForwardAndBackwardNode(endNode1: Node, endNode2: Node): { + startForwardNode: Node; + startBackwardNode: Node; + } { + const startForwardNode = GeneralViewFunctions.getLeftOrTopNode( + endNode1, + endNode2, + ); + + const startBackwardNode = + endNode1.getId() === startForwardNode.getId() + ? endNode2 + : endNode1; + + return { + startForwardNode: startForwardNode, + startBackwardNode: startBackwardNode + }; + } + static getRightOrBottomNode(node1: Node, node2: Node): Node { const posNode1: Vec2D = new Vec2D( node1.getPositionX(), diff --git a/src/app/view/util/origin-destination-graph.ts b/src/app/view/util/origin-destination-graph.ts new file mode 100644 index 00000000..c6412a3e --- /dev/null +++ b/src/app/view/util/origin-destination-graph.ts @@ -0,0 +1,405 @@ +import {Trainrun} from "src/app/models/trainrun.model"; +import {TrainrunService} from "src/app/services/data/trainrun.service"; +import {TrainrunIterator} from "src/app/services/util/trainrun.iterator"; +import {Node} from "src/app/models/node.model"; + +// A vertex indicates a "state": e.g. arriving at a node at a certain time and from a given trainrun. +export class Vertex { + constructor( + public nodeId: number, + // Indicates if we depart or arrive at the node. + public isDeparture: boolean, + // Optional fields are undefined for "convenience" vertices. + // Absolute time (duration from the start of the schedule) in minutes. + public time?: number, + // Negative trainrun ids are used for reverse directions. + public trainrunId?: number, + ) {} +} + +export class Edge { + constructor( + public v1: Vertex, + public v2: Vertex, + // The weight represents the cost of the edge, it is similar to a duration in minutes + // but it may include a connection penalty cost. + public weight: number, + ) {} +} + +export const buildEdges = ( + nodes: Node[], + odNodes: Node[], + trainruns: Trainrun[], + connectionPenalty: number, + trainrunService: TrainrunService, + timeLimit: number, +): Edge[] => { + let edges = buildSectionEdges(trainruns, trainrunService, timeLimit); + + const verticesDepartureByTrainrunByNode = new Map< + number, + Map + >(); + const verticesArrivalByTrainrunByNode = new Map< + number, + Map + >(); + edges.forEach((edge) => { + const src = edge.v1; + const tgt = edge.v2; + if (src.isDeparture !== true) { + console.log("src is not a departure: ", src); + } + if (tgt.isDeparture !== false) { + console.log("tgt is not an arrival: ", tgt); + } + const departuresByTrainrun = verticesDepartureByTrainrunByNode.get( + src.nodeId, + ); + if (departuresByTrainrun === undefined) { + verticesDepartureByTrainrunByNode.set( + src.nodeId, + new Map([[src.trainrunId, [src]]]), + ); + } else { + const departures = departuresByTrainrun.get(src.trainrunId); + if (departures === undefined) { + departuresByTrainrun.set(src.trainrunId, [src]); + } else { + departures.push(src); + } + } + const arrivalsByTrainrun = verticesArrivalByTrainrunByNode.get(tgt.nodeId); + if (arrivalsByTrainrun === undefined) { + verticesArrivalByTrainrunByNode.set( + tgt.nodeId, + new Map([[tgt.trainrunId, [tgt]]]), + ); + } else { + const arrivals = arrivalsByTrainrun.get(tgt.trainrunId); + if (arrivals === undefined) { + arrivalsByTrainrun.set(tgt.trainrunId, [tgt]); + } else { + arrivals.push(tgt); + } + } + }); + + // Sorting is useful to find relevant connections later. + verticesDepartureByTrainrunByNode.forEach((verticesDepartureByTrainrun) => { + verticesDepartureByTrainrun.forEach((departures, trainrunId) => { + departures.sort((a, b) => a.time - b.time); + }); + }); + verticesArrivalByTrainrunByNode.forEach((verticesArrivalByTrainrun) => { + verticesArrivalByTrainrun.forEach((arrivals, trainrunId) => { + arrivals.sort((a, b) => a.time - b.time); + }); + }); + + // Note: pushing too many elements at once does not work well. + edges = [ + ...edges, + ...buildConvenienceEdges( + odNodes, + verticesDepartureByTrainrunByNode, + verticesArrivalByTrainrunByNode, + ), + ]; + edges = [ + ...edges, + ...buildConnectionEdges( + nodes, + verticesDepartureByTrainrunByNode, + verticesArrivalByTrainrunByNode, + connectionPenalty, + ), + ]; + + return edges; +}; + +// Given edges, return the neighbors (with weights) for each vertex, if any (outgoing adjacency list). +export const computeNeighbors = ( + edges: Edge[], +): Map => { + const neighbors = new Map(); + edges.forEach((edge) => { + const v1 = JSON.stringify(edge.v1); + const v1Neighbors = neighbors.get(v1); + if (v1Neighbors === undefined) { + neighbors.set(v1, [[edge.v2, edge.weight]]); + } else { + v1Neighbors.push([edge.v2, edge.weight]); + } + }); + return neighbors; +}; + +// Given a graph (adjacency list), return the vertices in topological order. +// Note: sorting vertices by time would be enough for our use case. +export const topoSort = (graph: Map): Vertex[] => { + const res = []; + const visited = new Set(); + for (const node of graph.keys()) { + if (!visited.has(node)) { + depthFirstSearch(graph, JSON.parse(node) as Vertex, visited, res); + } + } + return res.reverse(); +}; + +// Given a graph (adjacency list), and vertices in topological order, return the shortest paths (and connections) +// from a given node to other nodes. +export const computeShortestPaths = ( + from: number, + neighbors: Map, + vertices: Vertex[], +): Map => { + const res = new Map(); + const dist = new Map(); + let started = false; + vertices.forEach((vertex) => { + const key = JSON.stringify(vertex); + // First, look for our start node. + if (!started) { + if ( + from === vertex.nodeId && + vertex.isDeparture === true && + vertex.time === undefined + ) { + started = true; + dist.set(key, [0, 0]); + } else { + return; + } + } + // We found an end node. + if ( + vertex.isDeparture === false && + vertex.time === undefined && + dist.get(key) !== undefined && + vertex.nodeId !== from + ) { + res.set(vertex.nodeId, dist.get(key)); + } + const neighs = neighbors.get(key); + if (neighs === undefined || dist.get(key) === undefined) { + return; + } + // The shortest path from the start node to this vertex is a shortest path from the start node to a neighbor + // plus the weight of the edge connecting the neighbor to this vertex. + neighs.forEach(([neighbor, weight]) => { + const alt = dist.get(key)[0] + weight; + const neighborKey = JSON.stringify(neighbor); + if ( + dist.get(neighborKey) === undefined || + alt < dist.get(neighborKey)[0] + ) { + let connection = 0; + if ( + vertex.trainrunId !== undefined && + neighbor.trainrunId !== undefined && + vertex.trainrunId !== neighbor.trainrunId + ) { + connection = 1; + } + dist.set(neighborKey, [alt, dist.get(key)[1] + connection]); + } + }); + }); + return res; +}; + +const buildSectionEdges = ( + trainruns: Trainrun[], + trainrunService: TrainrunService, + timeLimit: number, +): Edge[] => { + const edges = []; + const its = trainrunService.getRootIterators(); + trainruns.forEach((trainrun) => { + const tsIterator = its.get(trainrun.getId()); + if (tsIterator === undefined) { + console.log("Ignoring trainrun (no root found): ", trainrun.getId()); + return; + } + edges.push(...buildSectionEdgesFromIterator(tsIterator, false, timeLimit)); + // Don't forget the reverse direction. + const ts = tsIterator.current().trainrunSection; + const nextIterator = trainrunService.getIterator( + tsIterator.current().node, + ts, + ); + edges.push(...buildSectionEdgesFromIterator(nextIterator, true, timeLimit)); + }); + return edges; +}; + +const buildSectionEdgesFromIterator = ( + tsIterator: TrainrunIterator, + reverseIterator: boolean, + timeLimit: number, +): Edge[] => { + const edges = []; + let nonStopV1Time = -1; + let nonStopV1Node = -1; + while (tsIterator.hasNext()) { + tsIterator.next(); + const ts = tsIterator.current().trainrunSection; + const trainrunId = reverseIterator + ? // Minus 1 so we don't conflate 0 with -0. + -ts.getTrainrunId() - 1 + : ts.getTrainrunId(); + const reverseSection = + tsIterator.current().node.getId() !== ts.getTargetNodeId(); + const v1Time = reverseSection + ? ts.getTargetDepartureDto().consecutiveTime + : ts.getSourceDepartureDto().consecutiveTime; + const v1Node = reverseSection ? ts.getTargetNodeId() : ts.getSourceNodeId(); + // If we don't stop here, we need to remember where we started. + if ( + reverseSection + ? ts.getSourceNode().isNonStop(ts) + : ts.getTargetNode().isNonStop(ts) + ) { + if (nonStopV1Time === -1) { + nonStopV1Time = v1Time; + nonStopV1Node = v1Node; + } + continue; + } + let v1 = new Vertex(v1Node, true, v1Time, trainrunId); + // If we didn't stop previously, we need to use the stored start. + if (nonStopV1Time !== -1) { + v1 = new Vertex(nonStopV1Node, true, nonStopV1Time, trainrunId); + nonStopV1Time = -1; + } + const v2Time = reverseSection + ? ts.getSourceArrivalDto().consecutiveTime + : ts.getTargetArrivalDto().consecutiveTime; + const v2Node = reverseSection ? ts.getSourceNodeId() : ts.getTargetNodeId(); + const v2 = new Vertex(v2Node, false, v2Time, trainrunId); + + for (let i = 0; i * ts.getTrainrun().getFrequency() < timeLimit; i++) { + const newV1 = new Vertex( + v1.nodeId, + v1.isDeparture, + v1.time + i * ts.getTrainrun().getFrequency(), + v1.trainrunId, + ); + const newV2 = new Vertex( + v2.nodeId, + v2.isDeparture, + v2.time + i * ts.getTrainrun().getFrequency(), + v2.trainrunId, + ); + const edge = new Edge(newV1, newV2, newV2.time - newV1.time); + edges.push(edge); + } + } + return edges; +}; + +const buildConvenienceEdges = ( + nodes: Node[], + verticesDepartureByTrainrunByNode: Map>, + verticesArrivalByTrainrunByNode: Map>, +): Edge[] => { + const edges = []; + nodes.forEach((node) => { + const nodeId = node.getId(); + // We add a single start and end vertex for each node, so we can compute shortest paths more easily. + const srcVertex = new Vertex(nodeId, true); + const tgtVertex = new Vertex(nodeId, false); + // Going from one node to itself is free. + const edge = new Edge(srcVertex, tgtVertex, 0); + edges.push(edge); + const departuresByTrainrun = verticesDepartureByTrainrunByNode.get(nodeId); + if (departuresByTrainrun !== undefined) { + departuresByTrainrun.forEach((departures, trainrunId) => { + departures.forEach((departure) => { + const edge = new Edge(srcVertex, departure, 0); + edges.push(edge); + }); + }); + } + const arrivalsByTrainrun = verticesArrivalByTrainrunByNode.get(nodeId); + if (arrivalsByTrainrun !== undefined) { + arrivalsByTrainrun.forEach((arrivals, trainrunId) => { + arrivals.forEach((arrival) => { + const edge = new Edge(arrival, tgtVertex, 0); + edges.push(edge); + }); + }); + } + }); + return edges; +}; + +const buildConnectionEdges = ( + nodes: Node[], + verticesDepartureByTrainrunByNode: Map>, + verticesArrivalByTrainrunByNode: Map>, + connectionPenalty: number, +): Edge[] => { + const edges = []; + nodes.forEach((node) => { + const departuresByTrainrun = verticesDepartureByTrainrunByNode.get( + node.getId(), + ); + const arrivalsByTrainrun = verticesArrivalByTrainrunByNode.get( + node.getId(), + ); + if ( + departuresByTrainrun !== undefined && + arrivalsByTrainrun !== undefined + ) { + arrivalsByTrainrun.forEach((arrivals, arrivalTrainrunId) => { + arrivals.forEach((arrival) => { + departuresByTrainrun.forEach((departures, departureTrainrunId) => { + let minDepartureTime = arrival.time; + if (arrivalTrainrunId !== departureTrainrunId) { + minDepartureTime += node.getConnectionTime(); + } + // For each arrival and for each trainrun available, we only want to consider the first departure. + // This could be a binary search but it does not seem to be worth it. + const departure = departures.find((departure) => { + return departure.time >= minDepartureTime; + }); + if (departure !== undefined) { + let cost = departure.time - arrival.time; + if (arrivalTrainrunId !== departureTrainrunId) { + cost += connectionPenalty; + } + const edge = new Edge(arrival, departure, cost); + edges.push(edge); + } + }); + }); + }); + } + }); + return edges; +}; + +const depthFirstSearch = ( + graph: Map, + root: Vertex, + visited: Set, + res: Vertex[], +): void => { + const key = JSON.stringify(root); + visited.add(key); + const neighbors = graph.get(key); + if (neighbors !== undefined) { + neighbors.forEach(([neighbor, weight]) => { + if (!visited.has(JSON.stringify(neighbor))) { + depthFirstSearch(graph, neighbor, visited, res); + } + }); + } + // Note that the order is important for topological sorting. + res.push(root); +}; diff --git a/src/app/view/util/svg.mouse.controller.ts b/src/app/view/util/svg.mouse.controller.ts index 7b2637f3..efc4d86b 100644 --- a/src/app/view/util/svg.mouse.controller.ts +++ b/src/app/view/util/svg.mouse.controller.ts @@ -168,6 +168,9 @@ export class SVGMouseController { } moveNetzgrafikEditorViewFocalPoint(center: Vec2D) { + if (this.viewboxProperties === undefined) { + return; + } this.viewboxProperties.panZoomLeft = center.getX() - this.viewboxProperties.panZoomWidth / 2.0; this.viewboxProperties.panZoomTop = @@ -365,9 +368,9 @@ export class SVGMouseController { private updateZoomCenter(zoomCenter: Vec2D) { const oldZoomCenter = new Vec2D( this.viewboxProperties.panZoomLeft + - zoomCenter.getX() * this.viewboxProperties.panZoomWidth, + zoomCenter.getX() * this.viewboxProperties.panZoomWidth, this.viewboxProperties.panZoomTop + - zoomCenter.getY() * this.viewboxProperties.panZoomHeight, + zoomCenter.getY() * this.viewboxProperties.panZoomHeight, ); const zoomFactor = 100.0 / this.viewboxProperties.zoomFactor; @@ -386,9 +389,9 @@ export class SVGMouseController { const newZoomCenter = new Vec2D( this.viewboxProperties.panZoomLeft + - zoomCenter.getX() * this.viewboxProperties.panZoomWidth, + zoomCenter.getX() * this.viewboxProperties.panZoomWidth, this.viewboxProperties.panZoomTop + - zoomCenter.getY() * this.viewboxProperties.panZoomHeight, + zoomCenter.getY() * this.viewboxProperties.panZoomHeight, ); this.viewboxProperties.panZoomLeft -= diff --git a/src/app/view/variant/variant-dialog/variant-dialog.component.html b/src/app/view/variant/variant-dialog/variant-dialog.component.html index e22e92df..386e8425 100644 --- a/src/app/view/variant/variant-dialog/variant-dialog.component.html +++ b/src/app/view/variant/variant-dialog/variant-dialog.component.html @@ -1,13 +1,13 @@
- Variante erstellen - Variante bearbeiten + {{ 'app.view.variant.variant-dialog.create-variant' | translate }} + {{ 'app.view.variant.variant-dialog.edit-variant' | translate }}
- +
- +
diff --git a/src/app/view/variant/variant-dialog/variant-dialog.component.spec.ts b/src/app/view/variant/variant-dialog/variant-dialog.component.spec.ts index 458ec7cd..001a515d 100644 --- a/src/app/view/variant/variant-dialog/variant-dialog.component.spec.ts +++ b/src/app/view/variant/variant-dialog/variant-dialog.component.spec.ts @@ -1,6 +1,7 @@ import {ComponentFixture, TestBed} from "@angular/core/testing"; import {VariantDialogComponent} from "./variant-dialog.component"; import {SBB_DIALOG_DATA, SbbDialogRef} from "@sbb-esta/angular/dialog"; +import {I18nModule} from "../../../core/i18n/i18n.module"; describe("VariantDialogComponent", () => { let component: VariantDialogComponent; @@ -9,6 +10,7 @@ describe("VariantDialogComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [VariantDialogComponent], + imports:[I18nModule], providers: [ {provide: SbbDialogRef, useValue: {}}, {provide: SBB_DIALOG_DATA, useValue: {}}, diff --git a/src/app/view/variant/variant-dialog/variant-dialog.component.ts b/src/app/view/variant/variant-dialog/variant-dialog.component.ts index 8df58f75..c780c973 100644 --- a/src/app/view/variant/variant-dialog/variant-dialog.component.ts +++ b/src/app/view/variant/variant-dialog/variant-dialog.component.ts @@ -15,7 +15,7 @@ import {filter} from "rxjs/operators"; styleUrls: ["./variant-dialog.component.scss"], }) export class VariantDialogComponent { - readonly formmodel: FormModel; + readonly formModel: FormModel; readonly isNewVariant: boolean; constructor( @@ -25,7 +25,7 @@ export class VariantDialogComponent { >, @Inject(SBB_DIALOG_DATA) data?: VariantFormComponentModel, ) { - this.formmodel = new FormModel( + this.formModel = new FormModel( data ?? {name: ""}, ); this.isNewVariant = !!!data; @@ -42,7 +42,7 @@ export class VariantDialogComponent { } onCreateClicked(): void { - const formdata = this.formmodel.tryGetValid(); + const formdata = this.formModel.tryGetValid(); if (formdata) { this.dialogRef.close(formdata); diff --git a/src/app/view/variant/variant-dialog/variant-form/variant-form.component.html b/src/app/view/variant/variant-dialog/variant-form/variant-form.component.html index 20208470..f3a42d18 100644 --- a/src/app/view/variant/variant-dialog/variant-form/variant-form.component.html +++ b/src/app/view/variant/variant-dialog/variant-form/variant-form.component.html @@ -1,13 +1,13 @@
- + Pflichtfeld{{ 'app.view.variant.variant-dialog.variant-form.mandatory-field' | translate }}
diff --git a/src/app/view/variant/variant-dialog/variant-form/variant-form.component.spec.ts b/src/app/view/variant/variant-dialog/variant-form/variant-form.component.spec.ts index 01a505fb..b30fb431 100644 --- a/src/app/view/variant/variant-dialog/variant-form/variant-form.component.spec.ts +++ b/src/app/view/variant/variant-dialog/variant-form/variant-form.component.spec.ts @@ -4,6 +4,7 @@ import { VariantFormComponentModel, } from "./variant-form.component"; import {FormModel} from "../../../../utils/form-model"; +import {I18nModule} from "../../../../core/i18n/i18n.module"; describe("VariantFormComponent", () => { let component: VariantFormComponent; @@ -11,6 +12,7 @@ describe("VariantFormComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ + imports:[I18nModule], declarations: [VariantFormComponent], }).compileComponents(); }); diff --git a/src/app/view/variant/variant-view/variant-history/preview-button/preview-button.component.spec.ts b/src/app/view/variant/variant-view/variant-history/preview-button/preview-button.component.spec.ts index 3dd1b1af..19d4dc3b 100644 --- a/src/app/view/variant/variant-view/variant-history/preview-button/preview-button.component.spec.ts +++ b/src/app/view/variant/variant-view/variant-history/preview-button/preview-button.component.spec.ts @@ -1,6 +1,7 @@ import {ComponentFixture, TestBed} from "@angular/core/testing"; import {PreviewButtonComponent} from "./preview-button.component"; +import {I18nModule} from "../../../../../core/i18n/i18n.module"; describe("PreviewButtonComponent", () => { let component: PreviewButtonComponent; @@ -9,6 +10,7 @@ describe("PreviewButtonComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [PreviewButtonComponent], + imports:[I18nModule], }).compileComponents(); }); diff --git a/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.html b/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.html index d9613a45..b0b9ce00 100644 --- a/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.html +++ b/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.html @@ -8,20 +8,16 @@
diff --git a/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.ts b/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.ts index ca1b7390..e3a32872 100644 --- a/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.ts +++ b/src/app/view/variant/variant-view/variant-history/publish-entry/publish-entry.component.ts @@ -19,7 +19,7 @@ export class PublishEntryComponent { get actions(): HistoryEntryAction[] { return [ { - name: "Änderungen Verwerfen", + name: $localize`:@@app.view.variant.variant-view.variant-history.publish-entry.discard-changes:Discard changes`, icon: "trash-small", onClick: () => this.dropChangedClicked.next(), }, diff --git a/src/app/view/variant/variant-view/variant-history/released-entry/released-entry.component.ts b/src/app/view/variant/variant-view/variant-history/released-entry/released-entry.component.ts index 074ee74d..fa83f663 100644 --- a/src/app/view/variant/variant-view/variant-history/released-entry/released-entry.component.ts +++ b/src/app/view/variant/variant-view/variant-history/released-entry/released-entry.component.ts @@ -21,7 +21,7 @@ export class ReleasedEntryComponent { get actions(): HistoryEntryAction[] { const download = { - name: "Download", + name: $localize`:@@app.view.variant.variant-view.variant-history.released-entry.download:Download`, icon: "download-small", onClick: () => this.download.next({ @@ -37,12 +37,12 @@ export class ReleasedEntryComponent { if (this.model.conflict) { return [ { - name: "Änderungen Verwerfen", + name: $localize`:@@app.view.variant.variant-view.variant-history.released-entry.discard-changes:Discard changes`, icon: "trash-small", onClick: () => this.dropChanges.emit(), }, { - name: "Konflikt ignorieren", + name: $localize`:@@app.view.variant.variant-view.variant-history.released-entry.ignore-conflict:Ignore conflict`, icon: "tick-small", onClick: () => this.ignoreConflict.emit(), }, @@ -52,12 +52,12 @@ export class ReleasedEntryComponent { return [ { - name: "Wiederherstellen", + name: $localize`:@@app.view.variant.variant-view.variant-history.released-entry.restore:Restore`, icon: "arrows-circle-small", onClick: () => this.restore.next(this.model.id), }, { - name: "Als neue Variante", + name: $localize`:@@app.view.variant.variant-view.variant-history.released-entry.as-new-variant:As new variant`, icon: "circle-plus-small", onClick: () => this.saveAsNewVariant.emit(this.model.id), }, @@ -78,10 +78,10 @@ export class ReleasedEntryComponent { getMessage(): string | undefined { if (this.model.conflict) { - return "Version bereits vorhanden"; + return $localize`:@@app.view.variant.variant-view.variant-history.released-entry.version-already-available:Version already available`; } if (this.model.lastAdded) { - return "Erfolgreich publiziert"; + return $localize`:@@app.view.variant.variant-view.variant-history.released-entry.successfully-published:Successfully published`; } return undefined; diff --git a/src/app/view/variant/variant-view/variant-history/snapshot-entry/snapshot-entry.component.ts b/src/app/view/variant/variant-view/variant-history/snapshot-entry/snapshot-entry.component.ts index a131f13d..b51023a8 100644 --- a/src/app/view/variant/variant-view/variant-history/snapshot-entry/snapshot-entry.component.ts +++ b/src/app/view/variant/variant-view/variant-history/snapshot-entry/snapshot-entry.component.ts @@ -18,7 +18,7 @@ export class SnapshotEntryComponent { get actions(): HistoryEntryAction[] { const download = { - name: "Download", + name: $localize`:@@app.view.variant.variant-view.variant-history.snapshot-entry.download:Download`, icon: "download-small", onClick: () => this.download.emit({ @@ -33,12 +33,12 @@ export class SnapshotEntryComponent { return [ { - name: "Wiederherstellen", + name: $localize`:@@app.view.variant.variant-view.variant-history.snapshot-entry.restore:Restore`, icon: "arrows-circle-small", onClick: () => this.restore.next(this.model.id), }, { - name: "Als neue Variante", + name: $localize`:@@app.view.variant.variant-view.variant-history.snapshot-entry.as-new-variant:As new variant`, icon: "circle-plus-small", onClick: () => this.saveAsNewVariant.emit(this.model.id), }, @@ -56,14 +56,14 @@ export class SnapshotEntryComponent { getMessage(): string | undefined { if (this.model.lastAdded) { - return "Erfolgreich gespeichert"; + return $localize`:@@app.view.variant.variant-view.variant-history.snapshot-entry.successfully-published:Successfully published`; } return undefined; } getTitle(): string { - return `Änderung ${this.model.snapshotVersion}`; + return $localize`:@@app.view.variant.variant-view.variant-history.snapshot-entry.change-snapshot-version:Change ${this.model.snapshotVersion}:snapshotVersion:`; } } diff --git a/src/app/view/variant/variant-view/variant-history/variant-history.component.scss b/src/app/view/variant/variant-view/variant-history/variant-history.component.scss index e3ebfa50..c0de0897 100644 --- a/src/app/view/variant/variant-view/variant-history/variant-history.component.scss +++ b/src/app/view/variant/variant-view/variant-history/variant-history.component.scss @@ -37,3 +37,7 @@ display: flex; flex-direction: row; } + +div { + user-select: none; +} diff --git a/src/app/view/variant/variant-view/variant-history/variant-history.component.ts b/src/app/view/variant/variant-view/variant-history/variant-history.component.ts index b98293ec..681a134c 100644 --- a/src/app/view/variant/variant-view/variant-history/variant-history.component.ts +++ b/src/app/view/variant/variant-view/variant-history/variant-history.component.ts @@ -72,8 +72,8 @@ export class VariantHistoryComponent implements OnChanges, OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Neue Version publizieren", - "Möchten Sie Ihre persönlichen Änderungen als neue Version publizieren?", + $localize`:@@app.view.variant.variant-view.variant-history.new-version-published.title:New version published`, + $localize`:@@app.view.variant.variant-view.variant-history.new-version-published.content:Would you like to publish your personal changes as a new version?`, ), ) .pipe(takeUntil(this.destroyed)) @@ -88,8 +88,8 @@ export class VariantHistoryComponent implements OnChanges, OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Änderungen verwerfen", - "Möchten Sie Ihre persönlichen Änderungen unwiderruflich verwerfen?", + $localize`:@@app.view.variant.variant-view.variant-history.discard-changes.title:Discard changes`, + $localize`:@@app.view.variant.variant-view.variant-history.discard-changes.content:Would you like to irrevocably discard your personal changes?`, ), ) .pipe(takeUntil(this.destroyed)) @@ -112,8 +112,8 @@ export class VariantHistoryComponent implements OnChanges, OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Version wiederherstellen", - "Möchten Sie den Stand dieser Version wiederherstellen?", + $localize`:@@app.view.variant.variant-view.variant-history.restore-version.title:Restore version`, + $localize`:@@app.view.variant.variant-view.variant-history.restore-version.content:Would you like to restore the status of this version?`, ), ) .pipe(takeUntil(this.destroyed)) @@ -128,8 +128,8 @@ export class VariantHistoryComponent implements OnChanges, OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Konflikt ignorieren", - "Möchten Sie, dass der aktuelle Stand auf der höchsten publizierten Version aufbaut?", + $localize`:@@app.view.variant.variant-view.variant-history.ignore-conflict.title:Ignore conflict`, + $localize`:@@app.view.variant.variant-view.variant-history.ignore-conflict.content:Would you like the current version to be based on the highest published version?`, ), ) .pipe(takeUntil(this.destroyed)) diff --git a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.html b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.html index e3439645..71846e9b 100644 --- a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.html +++ b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.html @@ -8,8 +8,10 @@
{{ title }}
-
- +
{{ userId }}
@@ -20,7 +22,9 @@
+
«{{ commentField }}»
diff --git a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.scss b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.scss index c9e86d87..1ce59d47 100644 --- a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.scss +++ b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.scss @@ -20,8 +20,8 @@ } } -.comment { - font-style: italic; +.comment-field { + cursor: pointer; } .title-field { @@ -41,6 +41,7 @@ grid-column-start: 1; grid-column-end: span 2; grid-row: 2; + margin-right: 0; } .in-conflict { @@ -70,3 +71,13 @@ border: none; } } + + +.user-id { + width: 140px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + user-select: none; + cursor: pointer; +} diff --git a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.ts b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.ts index 616a7aee..5f3fbd91 100644 --- a/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.ts +++ b/src/app/view/variant/variant-view/variant-history/version-entry-layout/version-entry-layout.component.ts @@ -1,4 +1,5 @@ import {Component, Input} from "@angular/core"; +import {LogService} from "../../../../../logger/log.service"; @Component({ selector: "sbb-version-entry-layout", @@ -13,6 +14,9 @@ export class VersionEntryLayoutComponent { @Input() dateField: Date; @Input() commentField?: string; + constructor(private readonly logService: LogService) { + } + isInConflictState(): boolean { return this.state === "conflict"; } @@ -35,6 +39,26 @@ export class VersionEntryLayoutComponent { return undefined; } + copyComment() { + const comment = this.commentField; + if (!comment) { + return; + } + navigator.clipboard.writeText(comment); + const msg = $localize`:@@app.view.variant.variant-view.variant-history.version-entry-layout.user-id-copied:copied ${comment}:msg:`; + this.logService.info(msg); + } + + copyUserId() { + const userId = this.getUserId(); + if (!userId) { + return; + } + navigator.clipboard.writeText(userId); + const msg = $localize`:@@app.view.variant.variant-view.variant-history.version-entry-layout.user-id-copied:copied ${userId}:msg:`; + this.logService.info(msg); + } + getTitle(): string | undefined { if (typeof this.titleField === "string") { return this.titleField; @@ -44,5 +68,6 @@ export class VersionEntryLayoutComponent { } export class UserId { - constructor(readonly value: string) {} + constructor(readonly value: string) { + } } diff --git a/src/app/view/variant/variant-view/variant-view.component.html b/src/app/view/variant/variant-view/variant-view.component.html index b8c9cc11..c7654742 100644 --- a/src/app/view/variant/variant-view/variant-view.component.html +++ b/src/app/view/variant/variant-view/variant-view.component.html @@ -1,7 +1,7 @@

{{ (versionControlService.variant$ | async)?.latestVersion?.name }} - (archiviert) + {{ 'app.view.variant.variant-view.archived' | translate }}
@@ -10,21 +10,21 @@

sbb-menu-item mode="icon" (click)="onOpenVariantDialog()" - title="Variante bearbeiten" + [title]="'app.view.variant.variant-view.edit-variant' | translate" *ngIf="versionControlService.variant.isWritable" > - Variante bearbeiten + {{ 'app.view.variant.variant-view.edit-variant' | translate }}

@@ -32,7 +32,7 @@

- Versionen + {{ 'app.view.variant.variant-view.versions' | translate }}

- {{ proj.name }} - (archiviert) + {{ proj.name + ' '}} + {{ 'app.view.variant.variants-view.archived' | translate }}

- +
Archiv anzeigen{{ 'app.view.variant.variants-view.show-archive' | translate }}
@@ -44,7 +44,7 @@

- +
@@ -53,7 +53,7 @@

diff --git a/src/app/view/variant/variants-view/variants-view.component.spec.ts b/src/app/view/variant/variants-view/variants-view.component.spec.ts index cf88e8ce..f0e96dfc 100644 --- a/src/app/view/variant/variants-view/variants-view.component.spec.ts +++ b/src/app/view/variant/variants-view/variants-view.component.spec.ts @@ -12,6 +12,7 @@ import {of} from "rxjs"; import {ActivatedRoute} from "@angular/router"; import {NavigationService} from "../../../services/ui/navigation.service"; import {VersionControlService} from "../../../services/data/version-control.service"; +import {I18nModule} from "../../../core/i18n/i18n.module"; describe("VariantsViewComponent", () => { let component: VariantsViewComponent; @@ -55,7 +56,7 @@ describe("VariantsViewComponent", () => { await TestBed.configureTestingModule({ declarations: [VariantsViewComponent], - imports: [SbbDialogModule], + imports: [SbbDialogModule, I18nModule], providers: [ {provide: ActivatedRoute, useValue: activatedRoute}, {provide: NavigationService, useValue: {}}, diff --git a/src/app/view/variant/variants-view/variants-view.component.ts b/src/app/view/variant/variants-view/variants-view.component.ts index d0be8172..28342ea9 100644 --- a/src/app/view/variant/variants-view/variants-view.component.ts +++ b/src/app/view/variant/variants-view/variants-view.component.ts @@ -79,12 +79,12 @@ export class VariantsViewComponent implements OnDestroy { if (project.isWritable) { return [ { - name: "Projekt bearbeiten", + name: $localize`:@@app.view.variant.variants-view.edit-project:Edit project`, icon: "pen-small", action: () => this.onEditProjectClicked(), }, { - name: "Projekt archivieren", + name: $localize`:@@app.view.variant.variants-view.archive-project.title:Archive project`, icon: "archive-box-small", action: () => this.onArchiveProjectClicked(), }, @@ -92,12 +92,12 @@ export class VariantsViewComponent implements OnDestroy { } else if (project.isDeletable && project.isArchived) { return [ { - name: "Archivierung rückgängig machen", + name: $localize`:@@app.view.variant.variants-view.undo-archiving:Undo archiving`, icon: "arrow-circle-eye-small", action: () => this.onUnarchiveProjectClicked(), }, { - name: "Projekt löschen", + name: $localize`:@@app.view.variant.variants-view.delete-project.title:Delete project`, icon: "trash-small", action: () => this.onDeleteProjectClicked(), }, @@ -166,10 +166,14 @@ export class VariantsViewComponent implements OnDestroy { } getVariantDataActions(variant: VariantSummaryDto): Observable { + if (this.project.isArchived) { + return undefined; + } + if (variant.isArchived) { return of([ { - name: "Archivierung rückgängig machen", + name: $localize`:@@app.view.variant.variants-view.undo-archiving:Undo archiving`, icon: "arrow-circle-eye-small", action: () => this.onUnarchiveVariantClicked(variant), }, @@ -177,7 +181,7 @@ export class VariantsViewComponent implements OnDestroy { } return of([ { - name: "Archivieren", + name: $localize`:@@app.view.variant.variants-view.archive:Archive`, icon: "archive-box-small", action: () => this.onArchiveVariantClicked(variant), }, @@ -188,8 +192,8 @@ export class VariantsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Variante archivieren", - "Möchten Sie die Variante jetzt archivieren?", + $localize`:@@app.view.variant.variants-view.archive-variant.title:Archive variant`, + $localize`:@@app.view.variant.variants-view.archive-variant.content:Would you like to archive the variant now?`, ), ) .pipe( @@ -211,8 +215,8 @@ export class VariantsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Archivierung rückgängig machen", - "Möchten Sie die Archivierung der Variante rückgängig machen?", + $localize`:@@app.view.variant.variants-view.undo-archiving-variant.title:Undo archiving`, + $localize`:@@app.view.variant.variants-view.undo-archiving-variant.content:Would you like to undo the archiving of the variant?`, ), ) .pipe( @@ -257,8 +261,8 @@ export class VariantsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Projekt archivieren", - "Möchten Sie das Projekt jetzt archivieren?", + $localize`:@@app.view.variant.variants-view.archive-project.title:Archive project`, + $localize`:@@app.view.variant.variants-view.archive-project.content:Would you like to archive the project now?`, ), ) .pipe( @@ -274,8 +278,8 @@ export class VariantsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Archivierung rückgängig machen", - "Möchten Sie die Archivierung des Projekts rückgängig machen?", + $localize`:@@app.view.variant.variants-view.undo-archiving-project.title:Archive variant`, + $localize`:@@app.view.variant.variants-view.undo-archiving-project.content:Would you like to undo the archiving of the project?`, ), ) .pipe( @@ -291,9 +295,8 @@ export class VariantsViewComponent implements OnDestroy { this.uiInteractionService .showConfirmationDiagramDialog( new ConfirmationDialogParameter( - "Projekt löschen", - "Möchten Sie das Projekt und alle enthaltenen Varianten endgültig löschen? " + - "Diese Aktion kann nicht rückgängig gemacht werden.", + $localize`:@@app.view.variant.variants-view.delete-project.title:Delete projekt`, + $localize`:@@app.view.variant.variants-view.delete-project.content:Do you want to permanently delete the project and all the variants it contains? This action cannot be undone.`, ), ) .pipe( @@ -305,7 +308,7 @@ export class VariantsViewComponent implements OnDestroy { } getTitleCurrentVersion(variant: VariantSummaryDto): string { - const archivedSuffix = variant.isArchived ? " (archiviert)" : ""; + const archivedSuffix = variant.isArchived ? " " + $localize`:@@app.view.variant.variants-view.archived:(archived)` : ""; if (variant.latestSnapshotVersion) { return variant.latestSnapshotVersion.name + "*" + archivedSuffix; @@ -315,7 +318,7 @@ export class VariantsViewComponent implements OnDestroy { return variant.latestReleaseVersion.name + archivedSuffix; } - throw new Error("Unexpected data: No snapshot and no released version."); + throw new Error($localize`:@@app.view.variant.variants-view.error-unexpected-data:Unexpected data: No snapshot and no released version.`); } getChangedAtCurrentVersion(variant: VariantSummaryDto): Date { @@ -327,7 +330,7 @@ export class VariantsViewComponent implements OnDestroy { return new Date(variant.latestReleaseVersion.createdAt); } - throw new Error("Unexpected data: No snapshot and no released version."); + throw new Error($localize`:@@app.view.variant.variants-view.error-unexpected-data:Unexpected data: No snapshot and no released version.`); } private updateProject(project: ProjectDto): void { diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json new file mode 100644 index 00000000..f23599a7 --- /dev/null +++ b/src/assets/i18n/de.json @@ -0,0 +1,657 @@ +{ + "app-routing": { + "module": { + "path": { + "404": "Die gesuchte Seite wurde nicht gefunden.", + "401": "Sie sind nicht autorisiert, bitte laden Sie die Seite neu.", + "403": "Sie sind nicht berechtigt diese Aktion durchzuführen.", + "409": "Es gab einen Konflikt bei der Ausführung Ihrer Aktion, bitte versuchen Sie es erneut.", + "error": "Es ist ein Fehler aufgetreten." + } + } + }, + "app": { + "version": "Version {$version}", + "user-guide": "Benutzeranleitung", + "user-manual": "Benutzerhandbuch", + "logout": "Logout", + "login": "Sie werden angemeldet...", + "logger": { + "title": "Titel" + }, + "models": { + "node": { + "shortNameDefault": "NEW", + "full-name-default": "Neuer Knoten" + }, + "note": { + "title-default": "Notiztitel", + "text-default": "Notiztext", + "default-title": "Notiztitel", + "default-text": "Notiztext" + } + }, + "netzgrafik-application": { + "variants": "Varianten", + "filter": "Filter", + "analytics": "Analytics", + "edit": "Bearbeiten", + "more-functions": "Weitere Funktionen", + "settings": "Einstellungen" + }, + "perlenkette": { + "perlenkette-node": { + "0-warning-connection": "Kein fehlerhafter Anschluss", + "1-warning-connection": "1 fehlerhafter Anschluss", + "n-warning-connections": "{$number} fehlerhafte Anschlüsse", + "0-fitting-connection": "Kein passender Anschluss", + "1-fitting-connection": "1 passender Anschluss", + "n-fitting-connections": "{$number} passende Anschlüsse" + }, + "perlenkette-section": { + "propagate-times-upwards": "Zeiten nach oben propagieren", + "propagate-times-downwards": "Zeiten nach unten propagieren" + }, + "show-only-closed-locks": "Zeige nur geschlossene Schlösser", + "show-all-locks": "Zeige alle Schlösser" + }, + "services": { + "data": { + "node": { + "transit-modified": { + "title": "Durchfahrt geändert", + "description": "Zeiten können nicht angepasst werden, beidseitger Lock gefunden" + } + }, + "trainrunsection": { + "intermediate-stop-replacement": { + "title": "Zwischenhalteumwandlung", + "description": "Zwischenhalteumwandlung führte bei der Vergabe der Zeiten zu inkonsistenzen!" + } + } + }, + "ui": { + "newFilter": "Neuer Filter" + }, + "util": { + "connection-validator": { + "connection-marked-for-transit": { + "title": "Anschluss auf Durchfahrt gezeichnet!", + "description": "Anschluss auf Durchfahrt gezeichnet!" + } + }, + "trainrun-iteration": { + "error": { + "infinity-loop": "Iterator hat eine Endlosschleife entdeckt. Die Iteration wurde vorzeitig abgebrochen!" + } + }, + "trainrunsection-validator": { + "broken-symmetry": "Symmetrie gebrochen", + "target-arrival-not-reacheable": { + "title": "Ziel Ankunft Warnung", + "description": "Zielankunftszeit kann nicht erreicht werden" + }, + "source-arrival-not-reacheable": { + "title": "Quelle Ankunft Warnung", + "description": "Quellankunftszeit kann nicht erreicht werden" + }, + "travel-time-less-than-1": { + "title": "Reisezeit weniger als 1", + "description": "Die Reisezeit muss größer oder gleich 1 sein." + } + }, + "transition-validator": { + "source-arrival-not-reacheable": { + "title": "Quelle Ankunft Warnung", + "description": "Quellankunftszeit kann nicht erreicht werden" + }, + "source-departure-not-reacheable": { + "title": "Quelle Abfahrt Warnung", + "description": "Quellabfahrtszeit kann nicht erreicht werden" + }, + "target-arrival-not-reacheable": { + "title": "Ziel Ankunft Warnung", + "description": "Zielankunftszeit kann nicht erreicht werden" + }, + "target-departure-not-reacheable": { + "title": "Ziel Abfahrt Warnung", + "description": "Zielabfahrtszeit kann nicht erreicht werden" + } + } + } + }, + "streckengrafik": { + "components": { + "reset": "Zurücksetzen", + "close-all-path-nodes": "Schliesse alle Gleisbeleger", + "open-all-path-nodes": "Öffne alle Gleisbeleger", + "show-advanced-display-functions": "Erweiterte Darstellungsfunktionen einblenden", + "show-or-hide-time-for-non-selected-trainruns": "Zeit ein-/ausblenden für nicht selektierte Züge", + "show-or-hide": "{$component} ein-/ausblenden", + "show-or-hide-name-for-non-selected-trainruns": "Zugnamen ein-/ausblenden für nicht selektierte Züge", + "hide-advanced-display-functions": "Erweiterte Darstellungsfunktionen ausblenden", + "rail-track-slider": "Streckengleis", + "headway-band": "Zugfolgezeiten", + "time": "Zeit", + "name": "Name" + } + }, + "utils": { + "navigation-parameters": { + "no-project-id": "Keine Projekt-ID vorhanden", + "no-variant-id": "Keine Varianten-ID vorhanden", + "no-version-id": "Keine Version-ID vorhanden" + } + }, + "view": { + "card-grid": { + "card": { + "open": "Öffnen" + } + }, + "dialogs": { + "confirmation-dialog": { + "confirmation-default": "Ja", + "abort-default": "Nein" + }, + "filterable-labels-dialog": { + "filterable-label-dialog-component": { + "edit-filterable-labels": "Filterbare Labels für {$element} bearbeiten", + "transfer-to-all-visible": "auf alle sichtbaren übertragen", + "delete-from-all-visible": "aus allen sichtbaren löschen", + "transfer": { + "title": "Übernehmen", + "content": "Soll das Label {$label} auf alle sichtbaren {$element} übertragen werden?" + }, + "delete": { + "title": "Löschen", + "content": "Soll das Label {$label} definitiv aus allen sichtbaren {$element} gelöscht werden?" + } + }, + "filterable-labels-form": { + "mandatory-field": "Pflichtfeld" + } + }, + "note-dialog": { + "html-editor": { + "reset-color": "Farbe zurücksetzen", + "editor-placeholder": "Kommentar hier eingeben...", + "mandatory-field": "Pflichtfeld", + "color-presets": { + "ec": { + "title": "Verwende die Farbe des Farbschemas für EC" + }, + "ic": { + "title": "Verwende die Farbe des Farbschemas für IC" + }, + "ir": { + "title": "Verwende die Farbe des Farbschemas für IR" + }, + "re": { + "title": "Verwende die Farbe des Farbschemas für RE" + }, + "s": { + "title": "Verwende die Farbe des Farbschemas für S" + }, + "gex": { + "title": "Verwende die Farbe des Farbschemas für GEX" + }, + "g": { + "title": "Verwende die Farbe des Farbschemas für G" + }, + "green": { + "title": "green" + }, + "blue": { + "title": "blue" + }, + "magenta": { + "title": "magenta" + }, + "red": { + "title": "red" + }, + "warning": { + "title": "Warnfarbe" + } + } + }, + "note-tab": "Kommentar", + "filterable-labels-tab": "Filterbare Labels", + "delete-note": "Kommentar löschen", + "note-filter-tab": { + "labels": "Labels", + "label-placeholder": "Neues Label..." + }, + "note-form": { + "title": "Title", + "name": "Name" + } + }, + "stammdaten-dialog": { + "base-data": "Stammdaten", + "operationalPoint": "Betriebspunkt", + "ipv-stop-time": "Haltezeit IPV", + "a-stop-time": "Haltezeit A", + "b-stop-time": "Haltezeit B", + "c-stop-time": "Haltezeit C", + "d-stop-time": "Haltezeit D", + "zaz": "ZAZ", + "connection-time": "Anschlusszeit", + "region": "Region", + "category": "Kategorie", + "filterable-labels": "Filterbare Labels", + "position": "Position", + "close": "Schliessen" + }, + "trainrun-and-section-dialog" : { + "filterableLabels": "Filterbare Labels", + "trainrun-filter-tab": { + "labels": "Labels", + "newLabels" : "Neues Label...", + "trainrunDuplicate": "Zuglauf duplizieren", + "trainrunDelete": "Zuglauf löschen", + "delete": "Löschen", + "deleteConfirmationQuestion": "Soll der gesamte Zuglauf definitiv gelöscht werden?" + }, + "trainrun-tab": { + "tabName": "Name", + "category": "Kategorie", + "frequency": "Takt", + "verkehrt": "verkehrt", + "trainrunDuplicate": "Zuglauf duplizieren", + "trainrunDelete": "Zuglauf löschen", + "delete": "Löschen", + "deleteConfirmationQuestion": "Soll der gesamte Zuglauf definitiv gelöscht werden?" + }, + "trainrun-section-tab": { + "warningTwoLocks": "Warnung: Zu viele Zeiten sind gelockt!", + "propagateTimesToLeft": "Zeiten nach links propagieren", + "propagateTimesToRight": "Zeiten nach rechts propagieren" + } + } + }, + "editor-edit-tools-view-component": { + "edit": "Bearbeiten", + "filterable-labels": "Filterbare Labels", + "trainruns": "Zugfahrten", + "nodes": "Knoten", + "notes": "Kommentare", + "delete-netzgrafik-title": "Netzgrafik - Löschen", + "non-visible-elements": "Nicht sichtbare Elemente", + "delete-all-non-visible-elements-tooltip": "Alle nicht sichtbare Elemente, wie Knoten, Zugfahrten und Kommentare löschen", + "delete-all-non-visible-elements": "Alle nicht sichtbare Elemente löschen", + "visible-elements": "Sichtbare Elemente", + "delete-all-visible-trainruns-tooltip": "Alle sichtbare Zugfahrten löschen", + "delete-all-visible-trainruns": "Alle sichtbare Zugfahrten löschen", + "delete-all-visible-notes-tooltip": "Alle sichtbare Kommentare löschen", + "delete-all-visible-notes": "Alle sichtbare Kommentare löschen", + "delete-all-visible-elements-tooltip": "Alle sichtbare Elemente, wie Knoten, Zugfahrten und Kommentare löschen", + "delete-all-visible-elements": "Alle sichtbare Elemente löschen", + "merge-netzgrafik-title": "Netzgrafik - Zusammenführen", + "add-netzgrafik-as-copy-tooltip": "Netzgrafik als Kopie einfügen (Zugfahrten, Knoten, Kommentare)", + "add-netzgrafik-as-copy": "Netzgrafik als Kopie einfügen", + "merge-netzgrafik-tooltip": "Netzgrafik zusammenführen (Zugfahrten, Knoten, Kommentare)", + "merge-netzgrafik": "Netzgrafik durch zusammenführen", + "delete": "Löschen", + "on-clear-delete-all-non-visible-elements": "Sollen alle nicht sichtbare Elemente aus der Netzgrafik definitiv gelöscht werden?", + "on-clear-delete-all-visible-elements": "Sollen alle sichtbare Elemente aus der Netzgrafik definitiv gelöscht werden?", + "on-clear-delete-all-visible-trainruns": "Sollen alle sichtbare Zugfahrten aus der Netzgrafik definitiv gelöscht werden?", + "on-clear-delete-all-visible-notes": "Sollen alle sichtbare Kommentare aus der Netzgrafik definitiv gelöscht werden?", + "label-drop-list": { + "no-labels-available": "Keine Labels vorhanden", + "delete-group": "Gruppe löschen", + "add-new-group": "Neue Gruppe hinzufügen", + "trainruns": "Zugfahrten", + "notes": "Kommentare", + "nodes": "Knoten" + } + }, + "editor-filter-view": { + "filter": "Filter", + "general": "Allgemein", + "category": "Kategorie", + "frequency": "Takt", + "time-category": "Verkehrt", + "display-all-trainruns": "Alle Zugfahrten anzeigen", + "reset-trainrun-filter": "Zugfilter zurücksetzen", + "filterable-labels-trainruns": "Filterbare Labels: Zugfahrten", + "filterable-labels-nodes": "Filterbare Labels: Knoten", + "filterable-labels-notes": "Filterbare Labels: Kommentare", + "display": "Anzeigen", + "times": "Zeiten", + "decimal-displayed": "Anzahl Nachkommastellenanzeigen", + "display-arrival-departure-times": "Abfahrt- und Ankuftszeiten anzeigen", + "display-arrival-departure-times-for-connections": "Abfahrt- und Ankuftszeiten für Durchfahrten anzeigen", + "display-travel-times": "Fahrzeiten anzeigen", + "display-trainrun-name": "Zugname anzeigen", + "connections": "Anschlüsse", + "display-connections": "Anschlüsse anzeigen", + "nodes": "Knoten", + "display-nodes-without-visible-trainruns": "Knoten ohne (angezeigte) Zugfahrten anzeigen", + "display-nodes-with-only-stopping-trainruns": "Knoten mit nur durchfahrenden Zugfahrten anzeigen", + "notes": "Kommentare", + "display-notes": "Kommentare anzeigen", + "reset-display-filter": "Anzeigefilter zurücksetzen", + "saved-filters": "Gespeicherte Filter", + "save-filters": "Filter speichern und als Filtereinstellungen hinzufügen", + "reset-all-display-filters": "Alle Anzeigefilter zurücksetzen", + "load-filter": "{$filter} laden", + "reload-filter": "{$filter} neu laden", + "show-trainrun-category": "{$trainrunCategory} einblenden", + "hide-trainrun-category": "{$trainrunCategory} ausblenden", + "show-trainrun-time-category": "{$trainrunTimeCategory} einblenden", + "hide-trainrun-time-category": "{$trainrunTimeCategory} ausblenden", + "show-trainrun-frequency": "{$trainrunFrequency} einblenden", + "hide-trainrun-frequency": "{$trainrunFrequency} ausblenden", + "filterable-label-filter": { + "no-labels-available": "Keine Labels vorhanden", + "or": "Oder", + "and": "Und", + "show-all": "Alles anzeigen", + "reset-filter": "Filter zurücksetzen", + "show": "einblenden", + "hode": "ausblenden" + } + }, + "editor-menu": { + "save-changes": "Speichere Änderungen", + "changes-saved": "Änderungen gespeichert", + "read-mode": "Lese-Modus", + "show-hide-filter": "Filter ein-/ausblenden", + "zoom-out": "Herauszoomer", + "zoom-in": "Hereinzoomen", + "topology-editor-disabled": "Topologie Editor deaktiviert", + "topology-editor-enabled": "Topologie Editor aktiviert", + "multiple-selection-tool-disabled": "Mehrfachauswahlstool ist deaktiviert", + "multiple-selection-tool-enabled": "Mehrfachauswahlstool ist aktiviert", + "note-editor-disabled": "Notiz Editor deaktiviert", + "note-editor-enabled": "Notiz Editor aktiviert", + "analytics-disabled": "Analytics deaktiviert", + "analytics-enabled": "Analytics aktiviert", + "displayGraphicTimetable": "Streckengrafik anzeigen", + "closeGraphicTimetable": "Streckengrafik schliessen", + "errorGraphicTimetable": "Streckengrafik kann nicht angezeigt werden, da keine Zugfahrt oder keine Knoten ausgewählt wurden." + }, + "editor-properties-view-component": { + "settings": "Einstellungen", + "color-scheme": "Farbschema", + "theme": "Theme", + "background-color": "Hintergrundfarbe", + "set-color-to-white": "Hintergrundfarbe auf 'weiss' setzten", + "reset-background-color-to-default": "Hintergrundfarbe auf Standard zurücksetzen", + "background-color-black": "Hintergrundfarbe (dunkel)", + "editor": "Editor", + "useDefaultBrowserColorTheme": "Verwenden Sie das Standard-Browser-Farbschema", + "defaultBrowserColorTheme": "Standard-Browser-Farbschema", + "travel-time-presetting-default": "Fahrzeitvoreinstellungs (Heuristik)", + "graphicTimetable": "Streckengrafik", + "axis-scaling-distance": "Achsenskalierung (Distanz)", + "standardColorTheme": "Standard Farbschema", + "specialColorTheme": "Spezielles Farbschema", + "grayscaleColorTheme": "Graustufen Farbschema", + "optimizedPrintColorTheme": "Optimiertes Farbschema zum Drucken/Exportieren", + "standardDarkColorTheme": "Standard Farbschema (dunkel)", + "specialDarkColorTheme": "Spezielles Farbschema (dunkel)", + "grayscaleDarkColorTheme": "Graustufen Farbschema (dunkel)", + "timeScaledDistance": "fahrzeitskaliert", + "timeScaledDistanceTooltip": "Die Streckengrafikabschnitte werden fahrzeitskaliert dargestellt, d.h. es wird angenommen, dass der ausgewählte Zug mit konstanter Geschwindigkeit verkehrt.", + "uniformDistance": "gleichmässig", + "uniformDistanceTooltip": "Die Streckengrafikabschnitte werden gleichmässig skaliert dargestellt.", + "fixed": "Konstant 1min.", + "fixedTooltip": "Übernimmt die Fahrzeit mit konstant 1min (Default).", + "retrieveFromEdge": "Abschnittsfahrzeit", + "retrieveFromEdgeTooltip": "Übernimmt die max. Fahrzeit auf dem selben Abschnitt aller Züge gleicher Kategorie, sonst max. Fahrzeit aller Züge, sonst 1 Min." + }, + "editor-side-view": { + "editor-node-detail-view": { + "base-data": "Stammdaten", + "operational-point": "Betriebspunkt", + "name": "Name", + "connection-time": "Anschlusszeit", + "occupancy": "Auslastung", + "capacity": "Kapazität", + "filterable-labels": "Filterbare Labels", + "labels": "Labels", + "new-label-placeholder": "Neues Label...", + "stopping-times": "Haltezeiten", + "stopping-time-per-product": "Haltezeit pro Produkt", + "no-stop": "Kein Halt", + "ipv": "IPV", + "a": "A", + "b": "B", + "c": "C", + "d": "D", + "links": "Links", + "platform-information": "Perron Informationen", + "platform-length": "Perron-Länge", + "delete-node": "Knoten löschen", + "delete": "Löschen", + "deleteNodeDialog": "Soll der Knoten {$operationalPointShortName} ({$operationalPointName}) definitiv gelöscht werden?" + }, + "editor-tools-view-component": { + "more-functions": "Weitere Funktionen", + "export": "Exportieren", + "export-netzgrafik-as-svg": "Exportieren Netzgrafik als SVG", + "export-as-svg": "Exportieren als SVG", + "export-netzgrafik-as-png": "Exportieren Netzgrafik als PNG", + "export-as-png": "Exportieren als PNG", + "print-netzgrafik": "Netzgrafik drucken", + "print": "Drucken", + "netzgrafik": "Netzgrafik", + "export-netzgrafik": "Netzgrafik exportieren", + "export-netzgrafik-as-json": "Netzgrafik als JSON exportieren", + "import-netzgrafik": "Netzgrafik importieren", + "import-netzgrafik-error": "Netzgrafik konnte nicht importiert werden.", + "import-netzgrafik-as-json": "Netzgrafik aus JSON importieren", + "import-netzgrafik-as-json-info-3rd-party": "Drittanbieter JSON Daten erkannt: Import Heuristik angewandt.", + "export-trainruns": "Zugfahrten exportieren", + "export-trainruns-as-csv": "Zugfahrten als CSV exportieren", + "export-trainruns-as-csv-excel": "In Excel: Daten -> Aus Text/CSV -> Filename ... importieren", + "export-origin-destination": "Export origin-destination", + "export-origin-destination-as-csv": "Export origin-destination as CSV", + "base-data": "Stammdaten", + "import-base-data": "Stammdaten importieren", + "help-csv-data": "Hilfe: CSV - Datei", + "export-base-data": "Stammdaten exportieren", + "bp": "BP", + "station": "Bahnhof", + "category": "Kategorie", + "region": "Region", + "passengerConnectionTimeIPV": "Fahrgastwechselzeit_IPV", + "passengerConnectionTimeA": "Fahrgastwechselzeit_A", + "passengerConnectionTimeB": "Fahrgastwechselzeit_B", + "passengerConnectionTimeC": "Fahrgastwechselzeit_C", + "passengerConnectionTimeD": "Fahrgastwechselzeit_D", + "ZAZ": "ZAZ", + "transferTime": "Umsteigezeit", + "labels": "Labels", + "X": "X", + "Y": "Y", + "create": "Erstellen", + "yes": "JA", + "netzgrafikFile": "netzgrafik", + "baseDataFile": "stammdaten", + "trainrunFile": "zuglauf", + "originDestinationFile": "originDestination", + "trainCategory": "Zugkategorie", + "trainName": "Zugname", + "startStation": "Startbahnhof", + "destinationStation": "Zielbahnhof", + "trafficPeriod": "Verkehrsperiode", + "frequence": "Takt", + "departureMinuteAtStart": "Abfahrtsminute am Start Knoten", + "travelTimeStartDestination": "Fahrzeit Start-Ziel", + "arrivalMinuteAtDestination": "Ankuntsminute am Ziel Knoten", + "turnaroundTimeDestination": "Wendezeit Zielbahnhof", + "departureMinuteDeparture": "Abfahrtsminute am Ziel Knoten", + "travelTimeDestinationStart": "Fahrzeit Ziel-Start", + "arrivalMinuteAtStart": "Ankuntsminute am Start Knoten", + "turnaroundTimeStart": "Wendezeit Startbahnhof", + "turnaroundTime": "Umlaufzeit", + "trainrunTimeCategory": "Verkehrt", + "origin": "Start", + "destination": "Ziel", + "travelTime": "Fahrzeit", + "transfers": "Transfers", + "totalCost": "Gesamtkosten" + } + }, + "error-view": { + "error": "Fehler" + }, + "navigation-bar": { + "project-name": "Projekt «{$name}»", + "project-name-archived": "Projekt «{$name}» (archiviert)", + "variant-name": "Variante «{$name}»", + "variant-name-archived": "Variante «{$name}» (archiviert)" + }, + "project": { + "project-dialog": { + "create-project": "Projekt erstellen", + "edit-project": "Projekt bearbeiten", + "create": "Erstellen", + "save": "Speichern", + "cancel": "Abbrechen", + "project-form": { + "name": "Name", + "mandatory": "Pflichtfeld", + "summary": "Zusammenfassung", + "description": "Beschreibung", + "tooltip": "Benutzer müssen mit ihrer E-Mail angegeben werden. Eingabe pro E-Mail jeweils mit 'Enter' bestätigen.", + "user-with-write-access": "Benutzer mit Schreibzugriff", + "new-user-placeholder": "Neuer Benutzer...", + "invalid-values": "Ungültige Werte (keine E-Mail Adresse)", + "user-with-read-access": "Benutzer mit Lesezugriff" + } + }, + "projects-view": { + "projects": "Projekte", + "search-project": "Projekt suchen", + "show-archive": "Archiv anzeigen", + "archived": "(archiviert)", + "archive-project": { + "title": "Projekt archivieren", + "content": "Möchten Sie das Projekt jetzt archivieren?" + }, + "undo-archiving-project": { + "title": "Archivierung rückgängig machen", + "content": "Möchten Sie die Archivierung des Projekts rückgängig machen?" + }, + "undo-archiving": "Archivierung rückgängig machen", + "edit": "Bearbeiten", + "archive": "Archivieren" + } + }, + "variant": { + "variant-dialog": { + "create-variant": "Variante erstellen", + "edit-variant": "Variante bearbeiten", + "save": "Speichern", + "cancel": "Abbrechen", + "variant-form": { + "name": "Name", + "mandatory": "Pflichtfeld" + } + }, + "variant-view": { + "variant-history": { + "publish-entry": { + "comment": "Kommentar", + "publish": "Publizieren", + "local-changes": "Lokale Änderungen müssen zuerst gespeichert werden", + "discard-changes": "Änderungen Verwerfen" + }, + "released-entry": { + "download": "Herunterladen", + "discard-changes": "Änderungen Verwerfen", + "ignore-conflict": "Konflikt ignorieren", + "restore": "Wiederherstellen", + "as-new-variant": "Als neue Variante", + "version-already-available": "Version bereits vorhanden", + "successfully-published": "Erfolgreich publiziert" + }, + "version-entry-layout": { + "user-id-copied": "In die Zwischenablage kopiert: {$msg}" + }, + "snapshot-entry": { + "download": "Herunterladen", + "restore": "Wiederherstellen", + "as-new-variant": "Als neue Variante", + "successfully-published": "Erfolgreich publiziert", + "change-snapshot-version": "Änderung {$snapshotVersion}" + }, + "new-version-published": { + "title": "Neue Version publizieren", + "content": "Möchten Sie Ihre persönlichen Änderungen als neue Version publizieren?" + }, + "discard-changes": { + "title": "Änderungen verwerfen", + "content": "Möchten Sie Ihre persönlichen Änderungen unwiderruflich verwerfen?" + }, + "restore-version": { + "title": "Version wiederherstellen", + "content": "Möchten Sie den Stand dieser Version wiederherstellen?" + }, + "ignore-conflict": { + "title": "Konflikt ignorieren", + "content": "Möchten Sie, dass der aktuelle Stand auf der höchsten publizierten Version aufbaut?" + } + }, + "archived": "(archiviert)", + "edit-variant": "Variante bearbeiten", + "delete-variant": { + "title": "Variante löschen", + "content": "Möchten Sie die Variante und alle enthaltenen Versionen endgültig löschen? Diese Aktion kann nicht rückgängig gemacht werden." + }, + "versions": "Versionen" + }, + "variants-view": { + "archived": "(archiviert)", + "variants": "Varianten", + "search-variants": "Varianten suchen", + "show-archive": "Archiv anzeigen", + "project-description": "Projekt Beschreibung", + "edit-project": "Projekt bearbeiten", + "archive-project": { + "title": "Projekt archivieren", + "content": "Möchten Sie das Projekt jetzt archivieren?" + }, + "undo-archiving": "Archivierung rückgängig machen", + "delete-project": { + "title": "Projekt löschen", + "content": "Möchten Sie das Projekt und alle enthaltenen Varianten endgültig löschen? Diese Aktion kann nicht rückgängig gemacht werden." + }, + "archive": "Archivieren", + "archive-variant": { + "title": "Variante archivieren", + "content": "Möchten Sie die Variante jetzt archivieren?" + }, + "undo-archiving-variant": { + "title": "Archivierung rückgängig machen", + "content": "Möchten Sie die Archivierung der Variante rückgängig machen?" + }, + "undo-archiving-project": { + "title": "Archivierung rückgängig machen", + "content": "Möchten Sie die Archivierung des Projekts rückgängig machen?" + }, + "error-unexpected-data": "Unerwartete Daten: Kein Snapshot und keine freigegebene Version." + } + } + } + }, + "sbbBreadcrumbExpand": "Gesamten Pfad anzeigen", + "sbbDialogCloseDialog": "Dialog schließen", + "sbbFileSelectorUploadFile": "Datei hochladen", + "sbbFileSelectorRemoveFile": "Datei löschen", + "sbbHeaderMenuBack": "Zurück", + "sbbHeaderOpenMenu": "Menü öffnen", + "sbbHeaderCloseMenu": "Menü schliessen", + "sbbSidebarCollapse": "Zusammenklappen", + "sbbSidebarExpand": "Erweitern", + "sbbSidebarCloseSidebar": "Sidebar schließen", + "sbbSidebarOpenSidebar": "Sidebar öffnen", + "sbbTextareaCounterText": "{$PH} verbleibende Zeichen", + "sbbUsermenuLogin": "Login", + "sbbUsermenuOpenPanel": "Eingeloggt als {$PH}. Klicken Sie auf oder drücken Sie die Eingabetaste, um das Benutzermenü zu öffnen." +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json new file mode 100644 index 00000000..3e5aadd0 --- /dev/null +++ b/src/assets/i18n/en.json @@ -0,0 +1,657 @@ +{ + "app-routing": { + "module": { + "path": { + "404": "The page you were looking for was not found.", + "401": "You are not authorized, please reload the page.", + "403": "You are not authorized to perform this action.", + "409": "There was a conflict while executing your action, please try again.", + "error": "An error has occurred." + } + } + }, + "app": { + "version": "Version {$version}", + "user-guide": "User guide", + "user-manual": "User manual", + "logout": "Logout", + "login": "You are getting logged in...", + "logger": { + "title": "Title" + }, + "models": { + "node": { + "shortNameDefault": "NEW", + "full-name-default": "New node" + }, + "note": { + "title-default": "Note title", + "text-default": "Note text", + "default-title": "Note title", + "default-text": "Note text" + } + }, + "netzgrafik-application": { + "variants": "Variants", + "filter": "Filter", + "analytics": "Analytics", + "edit": "Edit", + "more-functions": "More functions", + "settings": "Settings" + }, + "perlenkette": { + "perlenkette-node": { + "0-warning-connection": "No incorrect connection", + "1-warning-connection": "1 incorrect connection", + "n-warning-connections": "{$number} incorrect connections", + "0-fitting-connection": "No fitting connection", + "1-fitting-connection": "1 fitting connection", + "n-fitting-connections": "{$number} fitting connections" + }, + "perlenkette-section": { + "propagate-times-upwards": "Propagate times upwards", + "propagate-times-downwards": "Propagate times downwards" + }, + "show-only-closed-locks": "Show only closed locks", + "show-all-locks": "Show all locks" + }, + "services": { + "data": { + "node": { + "transit-modified": { + "title": "Transition changed", + "description": "Times cannot be adjusted, lock found on both sides" + } + }, + "trainrunsection": { + "intermediate-stop-replacement": { + "title": "Intermediate stop replacement", + "description": "Intermediate stop replacement led to inconsistencies in the allocation of times!" + } + } + }, + "ui": { + "newFilter": "New filter" + }, + "util": { + "connection-validator": { + "connection-marked-for-transit": { + "title": "Connection marked for transition!", + "description": "Connection marked for transition!" + } + }, + "trainrun-iteration": { + "error": { + "infinity-loop": "Iterator has detected an infinity loop. The iteration terminated early!" + } + }, + "trainrunsection-validator": { + "broken-symmetry": "Broken symmetry", + "target-arrival-not-reacheable": { + "title": "Target Arrival Warning", + "description": "Target arrival time cannot be reached" + }, + "source-arrival-not-reacheable": { + "title": "Source Arrival Warning", + "description": "Source arrival time cannot be reached" + }, + "travel-time-less-than-1": { + "title": "Travel Time less than 1", + "description": "Travel time must be greater than or equal to 1" + } + }, + "transition-validator": { + "source-arrival-not-reacheable": { + "title": "Source Arrival Warning", + "description": "Source arrival time cannot be reached" + }, + "source-departure-not-reacheable": { + "title": "Source Departure Warning", + "description": "Source departure time cannot be reached" + }, + "target-arrival-not-reacheable": { + "title": "Target Arrival Warning", + "description": "Target arrival time cannot be reached" + }, + "target-departure-not-reacheable": { + "title": "Target Departure Warning", + "description": "Target departure time cannot be reached" + } + } + } + }, + "streckengrafik": { + "components": { + "reset": "Reset", + "close-all-path-nodes": "Close all path nodes", + "open-all-path-nodes": "Open all path nodes", + "show-advanced-display-functions": "Show advanced display functions", + "show-or-hide-time-for-non-selected-trainruns": "Show/hide time for non-selected trainruns", + "show-or-hide": "Enable/disable {$component}", + "show-or-hide-name-for-non-selected-trainruns": "Show/hide trainrun names for unselected trainruns", + "hide-advanced-display-functions": "Hide advanced display functions", + "rail-track-slider": "Rail track slider", + "headway-band": "Headway band", + "time": "Time", + "name": "Name" + } + }, + "utils": { + "navigation-parameters": { + "no-project-id": "No project ID available", + "no-variant-id": "No variant ID available", + "no-version-id": "No version ID available" + } + }, + "view": { + "card-grid": { + "card": { + "open": "Open" + } + }, + "dialogs": { + "confirmation-dialog": { + "confirmation-default": "Yes", + "abort-default": "No" + }, + "filterable-labels-dialog": { + "filterable-label-dialog-component": { + "edit-filterable-labels": "Edit filterable labels for {$element}", + "transfer-to-all-visible": "transfer to all visible", + "delete-from-all-visible": "delete from all visible", + "transfer": { + "title": "Transfer", + "content": "Should the label {$label} be applied on all visible {$element}?" + }, + "delete": { + "title": "Delete", + "content": "Should the label {$label} be definitely delete on all visible {$element}?" + } + }, + "filterable-labels-form": { + "mandatory-field": "Mandatory field" + } + }, + "note-dialog": { + "html-editor": { + "reset-color": "Reset color", + "editor-placeholder": "Enter comment here...", + "mandatory-field": "Mandatory field", + "color-presets": { + "ec": { + "title": "Use color of the color scheme for EC" + }, + "ic": { + "title": "Use color of the color scheme for IC" + }, + "ir": { + "title": "Use color of the color scheme for IR" + }, + "re": { + "title": "Use color of the color scheme for RE" + }, + "s": { + "title": "Use color of the color scheme for S" + }, + "gex": { + "title": "Use color of the color scheme for GEX" + }, + "g": { + "title": "Use color of the color scheme for G" + }, + "green": { + "title": "green" + }, + "blue": { + "title": "blue" + }, + "magenta": { + "title": "magenta" + }, + "red": { + "title": "red" + }, + "warning": { + "title": "warning color" + } + } + }, + "note-tab": "Note", + "filterable-labels-tab": "Filterable labels", + "delete-note": "Delete note", + "note-filter-tab": { + "labels": "Labels", + "label-placeholder": "New label..." + }, + "note-form": { + "title": "Title", + "name": "Name" + } + }, + "stammdaten-dialog": { + "base-data": "Base data", + "operationalPoint": "Operational point", + "ipv-stop-time": "IPV stop time", + "a-stop-time": "A stop time", + "b-stop-time": "B stop time", + "c-stop-time": "C stop time", + "d-stop-time": "D stop time", + "zaz": "ZAZ", + "connection-time": "Connection time", + "region": "Region", + "category": "Category", + "filterable-labels": "Filterable labels", + "position": "Position", + "close": "Close" + }, + "trainrun-and-section-dialog": { + "filterableLabels": "Filterable Labels", + "trainrun-filter-tab": { + "labels": "Labels", + "newLabels" : "New label...", + "trainrunDuplicate": "Duplicate trainrun", + "trainrunDelete": "Delete trainrun", + "delete": "Delete", + "deleteConfirmationQuestion": "Should the entire train route be definitively deleted?" + }, + "trainrun-tab": { + "tabName": "Name", + "category": "Category", + "frequency": "Frequency", + "verkehrt": "Operates", + "trainrunDuplicate": "Duplicate trainrun", + "trainrunDelete": "Delete trainrun", + "delete": "Delete", + "deleteConfirmationQuestion": "Should the entire train route be definitively deleted?" + }, + "trainrun-section-tab": { + "warningTwoLocks": "Warning: Too many times are locked!", + "propagateTimesToLeft": "Propagate times to the left", + "propagateTimesToRight": "Propagate times to the right" + } + } + }, + "editor-edit-tools-view-component": { + "edit": "Edit", + "filterable-labels": "Filterable labels", + "trainruns": "Trainruns", + "nodes": "Nodes", + "notes": "Notes", + "delete-netzgrafik-title": "Netzgrafik - Delete", + "non-visible-elements": "Non visible elements", + "delete-all-non-visible-elements-tooltip": "Delete all non-visible elements, such as nodes, trainruns and notes", + "delete-all-non-visible-elements": "Delete all non-visible elements", + "visible-elements": "Visible elements", + "delete-all-visible-trainruns-tooltip": "Delete all visible trainruns", + "delete-all-visible-trainruns": "Delete all visible trainruns", + "delete-all-visible-notes-tooltip": "Delete all visible notes", + "delete-all-visible-notes": "Delete all visible notes", + "delete-all-visible-elements-tooltip": "Delete all visible elements, such as nodes, trainruns and notes", + "delete-all-visible-elements": "Delete all visible elements", + "merge-netzgrafik-title": "Netzgrafik - Merge", + "add-netzgrafik-as-copy-tooltip": "Add netzgrafik as a copy (trainruns, nodes, notes)", + "add-netzgrafik-as-copy": "Add netzgrafik as a copy", + "merge-netzgrafik-tooltip": "Merge netzgrafik (trainruns, nodes, notes)", + "merge-netzgrafik": "Merge netzgrafik", + "delete": "Delete", + "on-clear-delete-all-non-visible-elements": "Should all non-visible elements be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-elements": "Should all visible elements be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-trainruns": "Should all visible trainruns be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-notes": "Should all visible notes be permanently deleted from the netzgrafik?", + "label-drop-list": { + "no-labels-available": "No labels available", + "delete-group": "Delete group", + "add-new-group": "Add new group", + "trainruns": "Trainruns", + "notes": "Notes", + "nodes": "Nodes" + } + }, + "editor-filter-view": { + "filter": "Filter", + "general": "General", + "category": "Category", + "frequency": "Frequence", + "time-category": "Time category", + "display-all-trainruns": "Display all trainruns", + "reset-trainrun-filter": "Reset trainrun filter", + "filterable-labels-trainruns": "Filterable labels: Trainruns", + "filterable-labels-nodes": "Filterable labels: Nodes", + "filterable-labels-notes": "Filterable labels: Notes", + "display": "Display", + "times": "Times", + "decimal-displayed": "Number of decimal place displayed", + "display-arrival-departure-times": "Display departure and arrival times", + "display-arrival-departure-times-for-connections": "Display departure and arrival times for connections", + "display-travel-times": "Display travel times", + "display-trainrun-name": "Display trainrun name", + "connections": "Connections", + "display-connections": "Display connections", + "nodes": "Nodes", + "display-nodes-without-visible-trainruns": "Display nodes without (visible) trainruns", + "display-nodes-with-only-stopping-trainruns": "Display nodes with only stopping trainruns", + "notes": "Notes", + "display-notes": "Display notes", + "reset-display-filter": "Reset display filter", + "saved-filters": "Saved filters", + "save-filters": "Save filters and add them as filter settings", + "reset-all-display-filters": "Reset all display filters", + "load-filter": "Load {$filter}", + "reload-filter": "Reload {$filter}", + "show-trainrun-category": "Show {$trainrunCategory}", + "hide-trainrun-category": "Hide {$trainrunCategory}", + "show-trainrun-time-category": "Show {$trainrunTimeCategory}", + "hide-trainrun-time-category": "Hide {$trainrunTimeCategory}", + "show-trainrun-frequency": "Show {$trainrunFrequency}", + "hide-trainrun-frequency": "Hide {$trainrunFrequency}", + "filterable-label-filter": { + "no-labels-available": "No labels available", + "or": "Or", + "and": "And", + "show-all": "Show all", + "reset-filter": "Reset filter", + "show": "show", + "hide": "hide" + } + }, + "editor-menu": { + "save-changes": "Save changes", + "changes-saved": "Changes saved", + "read-mode": "Read mode", + "show-hide-filter": "Show/Hide filter", + "zoom-out": "Zoom out", + "zoom-in": "Zoom in", + "topology-editor-disabled": "Topology editor disabled", + "topology-editor-enabled": "Topology editor enabled", + "multiple-selection-tool-disabled": "Multiple selection tool is disabled", + "multiple-selection-tool-enabled": "Multiple selection tool is enabled", + "note-editor-disabled": "Note editor disabled", + "note-editor-enabled": "Note editor enabled", + "analytics-disabled": "Analytics disabled", + "analytics-enabled": "Analytics enabled", + "displayGraphicTimetable": "Display graphic timetable", + "closeGraphicTimetable": "Close graphic timetable", + "errorGraphicTimetable": "Graphic timetable cannot be displayed because no trainrun or no nodes have been selected." + }, + "editor-properties-view-component": { + "settings": "Settings", + "color-scheme": "Color scheme", + "theme": "Theme", + "background-color": "Background color", + "set-color-to-white": "Set color to 'white'", + "reset-background-color-to-default": "Reset background color to default", + "background-color-black": "Background color (black)", + "editor": "Editor", + "useDefaultBrowserColorTheme": "Use the default browser color theme.", + "defaultBrowserColorTheme": "Default browser color theme", + "travel-time-presetting-default": "Travel time presetting (heuristics)", + "graphicTimetable": "Graphic timetable", + "axis-scaling-distance": "Axis scaling (distance)", + "standardColorTheme": "Standard color theme", + "specialColorTheme": "Special color theme", + "grayscaleColorTheme": "Grayscale color theme", + "optimizedPrintColorTheme": "Optimized color theme for printing/exporting", + "standardDarkColorTheme": "Standard color theme (dark)", + "specialDarkColorTheme": "Special color theme (dark)", + "grayscaleDarkColorTheme": "Grayscale color theme (dark)", + "timeScaledDistance": "Travel time scaled", + "timeScaledDistanceTooltip": "The route graphic sections are displayed with travel time scaling, i.e. it is assumed that the selected train travels at a constant speed.", + "uniformDistance": "Uniform", + "uniformDistanceTooltip": "The route graphic sections are uniformly displayed.", + "fixed": "Constant 1min", + "fixedTooltip": "Adopts the travel time with a constant 1min (default).", + "retrieveFromEdge": "Section travel time", + "retrieveFromEdgeTooltip": "Takes over the max. travel time on the same section of all trains of the same category, otherwise max. travel time of all trains, otherwise 1 min." + }, + "editor-side-view": { + "editor-node-detail-view": { + "base-data": "Base data", + "operational-point": "Operational point", + "name": "Name", + "connection-time": "Connection time", + "occupancy": "Occupancy", + "capacity": "Capacity", + "filterable-labels": "Filterable labels", + "labels": "Labels", + "new-label-placeholder": "New label...", + "stopping-times": "Stopping times", + "stopping-time-per-product": "Stopping time per product", + "no-stop": "No stop", + "ipv": "IPV", + "a": "A", + "b": "B", + "c": "C", + "d": "D", + "links": "Links", + "platform-information": "Platform information", + "platform-length": "Platform length", + "delete-node": "Delete node", + "delete": "Delete", + "deleteNodeDialog": "Should the node {$operationalPointShortName} ({$operationalPointName}) be definitely deleted?" + }, + "editor-tools-view-component": { + "more-functions": "More functions", + "export": "Export", + "export-netzgrafik-as-svg": "Export netzgrafik as SVG", + "export-as-svg": "Export as SVG", + "export-netzgrafik-as-png": "Export netzgrafik as PNG", + "export-as-png": "Export as PNG", + "print-netzgrafik": "Print netzgrafik", + "print": "Print", + "netzgrafik": "Netzgrafik", + "export-netzgrafik": "Export netzgrafik", + "export-netzgrafik-as-json": "Export netzgrafik as JSON", + "import-netzgrafik": "Import netzgrafik", + "import-netzgrafik-error": "Netzgrafik could not be imported.", + "import-netzgrafik-as-json": "Import netzgrafik as JSON", + "import-netzgrafik-as-json-info-3rd-party": "Third-party JSON data detected: Import heuristic applied.", + "export-trainruns": "Export trainruns", + "export-trainruns-as-csv": "Export trainruns as CSV", + "export-trainruns-as-csv-excel": "In Excel: Data -> From Text/CSV -> Import ... filename", + "export-origin-destination": "Export origin-destination", + "export-origin-destination-as-csv": "Export origin-destination as CSV", + "base-data": "Base data", + "import-base-data": "Import base data", + "help-csv-data": "Help: CSV - Data", + "export-base-data": "Export base data", + "bp": "BP", + "station": "Station", + "category": "Category", + "region": "Region", + "passengerConnectionTimeIPV": "Passenger_connection_time_IPV", + "passengerConnectionTimeA": "Passenger_connection_time_A", + "passengerConnectionTimeB": "Passenger_connection_time_B", + "passengerConnectionTimeC": "Passenger_connection_time_C", + "passengerConnectionTimeD": "Passenger_connection_time_D", + "ZAZ": "ZAZ", + "transferTime": "Transfer_time", + "labels": "Labels", + "X": "X", + "Y": "Y", + "create": "Create", + "yes": "YES", + "netzgrafikFile": "networkGraphic", + "baseDataFile": "baseData", + "trainrunFile": "trainrun", + "originDestinationFile": "originDestination", + "trainCategory": "Train category", + "trainName": "Train name", + "startStation": "Start station", + "destinationStation": "Destination station", + "trafficPeriod": "Traffic period", + "frequence": "Frequence", + "departureMinuteAtStart": "Minute of departure at start node", + "travelTimeStartDestination": "Travel time start-destination", + "arrivalMinuteAtDestination": "Arrival minute at destination node", + "turnaroundTimeDestination": "Turnaround time at destination station", + "departureMinuteDeparture": "Departure minute at destination node", + "travelTimeDestinationStart": "Travel time destination-start", + "arrivalMinuteAtStart": "Arrival minute at start node", + "turnaroundTimeStart": "Turnaround time at start station", + "turnaroundTime": "Turnaround time", + "trainrunTimeCategory": "Trainrun time category", + "origin": "Origin", + "destination": "Destination", + "travelTime": "Travel time", + "transfers": "Transfers", + "totalCost": "Total cost" + } + }, + "error-view": { + "error": "Error" + }, + "navigation-bar": { + "project-name": "Project «{$name}»", + "project-name-archived": "Project «{$name}» (archived)", + "variant-name": "Variant «{$name}»", + "variant-name-archived": "Variant «{$name}» (archived)" + }, + "project": { + "project-dialog": { + "create-project": "Create project", + "edit-project": "Edit project", + "create": "Create", + "save": "Save", + "cancel": "Cancel", + "project-form": { + "name": "Name", + "mandatory-field": "Mandatory field", + "summary": "Summary", + "description": "Description", + "tooltip": "Users must be entered with their e-mail address. Confirm the entry for each e-mail with 'Enter'.", + "user-with-write-access": "User with write access", + "new-user-placeholder": "New user...", + "invalid-values": "Invalid values (no e-mail address)", + "user-with-read-access": "User with read access" + } + }, + "projects-view": { + "projects": "Projects", + "search-project": "Search project", + "show-archive": "Show archive", + "archived": "(archived)", + "archive-project": { + "title": "Archive project", + "content": "Would you like to archive the project now?" + }, + "undo-archiving-project": { + "title": "Undo archiving", + "content": "Would you like to undo the archiving the project now?" + }, + "undo-archiving": "Undo archiving", + "edit": "Edit", + "archive": "Archive" + } + }, + "variant": { + "variant-dialog": { + "create-variant": "Create variant", + "edit-variant": "Edit variant", + "save": "Save", + "cancel": "Cancel", + "variant-form": { + "name": "Name", + "mandatory-field": "Mandatory field" + } + }, + "variant-view": { + "variant-history": { + "publish-entry": { + "comment": "Comment", + "publish": "Publish", + "local-changes": "Local changes must be saved first", + "discard-changes": "Discard changes" + }, + "released-entry": { + "download": "Download", + "discard-changes": "Discard changes", + "ignore-conflict": "Ignore conflict", + "restore": "Restore", + "as-new-variant": "As new variant", + "version-already-available": "Version already available", + "successfully-published": "Successfully published" + }, + "version-entry-layout": { + "user-id-copied": "Copied to clipboard: {$msg}" + }, + "snapshot-entry": { + "download": "Download", + "restore": "Restore", + "as-new-variant": "As new variant", + "successfully-published": "Successfully published", + "change-snapshot-version": "Change {$snapshotVersion}" + }, + "new-version-published": { + "title": "New version published", + "content": "Would you like to publish your personal changes as a new version?" + }, + "discard-changes": { + "title": "Discard changes", + "content": "Would you like to irrevocably discard your personal changes?" + }, + "restore-version": { + "title": "Restore version", + "content": "Would you like to restore the status of this version?" + }, + "ignore-conflict": { + "title": "Ignore conflict", + "content": "Would you like the current version to be based on the highest published version?" + } + }, + "archived": "(archived)", + "edit-variant": "Edit variant", + "delete-variant": { + "title": "Delete variant", + "content": "Do you want to permanently delete the variant and all versions it contains? This action cannot be undone." + }, + "versions": "Versions" + }, + "variants-view": { + "archived": "(archived)", + "variants": "Variants", + "search-variants": "Search variants", + "show-archive": "Show archive", + "project-description": "Project description", + "edit-project": "Edit project", + "archive-project": { + "title": "Archive project", + "content": "Would you like to archive the project now?" + }, + "undo-archiving": "Undo archiving", + "delete-project": { + "title": "Delete projekt", + "content": "Do you want to permanently delete the project and all the variants it contains? This action cannot be undone." + }, + "archive": "Archive", + "archive-variant": { + "title": "Archive variant", + "content": "Would you like to archive the variant now?" + }, + "undo-archiving-variant": { + "title": "Undo archiving", + "content": "Would you like to undo the archiving of the variant?" + }, + "undo-archiving-project": { + "title": "Archive variant", + "content": "Would you like to undo the archiving of the project?" + }, + "error-unexpected-data": "Unexpected data: No snapshot and no released version." + } + } + } + }, + "sbbBreadcrumbExpand": "Show entire path", + "sbbDialogCloseDialog": "Close dialog", + "sbbFileSelectorUploadFile": "Upload file", + "sbbFileSelectorRemoveFile": "Remove file", + "sbbHeaderMenuBack": "Back", + "sbbHeaderOpenMenu": "Open Menu", + "sbbHeaderCloseMenu": "Close Menu", + "sbbSidebarCollapse": "Collapse", + "sbbSidebarExpand": "Expand", + "sbbSidebarCloseSidebar": "Close Sidebar", + "sbbSidebarOpenSidebar": "Open Sidebar", + "sbbTextareaCounterText": "{$PH} characters remaining", + "sbbUsermenuLogin": "Login", + "sbbUsermenuOpenPanel": "Logged in as {$PH}. Click or press enter to open user menu." +} diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json new file mode 100644 index 00000000..988098f5 --- /dev/null +++ b/src/assets/i18n/fr.json @@ -0,0 +1,656 @@ +{ + "app-routing": { + "module": { + "path": { + "404": "La page recherchée n'a pas été trouvée.", + "401": "Vous n'êtes pas autorisé, veuillez recharger la page.", + "403": "Vous n'êtes pas autorisé à effectuer cette action.", + "409": "Un conflit s'est produit lors de l'exécution de votre action, veuillez réessayer.", + "error": "Une erreur s'est produite." + } + } + }, + "app": { + "version": "Version {$version}", + "user-guide": "Guide de l'utilisateur", + "user-manual": "Manuel de l'utilisateur", + "logout": "Déconnexion", + "login": "Vous êtes en train de vous connecter...", + "logger": { + "title": "Titre" + }, + "models": { + "node": { + "shortNameDefault": "NEW", + "full-name-default": "Nouveau noeud" + }, + "note": { + "title-default": "Titre de la note", + "text-default": "Texte de la note", + "default-title": "Titre de la note", + "default-text": "Texte de la note" + } + }, + "netzgrafik-application": { + "variants": "Variantes", + "filter": "Filtres", + "analytics": "Analyse", + "edit": "Edition", + "more-functions": "Plus de fonctionnalités", + "settings": "Paramètres" + }, + "perlenkette": { + "perlenkette-node": { + "0-warning-connection": "Pas de correspondance incorrecte", + "1-warning-connection": "1 correspondance incorrecte", + "n-warning-connections": "{$number} correspondances incorrectes", + "0-fitting-connection": "Pas de correspondance correcte", + "1-fitting-connection": "1 correspondance correcte", + "n-fitting-connections": "{$number} correspondances correctes" + }, + "perlenkette-section": { + "propagate-times-upwards": "Propager les temps vers l'avant", + "propagate-times-downwards": "Propager les temps vers l'arrière" + }, + "show-only-closed-locks": "Afficher uniquement les verrous fermés", + "show-all-locks": "Afficher tous les verrous" + }, + "services": { + "data": { + "node": { + "transit-modified": { + "title": "Transition modifiée", + "description": "Les temps ne peuvent pas être ajustés, le verrou se trouve des deux côtés." + } + }, + "trainrunsection": { + "intermediate-stop-replacement": { + "title": "Remplacement des arrêts intermédiaires", + "description": "Le remplacement des arrêts intermédiaires a entraîné des incohérences dans l'attribution des temps !" + } + } + }, + "ui": { + "newFilter": "Nouveau filtre" + }, + "util": { + "connection-validator": { + "connection-marked-for-transit": { + "title": "Correspondance marquée par une transition", + "description": "Correspondance marquée par une transition!" + } + }, + "trainrun-iteration": { + "error": { + "infinity-loop": "L'itérateur a détecté une boucle infinie. L'itération s'est terminée prématurément !" + } + }, + "trainrunsection-validator": { + "broken-symmetry": "Symétrie brisée", + "target-arrival-not-reacheable": { + "title": "Avertissement d'arrivée à destination", + "description": "L'heure d'arrivée à destination ne peut être atteinte" + }, + "source-arrival-not-reacheable": { + "title": "Avertissement d'arrivée à l'origine", + "description": "L'heure d'arrivée à l'origine ne peut être atteinte" + }, + "travel-time-less-than-1": { + "title": "Temps de trajet inférieur à 1", + "description": "Le temps de trajet doit être supérieur ou égal à 1" + } + }, + "transition-validator": { + "source-arrival-not-reacheable": { + "title": "Avertissement d'arrivée à l'origine", + "description": "L'heure d'arrivée à l'origine ne peut être atteinte" + }, + "source-departure-not-reacheable": { + "title": "Avertissement de départ à l'origine", + "description": "L'heure de départ à l'origine ne peut être atteinte" + }, + "target-arrival-not-reacheable": { + "title": "Avertissement d'arrivée à destination", + "description": "L'heure d'arrivée à destination ne peut être atteinte" + }, + "target-departure-not-reacheable": { + "title": "Avertissement de départ à destination", + "description": "L'heure de départ à destination ne peut être atteinte" + } + } + } + }, + "streckengrafik": { + "components": { + "reset": "Réinitialiser", + "close-all-path-nodes": "Fermer tous les noeuds du chemin", + "open-all-path-nodes": "Ouvrir tous les noeuds du chemin", + "show-advanced-display-functions": "Afficher les fonctionnalités d'affichage avancées", + "show-or-hide-time-for-non-selected-trainruns": "Afficher/masquer le temps des trajets de train non sélectionnés", + "show-or-hide": "Activer/Désactiver {$component}", + "show-or-hide-name-for-non-selected-trainruns": "Afficher/masquer le nom des trajets de train non sélectionnés", + "hide-advanced-display-functions": "Masquer les fonctionnalités d'affichage avancées", + "headway-band": "Espacement", + "time": "Temps", + "name": "Nom" + } + }, + "utils": { + "navigation-parameters": { + "no-project-id": "ID du projet indisponible", + "no-variant-id": "ID de la variante indisponible", + "no-version-id": "ID de la version indisponible" + } + }, + "view": { + "card-grid": { + "card": { + "open": "Ouvrir" + } + }, + "dialogs": { + "confirmation-dialog": { + "confirmation-default": "Oui", + "abort-default": "Non" + }, + "filterable-labels-dialog": { + "filterable-label-dialog-component": { + "edit-filterable-labels": "Modifier les labels filtrables pour {$element}", + "transfer-to-all-visible": "transférer à tous les visibles", + "delete-from-all-visible": "supprimer de tous les visibles", + "transfer": { + "title": "Transférer", + "content": "Le label {$label} doit-il être appliqué à tous les {$element} visibles ?" + }, + "delete": { + "title": "Supprimer", + "content": "Le label {$label} doit-il être définitivement supprimé sur tous les {$element} visibles ?" + } + }, + "filterable-labels-form": { + "mandatory-field": "Champ obligatoire" + } + }, + "note-dialog": { + "html-editor": { + "reset-color": "Réinitialiser la couleur", + "editor-placeholder": "Entrez un commentaire ici...", + "mandatory-field": "Champ obligatoire", + "color-presets": { + "ec": { + "title": "Utiliser la couleur du schéma de couleurs de EC" + }, + "ic": { + "title": "Utiliser la couleur du schéma de couleurs de IC" + }, + "ir": { + "title": "Utiliser la couleur du schéma de couleurs de IR" + }, + "re": { + "title": "Utiliser la couleur du schéma de couleurs de RE" + }, + "s": { + "title": "Utiliser la couleur du schéma de couleurs de S" + }, + "gex": { + "title": "Utiliser la couleur du schéma de couleurs de GEX" + }, + "g": { + "title": "Utiliser la couleur du schéma de couleurs de G" + }, + "green": { + "title": "vert" + }, + "blue": { + "title": "bleu" + }, + "magenta": { + "title": "magenta" + }, + "red": { + "title": "rouge" + }, + "warning": { + "title": "couleur d'avertissement" + } + } + }, + "note-tab": "Note", + "filterable-labels-tab": "Labels filtrables", + "delete-note": "Supprimer la note", + "note-filter-tab": { + "labels": "Labels", + "label-placeholder": "Nouveau label..." + }, + "note-form": { + "title": "Titre", + "name": "Nom" + } + }, + "stammdaten-dialog": { + "base-data": "Données de base", + "operationalPoint": "Point opérationnel", + "ipv-stop-time": "Temps d'arrêt IPV", + "a-stop-time": "Temps d'arrêt A", + "b-stop-time": "Temps d'arrêt B", + "c-stop-time": "Temps d'arrêt C", + "d-stop-time": "Temps d'arrêt D", + "zaz": "ZAZ", + "connection-time": "Temps de correspondance", + "region": "Région", + "category": "Catégorie", + "filterable-labels": "Labels filtrables", + "position": "Position", + "close": "Fermer" + }, + "trainrun-and-section-dialog": { + "filterableLabels": "Labels filtrables", + "trainrun-filter-tab": { + "labels": "Labels", + "newLabels" : "Nouveau label...", + "trainrunDuplicate": "Dupliquer le trajet de train", + "trainrunDelete": "Supprimer le trajet de train", + "delete": "Supprimer", + "deleteConfirmationQuestion": "Faut-il supprimer définitivement l'ensemble du trajet de train ?" + }, + "trainrun-tab": { + "tabName": "Nom", + "category": "Catégorie", + "frequency": "Fréquence", + "verkehrt": "Fonctionnement", + "trainrunDuplicate": "Dupliquer le trajet de train", + "trainrunDelete": "Supprimer le trajet de train", + "delete": "Supprimer", + "deleteConfirmationQuestion": "Faut-il supprimer définitivement l'ensemble du trajet de train ?" + }, + "trainrun-section-tab": { + "warningTwoLocks": "Avertissement : Trop de temps sont bloqués !", + "propagateTimesToLeft": "Propager les temps à gauche", + "propagateTimesToRight": "Propager les temps à droite" + } + } + }, + "editor-edit-tools-view-component": { + "edit": "Editer", + "filterable-labels": "Labels filtrables", + "trainruns": "Trajets de train", + "nodes": "Noeuds", + "notes": "Notes", + "delete-netzgrafik-title": "Réticulaire - Supprimer", + "non-visible-elements": "Éléments non visibles", + "delete-all-non-visible-elements-tooltip": "Supprimer tous les éléments non visibles, tels que les noeuds, les trajets de train et les notes", + "delete-all-non-visible-elements": "Supprimer tous les éléments non visibles", + "visible-elements": "Éléments visibles", + "delete-all-visible-trainruns-tooltip": "Supprimer tous les trajets de trains visibles", + "delete-all-visible-trainruns": "Supprimer tous les trajets de trains visibles", + "delete-all-visible-notes-tooltip": "Supprimer toutes les notes visibles", + "delete-all-visible-notes": "Supprimer toutes les notes visibles", + "delete-all-visible-elements-tooltip": "Supprimer tous les éléments visibles, tels que les noeuds, les trajets de train et les notes", + "delete-all-visible-elements": "Supprimer tous les éléments visibles", + "merge-netzgrafik-title": "Réticulaire - Fusionner", + "add-netzgrafik-as-copy-tooltip": "Ajouter un réticulaire en tant que copie (trajets de train, noeuds, notes)", + "add-netzgrafik-as-copy": "Ajouter un réticulaire en tant que copie", + "merge-netzgrafik-tooltip": "Fusionner les réticulaires (trajets de train, noeuds, notes)", + "merge-netzgrafik": "Fusionner un réticulaire", + "delete": "Supprimer", + "on-clear-delete-all-non-visible-elements": "Tous les éléments non visibles doivent-ils être définitivement supprimés du réticulaire ?", + "on-clear-delete-all-visible-elements": "Tous les éléments visibles doivent-ils être définitivement supprimés du réticulaire ?", + "on-clear-delete-all-visible-trainruns": "Tous les trajets de train visibles doivent-ils être définitivement supprimés du réticulaire ?", + "on-clear-delete-all-visible-notes": "Toutes les notes visibles doivent-elles être définitivement supprimées du réticulaire ?", + "label-drop-list": { + "no-labels-available": "Aucun label disponible", + "delete-group": "Supprimer le groupe", + "add-new-group": "Ajouter un nouveau groupe", + "trainruns": "Trajets de train", + "notes": "Notes", + "nodes": "Noeuds" + } + }, + "editor-filter-view": { + "filter": "Filtres", + "general": "Général", + "category": "Catégorie", + "frequency": "Fréquence", + "time-category": "Période de fonctionnement", + "display-all-trainruns": "Afficher tous les trajets de train", + "reset-trainrun-filter": "Réinitialiser les filtres sur les trajets de train", + "filterable-labels-trainruns": "Labels filtrables: Trajets de train", + "filterable-labels-nodes": "Labels filtrables: Noeuds", + "filterable-labels-notes": "Labels filtrables: Notes", + "display": "Affichage", + "times": "Temps", + "decimal-displayed": "Nombre de décimales affichées", + "display-arrival-departure-times": "Afficher les heures de départ et d'arrivée", + "display-arrival-departure-times-for-connections": "Afficher les heures de départ et d'arrivée des correspondances", + "display-travel-times": "Afficher les temps de parcours", + "display-trainrun-name": "Afficher le nom du trajet de train", + "connections": "Correspondances", + "display-connections": "Afficher les correspondances", + "nodes": "Noeuds", + "display-nodes-without-visible-trainruns": "Afficher les noeuds sans trajets de train (visibles)", + "display-nodes-with-only-stopping-trainruns": "Afficher les noeuds où les trains s'arrêtent", + "notes": "Notes", + "display-notes": "Afficher les notes", + "reset-display-filter": "Réinitialiser l'affichage des filtres", + "saved-filters": "Filtres sauvegardés", + "save-filters": "Enregistrer les filtres et les ajouter en tant que paramètres de filtre", + "reset-all-display-filters": "Réinitialiser l'affichage des filtres", + "load-filter": "Charger {$filter}", + "reload-filter": "Recharger {$filter}", + "show-trainrun-category": "Afficher {$trainrunCategory}", + "hide-trainrun-category": "Masquer {$trainrunCategory}", + "show-trainrun-time-category": "Afficher {$trainrunTimeCategory}", + "hide-trainrun-time-category": "Masquer {$trainrunTimeCategory}", + "show-trainrun-frequency": "Afficher {$trainrunFrequency}", + "hide-trainrun-frequency": "Masquer {$trainrunFrequency}", + "filterable-label-filter": { + "no-labels-available": "Aucun label disponible", + "or": "Ou", + "and": "Et", + "show-all": "Afficher tout", + "reset-filter": "Réinitialiser le filtre", + "show": "afficher", + "hide": "masquer" + } + }, + "editor-menu": { + "save-changes": "Enregistrer les modifications", + "changes-saved": "Modifications enregistrées", + "read-mode": "Mode lecture", + "show-hide-filter": "Filtres", + "zoom-out": "Zoom arrière", + "zoom-in": "Zoom avant", + "topology-editor-disabled": "Editeur de topologie désactivé", + "topology-editor-enabled": "Editeur de topologie activé", + "multiple-selection-tool-disabled": "Outil de sélection multiple désactivé", + "multiple-selection-tool-enabled": "Outil de sélection multiple activé", + "note-editor-disabled": "Editeur de notes désactivé", + "note-editor-enabled": "Editeur de notes activé", + "analytics-disabled": "Analyse désactivée", + "analytics-enabled": "Analyse activée", + "displayGraphicTimetable": "Afficher le graphique espace-temps", + "closeGraphicTimetable": "Fermer le graphique espace-temps", + "errorGraphicTimetable": "Le graphique espace-temps ne peut pas être affiché parce qu'aucun trajet de train ou aucun noeud n'a été sélectionné." + }, + "editor-properties-view-component": { + "settings": "Paramètres", + "color-scheme": "Palette de couleurs", + "theme": "Thème", + "background-color": "Couleur d'arrière-plan", + "set-color-to-white": "Définir la couleur à 'blanc'", + "reset-background-color-to-default": "Réinitialiser la couleur d'arrière-plan par défaut", + "background-color-black": "Couleur d'arrière-plan (noir)", + "editor": "Editeur", + "useDefaultBrowserColorTheme": "Utiliser le thème de couleur par défaut du navigateur", + "defaultBrowserColorTheme": "Thème de couleur par défaut du navigateur", + "travel-time-presetting-default": "Prédétermination du temps de parcours (heuristique)", + "graphicTimetable": "Graphique espace-temps", + "axis-scaling-distance": "Mise à l'échelle de l'axe (distance)", + "standardColorTheme": "Thème de couleur standard", + "specialColorTheme": "Thème de couleur spécial", + "grayscaleColorTheme": "Thème de couleurs en niveaux de gris", + "optimizedPrintColorTheme": "Thème de couleurs optimisé pour l'import/export", + "standardDarkColorTheme": "Thème de couleur standard (sombre)", + "specialDarkColorTheme": "Thème de couleur spécial (sombre)", + "grayscaleDarkColorTheme": "Thème de couleurs en niveaux de gris (sombre)", + "timeScaledDistance": "Temps de trajet mis à l'échelle", + "timeScaledDistanceTooltip": "Les sections graphiques de l'itinéraire sont affichées avec une mise à l'échelle des temps de parcours, c'est-à-dire que l'on suppose que le train sélectionné circule à une vitesse constante.", + "uniformDistance": "Uniforme", + "uniformDistanceTooltip": "Les sections graphiques de l'itinéraire sont affichées de manière uniforme.", + "fixed": "Constante 1min", + "fixedTooltip": "Adopte le temps de parcours avec une constante de 1min (par défaut).", + "retrieveFromEdge": "Temps de parcours de la section", + "retrieveFromEdgeTooltip": "Reprend le temps de parcours maximal sur le même tronçon de tous les trains de la même catégorie, sinon le temps de parcours maximal de tous les trains, sinon 1 min." + }, + "editor-side-view": { + "editor-node-detail-view": { + "base-data": "Données de base", + "operational-point": "Point opérationnel", + "name": "Nom", + "connection-time": "Temps de correspondance", + "occupancy": "Occupation", + "capacity": "Capacité", + "filterable-labels": "Labels filtrables", + "labels": "Labels", + "new-label-placeholder": "Nouveau label...", + "stopping-times": "Temps d'arrêt", + "stopping-time-per-product": "Temps d'arrêt par produit", + "no-stop": "Pas d'arrêt", + "ipv": "IPV", + "a": "A", + "b": "B", + "c": "C", + "d": "D", + "links": "Liens", + "platform-information": "Informations sur les quais", + "platform-length": "Longueur des quais", + "delete-node": "Supprimer le noeud", + "delete": "Supprimer", + "deleteNodeDialog": "Le noeud {$operationalPointShortName} ({$operationalPointName}) doit-il être définitivement supprimé ?" + }, + "editor-tools-view-component": { + "more-functions": "Plus de fonctionnalités", + "export": "Exporter", + "export-netzgrafik-as-svg": "Exporter le réticulaire au format SVG", + "export-as-svg": "Exporter au format SVG", + "export-netzgrafik-as-png": "Exporter le réticulaire au format PNG", + "export-as-png": "Exporter au format PNG", + "print-netzgrafik": "Imprimer le réticulaire", + "print": "Imprimer", + "netzgrafik": "Réticulaire", + "export-netzgrafik": "Exporter le réticulaire", + "export-netzgrafik-as-json": "Exporter le réticulaire au format JSON", + "import-netzgrafik": "Importer le réticulaire", + "import-netzgrafik-error": "Le réticulaire au format JSON n'ont pas pu être importés.", + "import-netzgrafik-as-json": "Importer le réticulaire au format JSON", + "import-netzgrafik-as-json-info-3rd-party": "Réticulaire au format JSON de tiers détectées: heuristique d'importation appliquée.", + "export-trainruns": "Exporter les trajets de train", + "export-trainruns-as-csv": "Exporter les trajets de train au format CSV", + "export-trainruns-as-csv-excel": "Dans Excel : Données -> txt/CSV -> Importer ... nom de fichier", + "export-origin-destination": "Exporter origine-destination", + "export-origin-destination-as-csv": "Exporter origine-destination au format CSV", + "base-data": "Données de base", + "import-base-data": "Importer les données de base", + "help-csv-data": "Aide: CSV - Données", + "export-base-data": "Exporter les données de base", + "bp": "BP", + "station": "Gare", + "category": "Catégorie", + "region": "Région", + "passengerConnectionTimeIPV": "Temps_correspondance_passager_IPV", + "passengerConnectionTimeA": "Temps_correspondance_passager_A", + "passengerConnectionTimeB": "Temps_correspondance_passager_B", + "passengerConnectionTimeC": "Temps_correspondance_passager_C", + "passengerConnectionTimeD": "Temps_correspondance_passager_D", + "ZAZ": "ZAZ", + "transferTime": "Temps_transfert", + "labels": "Labels", + "X": "X", + "Y": "Y", + "create": "Créer", + "yes": "OUI", + "netzgrafikFile": "reticulaire", + "baseDataFile": "baseData", + "trainrunFile": "trains", + "originDestinationFile": "origineDestination", + "trainCategory": "Catégorie du train", + "trainName": "Nom du train", + "startStation": "Gare d'origine", + "destinationStation": "Gare de destination", + "trafficPeriod": "Période de circulation", + "frequence": "Fréquence", + "departureMinuteAtStart": "Minute de départ au noeud de départ", + "travelTimeStartDestination": "Temps de parcours origine-destination", + "arrivalMinuteAtDestination": "Minute d'arrivée au noeud de destination", + "turnaroundTimeDestination": "Durée de retournement à la gare de destination", + "departureMinuteDeparture": "Minute de départ au noeud de destination", + "travelTimeDestinationStart": "Temps de parcours destination-origine", + "arrivalMinuteAtStart": "Minute d'arrivée au noeud d'origine", + "turnaroundTimeStart": "Durée de retournement à la gare d'origine", + "turnaroundTime": "Durée de retournement", + "trainrunTimeCategory": "Catégorie temporelle d'opération", + "origin": "Origine", + "destination": "Destination", + "travelTime": "Temps de parcours", + "transfers": "Changements", + "totalCost": "Coût total" + } + }, + "error-view": { + "error": "Erreur" + }, + "navigation-bar": { + "project-name": "Projet «{$name}»", + "project-name-archived": "Projet «{$name}» (archivé)", + "variant-name": "Variante «{$name}»", + "variant-name-archived": "Variante «{$name}» (archivée)" + }, + "project": { + "project-dialog": { + "create-project": "Créer un projet", + "edit-project": "Editer un projet", + "create": "Créer", + "save": "Sauvegarder", + "cancel": "Annuler", + "project-form": { + "name": "Nom", + "mandatory-field": "Champ obligatoire", + "summary": "Résumé", + "description": "Description", + "tooltip": "Les utilisateurs doivent être saisis avec leur adresse électronique. Confirmez la saisie de chaque e-mail avec « Entrée ».", + "user-with-write-access": "Utilisateur avec accès en écriture", + "new-user-placeholder": "Nouvel utilisateur...", + "invalid-values": "Valeurs invalides (pas d'adresse e-mail)", + "user-with-read-access": "Utilisateur avec accès en lecture" + } + }, + "projects-view": { + "projects": "Projets", + "search-project": "Chercher un projet", + "show-archive": "Afficher les archives", + "archived": "(archivé)", + "archive-project": { + "title": "Archiver un projet", + "content": "Voulez-vous archiver le projet maintenant ?" + }, + "undo-archiving-project": { + "title": "Annuler l'archivage", + "content": "Voulez-vous annuler l'archivage du projet maintenant ?" + }, + "undo-archiving": "Annuler l'archivage", + "edit": "Editer", + "archive": "Archiver" + } + }, + "variant": { + "variant-dialog": { + "create-variant": "Créer une variante", + "edit-variant": "Editer une variante", + "save": "Sauvegarder", + "cancel": "Annuler", + "variant-form": { + "name": "Nom", + "mandatory-field": "Champ obligatoire" + } + }, + "variant-view": { + "variant-history": { + "publish-entry": { + "comment": "Commentaire", + "publish": "Publier", + "local-changes": "Les modifications locales doivent d'abord être sauvegardées", + "discard-changes": "Annuler les modifications" + }, + "released-entry": { + "download": "Télécharger", + "discard-changes": "Annuler les modifications", + "ignore-conflict": "Ignorer les conflits", + "restore": "Restaurer", + "as-new-variant": "En tant que nouvelle variante", + "version-already-available": "Version déjà disponible", + "successfully-published": "Publication réussie" + }, + "version-entry-layout": { + "user-id-copied": "Copié dans le presse-papiers : {$msg}" + }, + "snapshot-entry": { + "download": "Télécharger", + "restore": "Restaurer", + "as-new-variant": "En tant que nouvelle variante", + "successfully-published": "Publication réussie", + "change-snapshot-version": "Changer {$snapshotVersion}" + }, + "new-version-published": { + "title": "Nouvelle version publiée", + "content": "Voulez-vous publier vos modifications personnelles dans une nouvelle version ?" + }, + "discard-changes": { + "title": "Annuler les modifications", + "content": "Voulez-vous annuler définitivement vos modifications personnelles ?" + }, + "restore-version": { + "title": "Restaurer version", + "content": "Voulez-vous restaurer cette version ?" + }, + "ignore-conflict": { + "title": "Ignorer les conflits", + "content": "Voulez-vous que la version actuelle soit basée sur la version publiée la plus récente ?" + } + }, + "archived": "(archivée)", + "edit-variant": "Editer la variante", + "delete-variant": { + "title": "Supprimer la variante", + "content": "Voulez-vous supprimer définitivement la variante et toutes les versions qu'elle contient ? Cette action ne peut pas être annulée." + }, + "versions": "Versions" + }, + "variants-view": { + "archived": "(archivée)", + "variants": "Variantes", + "search-variants": "Rechercher des variantes", + "show-archive": "Afficher les archives", + "project-description": "Description du projet", + "edit-project": "Editer le projet", + "archive-project": { + "title": "Archiver un projet", + "content": "Voulez-vous archiver le projet maintenant ?" + }, + "undo-archiving": "Annuler l'archivage", + "delete-project": { + "title": "Supprimer le projet", + "content": "Voulez-vous supprimer définitivement le projet et toutes les variantes qu'il contient ? Cette action ne peut pas être annulée." + }, + "archive": "Archiver", + "archive-variant": { + "title": "Archiver la variante", + "content": "Souhaitez-vous archiver la variante maintenant ?" + }, + "undo-archiving-variant": { + "title": "Annuler l'archivage", + "content": "Souhaitez-vous annuler l'archivage de la variante ?" + }, + "undo-archiving-project": { + "title": "Archiver la variante", + "content": "Voulez-vous annuler l'archivage du projet ?" + }, + "error-unexpected-data": "Données inattendues : Pas de snapshot ni de version publiée." + } + } + } + }, + "sbbBreadcrumbExpand": "Afficher l'ensemble du chemin", + "sbbDialogCloseDialog": "Fermer la boîte de dialogue", + "sbbFileSelectorUploadFile": "Télécharger le fichier", + "sbbFileSelectorRemoveFile": "Supprimer le fichier", + "sbbHeaderMenuBack": "Retour", + "sbbHeaderOpenMenu": "Ouvrir le menu", + "sbbHeaderCloseMenu": "Fermer le menu", + "sbbSidebarCollapse": "Réduire", + "sbbSidebarExpand": "Agrandir", + "sbbSidebarCloseSidebar": "Fermer la barre latérale", + "sbbSidebarOpenSidebar": "Ouvrir la barre latérale", + "sbbTextareaCounterText": "{$PH} caractères restants", + "sbbUsermenuLogin": "Login", + "sbbUsermenuOpenPanel": "Connecté en tant que {$PH}. Cliquez ou appuyez sur la touche Entrée pour ouvrir le menu utilisateur." +} diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json new file mode 100644 index 00000000..ffcfd7c1 --- /dev/null +++ b/src/assets/i18n/it.json @@ -0,0 +1,656 @@ +{ + "app-routing": { + "module": { + "path": { + "404": "The page you were looking for was not found.", + "401": "You are not authorized, please reload the page.", + "403": "You are not authorized to perform this action.", + "409": "There was a conflict while executing your action, please try again.", + "error": "An error has occurred." + } + } + }, + "app": { + "version": "Version {$version}", + "user-guide": "User guide", + "user-manual": "User manual", + "logout": "Logout", + "login": "You are getting logged in...", + "logger": { + "title": "Title" + }, + "models": { + "node": { + "shortNameDefault": "NEW", + "full-name-default": "New node" + }, + "note": { + "title-default": "Note title", + "text-default": "Note text", + "default-title": "Note title", + "default-text": "Note text" + } + }, + "netzgrafik-application": { + "variants": "Variants", + "filter": "Filter", + "analytics": "Analytics", + "edit": "Edit", + "more-functions": "More functions", + "settings": "Settings" + }, + "perlenkette": { + "perlenkette-node": { + "0-warning-connection": "No incorrect connection", + "1-warning-connection": "1 incorrect connection", + "n-warning-connections": "{$number} incorrect connections", + "0-fitting-connection": "No fitting connection", + "1-fitting-connection": "1 fitting connection", + "n-fitting-connections": "{$number} fitting connections" + }, + "perlenkette-section": { + "propagate-times-upwards": "Propagate times upwards", + "propagate-times-downwards": "Propagate times downwards" + }, + "show-only-closed-locks": "Show only closed locks", + "show-all-locks": "Show all locks" + }, + "services": { + "data": { + "node": { + "transit-modified": { + "title": "Transition changed", + "description": "Times cannot be adjusted, lock found on both sides" + } + }, + "trainrunsection": { + "intermediate-stop-replacement": { + "title": "Intermediate stop replacement", + "description": "Intermediate stop replacement led to inconsistencies in the allocation of times!" + } + } + }, + "ui": { + "newFilter": "New filter" + }, + "util": { + "connection-validator": { + "connection-marked-for-transit": { + "title": "Connection marked for transition!", + "description": "Connection marked for transition!" + } + }, + "trainrun-iteration": { + "error": { + "infinity-loop": "Iterator has detected an infinity loop. The iteration terminated early!" + } + }, + "trainrunsection-validator": { + "broken-symmetry": "Broken symmetry", + "target-arrival-not-reacheable": { + "title": "Target Arrival Warning", + "description": "Target arrival time cannot be reached" + }, + "source-arrival-not-reacheable": { + "title": "Source Arrival Warning", + "description": "Source arrival time cannot be reached" + }, + "travel-time-less-than-1": { + "title": "Travel Time less than 1", + "description": "Travel time must be greater than or equal to 1" + } + }, + "transition-validator": { + "source-arrival-not-reacheable": { + "title": "Source Arrival Warning", + "description": "Source arrival time cannot be reached" + }, + "source-departure-not-reacheable": { + "title": "Source Departure Warning", + "description": "Source departure time cannot be reached" + }, + "target-arrival-not-reacheable": { + "title": "Target Arrival Warning", + "description": "Target arrival time cannot be reached" + }, + "target-departure-not-reacheable": { + "title": "Target Departure Warning", + "description": "Target departure time cannot be reached" + } + } + } + }, + "streckengrafik": { + "components": { + "reset": "Reset", + "close-all-path-nodes": "Close all path nodes", + "open-all-path-nodes": "Open all path nodes", + "show-advanced-display-functions": "Show advanced display functions", + "show-or-hide-time-for-non-selected-trainruns": "Show/hide time for non-selected trainruns", + "show-or-hide": "Enable/disable {$component}", + "show-or-hide-name-for-non-selected-trainruns": "Show/hide trainrun names for unselected trainruns", + "hide-advanced-display-functions": "Hide advanced display functions", + "headway-band": "Headway band", + "time": "Time", + "name": "Name" + } + }, + "utils": { + "navigation-parameters": { + "no-project-id": "No project ID available", + "no-variant-id": "No variant ID available", + "no-version-id": "No version ID available" + } + }, + "view": { + "card-grid": { + "card": { + "open": "Open" + } + }, + "dialogs": { + "confirmation-dialog": { + "confirmation-default": "Yes", + "abort-default": "No" + }, + "filterable-labels-dialog": { + "filterable-label-dialog-component": { + "edit-filterable-labels": "Edit filterable labels for {$element}", + "transfer-to-all-visible": "transfer to all visible", + "delete-from-all-visible": "delete from all visible", + "transfer": { + "title": "Transfer", + "content": "Should the label {$label} be applied on all visible {$element}?" + }, + "delete": { + "title": "Delete", + "content": "Should the label {$label} be definitely delete on all visible {$element}?" + } + }, + "filterable-labels-form": { + "mandatory-field": "Mandatory field" + } + }, + "note-dialog": { + "html-editor": { + "reset-color": "Reset color", + "editor-placeholder": "Enter comment here...", + "mandatory-field": "Mandatory field", + "color-presets": { + "ec": { + "title": "Use color of the color scheme for EC" + }, + "ic": { + "title": "Use color of the color scheme for IC" + }, + "ir": { + "title": "Use color of the color scheme for IR" + }, + "re": { + "title": "Use color of the color scheme for RE" + }, + "s": { + "title": "Use color of the color scheme for S" + }, + "gex": { + "title": "Use color of the color scheme for GEX" + }, + "g": { + "title": "Use color of the color scheme for G" + }, + "green": { + "title": "green" + }, + "blue": { + "title": "blue" + }, + "magenta": { + "title": "magenta" + }, + "red": { + "title": "red" + }, + "warning": { + "title": "warning color" + } + } + }, + "note-tab": "Note", + "filterable-labels-tab": "Filterable labels", + "delete-note": "Delete note", + "note-filter-tab": { + "labels": "Labels", + "label-placeholder": "New label..." + }, + "note-form": { + "title": "Title", + "name": "Name" + } + }, + "stammdaten-dialog": { + "base-data": "Base data", + "operationalPoint": "Operational point", + "ipv-stop-time": "IPV stop time", + "a-stop-time": "A stop time", + "b-stop-time": "B stop time", + "c-stop-time": "C stop time", + "d-stop-time": "D stop time", + "zaz": "ZAZ", + "connection-time": "Connection time", + "region": "Region", + "category": "Category", + "filterable-labels": "Filterable labels", + "position": "Position", + "close": "Close" + }, + "trainrun-and-section-dialog": { + "filterableLabels": "Filterable Labels", + "trainrun-filter-tab": { + "labels": "Labels", + "newLabels" : "New label...", + "trainrunDuplicate": "Duplicate trainrun", + "trainrunDelete": "Delete trainrun", + "delete": "Delete", + "deleteConfirmationQuestion": "Should the entire train route be definitively deleted?" + }, + "trainrun-tab": { + "tabName": "Name", + "category": "Category", + "frequency": "Frequency", + "verkehrt": "Operates", + "trainrunDuplicate": "Duplicate trainrun", + "trainrunDelete": "Delete trainrun", + "delete": "Delete", + "deleteConfirmationQuestion": "Should the entire train route be definitively deleted?" + }, + "trainrun-section-tab": { + "warningTwoLocks": "Warning: Too many times are locked!", + "propagateTimesToLeft": "Propagate times to the left", + "propagateTimesToRight": "Propagate times to the right" + } + } + }, + "editor-edit-tools-view-component": { + "edit": "Edit", + "filterable-labels": "Filterable labels", + "trainruns": "Trainruns", + "nodes": "Nodes", + "notes": "Notes", + "delete-netzgrafik-title": "Netzgrafik - Delete", + "non-visible-elements": "Non visible elements", + "delete-all-non-visible-elements-tooltip": "Delete all non-visible elements, such as nodes, trainruns and notes", + "delete-all-non-visible-elements": "Delete all non-visible elements", + "visible-elements": "Visible elements", + "delete-all-visible-trainruns-tooltip": "Delete all visible trainruns", + "delete-all-visible-trainruns": "Delete all visible trainruns", + "delete-all-visible-notes-tooltip": "Delete all visible notes", + "delete-all-visible-notes": "Delete all visible notes", + "delete-all-visible-elements-tooltip": "Delete all visible elements, such as nodes, trainruns and notes", + "delete-all-visible-elements": "Delete all visible elements", + "merge-netzgrafik-title": "Netzgrafik - Merge", + "add-netzgrafik-as-copy-tooltip": "Add netzgrafik as a copy (trainruns, nodes, notes)", + "add-netzgrafik-as-copy": "Add netzgrafik as a copy", + "merge-netzgrafik-tooltip": "Merge netzgrafik (trainruns, nodes, notes)", + "merge-netzgrafik": "Merge netzgrafik", + "delete": "Delete", + "on-clear-delete-all-non-visible-elements": "Should all non-visible elements be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-elements": "Should all visible elements be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-trainruns": "Should all visible trainruns be permanently deleted from the netzgrafik?", + "on-clear-delete-all-visible-notes": "Should all visible notes be permanently deleted from the netzgrafik?", + "label-drop-list": { + "no-labels-available": "No labels available", + "delete-group": "Delete group", + "add-new-group": "Add new group", + "trainruns": "Trainruns", + "notes": "Notes", + "nodes": "Nodes" + } + }, + "editor-filter-view": { + "filter": "Filter", + "general": "General", + "category": "Category", + "frequency": "Frequence", + "time-category": "Time category", + "display-all-trainruns": "Display all trainruns", + "reset-trainrun-filter": "Reset trainrun filter", + "filterable-labels-trainruns": "Filterable labels: Trainruns", + "filterable-labels-nodes": "Filterable labels: Nodes", + "filterable-labels-notes": "Filterable labels: Notes", + "display": "Display", + "times": "Times", + "decimal-displayed": "Number of decimal place displayed", + "display-arrival-departure-times": "Display departure and arrival times", + "display-arrival-departure-times-for-connections": "Display departure and arrival times for connections", + "display-travel-times": "Display travel times", + "display-trainrun-name": "Display trainrun name", + "connections": "Connections", + "display-connections": "Display connections", + "nodes": "Nodes", + "display-nodes-without-visible-trainruns": "Display nodes without (visible) trainruns", + "display-nodes-with-only-stopping-trainruns": "Display nodes with only stopping trainruns", + "notes": "Notes", + "display-notes": "Display notes", + "reset-display-filter": "Reset display filter", + "saved-filters": "Saved filters", + "save-filters": "Save filters and add them as filter settings", + "reset-all-display-filters": "Reset all display filters", + "load-filter": "Load {$filter}", + "reload-filter": "Reload {$filter}", + "show-trainrun-category": "Show {$trainrunCategory}", + "hide-trainrun-category": "Hide {$trainrunCategory}", + "show-trainrun-time-category": "Show {$trainrunTimeCategory}", + "hide-trainrun-time-category": "Hide {$trainrunTimeCategory}", + "show-trainrun-frequency": "Show {$trainrunFrequency}", + "hide-trainrun-frequency": "Hide {$trainrunFrequency}", + "filterable-label-filter": { + "no-labels-available": "No labels available", + "or": "Or", + "and": "And", + "show-all": "Show all", + "reset-filter": "Reset filter", + "show": "show", + "hide": "hide" + } + }, + "editor-menu": { + "save-changes": "Save changes", + "changes-saved": "Changes saved", + "read-mode": "Read mode", + "show-hide-filter": "Show/Hide filter", + "zoom-out": "Zoom out", + "zoom-in": "Zoom in", + "topology-editor-disabled": "Topology editor disabled", + "topology-editor-enabled": "Topology editor enabled", + "multiple-selection-tool-disabled": "Multiple selection tool is disabled", + "multiple-selection-tool-enabled": "Multiple selection tool is enabled", + "note-editor-disabled": "Note editor disabled", + "note-editor-enabled": "Note editor enabled", + "analytics-disabled": "Analytics disabled", + "analytics-enabled": "Analytics enabled", + "displayGraphicTimetable": "Display graphic timetable", + "closeGraphicTimetable": "Close graphic timetable", + "errorGraphicTimetable": "Graphic timetable cannot be displayed because no trainrun or no nodes have been selected." + }, + "editor-properties-view-component": { + "settings": "Settings", + "color-scheme": "Color scheme", + "theme": "Theme", + "background-color": "Background color", + "set-color-to-white": "Set color to 'white'", + "reset-background-color-to-default": "Reset background color to default", + "background-color-black": "Background color (black)", + "editor": "Editor", + "useDefaultBrowserColorTheme": "Use the default browser color theme.", + "defaultBrowserColorTheme": "Default browser color theme", + "travel-time-presetting-default": "Travel time presetting (heuristics)", + "graphicTimetable": "Graphic timetable", + "axis-scaling-distance": "Axis scaling (distance)", + "standardColorTheme": "Standard color theme", + "specialColorTheme": "Special color theme", + "grayscaleColorTheme": "Grayscale color theme", + "optimizedPrintColorTheme": "Optimized color theme for printing/exporting", + "standardDarkColorTheme": "Standard color theme (dark)", + "specialDarkColorTheme": "Special color theme (dark)", + "grayscaleDarkColorTheme": "Grayscale color theme (dark)", + "timeScaledDistance": "Travel time scaled", + "timeScaledDistanceTooltip": "The route graphic sections are displayed with travel time scaling, i.e. it is assumed that the selected train travels at a constant speed.", + "uniformDistance": "Uniform", + "uniformDistanceTooltip": "The route graphic sections are uniformly displayed.", + "fixed": "Constant 1min", + "fixedTooltip": "Adopts the travel time with a constant 1min (default).", + "retrieveFromEdge": "Section travel time", + "retrieveFromEdgeTooltip": "Takes over the max. travel time on the same section of all trains of the same category, otherwise max. travel time of all trains, otherwise 1 min." + }, + "editor-side-view": { + "editor-node-detail-view": { + "base-data": "Base data", + "operational-point": "Operational point", + "name": "Name", + "connection-time": "Connection time", + "occupancy": "Occupancy", + "capacity": "Capacity", + "filterable-labels": "Filterable labels", + "labels": "Labels", + "new-label-placeholder": "New label...", + "stopping-times": "Stopping times", + "stopping-time-per-product": "Stopping time per product", + "no-stop": "No stop", + "ipv": "IPV", + "a": "A", + "b": "B", + "c": "C", + "d": "D", + "links": "Links", + "platform-information": "Platform information", + "platform-length": "Platform length", + "delete-node": "Delete node", + "delete": "Delete", + "deleteNodeDialog": "Should the node {$operationalPointShortName} ({$operationalPointName}) be definitely deleted?" + }, + "editor-tools-view-component": { + "more-functions": "More functions", + "export": "Export", + "export-netzgrafik-as-svg": "Export netzgrafik as SVG", + "export-as-svg": "Export as SVG", + "export-netzgrafik-as-png": "Export netzgrafik as PNG", + "export-as-png": "Export as PNG", + "print-netzgrafik": "Print netzgrafik", + "print": "Print", + "netzgrafik": "Netzgrafik", + "export-netzgrafik": "Export netzgrafik", + "import-netzgrafik-error": "Netzgrafik could not be imported.", + "export-netzgrafik-as-json": "Export netzgrafik as JSON", + "import-netzgrafik": "Import netzgrafik", + "import-netzgrafik-as-json": "Import netzgrafik as JSON", + "import-netzgrafik-as-json-info-3rd-party": "Third-party JSON data detected: Import heuristic applied.", + "export-trainruns": "Export trainruns", + "export-trainruns-as-csv": "Export trainruns as CSV", + "export-trainruns-as-csv-excel": "In Excel: Data -> From Text/CSV -> Import ... filename", + "export-origin-destination": "Export origin-destination", + "export-origin-destination-as-csv": "Export origin-destination as CSV", + "base-data": "Base data", + "import-base-data": "Import base data", + "help-csv-data": "Help: CSV - Data", + "export-base-data": "Export base data", + "bp": "BP", + "station": "Station", + "category": "Category", + "region": "Region", + "passengerConnectionTimeIPV": "Passenger_connection_time_IPV", + "passengerConnectionTimeA": "Passenger_connection_time_A", + "passengerConnectionTimeB": "Passenger_connection_time_B", + "passengerConnectionTimeC": "Passenger_connection_time_C", + "passengerConnectionTimeD": "Passenger_connection_time_D", + "ZAZ": "ZAZ", + "transferTime": "Transfer_time", + "labels": "Labels", + "X": "X", + "Y": "Y", + "create": "Create", + "yes": "YES", + "netzgrafikFile": "networkGraphic", + "baseDataFile": "baseData", + "trainrunFile": "trainrun", + "originDestinationFile": "originDestination", + "trainCategory": "Train category", + "trainName": "Train name", + "startStation": "Start station", + "destinationStation": "Destination station", + "trafficPeriod": "Traffic period", + "frequence": "Frequence", + "departureMinuteAtStart": "Minute of departure at start node", + "travelTimeStartDestination": "Travel time start-destination", + "arrivalMinuteAtDestination": "Arrival minute at destination node", + "turnaroundTimeDestination": "Turnaround time at destination station", + "departureMinuteDeparture": "Departure minute at destination node", + "travelTimeDestinationStart": "Travel time destination-start", + "arrivalMinuteAtStart": "Arrival minute at start node", + "turnaroundTimeStart": "Turnaround time at start station", + "turnaroundTime": "Turnaround time", + "trainrunTimeCategory": "Trainrun time category", + "origin": "Origine", + "destination": "Destinazione", + "travelTime": "Tempo di viaggio", + "transfers": "Cambiamenti", + "totalCost": "Costo totale" + } + }, + "error-view": { + "error": "Error" + }, + "navigation-bar": { + "project-name": "Project «{$name}»", + "project-name-archived": "Project «{$name}» (archived)", + "variant-name": "Variant «{$name}»", + "variant-name-archived": "Variant «{$name}» (archived)" + }, + "project": { + "project-dialog": { + "create-project": "Create project", + "edit-project": "Edit project", + "create": "Create", + "save": "Save", + "cancel": "Cancel", + "project-form": { + "name": "Name", + "mandatory-field": "Mandatory field", + "summary": "Summary", + "description": "Description", + "tooltip": "Users must be entered with their e-mail address. Confirm the entry for each e-mail with 'Enter'.", + "user-with-write-access": "User with write access", + "new-user-placeholder": "New user...", + "invalid-values": "Invalid values (no e-mail address)", + "user-with-read-access": "User with read access" + } + }, + "projects-view": { + "projects": "Projects", + "search-project": "Search project", + "show-archive": "Show archive", + "archived": "(archived)", + "archive-project": { + "title": "Archive project", + "content": "Would you like to archive the project now?" + }, + "undo-archiving-project": { + "title": "Undo archiving", + "content": "Would you like to undo the archiving the project now?" + }, + "undo-archiving": "Undo archiving", + "edit": "Edit", + "archive": "Archive" + } + }, + "variant": { + "variant-dialog": { + "create-variant": "Create variant", + "edit-variant": "Edit variant", + "save": "Save", + "cancel": "Cancel", + "variant-form": { + "name": "Name", + "mandatory-field": "Mandatory field" + } + }, + "variant-view": { + "variant-history": { + "publish-entry": { + "comment": "Comment", + "publish": "Publish", + "local-changes": "Local changes must be saved first", + "discard-changes": "Discard changes" + }, + "released-entry": { + "download": "Download", + "discard-changes": "Discard changes", + "ignore-conflict": "Ignore conflict", + "restore": "Restore", + "as-new-variant": "As new variant", + "version-already-available": "Version already available", + "successfully-published": "Successfully published" + }, + "version-entry-layout": { + "user-id-copied": "Copied to clipboard: {$msg}" + }, + "snapshot-entry": { + "download": "Download", + "restore": "Restore", + "as-new-variant": "As new variant", + "successfully-published": "Successfully published", + "change-snapshot-version": "Change {$snapshotVersion}" + }, + "new-version-published": { + "title": "New version published", + "content": "Would you like to publish your personal changes as a new version?" + }, + "discard-changes": { + "title": "Discard changes", + "content": "Would you like to irrevocably discard your personal changes?" + }, + "restore-version": { + "title": "Restore version", + "content": "Would you like to restore the status of this version?" + }, + "ignore-conflict": { + "title": "Ignore conflict", + "content": "Would you like the current version to be based on the highest published version?" + } + }, + "archived": "(archived)", + "edit-variant": "Edit variant", + "delete-variant": { + "title": "Delete variant", + "content": "Do you want to permanently delete the variant and all versions it contains? This action cannot be undone." + }, + "versions": "Versions" + }, + "variants-view": { + "archived": "(archived)", + "variants": "Variants", + "search-variants": "Search variants", + "show-archive": "Show archive", + "project-description": "Project description", + "edit-project": "Edit project", + "archive-project": { + "title": "Archive project", + "content": "Would you like to archive the project now?" + }, + "undo-archiving": "Undo archiving", + "delete-project": { + "title": "Delete projekt", + "content": "Do you want to permanently delete the project and all the variants it contains? This action cannot be undone." + }, + "archive": "Archive", + "archive-variant": { + "title": "Archive variant", + "content": "Would you like to archive the variant now?" + }, + "undo-archiving-variant": { + "title": "Undo archiving", + "content": "Would you like to undo the archiving of the variant?" + }, + "undo-archiving-project": { + "title": "Archive variant", + "content": "Would you like to undo the archiving of the project?" + }, + "error-unexpected-data": "Unexpected data: No snapshot and no released version." + } + } + } + }, + "sbbBreadcrumbExpand": "Show entire path", + "sbbDialogCloseDialog": "Close dialog", + "sbbFileSelectorUploadFile": "Upload file", + "sbbFileSelectorRemoveFile": "Remove file", + "sbbHeaderMenuBack": "Back", + "sbbHeaderOpenMenu": "Open Menu", + "sbbHeaderCloseMenu": "Close Menu", + "sbbSidebarCollapse": "Collapse", + "sbbSidebarExpand": "Expand", + "sbbSidebarCloseSidebar": "Close Sidebar", + "sbbSidebarOpenSidebar": "Open Sidebar", + "sbbTextareaCounterText": "{$PH} characters remaining", + "sbbUsermenuLogin": "Login", + "sbbUsermenuOpenPanel": "Logged in as {$PH}. Click or press enter to open user menu." +} diff --git a/src/environments/environment.model.ts b/src/environments/environment.model.ts index 389bda6b..0ec0626d 100644 --- a/src/environments/environment.model.ts +++ b/src/environments/environment.model.ts @@ -2,7 +2,10 @@ import {AuthConfig} from "angular-oauth2-oidc"; export interface Environment { production: boolean; - label: string; - backendUrl: string; - authConfig: AuthConfig; + label?: string; + backendUrl?: string; + authConfig?: AuthConfig; + disableBackend: boolean; + customElement: boolean; + standalonedemo: boolean; } diff --git a/src/environments/environment.standalone.ts b/src/environments/environment.standalone.ts new file mode 100644 index 00000000..27de6a4e --- /dev/null +++ b/src/environments/environment.standalone.ts @@ -0,0 +1,8 @@ +import {Environment} from "./environment.model"; + +export const environment: Environment = { + production: true, + disableBackend: true, + customElement: true, + standalonedemo: false, +}; diff --git a/src/environments/environment.standalonedemo.ts b/src/environments/environment.standalonedemo.ts new file mode 100644 index 00000000..30183cc8 --- /dev/null +++ b/src/environments/environment.standalonedemo.ts @@ -0,0 +1,8 @@ +import {Environment} from "./environment.model"; + +export const environment: Environment = { + production: true, + disableBackend: true, + customElement: true, + standalonedemo: true, +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 25898aab..a2001543 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -23,6 +23,9 @@ export const environment: Environment = { label: "local", backendUrl: "http://localhost:8080", authConfig, + disableBackend: false, + customElement: false, + standalonedemo: false, }; /* diff --git a/src/i18n/messages.de-CH.xlf b/src/i18n/messages.de-CH.xlf deleted file mode 100644 index 5142e472..00000000 --- a/src/i18n/messages.de-CH.xlf +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - Einträge Einträge - - node_modules/@sbb-esta/angular-public/lib/tabs/tabs/tabs.component.d.ts - 26 - - Aria label for amount of entries displayed in badge pill - - Kalender öffnenKalender öffnen - - node_modules/@sbb-esta/angular-public/lib/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts - 4 - - Open calendar - - Zum letzten Monat wechselnZum letzten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 10 - - Button label to switch to the previous month - - Zum nächsten Monat wechselnZum nächsten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 28 - - Button label to switch to the next month - - Zum letzten Jahr wechselnZum letzten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 42 - - Button label to switch to the previous year - - Zum nächsten Jahr wechselnZum nächsten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 60 - - Button label to switch to the next year - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 37 - - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 22 - - - Weniger anzeigenWeniger anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 14 - - Button label for showing less - - Mehr anzeigenMehr anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 20 - - Button label for showing more - - Resultate verfügbar Resultate verfügbar - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 7 - - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 41 - - Aria label for amount of results displayed in badge pill - - AlleAlle - - node_modules/@sbb-esta/angular-public/lib/tag/tags/tags.component.d.ts - 4 - - Label for 'All' tag - - Datei hochladenDatei hochladen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 17 - - Button label to select files for upload - - Datei entfernenDatei entfernen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 48 - - Hidden button label to remove a file from the selection list - - - Login - - Login - - - node_modules/@sbb-esta/angular-public/lib/usermenu/usermenu/usermenu.component.d.ts - 54 - - Button label for login - - Hinweismeldung schliessenHinweismeldung schliessen - - node_modules/@sbb-esta/angular-public/lib/ghettobox/ghettobox/ghettobox.component.d.ts - 44 - - Hidden button label to close the ghettobox - - This is the template from ESTA Cloud for building Angular applications. - Dies ist das Template von ESTA Cloud für das erstellen von Angular Applications. - - src/app/app.component.html6 - This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it. - Diese Applikation benutzt die Angular Component Library von ESTA (@sbb-esta/angular-public). Siehe Dokumentation, wie sie zu verwenden ist. - - src/app/app.component.html - 8 - - - - - diff --git a/src/i18n/messages.en-CH.xlf b/src/i18n/messages.en-CH.xlf deleted file mode 100644 index fb8068c0..00000000 --- a/src/i18n/messages.en-CH.xlf +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Einträge Einträge - - node_modules/@sbb-esta/angular-public/lib/tabs/tabs/tabs.component.d.ts - 26 - - Aria label for amount of entries displayed in badge pill - - Kalender öffnenKalender öffnen - - node_modules/@sbb-esta/angular-public/lib/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts - 4 - - Open calendar - - Zum letzten Monat wechselnZum letzten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 10 - - Button label to switch to the previous month - - Zum nächsten Monat wechselnZum nächsten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 28 - - Button label to switch to the next month - - Zum letzten Jahr wechselnZum letzten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 42 - - Button label to switch to the previous year - - Zum nächsten Jahr wechselnZum nächsten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 60 - - Button label to switch to the next year - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 37 - - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 22 - - - Weniger anzeigenWeniger anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 14 - - Button label for showing less - - Mehr anzeigenMehr anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 20 - - Button label for showing more - - Resultate verfügbar Resultate verfügbar - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 7 - - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 41 - - Aria label for amount of results displayed in badge pill - - AlleAlle - - node_modules/@sbb-esta/angular-public/lib/tag/tags/tags.component.d.ts - 4 - - Label for 'All' tag - - Datei hochladenDatei hochladen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 17 - - Button label to select files for upload - - Datei entfernenDatei entfernen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 48 - - Hidden button label to remove a file from the selection list - - - Login - - Login - - - node_modules/@sbb-esta/angular-public/lib/usermenu/usermenu/usermenu.component.d.ts - 54 - - Button label for login - - Hinweismeldung schliessenHinweismeldung schliessen - - node_modules/@sbb-esta/angular-public/lib/ghettobox/ghettobox/ghettobox.component.d.ts - 44 - - Hidden button label to close the ghettobox - - This is the template from ESTA Cloud for building Angular applications.This is the template from ESTA Cloud for building Angular applications. - - src/app/app.component.html6 - This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it.This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it. - - src/app/app.component.html - 8 - - - - - diff --git a/src/i18n/messages.fr-CH.xlf b/src/i18n/messages.fr-CH.xlf deleted file mode 100644 index 9c1fb17f..00000000 --- a/src/i18n/messages.fr-CH.xlf +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Einträge Einträge - - node_modules/@sbb-esta/angular-public/lib/tabs/tabs/tabs.component.d.ts - 26 - - Aria label for amount of entries displayed in badge pill - - Kalender öffnenKalender öffnen - - node_modules/@sbb-esta/angular-public/lib/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts - 4 - - Open calendar - - Zum letzten Monat wechselnZum letzten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 10 - - Button label to switch to the previous month - - Zum nächsten Monat wechselnZum nächsten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 28 - - Button label to switch to the next month - - Zum letzten Jahr wechselnZum letzten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 42 - - Button label to switch to the previous year - - Zum nächsten Jahr wechselnZum nächsten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 60 - - Button label to switch to the next year - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 37 - - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 22 - - - Weniger anzeigenWeniger anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 14 - - Button label for showing less - - Mehr anzeigenMehr anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 20 - - Button label for showing more - - Resultate verfügbar Resultate verfügbar - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 7 - - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 41 - - Aria label for amount of results displayed in badge pill - - AlleAlle - - node_modules/@sbb-esta/angular-public/lib/tag/tags/tags.component.d.ts - 4 - - Label for 'All' tag - - Datei hochladenDatei hochladen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 17 - - Button label to select files for upload - - Datei entfernenDatei entfernen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 48 - - Hidden button label to remove a file from the selection list - - - Login - - Login - - - node_modules/@sbb-esta/angular-public/lib/usermenu/usermenu/usermenu.component.d.ts - 54 - - Button label for login - - Hinweismeldung schliessenHinweismeldung schliessen - - node_modules/@sbb-esta/angular-public/lib/ghettobox/ghettobox/ghettobox.component.d.ts - 44 - - Hidden button label to close the ghettobox - - This is the template from ESTA Cloud for building Angular applications.This is the template from ESTA Cloud for building Angular applications. - - src/app/app.component.html6 - This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it.This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it. - - src/app/app.component.html - 8 - - - - - diff --git a/src/i18n/messages.it-CH.xlf b/src/i18n/messages.it-CH.xlf deleted file mode 100644 index 254f4e9b..00000000 --- a/src/i18n/messages.it-CH.xlf +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Einträge Einträge - - node_modules/@sbb-esta/angular-public/lib/tabs/tabs/tabs.component.d.ts - 26 - - Aria label for amount of entries displayed in badge pill - - Kalender öffnenKalender öffnen - - node_modules/@sbb-esta/angular-public/lib/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts - 4 - - Open calendar - - Zum letzten Monat wechselnZum letzten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 10 - - Button label to switch to the previous month - - Zum nächsten Monat wechselnZum nächsten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 28 - - Button label to switch to the next month - - Zum letzten Jahr wechselnZum letzten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 42 - - Button label to switch to the previous year - - Zum nächsten Jahr wechselnZum nächsten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 60 - - Button label to switch to the next year - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 37 - - - Vorherige SeiteVorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 6 - - - Nächste SeiteNächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 22 - - - Weniger anzeigenWeniger anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 14 - - Button label for showing less - - Mehr anzeigenMehr anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 20 - - Button label for showing more - - Resultate verfügbar Resultate verfügbar - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 7 - - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 41 - - Aria label for amount of results displayed in badge pill - - AlleAlle - - node_modules/@sbb-esta/angular-public/lib/tag/tags/tags.component.d.ts - 4 - - Label for 'All' tag - - Datei hochladenDatei hochladen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 17 - - Button label to select files for upload - - Datei entfernenDatei entfernen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 48 - - Hidden button label to remove a file from the selection list - - - Login - - Login - - - node_modules/@sbb-esta/angular-public/lib/usermenu/usermenu/usermenu.component.d.ts - 54 - - Button label for login - - Hinweismeldung schliessenHinweismeldung schliessen - - node_modules/@sbb-esta/angular-public/lib/ghettobox/ghettobox/ghettobox.component.d.ts - 44 - - Hidden button label to close the ghettobox - - This is the template from ESTA Cloud for building Angular applications.This is the template from ESTA Cloud for building Angular applications. - - src/app/app.component.html6 - This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it.This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it. - - src/app/app.component.html - 8 - - - - - diff --git a/src/i18n/messages.xlf b/src/i18n/messages.xlf deleted file mode 100644 index fbdcfc1e..00000000 --- a/src/i18n/messages.xlf +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - Einträge - - node_modules/@sbb-esta/angular-public/lib/tabs/tabs/tabs.component.d.ts - 26 - - Aria label for amount of entries displayed in badge pill - - - Kalender öffnen - - node_modules/@sbb-esta/angular-public/lib/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts - 4 - - Open calendar - - - Zum letzten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 10 - - Button label to switch to the previous month - - - Zum nächsten Monat wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 28 - - Button label to switch to the next month - - - Zum letzten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 42 - - Button label to switch to the previous year - - - Zum nächsten Jahr wechseln - - node_modules/@sbb-esta/angular-public/lib/datepicker/calendar/calendar.component.d.ts - 60 - - Button label to switch to the next year - - - Vorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 6 - - - - Nächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/pagination/pagination.component.d.ts - 37 - - - - Vorherige Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 6 - - - - Nächste Seite - - node_modules/@sbb-esta/angular-public/lib/pagination/navigation/navigation.component.d.ts - 22 - - - - Weniger anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 14 - - Button label for showing less - - - Mehr anzeigen - - node_modules/@sbb-esta/angular-public/lib/textexpand/textexpand/textexpand.component.d.ts - 20 - - Button label for showing more - - - Resultate verfügbar - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 7 - - - node_modules/@sbb-esta/angular-public/lib/tag/tag/tag.component.d.ts - 41 - - Aria label for amount of results displayed in badge pill - - - Alle - - node_modules/@sbb-esta/angular-public/lib/tag/tags/tags.component.d.ts - 4 - - Label for 'All' tag - - - Datei hochladen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 17 - - Button label to select files for upload - - - Datei entfernen - - node_modules/@sbb-esta/angular-public/lib/file-selector/file-selector/file-selector.component.d.ts - 48 - - Hidden button label to remove a file from the selection list - - - - Login - - - node_modules/@sbb-esta/angular-public/lib/usermenu/usermenu/usermenu.component.d.ts - 54 - - Button label for login - - - Hinweismeldung schliessen - - node_modules/@sbb-esta/angular-public/lib/ghettobox/ghettobox/ghettobox.component.d.ts - 44 - - Hidden button label to close the ghettobox - - - This is the template from ESTA Cloud for building Angular applications. - - src/app/app.component.html - 6 - - - - This app uses the Angular Component Library from ESTA (@sbb-esta/angular-public). See documentation on how to use it. - - src/app/app.component.html - 8 - - - - - diff --git a/src/index.html b/src/index.html index 6d7eadc0..d5d69fdc 100644 --- a/src/index.html +++ b/src/index.html @@ -1,5 +1,5 @@ - + Netzgrafik-Editor diff --git a/src/integration-testing/netzgrafik.unit.test.reconnec.trainrunsectionst.ts b/src/integration-testing/netzgrafik.unit.test.reconnec.trainrunsectionst.ts index 457b1bac..bda20da2 100644 --- a/src/integration-testing/netzgrafik.unit.test.reconnec.trainrunsectionst.ts +++ b/src/integration-testing/netzgrafik.unit.test.reconnec.trainrunsectionst.ts @@ -696,6 +696,11 @@ export class NetzgrafikUnitTestingReconnectTrainrunSection { }, ], metadata: { + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + } + }, trainrunCategories: [ { id: 0, diff --git a/src/integration-testing/netzgrafik.unit.testing.od.matrix.ts b/src/integration-testing/netzgrafik.unit.testing.od.matrix.ts new file mode 100644 index 00000000..1018d0e4 --- /dev/null +++ b/src/integration-testing/netzgrafik.unit.testing.od.matrix.ts @@ -0,0 +1,1520 @@ +import { + HaltezeitFachCategories, + LinePatternRefs, + NetzgrafikDto, +} from "../app/data-structures/business.data.structures"; + +export class NetzgrafikUnitTestingOdMatrix { + static getUnitTestNetzgrafik(): NetzgrafikDto { + return { + nodes: [ + { + id: 11, + betriebspunktName: "C", + fullName: "Neuer Knoten", + positionX: 1536, + positionY: 864, + ports: [ + { + id: 14, + trainrunSectionId: 7, + positionIndex: 0, + positionAlignment: 2, + }, + { + id: 20, + trainrunSectionId: 10, + positionIndex: 1, + positionAlignment: 2, + }, + { + id: 15, + trainrunSectionId: 8, + positionIndex: 2, + positionAlignment: 2, + }, + { + id: 21, + trainrunSectionId: 11, + positionIndex: 3, + positionAlignment: 2, + }, + ], + transitions: [ + { + id: 4, + port1Id: 20, + port2Id: 21, + isNonStopTransit: true, + }, + ], + connections: [], + resourceId: 12, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 12, + betriebspunktName: "A", + fullName: "Neuer Knoten", + positionX: 1120, + positionY: 672, + ports: [ + { + id: 17, + trainrunSectionId: 9, + positionIndex: 0, + positionAlignment: 1, + }, + { + id: 12, + trainrunSectionId: 6, + positionIndex: 0, + positionAlignment: 2, + }, + { + id: 13, + trainrunSectionId: 7, + positionIndex: 0, + positionAlignment: 3, + }, + { + id: 19, + trainrunSectionId: 10, + positionIndex: 1, + positionAlignment: 3, + }, + ], + transitions: [ + { + id: 3, + port1Id: 12, + port2Id: 13, + isNonStopTransit: false, + }, + ], + connections: [], + resourceId: 13, + perronkanten: 5, + connectionTime: 8, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 13, + betriebspunktName: "D", + fullName: "Neuer Knoten", + positionX: 1088, + positionY: 1088, + ports: [ + { + id: 18, + trainrunSectionId: 9, + positionIndex: 0, + positionAlignment: 0, + }, + { + id: 22, + trainrunSectionId: 11, + positionIndex: 0, + positionAlignment: 3, + }, + ], + transitions: [], + connections: [], + resourceId: 14, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 14, + betriebspunktName: "B", + fullName: "Neuer Knoten", + positionX: 800, + positionY: 864, + ports: [ + { + id: 11, + trainrunSectionId: 6, + positionIndex: 0, + positionAlignment: 3, + }, + { + id: 16, + trainrunSectionId: 8, + positionIndex: 1, + positionAlignment: 3, + }, + ], + transitions: [], + connections: [], + resourceId: 15, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 15, + betriebspunktName: "E", + fullName: "New node", + positionX: 1472, + positionY: 1248, + ports: [ + { + id: 24, + trainrunSectionId: 12, + positionIndex: 0, + positionAlignment: 3, + }, + ], + transitions: [], + connections: [], + resourceId: 16, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 16, + betriebspunktName: "F", + fullName: "New node", + positionX: 1696, + positionY: 1248, + ports: [ + { + id: 23, + trainrunSectionId: 12, + positionIndex: 0, + positionAlignment: 2, + }, + { + id: 25, + trainrunSectionId: 13, + positionIndex: 0, + positionAlignment: 3, + }, + ], + transitions: [ + { + id: 5, + port1Id: 23, + port2Id: 25, + isNonStopTransit: false, + }, + ], + connections: [], + resourceId: 17, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + { + id: 17, + betriebspunktName: "G", + fullName: "New node", + positionX: 1920, + positionY: 1248, + ports: [ + { + id: 26, + trainrunSectionId: 13, + positionIndex: 0, + positionAlignment: 2, + }, + ], + transitions: [], + connections: [], + resourceId: 18, + perronkanten: 5, + connectionTime: 3, + trainrunCategoryHaltezeiten: { + HaltezeitIPV: { + haltezeit: 3, + no_halt: false, + }, + HaltezeitA: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitB: { + haltezeit: 2, + no_halt: false, + }, + HaltezeitC: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitD: { + haltezeit: 1, + no_halt: false, + }, + HaltezeitUncategorized: { + haltezeit: 0, + no_halt: true, + }, + }, + symmetryAxis: null, + warnings: null, + labelIds: [], + }, + ], + trainrunSections: [ + { + id: 6, + sourceNodeId: 14, + sourcePortId: 11, + targetNodeId: 12, + targetPortId: 12, + travelTime: { + time: 2, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 0, + consecutiveTime: 0, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 0, + consecutiveTime: 60, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 58, + consecutiveTime: 58, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 2, + consecutiveTime: 2, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 4, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 898, + y: 880, + }, + { + x: 962, + y: 880, + }, + { + x: 1054, + y: 688, + }, + { + x: 1118, + y: 688, + }, + ], + textPositions: { + "0": { + x: 916, + y: 892, + }, + "1": { + x: 944, + y: 868, + }, + "2": { + x: 1100, + y: 676, + }, + "3": { + x: 1072, + y: 700, + }, + "4": { + x: 1008, + y: 772, + }, + "5": { + x: 1008, + y: 772, + }, + "6": { + x: 1008, + y: 796, + }, + }, + }, + warnings: null, + }, + { + id: 7, + sourceNodeId: 12, + sourcePortId: 13, + targetNodeId: 11, + targetPortId: 14, + travelTime: { + time: 4, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 3, + consecutiveTime: 3, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 57, + consecutiveTime: 57, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 53, + consecutiveTime: 53, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 7, + consecutiveTime: 7, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 4, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1218, + y: 688, + }, + { + x: 1282, + y: 688, + }, + { + x: 1470, + y: 880, + }, + { + x: 1534, + y: 880, + }, + ], + textPositions: { + "0": { + x: 1236, + y: 700, + }, + "1": { + x: 1264, + y: 676, + }, + "2": { + x: 1516, + y: 868, + }, + "3": { + x: 1488, + y: 892, + }, + "4": { + x: 1376, + y: 772, + }, + "5": { + x: 1376, + y: 772, + }, + "6": { + x: 1376, + y: 796, + }, + }, + }, + warnings: null, + }, + { + id: 8, + sourceNodeId: 11, + sourcePortId: 15, + targetNodeId: 14, + targetPortId: 16, + travelTime: { + time: 6, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 0, + consecutiveTime: 60, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 0, + consecutiveTime: 60, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 54, + consecutiveTime: 54, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 6, + consecutiveTime: 66, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 5, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1534, + y: 944, + }, + { + x: 1470, + y: 944, + }, + { + x: 962, + y: 912, + }, + { + x: 898, + y: 912, + }, + ], + textPositions: { + "0": { + x: 1516, + y: 932, + }, + "1": { + x: 1488, + y: 956, + }, + "2": { + x: 916, + y: 924, + }, + "3": { + x: 944, + y: 900, + }, + "4": { + x: 1216, + y: 916, + }, + "5": { + x: 1216, + y: 916, + }, + "6": { + x: 1216, + y: 940, + }, + }, + }, + warnings: null, + }, + { + id: 9, + sourceNodeId: 12, + sourcePortId: 17, + targetNodeId: 13, + targetPortId: 18, + travelTime: { + time: 2, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 8, + consecutiveTime: 8, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 52, + consecutiveTime: 52, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 50, + consecutiveTime: 50, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 10, + consecutiveTime: 10, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 6, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1136, + y: 766, + }, + { + x: 1136, + y: 830, + }, + { + x: 1104, + y: 1022, + }, + { + x: 1104, + y: 1086, + }, + ], + textPositions: { + "0": { + x: 1124, + y: 784, + }, + "1": { + x: 1148, + y: 812, + }, + "2": { + x: 1116, + y: 1068, + }, + "3": { + x: 1092, + y: 1040, + }, + "4": { + x: 1108, + y: 926, + }, + "5": { + x: 1108, + y: 926, + }, + "6": { + x: 1132, + y: 926, + }, + }, + }, + warnings: null, + }, + { + id: 10, + sourceNodeId: 12, + sourcePortId: 19, + targetNodeId: 11, + targetPortId: 20, + travelTime: { + time: 5, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 0, + consecutiveTime: 0, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 0, + consecutiveTime: 60, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 55, + consecutiveTime: 55, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 5, + consecutiveTime: 5, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 7, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1218, + y: 720, + }, + { + x: 1282, + y: 720, + }, + { + x: 1470, + y: 912, + }, + { + x: 1534, + y: 912, + }, + ], + textPositions: { + "0": { + x: 1236, + y: 732, + }, + "1": { + x: 1264, + y: 708, + }, + "2": { + x: 1516, + y: 900, + }, + "3": { + x: 1488, + y: 924, + }, + "4": { + x: 1376, + y: 804, + }, + "5": { + x: 1376, + y: 804, + }, + "6": { + x: 1376, + y: 828, + }, + }, + }, + warnings: null, + }, + { + id: 11, + sourceNodeId: 11, + sourcePortId: 21, + targetNodeId: 13, + targetPortId: 22, + travelTime: { + time: 4, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 5, + consecutiveTime: 5, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 55, + consecutiveTime: 55, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 51, + consecutiveTime: 51, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 9, + consecutiveTime: 9, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 7, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1534, + y: 976, + }, + { + x: 1470, + y: 976, + }, + { + x: 1250, + y: 1104, + }, + { + x: 1186, + y: 1104, + }, + ], + textPositions: { + "0": { + x: 1516, + y: 964, + }, + "1": { + x: 1488, + y: 988, + }, + "2": { + x: 1204, + y: 1116, + }, + "3": { + x: 1232, + y: 1092, + }, + "4": { + x: 1360, + y: 1028, + }, + "5": { + x: 1360, + y: 1028, + }, + "6": { + x: 1360, + y: 1052, + }, + }, + }, + warnings: null, + }, + { + id: 12, + sourceNodeId: 16, + sourcePortId: 23, + targetNodeId: 15, + targetPortId: 24, + travelTime: { + time: 1, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 0, + consecutiveTime: 120, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 0, + consecutiveTime: 60, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 59, + consecutiveTime: 59, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 1, + consecutiveTime: 121, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 8, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1694, + y: 1264, + }, + { + x: 1630, + y: 1264, + }, + { + x: 1634, + y: 1264, + }, + { + x: 1570, + y: 1264, + }, + ], + textPositions: { + "0": { + x: 1676, + y: 1252, + }, + "1": { + x: 1648, + y: 1276, + }, + "2": { + x: 1588, + y: 1276, + }, + "3": { + x: 1616, + y: 1252, + }, + "4": { + x: 1632, + y: 1252, + }, + "5": { + x: 1632, + y: 1252, + }, + "6": { + x: 1632, + y: 1276, + }, + }, + }, + warnings: null, + }, + { + id: 13, + sourceNodeId: 16, + sourcePortId: 25, + targetNodeId: 17, + targetPortId: 26, + travelTime: { + time: 1, + consecutiveTime: 1, + lock: true, + warning: null, + timeFormatter: null, + }, + sourceDeparture: { + time: 2, + consecutiveTime: 62, + lock: false, + warning: null, + timeFormatter: null, + }, + sourceArrival: { + time: 58, + consecutiveTime: 118, + lock: false, + warning: null, + timeFormatter: null, + }, + targetDeparture: { + time: 57, + consecutiveTime: 117, + lock: false, + warning: null, + timeFormatter: null, + }, + targetArrival: { + time: 3, + consecutiveTime: 63, + lock: false, + warning: null, + timeFormatter: null, + }, + numberOfStops: 0, + trainrunId: 8, + resourceId: 0, + specificTrainrunSectionFrequencyId: null, + path: { + path: [ + { + x: 1794, + y: 1264, + }, + { + x: 1858, + y: 1264, + }, + { + x: 1854, + y: 1264, + }, + { + x: 1918, + y: 1264, + }, + ], + textPositions: { + "0": { + x: 1812, + y: 1276, + }, + "1": { + x: 1840, + y: 1252, + }, + "2": { + x: 1900, + y: 1252, + }, + "3": { + x: 1872, + y: 1276, + }, + "4": { + x: 1856, + y: 1252, + }, + "5": { + x: 1856, + y: 1252, + }, + "6": { + x: 1856, + y: 1276, + }, + }, + }, + warnings: null, + }, + ], + trainruns: [ + { + id: 4, + name: "1", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [], + }, + { + id: 5, + name: "2", + categoryId: 3, + frequencyId: 2, + trainrunTimeCategoryId: 0, + labelIds: [], + }, + { + id: 6, + name: "4", + categoryId: 6, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [], + }, + { + id: 7, + name: "3", + categoryId: 5, + frequencyId: 0, + trainrunTimeCategoryId: 0, + labelIds: [], + }, + { + id: 8, + name: "X", + categoryId: 1, + frequencyId: 3, + trainrunTimeCategoryId: 0, + labelIds: [], + }, + ], + resources: [ + { + id: 1, + capacity: 2, + }, + { + id: 2, + capacity: 2, + }, + { + id: 3, + capacity: 2, + }, + { + id: 4, + capacity: 2, + }, + { + id: 5, + capacity: 2, + }, + { + id: 6, + capacity: 2, + }, + { + id: 7, + capacity: 2, + }, + { + id: 8, + capacity: 2, + }, + { + id: 9, + capacity: 2, + }, + { + id: 10, + capacity: 2, + }, + { + id: 11, + capacity: 2, + }, + { + id: 12, + capacity: 2, + }, + { + id: 13, + capacity: 2, + }, + { + id: 14, + capacity: 2, + }, + { + id: 15, + capacity: 2, + }, + { + id: 16, + capacity: 2, + }, + { + id: 17, + capacity: 2, + }, + { + id: 18, + capacity: 2, + }, + ], + metadata: { + trainrunCategories: [ + { + id: 0, + order: 0, + shortName: "EC", + name: "International", + colorRef: "EC", + fachCategory: HaltezeitFachCategories.IPV, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, + { + id: 1, + order: 1, + shortName: "IC", + name: "InterCity", + colorRef: "IC", + fachCategory: HaltezeitFachCategories.A, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, + { + id: 2, + order: 2, + shortName: "IR", + name: "InterRegio", + colorRef: "IR", + fachCategory: HaltezeitFachCategories.B, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, + { + id: 3, + order: 3, + shortName: "RE", + name: "RegioExpress", + colorRef: "RE", + fachCategory: HaltezeitFachCategories.C, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, + { + id: 4, + order: 4, + shortName: "S", + name: "RegioUndSBahnverkehr", + colorRef: "S", + fachCategory: HaltezeitFachCategories.D, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 2, + nodeHeadwayNonStop: 2, + sectionHeadway: 2, + }, + { + id: 5, + order: 5, + shortName: "GEX", + name: "GüterExpress", + colorRef: "GEX", + fachCategory: HaltezeitFachCategories.Uncategorized, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 3, + nodeHeadwayNonStop: 3, + sectionHeadway: 3, + }, + { + id: 6, + order: 6, + shortName: "G", + name: "Güterverkehr", + colorRef: "G", + fachCategory: HaltezeitFachCategories.Uncategorized, + minimalTurnaroundTime: 4, + nodeHeadwayStop: 3, + nodeHeadwayNonStop: 3, + sectionHeadway: 3, + }, + ], + trainrunFrequencies: [ + { + id: 0, + order: 0, + frequency: 15, + offset: 0, + shortName: "15", + name: "verkehrt viertelstündlich", + linePatternRef: LinePatternRefs.Freq15, + }, + { + id: 1, + order: 0, + frequency: 20, + offset: 0, + shortName: "20", + name: "verkehrt im 20 Minuten Takt", + linePatternRef: LinePatternRefs.Freq20, + }, + { + id: 2, + order: 0, + frequency: 30, + offset: 0, + shortName: "30", + name: "verkehrt halbstündlich", + linePatternRef: LinePatternRefs.Freq30, + }, + { + id: 3, + order: 0, + frequency: 60, + offset: 0, + shortName: "60", + name: "verkehrt stündlich", + linePatternRef: LinePatternRefs.Freq60, + }, + { + id: 4, + order: 0, + frequency: 120, + offset: 0, + shortName: "120", + name: "verkehrt zweistündlich (gerade)", + linePatternRef: LinePatternRefs.Freq120, + }, + { + id: 5, + order: 0, + frequency: 120, + offset: 60, + shortName: "120+", + name: "verkehrt zweistündlich (ungerade)", + linePatternRef: LinePatternRefs.Freq120, + }, + ], + trainrunTimeCategories: [ + { + id: 0, + order: 0, + shortName: "7/24", + name: "verkehrt uneingeschränkt", + dayTimeInterval: [], + weekday: [1, 2, 3, 4, 5, 6, 7], + linePatternRef: LinePatternRefs.TimeCat7_24, + }, + { + id: 1, + order: 0, + shortName: "HVZ", + name: "verkehrt zur Hauptverkehrszeit", + dayTimeInterval: [ + { + from: 360, + to: 420, + }, + { + from: 960, + to: 1140, + }, + ], + weekday: [1, 2, 3, 4, 5, 6, 7], + linePatternRef: LinePatternRefs.TimeCatHVZ, + }, + { + id: 2, + order: 0, + shortName: "zeitweise", + name: "verkehrt zeitweise", + dayTimeInterval: [], + weekday: [], + linePatternRef: LinePatternRefs.TimeZeitweise, + }, + ], + netzgrafikColors: [], + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + }, + }, + }, + freeFloatingTexts: [], + labels: [], + labelGroups: [], + filterData: { + filterSettings: [], + }, + }; + } +} diff --git a/src/integration-testing/netzgrafik.unit.testing.transition.ts b/src/integration-testing/netzgrafik.unit.testing.transition.ts index 43b14e33..77bf831e 100644 --- a/src/integration-testing/netzgrafik.unit.testing.transition.ts +++ b/src/integration-testing/netzgrafik.unit.testing.transition.ts @@ -1126,6 +1126,11 @@ export class NetzgrafikUnitTestingTransition { }, ], metadata: { + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + } + }, trainrunCategories: [ { id: 0, diff --git a/src/integration-testing/netzgrafik.unit.testing.ts b/src/integration-testing/netzgrafik.unit.testing.ts index c1f00685..bfef3c89 100644 --- a/src/integration-testing/netzgrafik.unit.testing.ts +++ b/src/integration-testing/netzgrafik.unit.testing.ts @@ -820,6 +820,11 @@ export class NetzgrafikUnitTesting { ], resources: [], metadata: { + analyticsSettings: { + originDestinationSettings: { + connectionPenalty: 5, + } + }, trainrunCategories: [ { id: 0, diff --git a/src/integration-testing/node.service.test.spec.ts b/src/integration-testing/node.service.test.spec.ts index 1f4292c6..869d865b 100644 --- a/src/integration-testing/node.service.test.spec.ts +++ b/src/integration-testing/node.service.test.spec.ts @@ -88,6 +88,8 @@ describe("NodeService Test", () => { const netzgrafik = NetzgrafikUnitTesting.getUnitTestNetzgrafik(); dataService.loadNetzgrafikDto(netzgrafik); expect(nodes.length).toBe(5); + expect(nodeService.getVisibleNodes().length).toBe(5); + expect(nodeService.getSelectedNodes().length).toBe(0); nodeService.setDataService(dataService); const node = netzgrafik.nodes.pop(); node.resourceId = null; @@ -95,6 +97,8 @@ describe("NodeService Test", () => { netzgrafik.nodes.push(node); nodeService.setNodeData(netzgrafik.nodes); expect(nodes.length).toBe(netzgrafik.nodes.length); + expect(nodeService.getVisibleNodes().length).toBe(netzgrafik.nodes.length); + expect(nodeService.getSelectedNodes().length).toBe(0); nodes.forEach((n) => { expect(n.getResourceId() !== null).toBe(true); }); @@ -215,11 +219,13 @@ describe("NodeService Test", () => { NetzgrafikUnitTesting.getUnitTestNetzgrafik(), ); expect(nodes.length).toBe(5); + expect(nodeService.getVisibleNodes().length).toBe(5); expect(trainrunSections.length).toBe(8); nodeService.deleteAllNonVisibleNodes(); expect(nodes.length).toBe(5); + expect(nodeService.getVisibleNodes().length).toBe(5); expect(trainrunSections.length).toBe(8); }); @@ -228,12 +234,15 @@ describe("NodeService Test", () => { NetzgrafikUnitTesting.getUnitTestNetzgrafik(), ); expect(nodes.length).toBe(5); + expect(nodeService.getVisibleNodes().length).toBe(5); expect(trainrunSections.length).toBe(8); filterService.setFilterNodeLabels([3]); + expect(nodeService.getVisibleNodes().length).toBe(4); nodeService.deleteAllNonVisibleNodes(); expect(nodes.length).toBe(4); + expect(nodeService.getVisibleNodes().length).toBe(4); expect(trainrunSections.length).toBe(6); }); @@ -358,6 +367,108 @@ describe("NodeService Test", () => { expect(trainrunSection4.getNumberOfStops()).toBe(1); }); + it("undock transition time lock test (-1-)", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingTransition.getUnitTestTransitionNetzgrafik(), + ); + expect(nodes.length).toBe(4); + expect(trainrunSections.length).toBe(8); + + const nodeOL = nodeService.getNodeFromId(1); + const transition1 = nodeOL.getTransitionFromId(1); + + expect(transition1.getDto().id).toBe(1); + const port1 = nodeOL.getPort(transition1.getPortId1()); + const port2 = nodeOL.getPort(transition1.getPortId2()); + const ts1 = port1.getTrainrunSection(); + const ts2 = port2.getTrainrunSection(); + ts1.setSourceDepartureLock(true); + ts1.setSourceArrivalLock(true); + ts2.setTargetDepartureLock(true); + ts2.setTargetArrivalLock(true); + nodeService.undockTransition(1, 1); + const updatedTrainrunSection = ts1; + expect(updatedTrainrunSection.getSourceArrivalLock()).toBe(true); + expect(updatedTrainrunSection.getTargetArrivalLock()).toBe(true); + }); + + it("undock transition time lock test (-2-)", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingTransition.getUnitTestTransitionNetzgrafik(), + ); + expect(nodes.length).toBe(4); + expect(trainrunSections.length).toBe(8); + + const nodeOL = nodeService.getNodeFromId(1); + const transition1 = nodeOL.getTransitionFromId(1); + + expect(transition1.getDto().id).toBe(1); + const port1 = nodeOL.getPort(transition1.getPortId1()); + const port2 = nodeOL.getPort(transition1.getPortId2()); + const ts1 = port1.getTrainrunSection(); + const ts2 = port2.getTrainrunSection(); + ts1.setSourceDepartureLock(false); + ts1.setSourceArrivalLock(false); + ts2.setTargetDepartureLock(true); + ts2.setTargetArrivalLock(true); + + nodeService.undockTransition(1, 1); + const updatedTrainrunSection = ts1; + expect(updatedTrainrunSection.getSourceDepartureLock()).toBe(false); + expect(updatedTrainrunSection.getTargetDepartureLock()).toBe(true); + }); + + it("undock transition time lock test (-3-)", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingTransition.getUnitTestTransitionNetzgrafik(), + ); + expect(nodes.length).toBe(4); + expect(trainrunSections.length).toBe(8); + + const nodeOL = nodeService.getNodeFromId(1); + const transition1 = nodeOL.getTransitionFromId(1); + + expect(transition1.getDto().id).toBe(1); + const port1 = nodeOL.getPort(transition1.getPortId1()); + const port2 = nodeOL.getPort(transition1.getPortId2()); + const ts1 = port1.getTrainrunSection(); + const ts2 = port2.getTrainrunSection(); + ts1.setSourceDepartureLock(true); + ts1.setSourceArrivalLock(true); + ts2.setTargetDepartureLock(false); + ts2.setTargetArrivalLock(false); + nodeService.undockTransition(1, 1); + const updatedTrainrunSection = ts1; + expect(updatedTrainrunSection.getSourceDepartureLock()).toBe(true); + expect(updatedTrainrunSection.getTargetDepartureLock()).toBe(false); + }); + + it("undock transition time lock test (-4-)", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingTransition.getUnitTestTransitionNetzgrafik(), + ); + expect(nodes.length).toBe(4); + expect(trainrunSections.length).toBe(8); + + const nodeOL = nodeService.getNodeFromId(1); + const transition1 = nodeOL.getTransitionFromId(1); + + expect(transition1.getDto().id).toBe(1); + const port1 = nodeOL.getPort(transition1.getPortId1()); + const port2 = nodeOL.getPort(transition1.getPortId2()); + const ts1 = port1.getTrainrunSection(); + const ts2 = port2.getTrainrunSection(); + ts1.setSourceDepartureLock(false); + ts1.setSourceArrivalLock(false); + ts2.setTargetDepartureLock(false); + ts2.setTargetArrivalLock(false); + + nodeService.undockTransition(1, 1); + const updatedTrainrunSection = ts1; + expect(updatedTrainrunSection.getSourceDepartureLock()).toBe(false); + expect(updatedTrainrunSection.getTargetDepartureLock()).toBe(false); + }); + it("undock transition - redock Intermediate stop test <1>", () => { dataService.loadNetzgrafikDto( NetzgrafikUnitTestingTransition.getUnitTestTransitionNetzgrafik(), @@ -686,6 +797,7 @@ describe("NodeService Test", () => { } n.setPosition(n.getId() * 32, n.getId() * 32); }); + expect(nodeService.getSelectedNodes().length).toBe(3); nodeService.moveSelectedNodes(-63, 132, 32, false); @@ -701,6 +813,7 @@ describe("NodeService Test", () => { nodeService.unselectAllNodes(); expect(nodeService.getSelectedNode()).toBe(null); + expect(nodeService.getSelectedNodes().length).toBe(0); }); it("select single node as selected test", () => { @@ -722,6 +835,7 @@ describe("NodeService Test", () => { nodeService.setSingleNodeAsSelected(ids[2]); expect(nodeService.getSelectedNode().getId()).toBe(ids[2]); + expect(nodeService.getSelectedNodes().length).toBe(1); nodeService.getNodes().forEach((n: Node) => { if (n.getId() === ids[2]) { @@ -735,6 +849,7 @@ describe("NodeService Test", () => { expect(n.selected()).toBe(false); expect(nodeService.isNodeSelected(n.getId())).toBe(false); }); + expect(nodeService.getSelectedNodes().length).toBe(0); }); it("unselect all nodes test", () => { @@ -759,5 +874,6 @@ describe("NodeService Test", () => { expect(n.selected()).toBe(false); expect(nodeService.isNodeSelected(n.getId())).toBe(false); }); + expect(nodeService.getSelectedNodes().length).toBe(0); }); }); diff --git a/src/integration-testing/origin.destination.csv.test.spec.ts b/src/integration-testing/origin.destination.csv.test.spec.ts new file mode 100644 index 00000000..e02e3a71 --- /dev/null +++ b/src/integration-testing/origin.destination.csv.test.spec.ts @@ -0,0 +1,291 @@ +import {LogPublishersService} from "src/app/logger/log.publishers.service"; +import {LogService} from "src/app/logger/log.service"; +import {DataService} from "src/app/services/data/data.service"; +import {LabelService} from "src/app/services/data/label.serivce"; +import {LabelGroupService} from "src/app/services/data/labelgroup.service"; +import {NetzgrafikColoringService} from "src/app/services/data/netzgrafikColoring.service"; +import {NodeService} from "src/app/services/data/node.service"; +import {NoteService} from "src/app/services/data/note.service"; +import {ResourceService} from "src/app/services/data/resource.service"; +import {StammdatenService} from "src/app/services/data/stammdaten.service"; +import {TrainrunService} from "src/app/services/data/trainrun.service"; +import {TrainrunSectionService} from "src/app/services/data/trainrunsection.service"; +import {FilterService} from "src/app/services/ui/filter.service"; +import { + buildEdges, + computeNeighbors, + computeShortestPaths, + Edge, + topoSort, + Vertex, +} from "src/app/view/util/origin-destination-graph"; +import {NetzgrafikUnitTestingOdMatrix} from "./netzgrafik.unit.testing.od.matrix"; + +describe("Origin Destination CSV Test", () => { + let dataService: DataService = null; + let resourceService: ResourceService = null; + let nodeService: NodeService = null; + let logService: LogService = null; + let logPublishersService: LogPublishersService = null; + let trainrunService: TrainrunService = null; + let labelService: LabelService = null; + let labelGroupService: LabelGroupService = null; + let filterService: FilterService = null; + let trainrunSectionService: TrainrunSectionService = null; + let stammdatenService: StammdatenService = null; + let noteService: NoteService = null; + let netzgrafikColoringService: NetzgrafikColoringService = null; + + beforeEach(() => { + resourceService = new ResourceService(); + logPublishersService = new LogPublishersService(); + logService = new LogService(logPublishersService); + labelGroupService = new LabelGroupService(logService); + labelService = new LabelService(logService, labelGroupService); + filterService = new FilterService(labelService, labelGroupService); + trainrunService = new TrainrunService( + logService, + labelService, + filterService, + ); + trainrunSectionService = new TrainrunSectionService( + logService, + trainrunService, + filterService, + ); + nodeService = new NodeService( + logService, + resourceService, + trainrunService, + trainrunSectionService, + labelService, + filterService, + ); + stammdatenService = new StammdatenService(); + noteService = new NoteService(logService, labelService, filterService); + netzgrafikColoringService = new NetzgrafikColoringService(logService); + dataService = new DataService( + resourceService, + nodeService, + trainrunSectionService, + trainrunService, + stammdatenService, + noteService, + labelService, + labelGroupService, + filterService, + netzgrafikColoringService, + ); + }); + + it("integration test", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingOdMatrix.getUnitTestNetzgrafik(), + ); + const nodes = nodeService.getNodes(); + const trainruns = trainrunService.getTrainruns(); + const connectionPenalty = 5; + const timeLimit = 60 * 10; + + const start = new Date().getTime(); + const edges = buildEdges( + nodes, + nodes, + trainruns, + connectionPenalty, + trainrunService, + timeLimit, + ); + + const neighbors = computeNeighbors(edges); + const vertices = topoSort(neighbors); + + const res = new Map(); + nodes.forEach((origin) => { + computeShortestPaths(origin.getId(), neighbors, vertices).forEach( + (value, key) => { + res.set([origin.getId(), key].join(","), value); + }, + ); + }); + const end = new Date().getTime(); + + // See https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/199 + expect(res).toEqual( + new Map([ + ["11,13", [22, 1]], + ["11,14", [6, 0]], + ["11,12", [4, 0]], + ["12,13", [2, 0]], + ["12,14", [2, 0]], + ["12,11", [4, 0]], + ["13,14", [29, 1]], + ["13,11", [22, 1]], + ["13,12", [2, 0]], + ["14,13", [29, 1]], + ["14,11", [6, 0]], + ["14,12", [2, 0]], + // Making sure we traverse E <- F -> G correctly. + ["15,17", [4, 0]], + ["15,16", [1, 0]], + ["16,15", [1, 0]], + ["16,17", [1, 0]], + ["17,15", [4, 0]], + ["17,16", [1, 0]], + ]), + ); + // This should be reasonably fast, likely less than 10ms. + expect(end - start).toBeLessThan(100); + }); + + it("integration test with selected nodes", () => { + dataService.loadNetzgrafikDto( + NetzgrafikUnitTestingOdMatrix.getUnitTestNetzgrafik(), + ); + nodeService.selectNode(13); + nodeService.selectNode(14); + const nodes = nodeService.getNodes(); + const odNodes = nodeService.getSelectedNodes(); + const trainruns = trainrunService.getTrainruns(); + const connectionPenalty = 5; + const timeLimit = 60 * 10; + + const edges = buildEdges( + nodes, + odNodes, + trainruns, + connectionPenalty, + trainrunService, + timeLimit, + ); + + const neighbors = computeNeighbors(edges); + const vertices = topoSort(neighbors); + + const res = new Map(); + nodes.forEach((origin) => { + computeShortestPaths(origin.getId(), neighbors, vertices).forEach( + (value, key) => { + res.set([origin.getId(), key].join(","), value); + }, + ); + }); + + // See https://github.com/SchweizerischeBundesbahnen/netzgrafik-editor-frontend/issues/199 + expect(res).toEqual( + new Map([ + ["13,14", [29, 1]], + ["14,13", [29, 1]], + ]), + ); + }); + + it("simple path unit test", () => { + const v1 = new Vertex(0, true); + const v2 = new Vertex(0, true, 0, 0); + const v3 = new Vertex(1, false, 15, 0); + const v4 = new Vertex(1, false); + const e1 = new Edge(v1, v2, 0); + const e2 = new Edge(v2, v3, 15); + const e3 = new Edge(v3, v4, 0); + const edges = [e1, e2, e3]; + + const neighbors = computeNeighbors(edges); + + // v4 has no outgoing edges. + expect(neighbors).toHaveSize(3); + expect(neighbors.get(JSON.stringify(v1))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v1))).toContain([v2, 0]); + expect(neighbors.get(JSON.stringify(v2))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v2))).toContain([v3, 15]); + expect(neighbors.get(JSON.stringify(v3))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v3))).toContain([v4, 0]); + + const topoVertices = topoSort(neighbors); + + expect(topoVertices).toHaveSize(4); + edges.forEach((edge) => { + const v1Index = topoVertices.findIndex((value, index, obj) => { + return value === edge.v1; + }); + const v2Index = topoVertices.findIndex((value, index, obj) => { + return value === edge.v2; + }); + expect(v1Index).toBeLessThan(v2Index); + }); + + const distances0 = computeShortestPaths(0, neighbors, topoVertices); + + expect(distances0).toHaveSize(1); + expect(distances0.get(1)).toEqual([15, 0]); + }); + + it("connection unit test", () => { + // trainrun 0 + const v1 = new Vertex(0, true); + const v2 = new Vertex(0, true, 0, 0); + const v3 = new Vertex(1, false, 15, 0); + const v4 = new Vertex(1, true, 16, 0); + const v5 = new Vertex(2, false, 30, 0); + const v6 = new Vertex(2, false); + const e1 = new Edge(v1, v2, 0); + const e2 = new Edge(v2, v3, 15); + const e3 = new Edge(v3, v4, 1); + const e4 = new Edge(v4, v5, 14); + const e5 = new Edge(v5, v6, 0); + // trainrun 1 + const v7 = new Vertex(3, true); + const v8 = new Vertex(3, true, 0, 1); + const v9 = new Vertex(1, false, 10, 1); + const e6 = new Edge(v7, v8, 0); + const e7 = new Edge(v8, v9, 10); + // connection + const e8 = new Edge(v9, v4, 6 + 5); + // convenience + const v10 = new Vertex(1, false); + const e9 = new Edge(v3, v10, 0); + const e10 = new Edge(v9, v10, 0); + const v11 = new Vertex(1, true); + const e11 = new Edge(v11, v4, 0); + const edges = [e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11]; + + const neighbors = computeNeighbors(edges); + expect(neighbors).toHaveSize(9); + expect(neighbors.get(JSON.stringify(v1))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v2))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v3))).toHaveSize(2); + expect(neighbors.get(JSON.stringify(v4))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v5))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v7))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v8))).toHaveSize(1); + expect(neighbors.get(JSON.stringify(v9))).toHaveSize(2); + expect(neighbors.get(JSON.stringify(v11))).toHaveSize(1); + + const topoVertices = topoSort(neighbors); + expect(topoVertices).toHaveSize(11); + edges.forEach((edge) => { + const v1Index = topoVertices.findIndex((value, index, obj) => { + return value === edge.v1; + }); + const v2Index = topoVertices.findIndex((value, index, obj) => { + return value === edge.v2; + }); + expect(v1Index).toBeLessThan(v2Index); + }); + + const distances0 = computeShortestPaths(0, neighbors, topoVertices); + expect(distances0).toHaveSize(2); + expect(distances0.get(1)).toEqual([15, 0]); + expect(distances0.get(2)).toEqual([30, 0]); + + const distances1 = computeShortestPaths(1, neighbors, topoVertices); + expect(distances1).toHaveSize(1); + expect(distances1.get(2)).toEqual([14, 0]); + + const distances3 = computeShortestPaths(3, neighbors, topoVertices); + expect(distances3).toHaveSize(2); + expect(distances3.get(1)).toEqual([10, 0]); + // connection + expect(distances3.get(2)).toEqual([30 + 5, 1]); + }); +});