diff --git a/.gitignore b/.gitignore index a4e6b621f..0af2c504b 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,7 @@ examples/cloud-operations/adfs/ansible/vars/vars.yaml examples/cloud-operations/adfs/ansible/gssh.sh examples/cloud-operations/multi-cluster-mesh-gke-fleet-api/ansible/vars.yaml examples/cloud-operations/multi-cluster-mesh-gke-fleet-api/ansible/gssh.sh -blueprints/cloud-operations/network-dashboard/cloud-function.zip +blueprints/cloud-operations/network-quota-monitoring/cloud-function.zip blueprints/apigee/bigquery-analytics/bundle-export.zip blueprints/apigee/bigquery-analytics/bundle-gcs2bq.zip blueprints/apigee/bigquery-analytics/apiproxy.zip diff --git a/blueprints/README.md b/blueprints/README.md index b9851bde9..5d5a5d02a 100644 --- a/blueprints/README.md +++ b/blueprints/README.md @@ -5,11 +5,11 @@ This section provides **[networking blueprints](./networking/)** that implement Currently available blueprints: - **apigee** - [Apigee Hybrid on GKE](./apigee/hybrid-gke/), [Apigee X analytics in BigQuery](./apigee/bigquery-analytics), [Apigee network patterns](./apigee/network-patterns/) -- **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Networking Dashboard](./cloud-operations/network-dashboard), [Managing on-prem service account keys by uploading public keys](./cloud-operations/onprem-sa-key-management), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation) +- **cloud operations** - [Active Directory Federation Services](./cloud-operations/adfs), [Cloud Asset Inventory feeds for resource change tracking and remediation](./cloud-operations/asset-inventory-feed-remediation), [Fine-grained Cloud DNS IAM via Service Directory](./cloud-operations/dns-fine-grained-iam), [Cloud DNS & Shared VPC design](./cloud-operations/dns-shared-vpc), [Delegated Role Grants](./cloud-operations/iam-delegated-role-grants), [Network Quota Monitoring](./cloud-operations/network-quota-monitoring), [Managing on-prem service account keys by uploading public keys](./cloud-operations/onprem-sa-key-management), [Compute Image builder with Hashicorp Packer](./cloud-operations/packer-image-builder), [Packer example](./cloud-operations/packer-image-builder/packer), [Compute Engine quota monitoring](./cloud-operations/compute-quota-monitoring), [Scheduled Cloud Asset Inventory Export to Bigquery](./cloud-operations/scheduled-asset-inventory-export-bq), [Configuring workload identity federation with Terraform Cloud/Enterprise workflows](./cloud-operations/terraform-cloud-dynamic-credentials), [TCP healthcheck and restart for unmanaged GCE instances](./cloud-operations/unmanaged-instances-healthcheck), [Migrate for Compute Engine (v5) blueprints](./cloud-operations/vm-migration), [Configuring workload identity federation to access Google Cloud resources from apps running on Azure](./cloud-operations/workload-identity-federation) - **data solutions** - [GCE and GCS CMEK via centralized Cloud KMS](./data-solutions/cmek-via-centralized-kms), [Cloud Composer version 2 private instance, supporting Shared VPC and external CMEK key](./data-solutions/composer-2), [Cloud SQL instance with multi-region read replicas](./data-solutions/cloudsql-multiregion), [Data Platform](./data-solutions/data-platform-foundations), [Minimal Data Platform](./data-solutions/data-platform-minimal), [Spinning up a foundation data pipeline on Google Cloud using Cloud Storage, Dataflow and BigQuery](./data-solutions/gcs-to-bq-with-least-privileges), [#SQL Server Always On Groups blueprint](./data-solutions/sqlserver-alwayson), [Data Playground](./data-solutions/data-playground), [MLOps with Vertex AI](./data-solutions/vertex-mlops), [Shielded Folder](./data-solutions/shielded-folder), [BigQuery ML and Vertex AI Pipeline](./data-solutions/bq-ml) - **factories** - [The why and the how of Resource Factories](./factories), [Google Cloud Identity Group Factory](./factories/cloud-identity-group-factory), [Google Cloud BQ Factory](./factories/bigquery-factory), [Google Cloud VPC Firewall Factory](./factories/net-vpc-firewall-yaml), [Minimal Project Factory](./factories/project-factory) - **GKE** - [Binary Authorization Pipeline Blueprint](./gke/binauthz), [Storage API](./gke/binauthz/image), [Multi-cluster mesh on GKE (fleet API)](./gke/multi-cluster-mesh-gke-fleet-api), [GKE Multitenant Blueprint](./gke/multitenant-fleet), [Shared VPC with GKE support](./networking/shared-vpc-gke/), [GKE Autopilot](./gke/autopilot) -- **networking** - [Calling a private Cloud Function from On-premises](./networking/private-cloud-function-from-onprem), [Decentralized firewall management](./networking/decentralized-firewall), [Decentralized firewall validator](./networking/decentralized-firewall/validator), [HA VPN over Interconnect](./networking/ha-vpn-over-interconnect/), [GLB and multi-regional daisy-chaining through hybrid NEGs](./networking/glb-hybrid-neg-internal), [Hybrid connectivity to on-premise services through PSC](./networking/psc-hybrid), [HTTP Load Balancer with Cloud Armor](./networking/glb-and-armor), [Hub and Spoke via VPN](./networking/hub-and-spoke-vpn), [Hub and Spoke via VPC Peering](./networking/hub-and-spoke-peering), [Internal Load Balancer as Next Hop](./networking/ilb-next-hop), On-prem DNS and Google Private Access, [PSC Producer](./networking/psc-hybrid/psc-producer), [PSC Consumer](./networking/psc-hybrid/psc-consumer), [Shared VPC with optional GKE cluster](./networking/shared-vpc-gke) +- **networking** - [Calling a private Cloud Function from On-premises](./networking/private-cloud-function-from-onprem), [Decentralized firewall management](./networking/decentralized-firewall), [Decentralized firewall validator](./networking/decentralized-firewall/validator), [HA VPN over Interconnect](./networking/ha-vpn-over-interconnect/), [GLB and multi-regional daisy-chaining through hybrid NEGs](./networking/glb-hybrid-neg-internal), [Hybrid connectivity to on-premise services through PSC](./networking/psc-hybrid), [HTTP Load Balancer with Cloud Armor](./networking/glb-and-armor), [Hub and Spoke via VPN](./networking/hub-and-spoke-vpn), [Hub and Spoke via VPC Peering](./networking/hub-and-spoke-peering), [Internal Load Balancer as Next Hop](./networking/ilb-next-hop), On-prem DNS and Google Private Access, [PSC Producer](./networking/psc-hybrid/psc-producer), [PSC Consumer](./networking/psc-hybrid/psc-consumer), [Shared VPC with optional GKE cluster](./networking/shared-vpc-gke), [VPC Connectivity Lab](./networking/vpc-connectivity-lab/) - **serverless** - [Cloud Run series](./serverless/cloud-run-explore) - **third party solutions** - [OpenShift on GCP user-provisioned infrastructure](./third-party-solutions/openshift), [Wordpress deployment on Cloud Run](./third-party-solutions/wordpress/cloudrun) diff --git a/blueprints/cloud-operations/README.md b/blueprints/cloud-operations/README.md index 99013624e..9ee59b99b 100644 --- a/blueprints/cloud-operations/README.md +++ b/blueprints/cloud-operations/README.md @@ -16,6 +16,12 @@ The blueprint's feed tracks changes to Google Compute instances, and the Cloud F
+## Compute Engine quota monitoring + + This [blueprint](./compute-quota-monitoring) shows a practical way of collecting and monitoring [Compute Engine resource quotas](https://cloud.google.com/compute/quotas) via Cloud Monitoring metrics as an alternative to the recently released [built-in quota metrics](https://cloud.google.com/monitoring/alerts/using-quota-metrics). A simple alert on quota thresholds is also part of the blueprint. + +
+ ## Granular Cloud DNS IAM via Service Directory This [blueprint](./dns-fine-grained-iam) shows how to leverage [Service Directory](https://cloud.google.com/blog/products/networking/introducing-service-directory) and Cloud DNS Service Directory private zones, to implement fine-grained IAM controls on DNS. The blueprint creates a Service Directory namespace, a Cloud DNS private zone that uses it as its authoritative source, service accounts with different levels of permissions, and VMs to test them. @@ -34,9 +40,9 @@ The blueprint's feed tracks changes to Google Compute instances, and the Cloud F
-## Network Dashboard +## Network Quota Monitoring - This [blueprint](./network-dashboard/) provides an end-to-end solution to gather some GCP Networking quotas and limits (that cannot be seen in the GCP console today) and display them in a dashboard. The goal is to allow for better visibility of these limits, facilitating capacity planning and avoiding hitting these limits.. + This [blueprint](./network-quota-monitoring) provides an end-to-end solution to gather some GCP Networking quotas and limits (that cannot be seen in the GCP console today) and display them in a dashboard. The goal is to allow for better visibility of these limits, facilitating capacity planning and avoiding hitting these limits.
@@ -52,12 +58,6 @@ This [blueprint](./onprem-sa-key-management) shows how to manage IAM Service Acc
-## Compute Engine quota monitoring - - This [blueprint](./quota-monitoring) shows a practical way of collecting and monitoring [Compute Engine resource quotas](https://cloud.google.com/compute/quotas) via Cloud Monitoring metrics as an alternative to the recently released [built-in quota metrics](https://cloud.google.com/monitoring/alerts/using-quota-metrics). A simple alert on quota thresholds is also part of the blueprint. - -
- ## Scheduled Cloud Asset Inventory Export to Bigquery This [blueprint](./scheduled-asset-inventory-export-bq) shows how to leverage the [Cloud Asset Inventory Exporting to Bigquery](https://cloud.google.com/asset-inventory/docs/exporting-to-bigquery) feature, to keep track of your organization's assets over time storing information in Bigquery. Data stored in Bigquery can then be used for different purposes like dashboarding or analysis. diff --git a/blueprints/cloud-operations/quota-monitoring/README.md b/blueprints/cloud-operations/compute-quota-monitoring/README.md similarity index 98% rename from blueprints/cloud-operations/quota-monitoring/README.md rename to blueprints/cloud-operations/compute-quota-monitoring/README.md index 26a702e82..2c69bda14 100644 --- a/blueprints/cloud-operations/quota-monitoring/README.md +++ b/blueprints/cloud-operations/compute-quota-monitoring/README.md @@ -72,7 +72,7 @@ Clone this repository or [open it in cloud shell](https://ssh.cloud.google.com/c ```hcl module "test" { - source = "./fabric/blueprints/cloud-operations/quota-monitoring" + source = "./fabric/blueprints/cloud-operations/compute-quota-monitoring" name = "name" project_id = "test" project_create_config = { diff --git a/blueprints/cloud-operations/quota-monitoring/backend.tf.sample b/blueprints/cloud-operations/compute-quota-monitoring/backend.tf.sample similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/backend.tf.sample rename to blueprints/cloud-operations/compute-quota-monitoring/backend.tf.sample diff --git a/blueprints/cloud-operations/quota-monitoring/cloud-shell-readme.txt b/blueprints/cloud-operations/compute-quota-monitoring/cloud-shell-readme.txt similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/cloud-shell-readme.txt rename to blueprints/cloud-operations/compute-quota-monitoring/cloud-shell-readme.txt diff --git a/blueprints/cloud-operations/quota-monitoring/diagram.png b/blueprints/cloud-operations/compute-quota-monitoring/diagram.png similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/diagram.png rename to blueprints/cloud-operations/compute-quota-monitoring/diagram.png diff --git a/blueprints/cloud-operations/quota-monitoring/explorer.png b/blueprints/cloud-operations/compute-quota-monitoring/explorer.png similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/explorer.png rename to blueprints/cloud-operations/compute-quota-monitoring/explorer.png diff --git a/blueprints/cloud-operations/quota-monitoring/main.tf b/blueprints/cloud-operations/compute-quota-monitoring/main.tf similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/main.tf rename to blueprints/cloud-operations/compute-quota-monitoring/main.tf diff --git a/blueprints/cloud-operations/quota-monitoring/outputs.tf b/blueprints/cloud-operations/compute-quota-monitoring/outputs.tf similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/outputs.tf rename to blueprints/cloud-operations/compute-quota-monitoring/outputs.tf diff --git a/blueprints/cloud-operations/quota-monitoring/src/main.py b/blueprints/cloud-operations/compute-quota-monitoring/src/main.py similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/src/main.py rename to blueprints/cloud-operations/compute-quota-monitoring/src/main.py diff --git a/blueprints/cloud-operations/quota-monitoring/src/requirements.txt b/blueprints/cloud-operations/compute-quota-monitoring/src/requirements.txt similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/src/requirements.txt rename to blueprints/cloud-operations/compute-quota-monitoring/src/requirements.txt diff --git a/blueprints/cloud-operations/quota-monitoring/tools/descriptors.py b/blueprints/cloud-operations/compute-quota-monitoring/tools/descriptors.py similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/tools/descriptors.py rename to blueprints/cloud-operations/compute-quota-monitoring/tools/descriptors.py diff --git a/blueprints/cloud-operations/quota-monitoring/variables.tf b/blueprints/cloud-operations/compute-quota-monitoring/variables.tf similarity index 100% rename from blueprints/cloud-operations/quota-monitoring/variables.tf rename to blueprints/cloud-operations/compute-quota-monitoring/variables.tf diff --git a/blueprints/cloud-operations/network-dashboard/LICENSE b/blueprints/cloud-operations/network-quota-monitoring/LICENSE similarity index 100% rename from blueprints/cloud-operations/network-dashboard/LICENSE rename to blueprints/cloud-operations/network-quota-monitoring/LICENSE diff --git a/blueprints/cloud-operations/network-dashboard/README.md b/blueprints/cloud-operations/network-quota-monitoring/README.md similarity index 99% rename from blueprints/cloud-operations/network-dashboard/README.md rename to blueprints/cloud-operations/network-quota-monitoring/README.md index fd7a68211..166f30920 100644 --- a/blueprints/cloud-operations/network-dashboard/README.md +++ b/blueprints/cloud-operations/network-quota-monitoring/README.md @@ -1,4 +1,4 @@ -# Network Dashboard and Discovery Tool +# Network Quota Monitoring This repository provides an end-to-end solution to gather some GCP networking quotas, limits, and their corresponding usage, store them in Cloud Operations timeseries which can displayed in one or more dashboards or wired to alerts. diff --git a/blueprints/cloud-operations/network-dashboard/dashboards/quotas-utilization.json b/blueprints/cloud-operations/network-quota-monitoring/dashboards/quotas-utilization.json similarity index 100% rename from blueprints/cloud-operations/network-dashboard/dashboards/quotas-utilization.json rename to blueprints/cloud-operations/network-quota-monitoring/dashboards/quotas-utilization.json diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md similarity index 96% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md index 1e917f883..2ebb1f6d0 100644 --- a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/README.md +++ b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/README.md @@ -1,4 +1,4 @@ -# Network Dashboard Discovery via Cloud Function +# Network Quota Monitoring via Cloud Function This simple Terraform setup allows deploying the [discovery tool for the Network Dashboard](../src/) to a Cloud Function, triggered by a schedule via PubSub. @@ -53,7 +53,7 @@ tf output -raw troubleshooting_payload ## Monitoring dashboard -A monitoring dashboard can be optionally be deployed int he same project by setting the `dashboard_json_path` variable to the path of a dashboard JSON file. A sample dashboard is in included, and can be deployed with this variable configuration: +A monitoring dashboard can be optionally be deployed int the same project by setting the `dashboard_json_path` variable to the path of a dashboard JSON file. A sample dashboard is in included, and can be deployed with this variable configuration: ```tfvars dashboard_json_path = "../dashboards/quotas-utilization.json" diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram-scope.png b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram-scope.png similarity index 100% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram-scope.png rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram-scope.png diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram.png b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram.png similarity index 100% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/diagram.png rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/diagram.png diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf similarity index 99% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf index dd59847bf..b30bb1fa7 100644 --- a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/main.tf +++ b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/main.tf @@ -1,5 +1,5 @@ /** - * Copyright 2022 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/outputs.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/outputs.tf similarity index 100% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/outputs.tf rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/outputs.tf diff --git a/blueprints/cloud-operations/network-dashboard/deploy-cloud-function/variables.tf b/blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/variables.tf similarity index 100% rename from blueprints/cloud-operations/network-dashboard/deploy-cloud-function/variables.tf rename to blueprints/cloud-operations/network-quota-monitoring/deploy-cloud-function/variables.tf diff --git a/blueprints/cloud-operations/network-dashboard/metric.png b/blueprints/cloud-operations/network-quota-monitoring/metric.png similarity index 100% rename from blueprints/cloud-operations/network-dashboard/metric.png rename to blueprints/cloud-operations/network-quota-monitoring/metric.png diff --git a/blueprints/cloud-operations/network-dashboard/src/README.md b/blueprints/cloud-operations/network-quota-monitoring/src/README.md similarity index 98% rename from blueprints/cloud-operations/network-dashboard/src/README.md rename to blueprints/cloud-operations/network-quota-monitoring/src/README.md index cad11020f..60db38e14 100644 --- a/blueprints/cloud-operations/network-dashboard/src/README.md +++ b/blueprints/cloud-operations/network-quota-monitoring/src/README.md @@ -1,8 +1,8 @@ -# Network Dashboard Discovery Tool +# Network Quota Monitoring Tool This tool constitutes the discovery and data gathering side of the Network Dashboard, and can be used in combination with the related [Terraform deployment examples](../), or packaged in different ways including standalone manual use. -- [Network Dashboard Discovery Tool](#network-dashboard-discovery-tool) +- [Network Quota Monitoring Tool](#network-dashboard-discovery-tool) - [Quick Usage Example](#quick-usage-example) - [High Level Architecture and Plugin Design](#high-level-architecture-and-plugin-design) - [Debugging and Troubleshooting](#debugging-and-troubleshooting) diff --git a/blueprints/cloud-operations/network-dashboard/src/custom-quotas.sample b/blueprints/cloud-operations/network-quota-monitoring/src/custom-quotas.sample similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/custom-quotas.sample rename to blueprints/cloud-operations/network-quota-monitoring/src/custom-quotas.sample diff --git a/blueprints/cloud-operations/network-dashboard/src/main.py b/blueprints/cloud-operations/network-quota-monitoring/src/main.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/main.py rename to blueprints/cloud-operations/network-quota-monitoring/src/main.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/__init__.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/__init__.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/__init__.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/__init__.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/core-discover-cai-nodes.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/core-discover-cai-nodes.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/core-discover-cai-nodes.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/core-discover-cai-nodes.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-cai.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-cai.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-cai.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-cai.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-quota.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-quota.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-quota.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-quota.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-routerstatus.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-routerstatus.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-compute-routerstatus.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-compute-routerstatus.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-group-networks.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-group-networks.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-group-networks.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-group-networks.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/discover-metric-descriptors.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-metric-descriptors.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/discover-metric-descriptors.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/discover-metric-descriptors.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/monitoring.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/monitoring.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/monitoring.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/monitoring.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-policies.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-policies.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-policies.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-policies.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-rules.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-rules.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-firewall-rules.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-firewall-rules.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-networks.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-networks.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-networks.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-networks.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-peering-groups.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-peering-groups.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-peering-groups.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-peering-groups.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-psa.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-psa.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-psa.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-psa.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-routes.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-routes.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-routes.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-routes.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/series-subnets.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-subnets.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/series-subnets.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-subnets.py diff --git a/blueprints/cloud-operations/network-dashboard/src/plugins/utils.py b/blueprints/cloud-operations/network-quota-monitoring/src/plugins/utils.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/plugins/utils.py rename to blueprints/cloud-operations/network-quota-monitoring/src/plugins/utils.py diff --git a/blueprints/cloud-operations/network-dashboard/src/requirements.txt b/blueprints/cloud-operations/network-quota-monitoring/src/requirements.txt similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/requirements.txt rename to blueprints/cloud-operations/network-quota-monitoring/src/requirements.txt diff --git a/blueprints/cloud-operations/network-dashboard/src/tools/remove-descriptors.py b/blueprints/cloud-operations/network-quota-monitoring/src/tools/remove-descriptors.py similarity index 100% rename from blueprints/cloud-operations/network-dashboard/src/tools/remove-descriptors.py rename to blueprints/cloud-operations/network-quota-monitoring/src/tools/remove-descriptors.py diff --git a/blueprints/networking/README.md b/blueprints/networking/README.md index 9dca3f97f..8a4c40a08 100644 --- a/blueprints/networking/README.md +++ b/blueprints/networking/README.md @@ -96,3 +96,9 @@ It is meant to be used as a starting point for most Shared VPC configurations, a It is meant to be used as a starting point for users that want to explore PSC to reduce some of the complexity in their network setup.
+ +### VPC Connectivity Lab + + This [blueprint](./vpc-connectivity-lab/) creates a networking playground showing a number of different VPC connectivity options (peering, HA VPN, NVA), along with PBR routing. + +
diff --git a/blueprints/networking/vpc-connectivity-lab/README.md b/blueprints/networking/vpc-connectivity-lab/README.md new file mode 100644 index 000000000..65a23433f --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/README.md @@ -0,0 +1,112 @@ +# VPC Connectivity Lab + +This blueprint creates a networking playground showing a number of different VPC connectivity options: + +* Hub and spoke via HA VPN +* Hub and spoke via VPC peering +* Interconnecting two networks via a network virtual appliance (aka NVA) + +On top of that, this blueprint implements Policy Based Routing (aka PBR) to show how to force all traffic within a VPC to be funneled through an internal network passthrough load balancer, to implement an Intrusion Prevention System (IPS). PBR is enabled in the `hub` VPC, matching all traffic originating from within that VPC. + +The blueprint has been purposefully kept simple to show how to use and wire VPCs together, and so that it can be used as a basis for experimentation. + +This is the high level diagram of this blueprint: + +![High-level diagram](diagram.png "High-level diagram") + +## Prerequisites + +This blueprint is contained within a single project to keep complexity to a minimum, even though in a real world scenario each spoke would probably use a separate project. + +The blueprint can either create a new project or consume an existing one. +If the variable `var.project_create_config` is populated, the blueprint will create a new project named `var.project_id`, otherwise the blueprint will use an existing project with the same id. + +## Testing reachability + +After running terraform, and in case `var.test_vms` is set to true (as it is by default), a set of ping commands will be printed to check the reachability of all VMs. The blueprint is configured to ensure that all VMs can ping each other - so you can simply SSH to each one, and run the generated ping commands, e.g.: + +```bash +ping -c 1 ext.example +ping -c 1 hub-a.example +ping -c 1 hub-b.example +ping -c 1 spoke-peering-a.example +ping -c 1 spoke-peering-b.example +ping -c 1 spoke-vpn-a.example +ping -c 1 spoke-vpn-b.example +``` + +## Testing IPS/NVA + +Per blueprint setup, not all traffic will flow through the deployed test NVAs. +You should expect the following flows to be routed through them: + +* `ext` to {`hub`, `peering-a`, `peering-b`, `vpn-a`, `vpn-b`} +* `peering-a` to {`ext`, `peering-b`} +* `peering-b` to {`ext`, `peering-a`} +* `vpn-a` to {`ext`} +* `vpn-b` to {`ext`} + +Additional PBR routes could be configured to force all traffic coming from `vpn-{a,b}` to go through the NVA - however traffic coming from `peering-{a,b}` can NOT be subjected to PBR routes, due to product constrains. + +In order to see the actual traffic flow, you'll want to manually stop one of the NVA instances (to force all traffic to be sent through a single VM), SSH to the active NVA instance and run the following commands: + +```bash +# Setting the toolbox up might take a while since we're using cheap instances :) +$ toolbox + +# Once inside the toolbox +$ tcpdump -i any icmp -n + +``` + + + +## Files + +| name | description | modules | resources | +|---|---|---|---| +| [dns-hub.tf](./dns-hub.tf) | DNS setup. | dns | | +| [main.tf](./main.tf) | Project setup. | project | | +| [nva.tf](./nva.tf) | None | compute-vm · simple-nva | google_compute_instance_group | +| [outputs.tf](./outputs.tf) | Module outputs. | | | +| [test-resources.tf](./test-resources.tf) | None | | | +| [variables.tf](./variables.tf) | Module variables. | | | +| [vpc-ext.tf](./vpc-ext.tf) | External VPC. | net-address · net-cloudnat · net-lb-int · net-vpc · net-vpc-firewall | google_compute_route | +| [vpc-hub.tf](./vpc-hub.tf) | Internal Hub VPC. | net-address · net-lb-int · net-vpc · net-vpc-firewall · net-vpc-peering · net-vpn-ha | google_compute_route | +| [vpc-peering-a.tf](./vpc-peering-a.tf) | None | net-vpc · net-vpc-firewall | | +| [vpc-peering-b.tf](./vpc-peering-b.tf) | None | net-vpc · net-vpc-firewall | | +| [vpc-vpn-a.tf](./vpc-vpn-a.tf) | None | net-vpc · net-vpc-firewall · net-vpn-ha | | +| [vpc-vpn-b.tf](./vpc-vpn-b.tf) | None | net-vpc · net-vpc-firewall · net-vpn-ha | | + +## Variables + +| name | description | type | required | default | +|---|---|:---:|:---:|:---:| +| [prefix](variables.tf#L37) | Prefix used for resource names. | string | ✓ | | +| [ip_ranges](variables.tf#L17) | Subnet/Routes IP CIDR ranges. | map(string) | | {…} | +| [project_create_config](variables.tf#L46) | Populate with billing account id to trigger project creation. | object({…}) | | null | +| [project_id](variables.tf#L55) | Project id for all resources. | string | | "net-test-02" | +| [region](variables.tf#L61) | Region used to deploy resources. | string | | "europe-west8" | +| [test_vms](variables.tf#L67) | Enable the creation of test resources. | bool | | true | + +## Outputs + +| name | description | sensitive | +|---|---|:---:| +| [ping_commands](outputs.tf#L17) | Ping commands that can be run to check VPC reachability. | | + +## Test + +```hcl +module "test" { + source = "./fabric/blueprints/networking/vpc-connectivity-lab" + project_create_config = { + billing_account_id = "123456-123456-123456" + parent_id = "folders/123456789" + } + project_id = "net-test-04" + prefix = "fast-sr0-sbox" +} + +# tftest modules=35 resources=131 +``` diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw b/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw new file mode 100644 index 000000000..552a89e27 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/diagram.excalidraw @@ -0,0 +1,10273 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 1474, + "versionNonce": 993286653, + "isDeleted": false, + "id": "cahWk0DfRyLp3s9pu85Vu", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.3435324885941, + "y": 2133.8481850351664, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 286.50895203755545, + "height": 171.5890064842986, + "seed": 1448890547, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "mEbRfBq_UxBkFfnzBVD8J" + } + ], + "updated": 1703059826403, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1595, + "versionNonce": 653398621, + "isDeleted": false, + "id": "mEbRfBq_UxBkFfnzBVD8J", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 705.3011335073718, + "y": 2138.8481850351664, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 58.59375, + "height": 24, + "seed": 43369043, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059826403, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "vpn-a", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "cahWk0DfRyLp3s9pu85Vu", + "originalText": "vpn-a", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "rectangle", + "version": 334, + "versionNonce": 680708413, + "isDeleted": false, + "id": "sMxH-PbI_QSEQto-RSJfS", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 977.9102295540138, + "y": 2179.0506945532093, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 500.7625481814538, + "height": 241.47267475061153, + "seed": 36452571, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "TFEIVsBkEraMp6OuJ9S5-" + } + ], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 350, + "versionNonce": 1975989523, + "isDeleted": false, + "id": "TFEIVsBkEraMp6OuJ9S5-", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1210.7133786447407, + "y": 2391.523369303821, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 35.15625, + "height": 24, + "seed": 797336955, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "hub", + "textAlign": "center", + "verticalAlign": "bottom", + "containerId": "sMxH-PbI_QSEQto-RSJfS", + "originalText": "hub", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "rectangle", + "version": 73, + "versionNonce": 356555165, + "isDeleted": false, + "id": "1-QRU78HgoxTvr0WL26Uk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1049.8478307866228, + "y": 1826.7579824875347, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 428.2689117627317, + "height": 241.47267475061153, + "seed": 1687481685, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "mAhUhit4uyfdsnbtz912o" + } + ], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 77, + "versionNonce": 447727293, + "isDeleted": false, + "id": "mAhUhit4uyfdsnbtz912o", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1246.4041616679888, + "y": 1831.7579824875347, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 35.15625, + "height": 24, + "seed": 446633909, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059873984, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "ext", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "1-QRU78HgoxTvr0WL26Uk", + "originalText": "ext", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "rectangle", + "version": 581, + "versionNonce": 1620401661, + "isDeleted": false, + "id": "ulFqvrwsF1010MSpVl-Ju", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1220.7733537370266, + "y": 2120.70798455941, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 730076277, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 573, + "versionNonce": 611667027, + "isDeleted": false, + "id": "LKd7jsHVFYsPgOxdaj5Ic", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1220.7206338029127, + "y": 2127.997539362958, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1129561557, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 601, + "versionNonce": 26383965, + "isDeleted": false, + "id": "RceqAUwCxvcwe-gPJTMsL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1228.6479473771885, + "y": 2105.46996815895, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 170343221, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 644, + "versionNonce": 122571251, + "isDeleted": false, + "id": "dcxeJEcJpWfh1S_zE-HkZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1236.011223864305, + "y": 2105.5577821087854, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 409210005, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 651, + "versionNonce": 319406781, + "isDeleted": false, + "id": "J8ov2tUZgd9AswumW2a8l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1243.1946613238354, + "y": 2105.550156656867, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1572844021, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 659, + "versionNonce": 1299616659, + "isDeleted": false, + "id": "pca_v9tY7ULNoILF0qAla", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1228.521605841157, + "y": 2135.598032457822, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 926919509, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 701, + "versionNonce": 1503421213, + "isDeleted": false, + "id": "gS3O7hoIIUAzV4yU4vhG4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1235.8848823282733, + "y": 2135.701351364916, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1161394357, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 708, + "versionNonce": 1730455859, + "isDeleted": false, + "id": "jTzRLjc6Z7ckVoBMARrGl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1243.0683197878031, + "y": 2135.693725912997, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 22190613, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 590, + "versionNonce": 163313533, + "isDeleted": false, + "id": "GKiCEDtmA0WgByAKKbced", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1250.6850338086579, + "y": 2113.4390605295825, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 343969653, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 633, + "versionNonce": 2042563283, + "isDeleted": false, + "id": "bSV94723G3QMVUlPvj-P7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1250.8197129160455, + "y": 2120.946634548106, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1829296341, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 625, + "versionNonce": 1302986717, + "isDeleted": false, + "id": "GF0MTQZKL4_jxJJMjFjsH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1250.7669929819315, + "y": 2128.236189351654, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 343995957, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 537, + "versionNonce": 970733683, + "isDeleted": false, + "id": "a1G_0E19JJcoZD5Ds5rxh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1220.638674629639, + "y": 2113.2004105408864, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1171154837, + "groupIds": [ + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 794, + "versionNonce": 192412733, + "isDeleted": false, + "id": "HxaiwcWdh4cwTb69crlWA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1226.4246527550144, + "y": 2109.8613065582117, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1126608117, + "groupIds": [ + "6Zi_lqyczctHujtPwlH4B", + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 671, + "versionNonce": 88257043, + "isDeleted": false, + "id": "cpFi4xdlR0GV4tgYkFAdT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1230.0152397922686, + "y": 2113.2538656902034, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 1812940373, + "groupIds": [ + "6Zi_lqyczctHujtPwlH4B", + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 642, + "versionNonce": 1795648669, + "isDeleted": false, + "id": "8qzgBsPJ6SYYBhRlsfeMO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1233.6699878375741, + "y": 2128.035757070686, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 324907957, + "groupIds": [ + "0H22kCusqFZQqiDr5BuQj", + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 647, + "versionNonce": 1021900723, + "isDeleted": false, + "id": "ZNpnv9f8ZVMM7ARue-U-M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1239.144956753726, + "y": 2122.5233920954324, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 355955989, + "groupIds": [ + "0H22kCusqFZQqiDr5BuQj", + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 736, + "versionNonce": 470405373, + "isDeleted": false, + "id": "-FwRjQ0LBeWL-hoDerwCZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1236.1697944215234, + "y": 2125.2153527000996, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 756157045, + "groupIds": [ + "0H22kCusqFZQqiDr5BuQj", + "61O8NBAMlU2DbQDANQ9CE" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 588, + "versionNonce": 1593149779, + "isDeleted": false, + "id": "4CbiKzm7dBjhNPsATQ60e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1268.1406514423054, + "y": 2120.7056555624717, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1257969237, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 580, + "versionNonce": 1543547229, + "isDeleted": false, + "id": "QKjIaK7jGnVfDprP224Z9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1268.0879315081918, + "y": 2127.9952103660194, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1146061749, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 608, + "versionNonce": 1623123699, + "isDeleted": false, + "id": "N4cqEXe-TDisCmE7HaHKJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1276.0152450824673, + "y": 2105.467639162011, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1735345429, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 651, + "versionNonce": 1010660797, + "isDeleted": false, + "id": "DZqFncr1xxN8js8-sgZGA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1283.378521569584, + "y": 2105.5554531118473, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 131062389, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 658, + "versionNonce": 1221300371, + "isDeleted": false, + "id": "lSySREJaGvY1NAOfaStX2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1290.5619590291142, + "y": 2105.5478276599283, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1849082837, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 666, + "versionNonce": 669103645, + "isDeleted": false, + "id": "yI37jQFIe9zURV2YL9A1-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1275.888903546436, + "y": 2135.595703460883, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 783909173, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 708, + "versionNonce": 147981875, + "isDeleted": false, + "id": "2rPA35AE-zcjwXSVyLYNI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1283.2521800335523, + "y": 2135.6990223679772, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1052611221, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 715, + "versionNonce": 702474877, + "isDeleted": false, + "id": "90pvFErQINNDNn9GAT17p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1290.435617493082, + "y": 2135.6913969160582, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1257797621, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 597, + "versionNonce": 397985747, + "isDeleted": false, + "id": "sCf3v9qI4K-HC59lsbYJ_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1298.052331513937, + "y": 2113.436731532644, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1299165525, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 640, + "versionNonce": 1928762077, + "isDeleted": false, + "id": "h9QHTQFEef4-B6zPQtR27", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1298.1870106213244, + "y": 2120.944305551168, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1668857525, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 632, + "versionNonce": 1268143475, + "isDeleted": false, + "id": "k1_zh9sbSKwX7JloIZF7B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1298.1342906872103, + "y": 2128.2338603547155, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1673076757, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 544, + "versionNonce": 532295485, + "isDeleted": false, + "id": "21wqjd7Qp2m-AEDWcNz0o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1268.0059723349175, + "y": 2113.198081543948, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 874927477, + "groupIds": [ + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 801, + "versionNonce": 1940991763, + "isDeleted": false, + "id": "-r4eYRrqBelUo0ebtvOKE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1273.791950460293, + "y": 2109.858977561273, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1610997461, + "groupIds": [ + "fKcRaBnu_vTCV1A9vOoaY", + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 678, + "versionNonce": 1049313181, + "isDeleted": false, + "id": "Gb094F0BredxzthmT3qex", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1277.3825374975474, + "y": 2113.2515366932644, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 1844263989, + "groupIds": [ + "fKcRaBnu_vTCV1A9vOoaY", + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 649, + "versionNonce": 847238323, + "isDeleted": false, + "id": "OAZ6YAAfZmEbmQ7Hn7yEO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1281.037285542853, + "y": 2128.0334280737475, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 1975643541, + "groupIds": [ + "Z0_I8SkiEzSxjQYw3byEx", + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 654, + "versionNonce": 362497021, + "isDeleted": false, + "id": "0AgZeIxIrHLgm8iuc7klu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1286.5122544590047, + "y": 2122.5210630984934, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1991865077, + "groupIds": [ + "Z0_I8SkiEzSxjQYw3byEx", + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 743, + "versionNonce": 396936787, + "isDeleted": false, + "id": "OZ19-WP8D88y0J85UbolC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1283.537092126802, + "y": 2125.213023703161, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1834568789, + "groupIds": [ + "Z0_I8SkiEzSxjQYw3byEx", + "DARAabG91VF7nU0g1plJZ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 707, + "versionNonce": 686537821, + "isDeleted": false, + "id": "xehcbIJ2W4wT3XRoiBe-0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1258.9918682354003, + "y": 2014.2583684275285, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 2.795822937921211, + "height": 8.814334379301076, + "seed": 94541723, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 648, + "versionNonce": 2046985203, + "isDeleted": false, + "id": "J3gLgEfGS-YFIwKeRMwnZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1251.0695469790999, + "y": 2007.7846878726143, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 9.182521437781132, + "height": 7.752121356930334, + "seed": 440593467, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 697, + "versionNonce": 5122237, + "isDeleted": false, + "id": "Rj-PhRU5XOIOh6Khitji0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1260.3320962255789, + "y": 2007.6562353545257, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 9.182521437781132, + "height": 7.752121356930334, + "seed": 758099163, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 974, + "versionNonce": 294882707, + "isDeleted": false, + "id": "qcDu59Y1GI6wESZTKGwe_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1248.016683104638, + "y": 2031.0527516368559, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 24.90241619165637, + "height": 11.329739262259444, + "seed": 301685115, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.03435663667088932, + -9.116492863370489 + ], + [ + 24.688829304665873, + -9.050824126229084 + ], + [ + 24.868059554985482, + 1.441051264022695 + ], + [ + 21.525409128484323, + 1.356323667686184 + ], + [ + 21.6345117885427, + -6.073449205346171 + ], + [ + 13.817932625107664, + -5.930011811754959 + ], + [ + 14.026982433485095, + 2.2132463988889555 + ], + [ + 10.949960750177553, + 1.766391090785731 + ], + [ + 10.876697882143608, + -6.003099454683841 + ], + [ + 2.9292756295436786, + -6.051064198174598 + ], + [ + 3.0517329458235207, + 0.8317873156856564 + ], + [ + 0.232511198337186, + 0.5821416052893031 + ] + ] + }, + { + "type": "rectangle", + "version": 814, + "versionNonce": 761530653, + "isDeleted": false, + "id": "_b_2UqAAqfTScWWs1RJZL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1244.9847300450635, + "y": 2029.7514514925117, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 99119643, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 856, + "versionNonce": 1368548147, + "isDeleted": false, + "id": "RyHdKGWvFvM-4w_BQc7rF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1249.657282696623, + "y": 2029.6803601641716, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 2045343419, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 860, + "versionNonce": 295624061, + "isDeleted": false, + "id": "rDPRfPuvAc9ao4rfaCfTM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1255.6865470143166, + "y": 2029.8375871477276, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 480307035, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 902, + "versionNonce": 40207571, + "isDeleted": false, + "id": "Kyxkus5_BkLZtsVV0dBWh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1260.3590996658763, + "y": 2029.7664958193889, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 610354171, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 870, + "versionNonce": 1681925597, + "isDeleted": false, + "id": "ffIBmmWXuuZovS5eNzCrd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1266.7057467131513, + "y": 2029.7011744034373, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1496124571, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 912, + "versionNonce": 463696499, + "isDeleted": false, + "id": "GKjaKaJEw1G7_ei7RnJVO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1271.3782993647112, + "y": 2029.6300830750986, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1589035323, + "groupIds": [ + "JOc29hhcxbWKwFBm5DwnR" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 140, + "versionNonce": 2019123773, + "isDeleted": false, + "id": "OIR3Ta5PCIVYWGK1e4DpR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.4756395027064, + "y": 2048.610141724072, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 13.421696578844598, + "height": 13.421696578844598, + "seed": 641969749, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 220, + "versionNonce": 1578282003, + "isDeleted": false, + "id": "BCa-6wAh4ZM4nawU0tmOc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1267.902175717202, + "y": 2048.558034606172, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 13.421696578844598, + "height": 13.421696578844598, + "seed": 1772286171, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 48, + "versionNonce": 1120670365, + "isDeleted": false, + "id": "n3os2eKjVoygNHhxw7ubQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1239.4791141432052, + "y": 2103.001745371031, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 8.00529879723058, + "height": 39.86194519278706, + "seed": 558465691, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 8.00529879723058, + -39.86194519278706 + ] + ] + }, + { + "type": "line", + "version": 182, + "versionNonce": 766095795, + "isDeleted": false, + "id": "TTKyfQSiuMrBx_gomWKmL", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1285.890220146151, + "y": 2104.525528627971, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 9.71112128845266, + "height": 42.05592910432688, + "seed": 1683934715, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -9.71112128845266, + -42.05592910432688 + ] + ] + }, + { + "type": "rectangle", + "version": 854, + "versionNonce": 541701885, + "isDeleted": false, + "id": "DRgwZ776eCzrTlEj7KDx5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1261.636264176028, + "y": 2223.229547780751, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 2.795822937921211, + "height": 8.814334379301076, + "seed": 1513372085, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 795, + "versionNonce": 730792787, + "isDeleted": false, + "id": "s2L98ZBU2fd8QcyaBFAAe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1253.7139429197275, + "y": 2216.7558672258374, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 9.182521437781132, + "height": 7.752121356930334, + "seed": 189610773, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 844, + "versionNonce": 1532219229, + "isDeleted": false, + "id": "mqbEHMUFsi17-ty65R26N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1262.9764921662056, + "y": 2216.6274147077484, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 9.182521437781132, + "height": 7.752121356930334, + "seed": 679415925, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1121, + "versionNonce": 270082291, + "isDeleted": false, + "id": "Q9Y5mfq0JVHplG-OEI_dD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1250.6610790452648, + "y": 2240.023930990078, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 24.90241619165637, + "height": 11.329739262259444, + "seed": 1603221973, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.03435663667088932, + -9.116492863370489 + ], + [ + 24.688829304665873, + -9.050824126229084 + ], + [ + 24.868059554985482, + 1.441051264022695 + ], + [ + 21.525409128484323, + 1.356323667686184 + ], + [ + 21.6345117885427, + -6.073449205346171 + ], + [ + 13.817932625107664, + -5.930011811754959 + ], + [ + 14.026982433485095, + 2.2132463988889555 + ], + [ + 10.949960750177553, + 1.766391090785731 + ], + [ + 10.876697882143608, + -6.003099454683841 + ], + [ + 2.9292756295436786, + -6.051064198174598 + ], + [ + 3.0517329458235207, + 0.8317873156856564 + ], + [ + 0.232511198337186, + 0.5821416052893031 + ] + ] + }, + { + "type": "rectangle", + "version": 961, + "versionNonce": 1916525501, + "isDeleted": false, + "id": "W_SihJ9z4KefZywFWQHae", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1247.6291259856907, + "y": 2238.722630845733, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 160642869, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1003, + "versionNonce": 1154386579, + "isDeleted": false, + "id": "ejOxTuR_HJ14QMGcviqh_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1252.3016786372507, + "y": 2238.6515395173947, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1089505429, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1007, + "versionNonce": 488856605, + "isDeleted": false, + "id": "Ge27YncKRlLs0_xbDTAMy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1258.330942954944, + "y": 2238.8087665009502, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 928820725, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1051, + "versionNonce": 1046855731, + "isDeleted": false, + "id": "Uqs84c0PfNm7HwUXprk8s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1263.003495606504, + "y": 2238.7376751726115, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1272784725, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1017, + "versionNonce": 335270013, + "isDeleted": false, + "id": "04ejsABk5G1nMv2szrfCm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1269.3501426537784, + "y": 2238.672353756659, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1623684277, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1059, + "versionNonce": 382026195, + "isDeleted": false, + "id": "6l9NYQdgs5ByBWGJamiXC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 6.283185307179586, + "x": 1274.022695305339, + "y": 2238.6012624283208, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 4.501270111362706, + "height": 8.998810431203477, + "seed": 1908479509, + "groupIds": [ + "oMbWO03pcIbqnXEv89t8Q" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 253, + "versionNonce": 344373469, + "isDeleted": false, + "id": "OAnmHUXtnOP18jKAZh7Wd", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1269.45170932271, + "y": 2188.9818449779305, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 13.421696578844598, + "height": 13.421696578844598, + "seed": 1774160757, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 333, + "versionNonce": 1728286579, + "isDeleted": false, + "id": "lndLr0y5axsSNFoJ7IwwY", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1243.0251731082144, + "y": 2189.0339520958305, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 13.421696578844598, + "height": 13.421696578844598, + "seed": 956847317, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 161, + "versionNonce": 676697405, + "isDeleted": false, + "id": "m-zFu_1iQQFRbTQO_f5CJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1277.5113843928068, + "y": 2188.1362469634523, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 8.00529879723058, + "height": 39.86194519278706, + "seed": 724628021, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 8.00529879723058, + -39.86194519278706 + ] + ] + }, + { + "type": "line", + "version": 295, + "versionNonce": 1634150675, + "isDeleted": false, + "id": "n7dO4vq13K_etYjYSqehS", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1248.0025349064144, + "y": 2189.2090102094853, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 9.71112128845266, + "height": 42.05592910432688, + "seed": 2099176341, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -9.71112128845266, + -42.05592910432688 + ] + ] + }, + { + "type": "line", + "version": 1069, + "versionNonce": 717874589, + "isDeleted": false, + "id": "9dR33WzB0LAC0g0Z378LT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1033.7577135441386, + "y": 2264.6078127555065, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 1418037851, + "groupIds": [ + "PNDNhDwb11_-FkRDWjZB_" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.940775652730609, + 7.836427741431539 + ], + [ + 3.129717769098604, + 8.044191549716741 + ], + [ + 3.3503310394194927, + 12.793832431341501 + ], + [ + -3.230375314901173, + 12.807449434576053 + ], + [ + -3.110447002568436, + 7.99620309216759 + ], + [ + -7.9552492867675895, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1154, + "versionNonce": 728141491, + "isDeleted": false, + "id": "SwA_xGZekdRxmwljUaVmI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1033.5034682281148, + "y": 2283.507380212156, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 1572439803, + "groupIds": [ + "PNDNhDwb11_-FkRDWjZB_" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1238, + "versionNonce": 253045245, + "isDeleted": false, + "id": "hogqj6-vrgPnxE5qbiUjI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 4.71238898038469, + "x": 1043.1298125779804, + "y": 2274.2330362679654, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 1686433691, + "groupIds": [ + "PNDNhDwb11_-FkRDWjZB_" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1310, + "versionNonce": 2007515219, + "isDeleted": false, + "id": "FNvv4HKIJeTe_-IYuAT5G", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1024.1202072738672, + "y": 2274.3207326836023, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 454706235, + "groupIds": [ + "PNDNhDwb11_-FkRDWjZB_" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 803, + "versionNonce": 1715003997, + "isDeleted": false, + "id": "HHOumUP5HlzJkMbNFZp18", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1011.0669587965249, + "y": 2241.462011170073, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 13.709532316968268, + "height": 13.891881189304865, + "seed": 1780115541, + "groupIds": [ + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05157250871858333, + 5.337183467876706 + ], + [ + -12.103991954322073, + 5.292187876055851 + ], + [ + -11.93736250588609, + 6.9588971209408905 + ], + [ + 0.08328391343613158, + 6.831468467275338 + ], + [ + 0.08101813593913357, + 13.218311281604404 + ], + [ + 1.6055403626461942, + 13.261230700739738 + ], + [ + 1.4974324392689604, + -0.630650488565126 + ], + [ + 0.051918537499509206, + -0.4099220472977767 + ] + ] + }, + { + "type": "rectangle", + "version": 664, + "versionNonce": 1610792435, + "isDeleted": false, + "id": "-ogSvUwnzLJL5Meh3QVUm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.3579857627833, + "y": 2236.701784637444, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 666146229, + "groupIds": [ + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 708, + "versionNonce": 621186749, + "isDeleted": false, + "id": "cadGkHwd3vEhuTvjzSt1D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.3131584452324, + "y": 2253.3296999921254, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 6428437, + "groupIds": [ + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 730, + "versionNonce": 2138867603, + "isDeleted": false, + "id": "28al62_EfJEP44Ph8DtDO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 994.8735551717771, + "y": 2244.9665991177126, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1587047541, + "groupIds": [ + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 846, + "versionNonce": 706719517, + "isDeleted": false, + "id": "DzW5k76C1tFiADx6K6_yo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1003.4156038822205, + "y": 2245.2748515100125, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 4.799876613026025, + "height": 4.799876613026024, + "seed": 1109202389, + "groupIds": [ + "p-aK87dOsoY330TYimoxO", + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 791, + "versionNonce": 1280056627, + "isDeleted": false, + "id": "DA5sI7Rnp23lB936V0z1p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1004.2799138601949, + "y": 2246.139161487987, + "strokeColor": "#1864ab", + "backgroundColor": "white", + "width": 3.071256657077243, + "height": 3.0712566570772424, + "seed": 369464117, + "groupIds": [ + "p-aK87dOsoY330TYimoxO", + "EN0IAcsyrBL9jO3lxMe9J" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 890, + "versionNonce": 66438013, + "isDeleted": false, + "id": "1H82co6OXhRAt8blDS6xe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1011.3281177270871, + "y": 2301.7008532232776, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 13.709532316968268, + "height": 13.891881189304865, + "seed": 404843899, + "groupIds": [ + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05157250871858333, + 5.337183467876706 + ], + [ + -12.103991954322073, + 5.292187876055851 + ], + [ + -11.93736250588609, + 6.9588971209408905 + ], + [ + 0.08328391343613158, + 6.831468467275338 + ], + [ + 0.08101813593913357, + 13.218311281604404 + ], + [ + 1.6055403626461942, + 13.261230700739738 + ], + [ + 1.4974324392689604, + -0.630650488565126 + ], + [ + 0.051918537499509206, + -0.4099220472977767 + ] + ] + }, + { + "type": "rectangle", + "version": 751, + "versionNonce": 836239059, + "isDeleted": false, + "id": "HQpIHRCNi42CQ0u351itQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.6191446933456, + "y": 2296.940626690648, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 103548443, + "groupIds": [ + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 795, + "versionNonce": 1992969181, + "isDeleted": false, + "id": "wROf4EznRSkCBu6h5wMQV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.5743173757944, + "y": 2313.56854204533, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1419414203, + "groupIds": [ + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 817, + "versionNonce": 1790356595, + "isDeleted": false, + "id": "ZMI2OEbMra8j1ZatInXlO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 995.1347141023396, + "y": 2305.205441170917, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 672103259, + "groupIds": [ + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 933, + "versionNonce": 1118750781, + "isDeleted": false, + "id": "TzJWlth1fAeWNNL-lz8Yy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1003.6767628127825, + "y": 2305.5136935632163, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 4.799876613026025, + "height": 4.799876613026024, + "seed": 1826445307, + "groupIds": [ + "PaekpZk8Em3PIrbAM_fXn", + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 878, + "versionNonce": 447653395, + "isDeleted": false, + "id": "Ew9MC4x09XAoKzLU0NsQK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1004.5410727907572, + "y": 2306.378003541191, + "strokeColor": "#1864ab", + "backgroundColor": "white", + "width": 3.071256657077243, + "height": 3.0712566570772424, + "seed": 1627824283, + "groupIds": [ + "PaekpZk8Em3PIrbAM_fXn", + "OutwEMO533lUjTMN6DMhP" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 270, + "versionNonce": 2114641629, + "isDeleted": false, + "id": "vlnPDA5sRcpRToibNMy0x", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 887.4883699945209, + "y": 2257.1267580123017, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 105.48856245285094, + "height": 12.994357975033836, + "seed": 859723701, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 105.48856245285094, + -12.994357975033836 + ] + ] + }, + { + "type": "line", + "version": 351, + "versionNonce": 1673316723, + "isDeleted": false, + "id": "GtVAy-pbGmtaasEUBPt1Z", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 882.8626811416442, + "y": 2272.986490182761, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 111.80907356459636, + "height": 12.929967694521565, + "seed": 419764533, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 111.80907356459636, + -12.929967694521565 + ] + ] + }, + { + "type": "line", + "version": 1535, + "versionNonce": 1777447133, + "isDeleted": false, + "id": "EFr6u3RaWKi1LtMdi-F2O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 861.1807230666249, + "y": 2214.0747559672427, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 1748196277, + "groupIds": [ + "1Ht3ueP4RjVqTtYZryzwz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059830361, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.940775652730609, + 7.836427741431539 + ], + [ + 3.129717769098604, + 8.044191549716741 + ], + [ + 3.3503310394194927, + 12.793832431341501 + ], + [ + -3.230375314901173, + 12.807449434576053 + ], + [ + -3.110447002568436, + 7.99620309216759 + ], + [ + -7.9552492867675895, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1618, + "versionNonce": 94473533, + "isDeleted": false, + "id": "P1WD5WPY3sOEupginOvJx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 860.9264777506008, + "y": 2232.974323423892, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 286792981, + "groupIds": [ + "1Ht3ueP4RjVqTtYZryzwz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059830361, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1704, + "versionNonce": 1809243549, + "isDeleted": false, + "id": "3iE8lT6emDXQscMzdY9-I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 4.71238898038469, + "x": 870.5528221004664, + "y": 2223.699979479701, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 916304501, + "groupIds": [ + "1Ht3ueP4RjVqTtYZryzwz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059830361, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1803, + "versionNonce": 331555325, + "isDeleted": false, + "id": "-dPoIYMgtoMmp5IF8LDsY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 851.543216796353, + "y": 2223.787675895339, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 898210773, + "groupIds": [ + "1Ht3ueP4RjVqTtYZryzwz" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059830361, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1226, + "versionNonce": 1366952029, + "isDeleted": false, + "id": "WEkhNADkJclq9qXUPgZyk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 867.8962279516385, + "y": 2259.4667099456096, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 13.709532316968268, + "height": 13.891881189304865, + "seed": 905009461, + "groupIds": [ + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05157250871858333, + 5.337183467876706 + ], + [ + -12.103991954322073, + 5.292187876055851 + ], + [ + -11.93736250588609, + 6.9588971209408905 + ], + [ + 0.08328391343613158, + 6.831468467275338 + ], + [ + 0.08101813593913357, + 13.218311281604404 + ], + [ + 1.6055403626461942, + 13.261230700739738 + ], + [ + 1.4974324392689604, + -0.630650488565126 + ], + [ + 0.051918537499509206, + -0.4099220472977767 + ] + ] + }, + { + "type": "rectangle", + "version": 1087, + "versionNonce": 558823411, + "isDeleted": false, + "id": "URcnF-HyM1_iApW1rUCVF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 866.1872549178969, + "y": 2254.70648341298, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1094347413, + "groupIds": [ + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1131, + "versionNonce": 422769853, + "isDeleted": false, + "id": "roOQAnt7EyHVpzM0ul5Z1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 866.1424276003457, + "y": 2271.334398767662, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 404377589, + "groupIds": [ + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1153, + "versionNonce": 2133950867, + "isDeleted": false, + "id": "ipKZoTr8aZlmFiu4mNKWy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 851.7028243268909, + "y": 2262.971297893248, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1217825109, + "groupIds": [ + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1269, + "versionNonce": 1741640989, + "isDeleted": false, + "id": "XfeFjOm91H1ODxYcvPKJi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 860.2448730373338, + "y": 2263.2795502855483, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 4.799876613026025, + "height": 4.799876613026024, + "seed": 67409589, + "groupIds": [ + "ML6Hjg3O4IRMSTk9ZRk_t", + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1214, + "versionNonce": 1062328115, + "isDeleted": false, + "id": "TuQbZUOMAaYfpcS2Qa8Ms", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 861.1091830153085, + "y": 2264.143860263523, + "strokeColor": "#1864ab", + "backgroundColor": "white", + "width": 3.071256657077243, + "height": 3.0712566570772424, + "seed": 889845781, + "groupIds": [ + "ML6Hjg3O4IRMSTk9ZRk_t", + "QFEXUgF9Q4n9HUyvLnKIC" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 403, + "versionNonce": 967051933, + "isDeleted": false, + "id": "Z_QLYy-qAAq_lA0aeAnUR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 881.8886026128241, + "y": 2457.176746649619, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 115.83496361015068, + "height": 138.3650539946475, + "seed": 562852981, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059843008, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 115.83496361015068, + -138.3650539946475 + ] + ] + }, + { + "type": "line", + "version": 494, + "versionNonce": 216043485, + "isDeleted": false, + "id": "4_f4jxl4coCZah-DbhUw_", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 877.009612285646, + "y": 2441.309501634997, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 113.3713568231293, + "height": 131.44630452426827, + "seed": 424680917, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059845694, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 113.3713568231293, + -131.44630452426827 + ] + ] + }, + { + "type": "rectangle", + "version": 1372, + "versionNonce": 491287005, + "isDeleted": false, + "id": "LubMKqhrP54vZJNBdS_fv", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1628.4006037949123, + "y": 2159.3500765103618, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 253.3461767206081, + "height": 171.5890064842986, + "seed": 464267707, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "BJnInlZNbR5Zovo7tT3rp" + } + ], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1490, + "versionNonce": 253093491, + "isDeleted": false, + "id": "BJnInlZNbR5Zovo7tT3rp", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1702.3393171552163, + "y": 2164.3500765103618, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 105.46875, + "height": 24, + "seed": 2039822939, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "peering-a", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "LubMKqhrP54vZJNBdS_fv", + "originalText": "peering-a", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "rectangle", + "version": 1167, + "versionNonce": 41430589, + "isDeleted": false, + "id": "iUltUTxWgZdRhu485J5m6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1631.4515300791693, + "y": 2340.3805419215405, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 252.86183709857812, + "height": 160.44091586782883, + "seed": 958967643, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "YGJ0p9LfQXwyn0yWsI86f" + } + ], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1276, + "versionNonce": 588685331, + "isDeleted": false, + "id": "YGJ0p9LfQXwyn0yWsI86f", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.1480736284584, + "y": 2345.3805419215405, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 105.46875, + "height": 24, + "seed": 1823476731, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "peering-b", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "iUltUTxWgZdRhu485J5m6", + "originalText": "peering-b", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "line", + "version": 60, + "versionNonce": 925982365, + "isDeleted": false, + "id": "b2pDNIAguitDGETJQVCVx", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1478.556867, + "y": 2282.082982, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 148.6234251630549, + "height": 52.22947100600368, + "seed": 2032387893, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 148.6234251630549, + -52.22947100600368 + ] + ] + }, + { + "type": "line", + "version": 277, + "versionNonce": 370091443, + "isDeleted": false, + "id": "xaQ6duxeuBW9DTcHTKUwf", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1479.9258015295748, + "y": 2282.11149919917, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 144.2325954261787, + "height": 108.62601454663536, + "seed": 436206965, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 144.2325954261787, + 108.62601454663536 + ] + ] + }, + { + "type": "line", + "version": 266, + "versionNonce": 1555919805, + "isDeleted": false, + "id": "RNeZ_yZBTTH4uJ26mwD5I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1096.257786536119, + "y": 1940.9076578205977, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 7.606266135575659, + "height": 3.114070710579337, + "seed": 2094943419, + "groupIds": [ + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.542590385269981, + -0.011749421338263826 + ], + [ + 7.606266135575659, + 3.102321289241073 + ], + [ + 0.00021497885632761963, + 2.9498048152566634 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 203, + "versionNonce": 1859285651, + "isDeleted": false, + "id": "8nEo2kJn4eUZd0NUqOG7I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1091.4620547467305, + "y": 1951.389762264169, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 14.437042901434056, + "height": 3.0413389536721747, + "seed": 1451949403, + "groupIds": [ + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 309, + "versionNonce": 1941042205, + "isDeleted": false, + "id": "DjpMnhRS0-xNk21UvPJk1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1103.8420008020894, + "y": 1961.7835613863776, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 7.606266135575659, + "height": 3.114070710579337, + "seed": 77109755, + "groupIds": [ + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -5.542590385269981, + -0.011749421338263826 + ], + [ + -7.606266135575659, + 3.102321289241073 + ], + [ + -0.00021497885632761963, + 2.9498048152566634 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "ellipse", + "version": 290, + "versionNonce": 1336715315, + "isDeleted": false, + "id": "w9zOzTZ7iL6MMBz8szQy-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1091.1412340220434, + "y": 1939.283763085099, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 6.371049940947724, + "height": 6.371049940947724, + "seed": 604611227, + "groupIds": [ + "BKsisrLF7ftQOR8PuBPBw", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 261, + "versionNonce": 1291282557, + "isDeleted": false, + "id": "uSRBLUsunhsG7DPpaqIgn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.2593569573971, + "y": 1941.4018860204528, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 2.1348040702403304, + "height": 2.1348040702403304, + "seed": 227579707, + "groupIds": [ + "BKsisrLF7ftQOR8PuBPBw", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 363, + "versionNonce": 787425747, + "isDeleted": false, + "id": "KeTgfsonMsUWo09uJWVO0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1086.5421740724028, + "y": 1949.7805973188683, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 6.371049940947724, + "height": 6.371049940947724, + "seed": 1603270619, + "groupIds": [ + "R5G9JBt20ZRsFps6E9K0L", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 334, + "versionNonce": 1515147485, + "isDeleted": false, + "id": "f1cWMw49D0ADO4eAuzr5g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.6602970077565, + "y": 1951.898720254222, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 2.1348040702403304, + "height": 2.1348040702403304, + "seed": 1209681019, + "groupIds": [ + "R5G9JBt20ZRsFps6E9K0L", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 326, + "versionNonce": 833648499, + "isDeleted": false, + "id": "kzd6_jZWCHoYKtE9Jtp4u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1091.3392618822695, + "y": 1960.2711548413145, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 6.371049940947724, + "height": 6.371049940947724, + "seed": 250739995, + "groupIds": [ + "2Pyi9gzZMwlT4kW0Eph_r", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 297, + "versionNonce": 1498099005, + "isDeleted": false, + "id": "S8kyFWydAGjUKnYZUcTgF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.4573848176233, + "y": 1962.3892777766682, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 2.1348040702403304, + "height": 2.1348040702403304, + "seed": 1602855355, + "groupIds": [ + "2Pyi9gzZMwlT4kW0Eph_r", + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 617, + "versionNonce": 372707603, + "isDeleted": false, + "id": "sIz3_GdNbJMQjcOlEekHS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1101.346380162843, + "y": 1933.1050863607288, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 11.487984999895955, + "height": 39.668093560357086, + "seed": 1392751195, + "groupIds": [ + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.9189012712869844, + 1.6342644423091504 + ], + [ + 3.7876242726036007, + 3.572305722154397 + ], + [ + 5.929546814322157, + 6.616511060577209 + ], + [ + 7.685262596846332, + 9.674118125778662 + ], + [ + 8.98612170539948, + 13.579579751093279 + ], + [ + 9.65491541505417, + 17.50974878611622 + ], + [ + 9.711234363124966, + 22.043548132083853 + ], + [ + 8.970896792551143, + 26.93008643914338 + ], + [ + 7.448813416314007, + 31.17904155665962 + ], + [ + 4.313501141049105, + 35.34085030934008 + ], + [ + 2.274492836433714, + 37.68405920789095 + ], + [ + -0.05017826997060611, + 39.668093560357086 + ], + [ + -1.7767506367709904, + 36.78616418476654 + ], + [ + 1.1153047941787904, + 33.99757697489578 + ], + [ + 3.427424442742467, + 30.94731364254809 + ], + [ + 4.972885391532042, + 27.494981970006393 + ], + [ + 6.189373567407041, + 23.687474909334696 + ], + [ + 6.379795223578899, + 19.447670173906996 + ], + [ + 6.004122428343023, + 15.256315609181819 + ], + [ + 4.852811431873948, + 11.75197007797351 + ], + [ + 2.5924851508422107, + 7.781466324073101 + ], + [ + 0.5358540922889202, + 5.0819850939973295 + ], + [ + -1.7748489007344752, + 2.767318772828393 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 286, + "versionNonce": 1498185117, + "isDeleted": false, + "id": "NA9PEECIKU_IxXvG0BfWX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1112.793127808279, + "y": 1951.3347166524009, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 13.508709077169547, + "height": 9.688113111516508, + "seed": 976400123, + "groupIds": [ + "GC04Hry_G-XznKFVOAv6u" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.055497618594264705, + 3.3179836680533445 + ], + [ + 6.709875964445189, + 3.4676640748181984 + ], + [ + 6.689623853726602, + 6.499546714952619 + ], + [ + 13.453211458575282, + 1.6165142169342475 + ], + [ + 6.73594352884048, + -3.1885663965638886 + ], + [ + 6.728457854818745, + -0.02557697162071037 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1754, + "versionNonce": 234452659, + "isDeleted": false, + "id": "RRQ8keB3eHmtIKpMUGil5", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 918.0999915470898, + "y": 2010.0713027622992, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 234.00841221290932, + "height": 144.06609761970694, + "seed": 1499973723, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 9.84112582335979, + -3.4086670467121394 + ], + [ + 16.08478867991687, + -10.538944431718818 + ], + [ + 19.060612048499195, + -20.641588098529297 + ], + [ + 16.25686337909093, + -32.4391480612106 + ], + [ + 12.478134170818919, + -36.313454947567834 + ], + [ + 6.754860329386531, + -39.832759029607985 + ], + [ + -0.09749600220283128, + -41.15284299966956 + ], + [ + 3.115235265671572, + -44.449795877191036 + ], + [ + 4.906293452603279, + -53.1705127025933 + ], + [ + 4.408944843723134, + -60.77131293408959 + ], + [ + 0.5468557328943575, + -69.80724529060362 + ], + [ + -3.7318892728702053, + -75.80341356076084 + ], + [ + -10.400107006023063, + -81.50413427079135 + ], + [ + -17.406667873082995, + -85.59586319194332 + ], + [ + -28.01346147973544, + -88.2697659388052 + ], + [ + -36.30232456431986, + -87.45083645060535 + ], + [ + -39.45654098669047, + -88.47734696881528 + ], + [ + -37.38612639857149, + -93.88057674655167 + ], + [ + -37.91330648624012, + -107.6918307717751 + ], + [ + -42.26911272606901, + -119.05105880283546 + ], + [ + -49.66385212041797, + -130.65372934528838 + ], + [ + -59.7363873311611, + -138.29826121161116 + ], + [ + -74.09484844008693, + -143.48229106611254 + ], + [ + -87.93318725274935, + -144.06609761970694 + ], + [ + -100.95971591912371, + -141.82135064979738 + ], + [ + -109.86734624496114, + -136.64307576764836 + ], + [ + -116.8834782157727, + -130.7549388947132 + ], + [ + -121.82609672559397, + -125.11486082115377 + ], + [ + -126.76091883793276, + -117.20898550448177 + ], + [ + -127.56879604715829, + -111.79631521702257 + ], + [ + -130.64188343740352, + -115.61934109146111 + ], + [ + -140.908395069196, + -121.20662934732954 + ], + [ + -148.07197127818733, + -122.38344425523164 + ], + [ + -157.01851178251343, + -120.87208182798625 + ], + [ + -167.03045051966524, + -116.87859264432328 + ], + [ + -174.5834670413276, + -108.18750725856361 + ], + [ + -177.4342300392392, + -99.93297909815576 + ], + [ + -178.5277465950909, + -92.7576159671809 + ], + [ + -176.56812225040022, + -87.3294401693395 + ], + [ + -180.52109052144147, + -86.30418898467221 + ], + [ + -192.15674187692912, + -82.2667219641572 + ], + [ + -203.82806006342872, + -73.72024483215935 + ], + [ + -211.2009376946695, + -61.62444849622429 + ], + [ + -214.94780016441013, + -51.16288545406593 + ], + [ + -214.81002067082886, + -38.98760648111789 + ], + [ + -210.53527060968543, + -23.949853216579584 + ], + [ + -201.6864776724825, + -12.42689490339859 + ], + [ + -190.90388121821076, + -5.2438262478790705 + ], + [ + -180.85901638046522, + -1.184982098601182 + ], + [ + -156.8781887487329, + -0.9696705628900588 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 22, + "versionNonce": 25477629, + "isDeleted": false, + "id": "PCEUsa-kgrIgOAlxSlOvT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1084.644408039474, + "y": 1953.3714916729625, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "width": 164.9090580571409, + "height": 0, + "seed": 1768524245, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -164.9090580571409, + 0 + ] + ] + }, + { + "type": "line", + "version": 1066, + "versionNonce": 1469982803, + "isDeleted": false, + "id": "YeGVU137QIYz2zjbMH9MB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1101.2408777017226, + "y": 1981.8964950066338, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 191099893, + "groupIds": [ + "XEk2uZSxoi3b-9GdbXQuQ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.940775652730609, + 7.836427741431539 + ], + [ + 3.129717769098604, + 8.044191549716741 + ], + [ + 3.3503310394194927, + 12.793832431341501 + ], + [ + -3.230375314901173, + 12.807449434576053 + ], + [ + -3.110447002568436, + 7.99620309216759 + ], + [ + -7.9552492867675895, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1151, + "versionNonce": 385186397, + "isDeleted": false, + "id": "c-6_JBRndzSOD2tvuWRf-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 1100.986632385699, + "y": 2000.7960624632842, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 1795927381, + "groupIds": [ + "XEk2uZSxoi3b-9GdbXQuQ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1235, + "versionNonce": 419145203, + "isDeleted": false, + "id": "EACrFg5-l9v-9rdbpAEQf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 4.71238898038469, + "x": 1110.6129767355646, + "y": 1991.5217185190932, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 1681210037, + "groupIds": [ + "XEk2uZSxoi3b-9GdbXQuQ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1307, + "versionNonce": 1114646205, + "isDeleted": false, + "id": "6_MonwZvyZkBz34w7yAm0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1091.6033714314513, + "y": 1991.60941493473, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 260447253, + "groupIds": [ + "XEk2uZSxoi3b-9GdbXQuQ" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825744, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 547, + "versionNonce": 565680669, + "isDeleted": false, + "id": "nqCg8C043EerPVR26WgWX", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1280.873077161392, + "y": 2283.9252812783316, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 1177851421, + "groupIds": [ + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "jsWz_WbUcznOLF13Q8ffQ" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 230, + "versionNonce": 716988979, + "isDeleted": false, + "id": "jsWz_WbUcznOLF13Q8ffQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1337.5399796381105, + "y": 2310.9252812783316, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 987089533, + "groupIds": [ + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "hub-b\n10.0.2.0/24", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "nqCg8C043EerPVR26WgWX", + "originalText": "hub-b\n10.0.2.0/24", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 849, + "versionNonce": 928534141, + "isDeleted": false, + "id": "kZKYeuxYuq5MIhqXJKU2C", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1294.978213545343, + "y": 2315.499215118297, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1320772603, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 841, + "versionNonce": 1140302803, + "isDeleted": false, + "id": "jDkThL7obg2IUM6VTBfMk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1294.9254936112293, + "y": 2322.7887699218454, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1132539035, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 869, + "versionNonce": 1403221725, + "isDeleted": false, + "id": "UMY50oeLLy0UiaVZzBiJ3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1302.8528071855048, + "y": 2300.261198717837, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 696705339, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 912, + "versionNonce": 1134145907, + "isDeleted": false, + "id": "6gbfmkPcyvtqZMMqBggcT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1310.2160836726216, + "y": 2300.3490126676725, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2049769947, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 919, + "versionNonce": 556438333, + "isDeleted": false, + "id": "PcaAjNpuWcPwPCdFHlgXq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1317.3995211321521, + "y": 2300.3413872157535, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1585843835, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 927, + "versionNonce": 1256786707, + "isDeleted": false, + "id": "h6D9PRr8GKGlLcPZOlgjt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1302.7264656494735, + "y": 2330.3892630167093, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 961840923, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 969, + "versionNonce": 2085561245, + "isDeleted": false, + "id": "iJWWZIGbO6BqmJhNuHtw_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1310.0897421365898, + "y": 2330.4925819238024, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1896541115, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 976, + "versionNonce": 240922803, + "isDeleted": false, + "id": "dxnP_oVoAr6E0YJPa9y2K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1317.2731795961195, + "y": 2330.4849564718834, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2043395163, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 858, + "versionNonce": 960669693, + "isDeleted": false, + "id": "Op14u2v1SNqb5jaHbGVEv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.8898936169744, + "y": 2308.230291088469, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 527005947, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 901, + "versionNonce": 1872339539, + "isDeleted": false, + "id": "AAtyXe05u0wgkjHK52GfN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1325.0245727243623, + "y": 2315.737865106993, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 258384283, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 893, + "versionNonce": 705077341, + "isDeleted": false, + "id": "uIfWUQYewSSdGtsWo9kji", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.9718527902482, + "y": 2323.0274199105415, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 586528315, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 805, + "versionNonce": 1467473907, + "isDeleted": false, + "id": "A2BJgjiIquiPXPZCth2cS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1294.8435344379554, + "y": 2307.991641099773, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1761162971, + "groupIds": [ + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1062, + "versionNonce": 1684835517, + "isDeleted": false, + "id": "wXTNNmzoMJQyvHY_9eMym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1300.629512563331, + "y": 2304.6525371170983, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1879286651, + "groupIds": [ + "EIMSbsGeqlpo6At7o_BQy", + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 941, + "versionNonce": 1342007699, + "isDeleted": false, + "id": "_LTtof8111p5E7EM2oqEk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1304.2200996005854, + "y": 2308.0450962490904, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 1347910683, + "groupIds": [ + "EIMSbsGeqlpo6At7o_BQy", + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 910, + "versionNonce": 1209396509, + "isDeleted": false, + "id": "Wb2WkByHceNJtk3Ef7Igu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1307.874847645891, + "y": 2322.8269876295735, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 1978089659, + "groupIds": [ + "dDOTZ8escyi2T9PZRQMWu", + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 915, + "versionNonce": 1583398707, + "isDeleted": false, + "id": "4hzzNKNcle0lJ_qF5ZLtm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1313.3498165620426, + "y": 2317.3146226543195, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 710242651, + "groupIds": [ + "dDOTZ8escyi2T9PZRQMWu", + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1087, + "versionNonce": 1148469629, + "isDeleted": false, + "id": "ULpJF_9EStysgbRDYCG4S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1310.37465422984, + "y": 2320.006583258987, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1593085435, + "groupIds": [ + "dDOTZ8escyi2T9PZRQMWu", + "supSNn_AJprcC4eOaGFUE", + "spqYTauP-yPJTF-8Xmv_M" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "id": "qZfGSi0K0YrYl1ARhqUI3", + "type": "rectangle", + "x": 1225.5217516386235, + "y": 2184.476319994022, + "width": 190.57315247671846, + "height": 80, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 1261356861, + "version": 453, + "versionNonce": 2015741501, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "sk8mEqYAcZ_O5Ff59hnB7" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "id": "sk8mEqYAcZ_O5Ff59hnB7", + "type": "text", + "x": 1282.188654115342, + "y": 2211.476319994022, + "width": 128.90625, + "height": 48, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 731617875, + "version": 132, + "versionNonce": 1521387539, + "isDeleted": false, + "boundElements": null, + "updated": 1703059825745, + "link": null, + "locked": false, + "text": "hub-nva\n10.0.0.0/24", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "right", + "verticalAlign": "bottom", + "baseline": 44, + "containerId": "qZfGSi0K0YrYl1ARhqUI3", + "originalText": "hub-nva\n10.0.0.0/24", + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 837, + "versionNonce": 675984221, + "isDeleted": false, + "id": "KhOnCVePeiAlQUZnxpbHc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1066.2402504689583, + "y": 2283.1754570548537, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 499873917, + "groupIds": [ + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "D4v1QyKPzKupS4wtyH4EY" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 527, + "versionNonce": 1567784179, + "isDeleted": false, + "id": "D4v1QyKPzKupS4wtyH4EY", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1122.9071529456767, + "y": 2310.1754570548537, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 371286237, + "groupIds": [ + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "hub-a\n10.0.1.0/24", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "KhOnCVePeiAlQUZnxpbHc", + "originalText": "hub-a\n10.0.1.0/24", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1139, + "versionNonce": 1186348989, + "isDeleted": false, + "id": "rAzbS8mn__1iSqTltgiyU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1080.3453868529089, + "y": 2314.749390894819, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1885027645, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1131, + "versionNonce": 1453090451, + "isDeleted": false, + "id": "Zr5OwMqiBpwSbMm7uzN5Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1080.2926669187952, + "y": 2322.0389456983676, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 869961117, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1159, + "versionNonce": 1018249245, + "isDeleted": false, + "id": "sJ6ThHYhxYGnyK85Ywugm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1088.2199804930708, + "y": 2299.5113744943583, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2144391677, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1202, + "versionNonce": 303569971, + "isDeleted": false, + "id": "9APmI_5l1ovHcjBOyqO6e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1095.5832569801876, + "y": 2299.5991884441946, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 289376861, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1209, + "versionNonce": 1345139837, + "isDeleted": false, + "id": "R5tAuvNCKomeKyjNraMug", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1102.766694439718, + "y": 2299.5915629922756, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 150484669, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1217, + "versionNonce": 2076974547, + "isDeleted": false, + "id": "-Lj3DswqWbyXn3OPiFAeX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1088.0936389570395, + "y": 2329.6394387932314, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1906071325, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1259, + "versionNonce": 216767709, + "isDeleted": false, + "id": "HcNVUjYQnFTC8ywfY00hT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1095.4569154441558, + "y": 2329.7427577003245, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 94202749, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1266, + "versionNonce": 1053748083, + "isDeleted": false, + "id": "Zhf5TwF3nGtZK1GtjWNLx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1102.6403529036854, + "y": 2329.7351322484055, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 893187037, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1148, + "versionNonce": 176027965, + "isDeleted": false, + "id": "eAnuIpbLf0Mgt7MEVMLUu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1110.2570669245404, + "y": 2307.4804668649913, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1821143101, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1191, + "versionNonce": 1600587027, + "isDeleted": false, + "id": "1dZvG1UpFn5vrSgive64s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1110.3917460319283, + "y": 2314.988040883515, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 426598557, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1183, + "versionNonce": 1917176221, + "isDeleted": false, + "id": "s2UugGasje5o2hU-Fhuxl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1110.3390260978142, + "y": 2322.2775956870637, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1905345789, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1095, + "versionNonce": 353036979, + "isDeleted": false, + "id": "6jz_2rWzyTRnKbNhBVdeR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1080.2107077455214, + "y": 2307.241816876295, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2021236061, + "groupIds": [ + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1352, + "versionNonce": 1165266429, + "isDeleted": false, + "id": "jMIlmyW1J6PrCCSXyzjze", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1085.996685870897, + "y": 2303.9027128936204, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1165486525, + "groupIds": [ + "h7tUw0NxJlWu0G2gO72Mn", + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1231, + "versionNonce": 1684085843, + "isDeleted": false, + "id": "adKkCqeZs90gjGNnJzK0m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.5872729081514, + "y": 2307.2952720256117, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 162376221, + "groupIds": [ + "h7tUw0NxJlWu0G2gO72Mn", + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1200, + "versionNonce": 1661716061, + "isDeleted": false, + "id": "2c0oxB3G7RudBhLSDu6xW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.2420209534569, + "y": 2322.0771634060957, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 1443651197, + "groupIds": [ + "bTKKfdH2rEUh0izhaN83x", + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1205, + "versionNonce": 2034244083, + "isDeleted": false, + "id": "UX-hfmmIY-EPQFiIlsZHk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1098.7169898696086, + "y": 2316.5647984308407, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 559253213, + "groupIds": [ + "bTKKfdH2rEUh0izhaN83x", + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1377, + "versionNonce": 1306325693, + "isDeleted": false, + "id": "jCYs1sZJ76Fyg-mW9DVOx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1095.741827537406, + "y": 2319.2567590355093, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 236626749, + "groupIds": [ + "bTKKfdH2rEUh0izhaN83x", + "NH2NJlKQP6T0NDhb2kl12", + "yJKSPh8b3UW2OebDT34Py" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 981, + "versionNonce": 1085170579, + "isDeleted": false, + "id": "BnEhv87Sff9IZGzbh4scV", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1664.354147472308, + "y": 2218.1952942599296, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 1830028573, + "groupIds": [ + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "BlBeAHPwwDYgBGwfDIrxC" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 690, + "versionNonce": 847876893, + "isDeleted": false, + "id": "BlBeAHPwwDYgBGwfDIrxC", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1721.0210499490263, + "y": 2245.1952942599296, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 1374640509, + "groupIds": [ + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "peering-a\n10.3.0.0/16", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "BnEhv87Sff9IZGzbh4scV", + "originalText": "peering-a\n10.3.0.0/16", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1282, + "versionNonce": 1122138419, + "isDeleted": false, + "id": "Xpy7p5S7xJdi1ky00JhJp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1678.4592838562585, + "y": 2249.640898798332, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1025581533, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1274, + "versionNonce": 763570045, + "isDeleted": false, + "id": "ZNTJyryaeBTaWIIDecNu3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1678.4065639221449, + "y": 2256.9304536018803, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 62578237, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1302, + "versionNonce": 1027791571, + "isDeleted": false, + "id": "z5MzkFzeOP0a0qlfdbH-O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1686.3338774964204, + "y": 2234.402882397871, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1553862301, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1345, + "versionNonce": 1359687645, + "isDeleted": false, + "id": "R1YcSxH0ICURR3S_sqnAu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1693.6971539835372, + "y": 2234.4906963477074, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 645673725, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1352, + "versionNonce": 2087061619, + "isDeleted": false, + "id": "cKWsVV8c1p1Mzb3DLczxf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1700.8805914430677, + "y": 2234.4830708957884, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1842793309, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1360, + "versionNonce": 1798515773, + "isDeleted": false, + "id": "LYNUjaPN0vWHZFQm6vxVf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1686.2075359603891, + "y": 2264.530946696744, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 855594941, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1402, + "versionNonce": 1980924435, + "isDeleted": false, + "id": "ImjsKp3-z2yBdCVmZrmot", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1693.5708124475054, + "y": 2264.6342656038373, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1880578077, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1409, + "versionNonce": 199007389, + "isDeleted": false, + "id": "i8rBzUjHKzn6DsmZISWjg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1700.754249907035, + "y": 2264.6266401519183, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1594903677, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1291, + "versionNonce": 591316915, + "isDeleted": false, + "id": "x4eKxqxRWiZ5npOY22hux", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1708.37096392789, + "y": 2242.371974768504, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2141959389, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1334, + "versionNonce": 1253638397, + "isDeleted": false, + "id": "boCv9rtnuypdrQ7zQ2TBZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1708.505643035278, + "y": 2249.879548787028, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1568346429, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1326, + "versionNonce": 437344595, + "isDeleted": false, + "id": "R1ItI1LWcxHZs47jLilEc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1708.4529231011638, + "y": 2257.1691035905765, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 366993821, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1238, + "versionNonce": 1296685405, + "isDeleted": false, + "id": "XmBxDYG-os2AP32HuJQ9T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1678.324604748871, + "y": 2242.133324779808, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 504079869, + "groupIds": [ + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1495, + "versionNonce": 1742780147, + "isDeleted": false, + "id": "YCBEBtQInSuq_qKhm4XVh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1684.1105828742466, + "y": 2238.794220797133, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1224728157, + "groupIds": [ + "UPppP-IYltbZn9lkzBwLQ", + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1374, + "versionNonce": 216049085, + "isDeleted": false, + "id": "mNcQrDN1mWtdHeKP56Rdh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1687.701169911501, + "y": 2242.1867799291244, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 227412669, + "groupIds": [ + "UPppP-IYltbZn9lkzBwLQ", + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1343, + "versionNonce": 724787347, + "isDeleted": false, + "id": "8beFB6OaJs-mf2d06XFi3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1691.3559179568065, + "y": 2256.9686713096085, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 207072029, + "groupIds": [ + "a45MIjJZgj6J-MFEBgc10", + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1348, + "versionNonce": 1553917469, + "isDeleted": false, + "id": "U4nL3SWR_AfziE4PzofWm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1696.8308868729582, + "y": 2251.4563063343535, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1439580029, + "groupIds": [ + "a45MIjJZgj6J-MFEBgc10", + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1520, + "versionNonce": 1841288755, + "isDeleted": false, + "id": "oMgmmGmHVoxoOqRFPFCpN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1693.8557245407555, + "y": 2254.148266939022, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1882408925, + "groupIds": [ + "a45MIjJZgj6J-MFEBgc10", + "q5UF4B9hLKLVnwaQdFiap", + "zKtzn3nnITiKSM3USgFRB" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 934, + "versionNonce": 796269181, + "isDeleted": false, + "id": "deB_OONuWN3y9yULiUy-q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1662.9466648099979, + "y": 2391.087980705108, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 2065175933, + "groupIds": [ + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "8Bqs2uPQWXHNd4iMQFgXU" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 649, + "versionNonce": 1047304147, + "isDeleted": false, + "id": "8Bqs2uPQWXHNd4iMQFgXU", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1719.6135672867163, + "y": 2418.087980705108, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 970087901, + "groupIds": [ + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "peering-b\n10.4.0.0/16", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "deB_OONuWN3y9yULiUy-q", + "originalText": "peering-b\n10.4.0.0/16", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1236, + "versionNonce": 505922269, + "isDeleted": false, + "id": "8YaKlR-0giGPZ4X7q9CJB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1677.0518011939484, + "y": 2422.661914545073, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1323604541, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1228, + "versionNonce": 189801843, + "isDeleted": false, + "id": "KRbTioonq70IWNjiEHeii", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1676.9990812598353, + "y": 2429.9514693486217, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 321931933, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1256, + "versionNonce": 759521085, + "isDeleted": false, + "id": "thiBcJfSpKiHNhlLk3yxB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1684.9263948341104, + "y": 2407.4238981446124, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1197928189, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1299, + "versionNonce": 1001455379, + "isDeleted": false, + "id": "VBXBI1BcbYFrBaokLDhnq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1692.2896713212276, + "y": 2407.5117120944487, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 436864861, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1306, + "versionNonce": 1395683229, + "isDeleted": false, + "id": "RWe2aFkjCAAQZ7eiaPHgQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1699.4731087807577, + "y": 2407.5040866425297, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1835733949, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1314, + "versionNonce": 168142003, + "isDeleted": false, + "id": "XFG9cRIkiS-hG0CNkUwoB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1684.8000532980795, + "y": 2437.5519624434855, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1571525661, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1356, + "versionNonce": 1041921021, + "isDeleted": false, + "id": "nWT6UtuDgHW3RTwjZ1jed", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1692.1633297851959, + "y": 2437.6552813505787, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 113051773, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1363, + "versionNonce": 502568531, + "isDeleted": false, + "id": "NzA70P05eZAdwsSxwQnZy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1699.346767244725, + "y": 2437.6476558986597, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 174125277, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1245, + "versionNonce": 1510272093, + "isDeleted": false, + "id": "wdi-wiVopMx52Pezr8NL-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1706.9634812655804, + "y": 2415.3929905152454, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1445514557, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1288, + "versionNonce": 1716802547, + "isDeleted": false, + "id": "ZDRyL4Rrdti5_H_18s55U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1707.0981603729679, + "y": 2422.9005645337693, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 695606685, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1280, + "versionNonce": 381769917, + "isDeleted": false, + "id": "qcvet2RljcEpbUwXXPEov", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1707.0454404388538, + "y": 2430.190119337318, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1534747133, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1192, + "versionNonce": 858480019, + "isDeleted": false, + "id": "AxJmIljb5w0nL5ZTGVEcY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1676.917122086561, + "y": 2415.1543405265493, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1631001181, + "groupIds": [ + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1449, + "versionNonce": 1844525341, + "isDeleted": false, + "id": "MfsmaS8ziiYFIsiCEgwEd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1682.7031002119365, + "y": 2411.8152365438746, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 327009981, + "groupIds": [ + "AN8eDOALCylkf9mdVguhh", + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1328, + "versionNonce": 263205683, + "isDeleted": false, + "id": "4c8sej-9vzWIktLsaQDl8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1686.293687249191, + "y": 2415.207795675866, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 888137501, + "groupIds": [ + "AN8eDOALCylkf9mdVguhh", + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1297, + "versionNonce": 688262525, + "isDeleted": false, + "id": "NlJhu1uUb3YTOk2wfZw2t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1689.9484352944964, + "y": 2429.98968705635, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 939457405, + "groupIds": [ + "HNqh4eyMg4fTAjEFWYkwB", + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1302, + "versionNonce": 1548309715, + "isDeleted": false, + "id": "aeaUAj4j77oCMLFJJ1EkW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1695.4234042106482, + "y": 2424.477322081095, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1156350941, + "groupIds": [ + "HNqh4eyMg4fTAjEFWYkwB", + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1474, + "versionNonce": 1732335069, + "isDeleted": false, + "id": "It_JfiM7dynatHkiZf-l-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1692.4482418784455, + "y": 2427.1692826857634, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 2143944765, + "groupIds": [ + "HNqh4eyMg4fTAjEFWYkwB", + "rqF8owiiHLWZG-UrJRbAC", + "Kfav3HathzNhS3zDUcBJw" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1085, + "versionNonce": 680346227, + "isDeleted": false, + "id": "tKI7lmXT5PBFEm6EfMAD_", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 610.4528204220549, + "y": 2195.346921568677, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 1978662899, + "groupIds": [ + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "Y52ZaOEm_qpEis4O7O5Y-" + } + ], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 803, + "versionNonce": 1672778301, + "isDeleted": false, + "id": "Y52ZaOEm_qpEis4O7O5Y-", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 667.1197228987733, + "y": 2222.346921568677, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 712083859, + "groupIds": [ + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "vpn-a\n10.1.0.0/16", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "tKI7lmXT5PBFEm6EfMAD_", + "originalText": "vpn-a\n10.1.0.0/16", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1386, + "versionNonce": 1296202771, + "isDeleted": false, + "id": "8Ys1M4FRFYoVYqTx_FOaF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 624.5579568060054, + "y": 2226.79252610708, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 357621555, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1378, + "versionNonce": 2067874461, + "isDeleted": false, + "id": "djV1bp-BFLv_Pcbm777v9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 624.5052368718918, + "y": 2234.0820809106285, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1089765587, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1406, + "versionNonce": 1180664243, + "isDeleted": false, + "id": "EZwhCweM9iSMwe3jicIva", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 632.4325504461674, + "y": 2211.5545097066192, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 653454963, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1449, + "versionNonce": 1922623229, + "isDeleted": false, + "id": "wT0X5Ft4kdeqfC2XiNoyn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 639.7958269332842, + "y": 2211.6423236564556, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1242736659, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1456, + "versionNonce": 1292555091, + "isDeleted": false, + "id": "LkLPjhfF7pL4woWGI2BYA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 646.9792643928147, + "y": 2211.6346982045366, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 273296819, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1464, + "versionNonce": 2084372317, + "isDeleted": false, + "id": "ZfHpPgeVc9wdqGRciNvgD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 632.3062089101361, + "y": 2241.6825740054924, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1556086611, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1506, + "versionNonce": 832237811, + "isDeleted": false, + "id": "n424AOqdzmsQ0cS7uVSDe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 639.6694853972524, + "y": 2241.7858929125855, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1774886131, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1513, + "versionNonce": 2122255293, + "isDeleted": false, + "id": "tOq-1exOIqi_eHkzWCmS2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 646.852922856782, + "y": 2241.7782674606665, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1659930259, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1395, + "versionNonce": 1972787859, + "isDeleted": false, + "id": "zcKlNeucI7QCXyqKiXApv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 654.469636877637, + "y": 2219.5236020772522, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1055407155, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1438, + "versionNonce": 427854877, + "isDeleted": false, + "id": "eeXoDAYII-6VbxNuJGOsy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 654.6043159850249, + "y": 2227.031176095776, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1503149523, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1430, + "versionNonce": 632524851, + "isDeleted": false, + "id": "Wn2pQXw7IcvWhiYReNsT7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 654.5515960509108, + "y": 2234.3207308993246, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1310133107, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1342, + "versionNonce": 1832059005, + "isDeleted": false, + "id": "PcuiNNleWYazHcBXfcv4A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 624.423277698618, + "y": 2219.284952088556, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 279651603, + "groupIds": [ + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1599, + "versionNonce": 1943605715, + "isDeleted": false, + "id": "9wEwyCrfHNsAuoGrpaDY6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 630.2092558239935, + "y": 2215.9458481058814, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 1221266099, + "groupIds": [ + "dslCd4W--VBvkfq-QteaB", + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1478, + "versionNonce": 525854941, + "isDeleted": false, + "id": "BOpT64nVCoJ73p4rYDYv_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 633.799842861248, + "y": 2219.3384072378726, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 1797078099, + "groupIds": [ + "dslCd4W--VBvkfq-QteaB", + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1447, + "versionNonce": 287137651, + "isDeleted": false, + "id": "Ug_7bg7bRG6_hxcE_RkHo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 637.4545909065534, + "y": 2234.1202986183566, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 326646259, + "groupIds": [ + "yxQY6HQUdA4DEwLpWCmUq", + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1452, + "versionNonce": 562087229, + "isDeleted": false, + "id": "nZRsXN7RVKC5tnAL-GOwX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 642.9295598227052, + "y": 2228.6079336431017, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 518161299, + "groupIds": [ + "yxQY6HQUdA4DEwLpWCmUq", + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1624, + "versionNonce": 1204222227, + "isDeleted": false, + "id": "H9Kx8KlaQIiwoduDRflF-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 639.9543974905025, + "y": 2231.29989424777, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 93493555, + "groupIds": [ + "yxQY6HQUdA4DEwLpWCmUq", + "gh-8zRc6RI71mKBvliDbF", + "Ah-NAposoI2CAcYtObdBl" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059825745, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1536, + "versionNonce": 1863856275, + "isDeleted": false, + "id": "OCP9Q4gw75Civj_P3y4QB", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 589.0149766134494, + "y": 2323.0800893278024, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 286.50895203755545, + "height": 171.5890064842986, + "seed": 769560691, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "70u91zjSNaUmq-FsZjQeb" + } + ], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1659, + "versionNonce": 1392900435, + "isDeleted": false, + "id": "70u91zjSNaUmq-FsZjQeb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 702.9725776322272, + "y": 2328.0800893278024, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "width": 58.59375, + "height": 24, + "seed": 2000292371, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059848410, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "vpn-b", + "textAlign": "center", + "verticalAlign": "top", + "containerId": "OCP9Q4gw75Civj_P3y4QB", + "originalText": "vpn-b", + "lineHeight": 1.2, + "baseline": 20 + }, + { + "type": "line", + "version": 1597, + "versionNonce": 1264412627, + "isDeleted": false, + "id": "2eH4g-jMpfFJyDf55YYpD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 858.8521671914804, + "y": 2403.3066602598788, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 641028019, + "groupIds": [ + "9MNOX0vHevE_J2DWlHA2m" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 7.940775652730609, + 7.836427741431539 + ], + [ + 3.129717769098604, + 8.044191549716741 + ], + [ + 3.3503310394194927, + 12.793832431341501 + ], + [ + -3.230375314901173, + 12.807449434576053 + ], + [ + -3.110447002568436, + 7.99620309216759 + ], + [ + -7.9552492867675895, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1680, + "versionNonce": 1638331763, + "isDeleted": false, + "id": "xhJ3VlVQQZ-y3cRNAnt9g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 3.141592653589793, + "x": 858.5979218754563, + "y": 2422.2062277165273, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498195, + "height": 12.807449434576053, + "seed": 217506131, + "groupIds": [ + "9MNOX0vHevE_J2DWlHA2m" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1766, + "versionNonce": 1051578131, + "isDeleted": false, + "id": "sGiNjbQFppIWDzBrZ4JLk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 4.71238898038469, + "x": 868.2242662253219, + "y": 2412.9318837723363, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 1960132339, + "groupIds": [ + "9MNOX0vHevE_J2DWlHA2m" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1865, + "versionNonce": 887649459, + "isDeleted": false, + "id": "X1tvyccO6F8FWLkzuFiII", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 849.2146609212085, + "y": 2413.019580187974, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 15.896024939498197, + "height": 12.807449434576053, + "seed": 945219731, + "groupIds": [ + "9MNOX0vHevE_J2DWlHA2m" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -7.9407756527306095, + 7.836427741431539 + ], + [ + -3.129717769098604, + 8.044191549716741 + ], + [ + -3.3503310394194914, + 12.793832431341501 + ], + [ + 3.230375314901172, + 12.807449434576053 + ], + [ + 3.1104470025684363, + 7.99620309216759 + ], + [ + 7.955249286767588, + 8.09930374901842 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1288, + "versionNonce": 66938451, + "isDeleted": false, + "id": "NeSUmiOzS8vf72BwJ1-cZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 865.567672076494, + "y": 2448.698614238245, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 13.709532316968268, + "height": 13.891881189304865, + "seed": 489840179, + "groupIds": [ + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.05157250871858333, + 5.337183467876706 + ], + [ + -12.103991954322073, + 5.292187876055851 + ], + [ + -11.93736250588609, + 6.9588971209408905 + ], + [ + 0.08328391343613158, + 6.831468467275338 + ], + [ + 0.08101813593913357, + 13.218311281604404 + ], + [ + 1.6055403626461942, + 13.261230700739738 + ], + [ + 1.4974324392689604, + -0.630650488565126 + ], + [ + 0.051918537499509206, + -0.4099220472977767 + ] + ] + }, + { + "type": "rectangle", + "version": 1149, + "versionNonce": 851649523, + "isDeleted": false, + "id": "_Qb7mcfWICxgukqPcBMwl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 863.8586990427524, + "y": 2443.9383877056157, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1850613715, + "groupIds": [ + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1193, + "versionNonce": 692071827, + "isDeleted": false, + "id": "49PtbwzqvhU5Y_Mm3T1ap", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 863.8138717252012, + "y": 2460.5663030602977, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1438690675, + "groupIds": [ + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1215, + "versionNonce": 178979635, + "isDeleted": false, + "id": "jNGaQLPuxvkc-3HJ3nrDn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 849.3742684517464, + "y": 2452.2032021858836, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.207202259436818, + "height": 5.207202259436818, + "seed": 1993377555, + "groupIds": [ + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1331, + "versionNonce": 1332356307, + "isDeleted": false, + "id": "A-JVJ4IDbOT3T2kJ3ZveR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 857.9163171621893, + "y": 2452.511454578184, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 4.799876613026025, + "height": 4.799876613026024, + "seed": 1207184563, + "groupIds": [ + "Wa-ia71skhXThVr1Ufxzu", + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 1276, + "versionNonce": 521409139, + "isDeleted": false, + "id": "Sj2i3J_3JsUEzY1RHgClt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 858.780627140164, + "y": 2453.3757645561586, + "strokeColor": "#1864ab", + "backgroundColor": "white", + "width": 3.071256657077243, + "height": 3.0712566570772424, + "seed": 751967827, + "groupIds": [ + "Wa-ia71skhXThVr1Ufxzu", + "lo0Tiy2FccxVELkQh5UKU" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1147, + "versionNonce": 1785678867, + "isDeleted": false, + "id": "x46LdZDq1sK-cwS7K2tbb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 608.1242645469102, + "y": 2384.5788258613125, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 1346427891, + "groupIds": [ + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "SrDmM1v7D1GW60VDU_ooR" + } + ], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 874, + "versionNonce": 475444701, + "isDeleted": false, + "id": "SrDmM1v7D1GW60VDU_ooR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 664.7911670236288, + "y": 2411.5788258613125, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 128.90625, + "height": 48, + "seed": 1044833683, + "groupIds": [ + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059857588, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "vpn-b\n10.2.0.0/16", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "x46LdZDq1sK-cwS7K2tbb", + "originalText": "vpn-b\n10.2.0.0/16", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1448, + "versionNonce": 21209939, + "isDeleted": false, + "id": "u4Jfc4VMCf2ht14NZe4ci", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 622.2294009308608, + "y": 2416.0244303997156, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1041939251, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1440, + "versionNonce": 104448243, + "isDeleted": false, + "id": "Br6eZTo7t1KJXmgGwz5C_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 622.1766809967472, + "y": 2423.313985203264, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1814224083, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1468, + "versionNonce": 1843079827, + "isDeleted": false, + "id": "DM2ufRyKBC-eUMfDqxFca", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 630.1039945710228, + "y": 2400.786413999255, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 334875251, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1511, + "versionNonce": 1558077491, + "isDeleted": false, + "id": "kYPceQpr_oiVhEuPtKeb3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 637.4672710581395, + "y": 2400.874227949091, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1247413267, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1518, + "versionNonce": 489284051, + "isDeleted": false, + "id": "m1-AJ8KG7_0MKJ7CdZaWU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 644.6507085176701, + "y": 2400.866602497172, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1195772339, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1526, + "versionNonce": 2010394483, + "isDeleted": false, + "id": "Ld9sEsTr2mt6VK9f51FyN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 629.9776530349915, + "y": 2430.914478298128, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2145409875, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1568, + "versionNonce": 1327745299, + "isDeleted": false, + "id": "hdENQDAYlZcx-Y2tm3FVq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 637.3409295221078, + "y": 2431.017797205221, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 8354035, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1575, + "versionNonce": 2022649523, + "isDeleted": false, + "id": "v_EfdESSk9-frBDB5RoAr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 644.5243669816374, + "y": 2431.010171753302, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 111796883, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1457, + "versionNonce": 1455218771, + "isDeleted": false, + "id": "cXvb7Aj6NXkDEJ6SkxJad", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 652.1410810024923, + "y": 2408.755506369888, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1528174643, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1500, + "versionNonce": 864247283, + "isDeleted": false, + "id": "Qu-7sBMmx0D1vp0FUyu0Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 652.2757601098803, + "y": 2416.2630803884117, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1806342611, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1492, + "versionNonce": 1508452243, + "isDeleted": false, + "id": "jutpG8LrSjEQPiq0rui1N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 652.2230401757662, + "y": 2423.5526351919602, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 629008243, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1404, + "versionNonce": 1881455923, + "isDeleted": false, + "id": "7jbP2X8VJO0t3-BKS8lJU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 622.0947218234734, + "y": 2408.5168563811917, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 248938771, + "groupIds": [ + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1661, + "versionNonce": 295476947, + "isDeleted": false, + "id": "0plkdLt4TdYzhp6B-XXBz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 627.8806999488489, + "y": 2405.177752398517, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 556459699, + "groupIds": [ + "Nh39oWl6XeR9XxceuHasT", + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1540, + "versionNonce": 686247027, + "isDeleted": false, + "id": "yOpWHbaA-Ua3Cl2vrjXf_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 631.4712869861033, + "y": 2408.570311530508, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 1663146067, + "groupIds": [ + "Nh39oWl6XeR9XxceuHasT", + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1509, + "versionNonce": 164316691, + "isDeleted": false, + "id": "sz68YdrqzYLxm9PXR01O_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 635.1260350314088, + "y": 2423.352202910992, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 1116804595, + "groupIds": [ + "p6Di7xYrPJhVu1-nq1QRP", + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1514, + "versionNonce": 1262422963, + "isDeleted": false, + "id": "WkBLanBBNbKPGoI2AypQ0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 640.6010039475606, + "y": 2417.8398379357373, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 780132243, + "groupIds": [ + "p6Di7xYrPJhVu1-nq1QRP", + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1686, + "versionNonce": 1634278739, + "isDeleted": false, + "id": "DkvZgauujAiVmZkjYG2U5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 637.6258416153579, + "y": 2420.531798540406, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1898214707, + "groupIds": [ + "p6Di7xYrPJhVu1-nq1QRP", + "cuAhBAkSU23K0v96qczrk", + "Ms51rkF5yFOD8ASz3QYec" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059839395, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 1058, + "versionNonce": 447806333, + "isDeleted": false, + "id": "uWtU_FeLRedA51Gtav-m6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1166.0680281207106, + "y": 1899.5205212385947, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 190.57315247671846, + "height": 80, + "seed": 365105789, + "groupIds": [ + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "bRk7mVnU1nhCd5z9rwVCO" + } + ], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 778, + "versionNonce": 530354877, + "isDeleted": false, + "id": "bRk7mVnU1nhCd5z9rwVCO", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1199.297430597429, + "y": 1926.5205212385947, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "width": 152.34375, + "height": 48, + "seed": 538295005, + "groupIds": [ + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059881545, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": "ext\n10.255.0.0/16", + "textAlign": "right", + "verticalAlign": "bottom", + "containerId": "uWtU_FeLRedA51Gtav-m6", + "originalText": "ext\n10.255.0.0/16", + "lineHeight": 1.2, + "baseline": 44 + }, + { + "type": "rectangle", + "version": 1359, + "versionNonce": 1576796221, + "isDeleted": false, + "id": "1LyC5uLjAwuGz_4BmJBRa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1180.1731645046611, + "y": 1930.966125776997, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 783570749, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1351, + "versionNonce": 1449848989, + "isDeleted": false, + "id": "YRgHgSzp8hnD1v27C0vN5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1180.120444570547, + "y": 1938.2556805805455, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1006659485, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1379, + "versionNonce": 1482478845, + "isDeleted": false, + "id": "INCx1zS8fJSD1YFkxo29I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1188.047758144823, + "y": 1915.7281093765362, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 2049666045, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1422, + "versionNonce": 525544797, + "isDeleted": false, + "id": "OYZGFZ9gYI2f6o3qeCdO4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1195.4110346319394, + "y": 1915.8159233263725, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1496769629, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1429, + "versionNonce": 2057271741, + "isDeleted": false, + "id": "nydylK60ZtAOVRmY3Mjkf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1202.5944720914704, + "y": 1915.8082978744535, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1291079869, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1437, + "versionNonce": 1399011869, + "isDeleted": false, + "id": "Hgch8rBsMsiGVjn6v3OHP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1187.9214166087913, + "y": 1945.8561736754093, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1392849181, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1479, + "versionNonce": 1922035325, + "isDeleted": false, + "id": "-kxMV7UyOqOZwbOiIuZZe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1195.2846930959076, + "y": 1945.9594925825024, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 953877885, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1486, + "versionNonce": 115807965, + "isDeleted": false, + "id": "MuVLkLsR_GjGBhCSkNxNP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1202.4681305554377, + "y": 1945.9518671305834, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 565661149, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1368, + "versionNonce": 1794782013, + "isDeleted": false, + "id": "G_ZnbOzkmxIgYASxCrvlu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1210.0848445762922, + "y": 1923.6972017471692, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1286310461, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1411, + "versionNonce": 724222877, + "isDeleted": false, + "id": "IvqYLmdUlIdx1xpSax3P5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1210.2195236836806, + "y": 1931.204775765693, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 446249629, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1403, + "versionNonce": 1269450749, + "isDeleted": false, + "id": "5EQTrkF-BCpvd8DCo1XIR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1210.1668037495665, + "y": 1938.4943305692416, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 1412554493, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1315, + "versionNonce": 1316634717, + "isDeleted": false, + "id": "vovK35CZ4OV9cs_6CCMtH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1180.0384853972737, + "y": 1923.458551758473, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 6.390428952916756, + "height": 3.559017050423508, + "seed": 804714333, + "groupIds": [ + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1572, + "versionNonce": 2037132477, + "isDeleted": false, + "id": "VSDMkda27iGkBjWqU8t89", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1185.8244635226492, + "y": 1920.1194477757983, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 25.68701803825022, + "height": 25.322961410864238, + "seed": 406455229, + "groupIds": [ + "U9e5QiMKwSvBkmKVjYK8H", + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1451, + "versionNonce": 1545702685, + "isDeleted": false, + "id": "ZcgKHNHtSCJPs9sggCBCA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1189.4150505599036, + "y": 1923.5120069077896, + "strokeColor": "#669df6", + "backgroundColor": "white", + "width": 18.415416343106916, + "height": 18.197540514342283, + "seed": 823952413, + "groupIds": [ + "U9e5QiMKwSvBkmKVjYK8H", + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 1420, + "versionNonce": 369877373, + "isDeleted": false, + "id": "87V2aMASqpShAwPIXGRBz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.0697986052091, + "y": 1938.2938982882736, + "strokeColor": "#669df6", + "backgroundColor": "#aecbfa", + "width": 11.005694271511862, + "height": 10.941584275697766, + "seed": 512751741, + "groupIds": [ + "CvneiRXyEi3pl1f9QoKrJ", + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11767292537006607, + -10.939877113695731 + ], + [ + 10.888021346141796, + -10.941584275697766 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1425, + "versionNonce": 1550625245, + "isDeleted": false, + "id": "1DF0gduuuG2WyREp88c6o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1198.5447675213609, + "y": 1932.7815333130186, + "strokeColor": "#1864ab", + "backgroundColor": "#4285f4", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 173400285, + "groupIds": [ + "CvneiRXyEi3pl1f9QoKrJ", + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1597, + "versionNonce": 1079338557, + "isDeleted": false, + "id": "UUoDBdjiC8ngT0MPFfyqx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5707963267948957, + "x": 1195.5696051891582, + "y": 1935.4734939176872, + "strokeColor": "#1864ab", + "backgroundColor": "#669df6", + "width": 5.716009503705499, + "height": 10.677776743237455, + "seed": 1778367805, + "groupIds": [ + "CvneiRXyEi3pl1f9QoKrJ", + "dpH6lzlECxP1gDBq5jLOz", + "ji5b1nS9NfGYW-gMtOe_o" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1703059875211, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.459069112195784, + 5.178594135612063 + ], + [ + 5.716009503705499, + -5.499182607625391 + ], + [ + 0, + 0 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.png b/blueprints/networking/vpc-connectivity-lab/diagram.png new file mode 100644 index 000000000..6522af033 Binary files /dev/null and b/blueprints/networking/vpc-connectivity-lab/diagram.png differ diff --git a/blueprints/networking/vpc-connectivity-lab/diagram.svg b/blueprints/networking/vpc-connectivity-lab/diagram.svg new file mode 100644 index 000000000..f3836c7a8 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/diagram.svg @@ -0,0 +1,21 @@ + + + + + + + + vpn-ahubextpeering-apeering-bhub-b10.0.2.0/24hub-nva10.0.0.0/24hub-a10.0.1.0/24peering-a10.3.0.0/16peering-b10.4.0.0/16vpn-a10.1.0.0/16vpn-bvpn-b10.2.0.0/16ext10.255.0.0/16 \ No newline at end of file diff --git a/blueprints/networking/vpc-connectivity-lab/dns-hub.tf b/blueprints/networking/vpc-connectivity-lab/dns-hub.tf new file mode 100644 index 000000000..ab1553981 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/dns-hub.tf @@ -0,0 +1,42 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description DNS setup. + +module "hub-dns" { + source = "../../../modules/dns" + project_id = module.project.project_id + name = "${var.prefix}-example" + zone_config = { + domain = "example." + private = { + client_networks = [ + module.hub-vpc.self_link, + module.ext-vpc.self_link, + module.spoke-peering-a-vpc.self_link, + module.spoke-peering-b-vpc.self_link, + module.spoke-vpn-a-vpc.self_link, + module.spoke-vpn-b-vpc.self_link, + ] + } + } + recordsets = merge({ + "A localhost" = { records = ["127.0.0.1"] } + }, + var.test_vms + ? { for instance, _ in local.test-vms : "A ${instance}" => { records = [module.test-vms[instance].internal_ip] } } + : {}) +} diff --git a/blueprints/networking/vpc-connectivity-lab/main.tf b/blueprints/networking/vpc-connectivity-lab/main.tf new file mode 100644 index 000000000..92b04da4a --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/main.tf @@ -0,0 +1,32 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Project setup. + +module "project" { + source = "../../../modules/project" + name = var.project_id + parent = try(var.project_create_config.parent_id, null) + billing_account = try(var.project_create_config.billing_account_id, null) + project_create = try(var.project_create_config.billing_account_id, null) != null + prefix = var.prefix + services = [ + "compute.googleapis.com", + "dns.googleapis.com", + "networkconnectivity.googleapis.com", + "stackdriver.googleapis.com", + ] +} diff --git a/blueprints/networking/vpc-connectivity-lab/nva.tf b/blueprints/networking/vpc-connectivity-lab/nva.tf new file mode 100644 index 000000000..812315804 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/nva.tf @@ -0,0 +1,117 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + network_interfaces = [ + { + addresses = null + name = "ext" + nat = false + enable_masquerading = true + network = module.ext-vpc.self_link + routes = [var.ip_ranges.ext, "0.0.0.0/0"] + subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"] + }, + { + addresses = null + name = "hub" + nat = false + network = module.hub-vpc.self_link + routes = [var.ip_ranges.int] + subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"] + } + ] +} + +module "cos-nva" { + source = "../../../modules/cloud-config-container/simple-nva" + enable_health_checks = true + network_interfaces = local.network_interfaces +} + +module "nva-a" { + source = "../../../modules/compute-vm" + project_id = module.project.project_id + zone = "${var.region}-a" + name = "cos-nva-a" + network_interfaces = local.network_interfaces + can_ip_forward = true + instance_type = "e2-micro" + options = { + spot = true + termination_action = "STOP" + } + metadata = { + user-data = module.cos-nva.cloud_config + google-logging-enabled = true + } + boot_disk = { + initialize_params = { + image = "projects/cos-cloud/global/images/family/cos-stable" + type = "pd-ssd" + size = 10 + } + } + tags = ["nva", "ssh"] +} + +module "nva-b" { + source = "../../../modules/compute-vm" + project_id = module.project.project_id + zone = "${var.region}-b" + name = "cos-nva-b" + network_interfaces = local.network_interfaces + can_ip_forward = true + instance_type = "e2-micro" + options = { + spot = true + termination_action = "STOP" + } + metadata = { + user-data = module.cos-nva.cloud_config + google-logging-enabled = true + } + boot_disk = { + initialize_params = { + image = "projects/cos-cloud/global/images/family/cos-stable" + type = "pd-ssd" + size = 10 + } + } + tags = ["nva", "ssh"] +} + +resource "google_compute_instance_group" "nva-a" { + name = "nva-ig-a" + description = "NVA instance group for the primary region, zone a." + zone = "${var.region}-a" + project = module.project.project_id + network = module.ext-vpc.self_link + instances = toset([ + module.nva-a.self_link, + ]) +} + +resource "google_compute_instance_group" "nva-b" { + name = "nva-ig-b" + description = "NVA instance group for the primary region, zone b." + zone = "${var.region}-b" + project = module.project.project_id + network = module.ext-vpc.self_link + instances = toset([ + module.nva-b.self_link, + ]) +} diff --git a/blueprints/networking/vpc-connectivity-lab/outputs.tf b/blueprints/networking/vpc-connectivity-lab/outputs.tf new file mode 100644 index 000000000..0b4adf5ca --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/outputs.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "ping_commands" { + description = "Ping commands that can be run to check VPC reachability." + value = var.test_vms ? join("\n", [for instance, _ in local.test-vms : "ping -c 1 ${instance}.example"]) : "" +} diff --git a/blueprints/networking/vpc-connectivity-lab/test-resources.tf b/blueprints/networking/vpc-connectivity-lab/test-resources.tf new file mode 100644 index 000000000..b04a55ffb --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/test-resources.tf @@ -0,0 +1,82 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + test-vms = { + ext = { + network = module.ext-vpc.self_link + subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"] + } + hub-a = { + network = module.hub-vpc.self_link + subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-a"] + } + hub-b = { + network = module.hub-vpc.self_link + subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-b"] + } + spoke-vpn-a = { + network = module.spoke-vpn-a-vpc.self_link + subnetwork = module.spoke-vpn-a-vpc.subnet_self_links["${var.region}/vpn-a"] + }, + spoke-peering-a = { + network = module.spoke-peering-a-vpc.self_link + subnetwork = module.spoke-peering-a-vpc.subnet_self_links["${var.region}/peering-a"] + }, + spoke-vpn-b = { + network = module.spoke-vpn-b-vpc.self_link + subnetwork = module.spoke-vpn-b-vpc.subnet_self_links["${var.region}/vpn-b"] + }, + spoke-peering-b = { + network = module.spoke-peering-b-vpc.self_link + subnetwork = module.spoke-peering-b-vpc.subnet_self_links["${var.region}/peering-b"] + }, + } +} + +module "test-vms" { + for_each = var.test_vms ? local.test-vms : {} + source = "../../../modules/compute-vm" + project_id = module.project.project_id + zone = "${var.region}-a" + name = "test-vm-${each.key}" + network_interfaces = [{ + network = each.value.network + # change the subnet name to match the values you are actually using + subnetwork = each.value.subnetwork + }] + instance_type = "e2-micro" + tags = ["ssh"] + boot_disk = { + initialize_params = { + image = "projects/debian-cloud/global/images/family/debian-11" + } + } + options = { + spot = true + termination_action = "STOP" + } + metadata = { + startup-script = < /etc/apt/sources.list + echo "deb https://packages.cloud.google.com/mirror/cloud-apt/$DEB_VERSION-security $DEB_VERSION-security main" >> /etc/apt/sources.list + echo "deb https://packages.cloud.google.com/mirror/cloud-apt/$DEB_VERSION-updates $DEB_VERSION-updates main" >> /etc/apt/sources.list + apt update + apt install -y iputils-ping bind9-dnsutils + EOF + } +} diff --git a/blueprints/networking/vpc-connectivity-lab/variables.tf b/blueprints/networking/vpc-connectivity-lab/variables.tf new file mode 100644 index 000000000..fd2be1ecb --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/variables.tf @@ -0,0 +1,72 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +variable "ip_ranges" { + description = "Subnet/Routes IP CIDR ranges." + type = map(string) + default = { + ext = "10.255.0.0/16" + hub-a = "10.0.1.0/24" + hub-all = "10.0.0.0/16" + hub-b = "10.0.2.0/24" + hub-nva = "10.0.0.0/24" + int = "10.0.0.0/9" + peering-a = "10.3.0.0/24" + peering-b = "10.4.0.0/24" + rfc1918_10 = "10.0.0.0/8" + rfc1918_172 = "172.16.0.0/12" + rfc1918_192 = "192.168.0.0/16" + vpn-a = "10.1.0.0/24" + vpn-b = "10.2.0.0/24" + } +} + +variable "prefix" { + description = "Prefix used for resource names." + type = string + validation { + condition = var.prefix != "" + error_message = "Prefix cannot be empty." + } +} + +variable "project_create_config" { + description = "Populate with billing account id to trigger project creation." + type = object({ + billing_account_id = string + parent_id = string + }) + default = null +} + +variable "project_id" { + description = "Project id for all resources." + type = string + default = "net-test-02" +} + +variable "region" { + description = "Region used to deploy resources." + type = string + default = "europe-west8" +} + +variable "test_vms" { + description = "Enable the creation of test resources." + type = bool + default = true +} + diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf b/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf new file mode 100644 index 000000000..b52ef9aba --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-ext.tf @@ -0,0 +1,105 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description External VPC. + +module "ext-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "ext" + mtu = 1500 + subnets = [ + { + name = "ext" + region = var.region + ip_cidr_range = var.ip_ranges.ext + } + ] +} + +module "nat" { + source = "../../../modules/net-cloudnat" + project_id = module.project.project_id + router_network = module.ext-vpc.name + region = var.region + name = "default" +} + +module "ext-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.ext-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + ssh_ranges = ["35.235.240.0/20", "35.191.0.0/16", "130.211.0.0/22", "209.85.152.0/22", "209.85.204.0/22"] + } +} + +resource "google_compute_route" "ext-rfc1918-10" { + project = module.project.project_id + network = module.ext-vpc.name + name = "ext-rfc1918-10" + description = "Terraform-managed." + dest_range = var.ip_ranges.rfc1918_10 + priority = 1000 + next_hop_ilb = module.ext-lb.forwarding_rule_self_links[""] +} + +module "ext-addresses" { + source = "../../../modules/net-address" + project_id = module.project.project_id + internal_addresses = { + ext = { + region = var.region + subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"] + address = cidrhost(module.ext-vpc.subnet_ips["${var.region}/ext"], -3) + } + } +} + +module "ext-lb" { + source = "../../../modules/net-lb-int" + project_id = module.project.project_id + region = var.region + name = "ext-lb" + vpc_config = { + network = module.ext-vpc.name + subnetwork = module.ext-vpc.subnet_self_links["${var.region}/ext"] + } + forwarding_rules_config = { + "" = { + global_access = false + address = module.ext-addresses.internal_addresses["ext"].address + } + } + backends = [ + { + failover = false + group = google_compute_instance_group.nva-a.id + balancing_mode = "CONNECTION" + }, + { + failover = false + group = google_compute_instance_group.nva-b.id + balancing_mode = "CONNECTION" + }, + ] + health_check_config = { + tcp = { + port = 22 + } + } +} diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf b/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf new file mode 100644 index 000000000..34546b851 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-hub.tf @@ -0,0 +1,222 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +# tfdoc:file:description Internal Hub VPC. + +module "hub-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "hub" + mtu = 1500 + subnets = [ + { + name = "hub-nva" + region = var.region + ip_cidr_range = var.ip_ranges.hub-nva + }, + { + name = "hub-a" + region = var.region + ip_cidr_range = var.ip_ranges.hub-a + }, + { + name = "hub-b" + region = var.region + ip_cidr_range = var.ip_ranges.hub-b + }, + ] + policy_based_routes = { + nva-skip = { + use_default_routing = true + priority = 100 + target = { + tags = ["nva"] + } + } + default-nva = { + next_hop_ilb_ip = module.hub-lb.forwarding_rule_addresses[""] + priority = 101 + filter = { + src_range = var.ip_ranges.hub-all + dest_range = "0.0.0.0/0" + } + } + } +} + +module "hub-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.hub-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + ssh_ranges = ["35.235.240.0/20", "35.191.0.0/16", "130.211.0.0/22", "209.85.152.0/22", "209.85.204.0/22"] + } +} + +resource "google_compute_route" "hub-0-0" { + project = module.project.project_id + network = module.hub-vpc.name + name = "hub-0-0" + description = "Terraform-managed." + dest_range = "0.0.0.0/0" + priority = 1000 + next_hop_ilb = module.hub-lb.forwarding_rule_self_links[""] +} + +module "hub-addresses" { + source = "../../../modules/net-address" + project_id = module.project.project_id + internal_addresses = { + hub = { + region = var.region + subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"] + address = cidrhost(module.hub-vpc.subnet_ips["${var.region}/hub-nva"], -3) + } + } +} + +module "hub-lb" { + source = "../../../modules/net-lb-int" + project_id = module.project.project_id + region = var.region + name = "hub-lb" + vpc_config = { + network = module.hub-vpc.name + subnetwork = module.hub-vpc.subnet_self_links["${var.region}/hub-nva"] + } + forwarding_rules_config = { + "" = { + global_access = false + address = module.hub-addresses.internal_addresses["hub"].address + } + } + + backends = [ + { + failover = false + group = google_compute_instance_group.nva-a.id + balancing_mode = "CONNECTION" + }, + { + failover = false + group = google_compute_instance_group.nva-b.id + balancing_mode = "CONNECTION" + }, + ] + health_check_config = { + tcp = { + port = 22 + } + } +} + + +module "vpn-hub-a" { + source = "../../../modules/net-vpn-ha" + project_id = module.project.project_id + region = var.region + network = module.hub-vpc.self_link + name = "hub-a" + peer_gateways = { + default = { gcp = module.vpn-a-hub.self_link } + } + router_config = { + asn = 64513 + custom_advertise = { + all_subnets = false + ip_ranges = { + "0.0.0.0/0" = "default" + } + } + } + tunnels = { + remote-0 = { + bgp_peer = { + address = "169.254.1.2" + asn = 64514 + } + bgp_session_range = "169.254.1.1/30" + shared_secret = module.vpn-a-hub.random_secret + vpn_gateway_interface = 0 + } + remote-1 = { + bgp_peer = { + address = "169.254.2.2" + asn = 64514 + } + bgp_session_range = "169.254.2.1/30" + shared_secret = module.vpn-a-hub.random_secret + vpn_gateway_interface = 1 + } + } +} + +module "vpn-hub-b" { + source = "../../../modules/net-vpn-ha" + project_id = module.project.project_id + region = var.region + network = module.hub-vpc.self_link + name = "hub-b" + peer_gateways = { + default = { gcp = module.vpn-b-hub.self_link } + } + router_config = { + asn = 64513 + custom_advertise = { + all_subnets = false + ip_ranges = { + "0.0.0.0/0" = "default" + } + } + } + tunnels = { + remote-0 = { + bgp_peer = { + address = "169.254.1.6" + asn = 64515 + } + bgp_session_range = "169.254.1.5/30" + shared_secret = module.vpn-b-hub.random_secret + vpn_gateway_interface = 0 + } + remote-1 = { + bgp_peer = { + address = "169.254.2.6" + asn = 64515 + } + bgp_session_range = "169.254.2.5/30" + shared_secret = module.vpn-b-hub.random_secret + vpn_gateway_interface = 1 + } + } +} + +module "peering-hub-a" { + source = "../../../modules/net-vpc-peering" + prefix = "a" + local_network = module.hub-vpc.id + peer_network = module.spoke-peering-a-vpc.id +} + +module "peering-hub-b" { + source = "../../../modules/net-vpc-peering" + prefix = "b" + local_network = module.hub-vpc.id + peer_network = module.spoke-peering-b-vpc.id + depends_on = [module.spoke-peering-a-vpc.id] +} + diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf b/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf new file mode 100644 index 000000000..b1ba8cd02 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-peering-a.tf @@ -0,0 +1,48 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module "spoke-peering-a-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "peering-a" + mtu = 1500 + subnets = [ + { + name = "peering-a" + region = var.region + ip_cidr_range = var.ip_ranges.peering-a + + } + ] + routes = { + default = { + description = "Route to default." + dest_range = "0.0.0.0/0" + tags = null + next_hop_type = "ilb" + next_hop = module.hub-lb.forwarding_rule_addresses[""] + } + } +} + +module "peering-a-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.spoke-peering-a-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + } +} diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf b/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf new file mode 100644 index 000000000..961518a31 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-peering-b.tf @@ -0,0 +1,47 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module "spoke-peering-b-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "peering-b" + mtu = 1500 + subnets = [ + { + name = "peering-b" + region = var.region + ip_cidr_range = var.ip_ranges.peering-b + } + ] + routes = { + default = { + description = "Route to default." + dest_range = "0.0.0.0/0" + tags = null + next_hop_type = "ilb" + next_hop = module.hub-lb.forwarding_rule_addresses[""] + } + } +} + +module "peering-b-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.spoke-peering-b-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + } +} diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf new file mode 100644 index 000000000..d1aee2791 --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-a.tf @@ -0,0 +1,78 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module "spoke-vpn-a-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "vpn-a" + mtu = 1500 + subnets = [ + { + name = "vpn-a" + region = var.region + ip_cidr_range = var.ip_ranges.vpn-a + } + ] +} + +module "vpn-a-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.spoke-vpn-a-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + } +} + +module "vpn-a-hub" { + source = "../../../modules/net-vpn-ha" + project_id = module.project.project_id + region = var.region + network = module.spoke-vpn-a-vpc.self_link + name = "a-hub" + peer_gateways = { + default = { gcp = module.vpn-hub-a.self_link } + } + router_config = { + asn = 64514 + custom_advertise = { + all_subnets = false + ip_ranges = { + (var.ip_ranges.vpn-a) = "default" + } + } + } + tunnels = { + remote-0 = { + bgp_peer = { + address = "169.254.1.1" + asn = 64513 + } + bgp_session_range = "169.254.1.2/30" + vpn_gateway_interface = 0 + } + remote-1 = { + bgp_peer = { + address = "169.254.2.1" + asn = 64513 + } + bgp_session_range = "169.254.2.2/30" + vpn_gateway_interface = 1 + } + } +} + + diff --git a/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf new file mode 100644 index 000000000..a57a39d9f --- /dev/null +++ b/blueprints/networking/vpc-connectivity-lab/vpc-vpn-b.tf @@ -0,0 +1,76 @@ +/** + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module "spoke-vpn-b-vpc" { + source = "../../../modules/net-vpc" + project_id = module.project.project_id + name = "vpn-b" + mtu = 1500 + subnets = [ + { + name = "vpn-b" + region = var.region + ip_cidr_range = var.ip_ranges.vpn-b + } + ] +} + +module "vpn-b-firewall" { + source = "../../../modules/net-vpc-firewall" + project_id = module.project.project_id + network = module.spoke-vpn-b-vpc.name + default_rules_config = { + admin_ranges = [var.ip_ranges.rfc1918_10] + } +} + +module "vpn-b-hub" { + source = "../../../modules/net-vpn-ha" + project_id = module.project.project_id + region = var.region + network = module.spoke-vpn-b-vpc.self_link + name = "b-hub" + peer_gateways = { + default = { gcp = module.vpn-hub-b.self_link } + } + router_config = { + asn = 64515 + custom_advertise = { + all_subnets = false + ip_ranges = { + (var.ip_ranges.vpn-b) = "default" + } + } + } + tunnels = { + remote-0 = { + bgp_peer = { + address = "169.254.1.5" + asn = 64513 + } + bgp_session_range = "169.254.1.6/30" + vpn_gateway_interface = 0 + } + remote-1 = { + bgp_peer = { + address = "169.254.2.5" + asn = 64513 + } + bgp_session_range = "169.254.2.6/30" + vpn_gateway_interface = 1 + } + } +} diff --git a/default-versions.tf b/default-versions.tf index 4a2837182..5ec74cff3 100644 --- a/default-versions.tf +++ b/default-versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml b/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml index 2d92cce0b..56fb0719f 100644 --- a/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml +++ b/fast/stages-multitenant/0-bootstrap-tenant/templates/workflow-github.yaml @@ -28,11 +28,11 @@ env: FAST_SERVICE_ACCOUNT: ${service_account} FAST_WIF_PROVIDER: ${identity_provider} SSH_AUTH_SOCK: /tmp/ssh_agent.sock - %{~ if tf_providers_file != "" ~} TF_PROVIDERS_FILE: ${tf_providers_file} + %{~ if tf_var_files != [] ~} + TF_VAR_FILES: ${join("\n ", tf_var_files)} %{~ endif ~} - TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)} - TF_VERSION: 1.4.4 + TF_VERSION: 1.5.1 jobs: fast-pr: @@ -57,7 +57,7 @@ jobs: # set up authentication via Workload identity Federation - id: gcp-auth name: Authenticate to Google Cloud - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: workload_identity_provider: $${{ env.FAST_WIF_PROVIDER }} service_account: $${{ env.FAST_SERVICE_ACCOUNT }} @@ -73,15 +73,15 @@ jobs: - id: tf-config name: Copy Terraform output files run: | - %{~ if tf_providers_file != "" ~} gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./ - %{~ endif ~} + %{~ if tf_var_files != [] ~} gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./ for f in $${{env.TF_VAR_FILES}}; do ln -s "tfvars/$f" ./ done + %{~ endif ~} - id: tf-setup name: Set up Terraform @@ -97,8 +97,8 @@ jobs: terraform init -no-color - id: tf-validate - name: Terraform validate continue-on-error: true + name: Terraform validate run: terraform validate -no-color - id: tf-plan diff --git a/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml b/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml index 9266a134a..56fb0719f 100644 --- a/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml +++ b/fast/stages-multitenant/1-resman-tenant/templates/workflow-github.yaml @@ -29,8 +29,10 @@ env: FAST_WIF_PROVIDER: ${identity_provider} SSH_AUTH_SOCK: /tmp/ssh_agent.sock TF_PROVIDERS_FILE: ${tf_providers_file} - TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)} - TF_VERSION: 1.4.4 + %{~ if tf_var_files != [] ~} + TF_VAR_FILES: ${join("\n ", tf_var_files)} + %{~ endif ~} + TF_VERSION: 1.5.1 jobs: fast-pr: @@ -55,7 +57,7 @@ jobs: # set up authentication via Workload identity Federation - id: gcp-auth name: Authenticate to Google Cloud - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: workload_identity_provider: $${{ env.FAST_WIF_PROVIDER }} service_account: $${{ env.FAST_SERVICE_ACCOUNT }} @@ -73,11 +75,13 @@ jobs: run: | gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./ + %{~ if tf_var_files != [] ~} gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./ for f in $${{env.TF_VAR_FILES}}; do ln -s "tfvars/$f" ./ done + %{~ endif ~} - id: tf-setup name: Set up Terraform @@ -93,8 +97,8 @@ jobs: terraform init -no-color - id: tf-validate - name: Terraform validate continue-on-error: true + name: Terraform validate run: terraform validate -no-color - id: tf-plan diff --git a/fast/stages/0-bootstrap/README.md b/fast/stages/0-bootstrap/README.md index c10b2bf32..076586099 100644 --- a/fast/stages/0-bootstrap/README.md +++ b/fast/stages/0-bootstrap/README.md @@ -597,7 +597,7 @@ The `fast_features` variable consists of 4 toggles: | [organization](variables.tf#L235) | Organization details. | object({…}) | ✓ | | | | [prefix](variables.tf#L250) | Prefix used for resources that need unique names. Use 9 characters or less. | string | ✓ | | | | [bootstrap_user](variables.tf#L27) | Email of the nominal user running this stage for the first time. | string | | null | | -| [cicd_repositories](variables.tf#L33) | CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | | +| [cicd_repositories](variables.tf#L33) | CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | | | [custom_roles](variables.tf#L79) | Map of role names => list of permissions to additionally create at the organization level. | map(list(string)) | | {} | | | [factories_config](variables.tf#L86) | Configuration for the organization policies factory. | object({…}) | | {} | | | [fast_features](variables.tf#L96) | Selective control for top-level FAST features. | object({…}) | | {} | | diff --git a/fast/stages/0-bootstrap/identity-providers.tf b/fast/stages/0-bootstrap/identity-providers.tf index f648f965a..ca0783597 100644 --- a/fast/stages/0-bootstrap/identity-providers.tf +++ b/fast/stages/0-bootstrap/identity-providers.tf @@ -33,9 +33,10 @@ locals { "attribute.repository" = "assertion.repository" "attribute.repository_owner" = "assertion.repository_owner" "attribute.ref" = "assertion.ref" + "attribute.fast_sub" = "\"repo:\" + assertion.repository + \":ref:\" + assertion.ref" } issuer_uri = "https://token.actions.githubusercontent.com" - principal_tpl = "principal://iam.googleapis.com/%s/subject/repo:%s:ref:refs/heads/%s" + principal_tpl = "principalSet://iam.googleapis.com/%s/attribute.fast_sub/repo:%s:ref:refs/heads/%s" principalset_tpl = "principalSet://iam.googleapis.com/%s/attribute.repository/%s" } # https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#token-payload @@ -89,7 +90,7 @@ resource "google_iam_workload_identity_pool_provider" "default" { ? each.value.custom_settings.issuer_uri : try(each.value.issuer_uri, null) ) - # OIDC JWKs in JSON String format. If no value is provided, they key is + # OIDC JWKs in JSON String format. If no value is provided, they key is # fetched from the `.well-known` path for the issuer_uri jwks_json = each.value.custom_settings.jwks_json } diff --git a/fast/stages/0-bootstrap/templates/workflow-github.yaml b/fast/stages/0-bootstrap/templates/workflow-github.yaml index 5969f5a95..56fb0719f 100644 --- a/fast/stages/0-bootstrap/templates/workflow-github.yaml +++ b/fast/stages/0-bootstrap/templates/workflow-github.yaml @@ -32,7 +32,7 @@ env: %{~ if tf_var_files != [] ~} TF_VAR_FILES: ${join("\n ", tf_var_files)} %{~ endif ~} - TF_VERSION: 1.4.4 + TF_VERSION: 1.5.1 jobs: fast-pr: @@ -47,19 +47,6 @@ jobs: name: Checkout repository uses: actions/checkout@v3 -# # Print JWT token payload, useful for debugging -# - id: jwt-debug -# name: Print GITHUB_TOKEN payload -# shell: python -u {0} -# run: | -# import base64 -# import json -# -# token = '${{ secrets.GITHUB_TOKEN }}' -# payload_text = token.split('.')[1] -# payload = json.loads(base64.urlsafe_b64decode(payload_text + '=' * (4-len(payload_text) %4))) -# print(json.dumps(payload, indent=2)) - # set up SSH key authentication to the modules repository - id: ssh-config name: Configure SSH authentication diff --git a/fast/stages/0-bootstrap/variables.tf b/fast/stages/0-bootstrap/variables.tf index 9980c1189..a20c4465e 100644 --- a/fast/stages/0-bootstrap/variables.tf +++ b/fast/stages/0-bootstrap/variables.tf @@ -34,16 +34,16 @@ variable "cicd_repositories" { description = "CI/CD repository configuration. Identity providers reference keys in the `federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed." type = object({ bootstrap = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) resman = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) }) default = null diff --git a/fast/stages/1-resman/README.md b/fast/stages/1-resman/README.md index 8cbaa7f5c..e1a4637a5 100644 --- a/fast/stages/1-resman/README.md +++ b/fast/stages/1-resman/README.md @@ -357,7 +357,7 @@ Due to its simplicity, this stage lends itself easily to customizations: adding | [billing_account](variables.tf#L39) | Billing account id. If billing account is not part of the same org set `is_org_level` to `false`. To disable handling of billing IAM roles set `no_iam` to `true`. | object({…}) | ✓ | | 0-bootstrap | | [organization](variables.tf#L198) | Organization details. | object({…}) | ✓ | | 0-bootstrap | | [prefix](variables.tf#L214) | Prefix used for resources that need unique names. Use 9 characters or less. | string | ✓ | | 0-bootstrap | -| [cicd_repositories](variables.tf#L50) | CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | | +| [cicd_repositories](variables.tf#L50) | CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed. | object({…}) | | null | | | [custom_roles](variables.tf#L132) | Custom roles defined at the org level, in key => id format. | object({…}) | | null | 0-bootstrap | | [fast_features](variables.tf#L141) | Selective control for top-level FAST features. | object({…}) | | {} | 0-0-bootstrap | | [groups](variables.tf#L155) | Group names or emails to grant organization-level permissions. If just the name is provided, the default organization domain is assumed. | object({…}) | | {} | 0-bootstrap | diff --git a/fast/stages/1-resman/templates/workflow-github.yaml b/fast/stages/1-resman/templates/workflow-github.yaml index 1d8a555a1..56fb0719f 100644 --- a/fast/stages/1-resman/templates/workflow-github.yaml +++ b/fast/stages/1-resman/templates/workflow-github.yaml @@ -29,8 +29,10 @@ env: FAST_WIF_PROVIDER: ${identity_provider} SSH_AUTH_SOCK: /tmp/ssh_agent.sock TF_PROVIDERS_FILE: ${tf_providers_file} - TF_VAR_FILES: ${tf_var_files == [] ? "''" : join("\n ", tf_var_files)} - TF_VERSION: 1.4.4 + %{~ if tf_var_files != [] ~} + TF_VAR_FILES: ${join("\n ", tf_var_files)} + %{~ endif ~} + TF_VERSION: 1.5.1 jobs: fast-pr: @@ -73,11 +75,13 @@ jobs: run: | gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/providers/$${{env.TF_PROVIDERS_FILE}}" ./ + %{~ if tf_var_files != [] ~} gcloud alpha storage cp -r \ "gs://$${{env.FAST_OUTPUTS_BUCKET}}/tfvars" ./ for f in $${{env.TF_VAR_FILES}}; do ln -s "tfvars/$f" ./ done + %{~ endif ~} - id: tf-setup name: Set up Terraform diff --git a/fast/stages/1-resman/variables.tf b/fast/stages/1-resman/variables.tf index 849fc6ef7..d3099f456 100644 --- a/fast/stages/1-resman/variables.tf +++ b/fast/stages/1-resman/variables.tf @@ -51,52 +51,52 @@ variable "cicd_repositories" { description = "CI/CD repository configuration. Identity providers reference keys in the `automation.federated_identity_providers` variable. Set to null to disable, or set individual repositories to null if not needed." type = object({ data_platform_dev = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) data_platform_prod = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) gke_dev = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) gke_prod = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) networking = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) project_factory_dev = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) project_factory_prod = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) security = optional(object({ - branch = string - identity_provider = string name = string type = string + branch = optional(string) + identity_provider = optional(string) })) }) default = null diff --git a/modules/__experimental/alloydb-instance/versions.tf b/modules/__experimental/alloydb-instance/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/__experimental/alloydb-instance/versions.tf +++ b/modules/__experimental/alloydb-instance/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/__experimental/net-neg/versions.tf b/modules/__experimental/net-neg/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/__experimental/net-neg/versions.tf +++ b/modules/__experimental/net-neg/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/__experimental/project-iam-magic/versions.tf b/modules/__experimental/project-iam-magic/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/__experimental/project-iam-magic/versions.tf +++ b/modules/__experimental/project-iam-magic/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/api-gateway/versions.tf b/modules/api-gateway/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/api-gateway/versions.tf +++ b/modules/api-gateway/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/apigee/versions.tf b/modules/apigee/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/apigee/versions.tf +++ b/modules/apigee/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/artifact-registry/versions.tf b/modules/artifact-registry/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/artifact-registry/versions.tf +++ b/modules/artifact-registry/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/bigquery-dataset/versions.tf b/modules/bigquery-dataset/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/bigquery-dataset/versions.tf +++ b/modules/bigquery-dataset/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/bigtable-instance/versions.tf b/modules/bigtable-instance/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/bigtable-instance/versions.tf +++ b/modules/bigtable-instance/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/billing-account/versions.tf b/modules/billing-account/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/billing-account/versions.tf +++ b/modules/billing-account/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/binauthz/versions.tf b/modules/binauthz/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/binauthz/versions.tf +++ b/modules/binauthz/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/__need_fixing/onprem/versions.tf b/modules/cloud-config-container/__need_fixing/onprem/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/__need_fixing/onprem/versions.tf +++ b/modules/cloud-config-container/__need_fixing/onprem/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/__need_fixing/squid/versions.tf b/modules/cloud-config-container/__need_fixing/squid/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/__need_fixing/squid/versions.tf +++ b/modules/cloud-config-container/__need_fixing/squid/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/coredns/versions.tf b/modules/cloud-config-container/coredns/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/coredns/versions.tf +++ b/modules/cloud-config-container/coredns/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/cos-generic-metadata/versions.tf b/modules/cloud-config-container/cos-generic-metadata/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/cos-generic-metadata/versions.tf +++ b/modules/cloud-config-container/cos-generic-metadata/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf b/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf +++ b/modules/cloud-config-container/envoy-sni-dyn-fwd-proxy/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/envoy-traffic-director/versions.tf b/modules/cloud-config-container/envoy-traffic-director/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/envoy-traffic-director/versions.tf +++ b/modules/cloud-config-container/envoy-traffic-director/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/mysql/versions.tf b/modules/cloud-config-container/mysql/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/mysql/versions.tf +++ b/modules/cloud-config-container/mysql/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/nginx-tls/versions.tf b/modules/cloud-config-container/nginx-tls/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/nginx-tls/versions.tf +++ b/modules/cloud-config-container/nginx-tls/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/nginx/versions.tf b/modules/cloud-config-container/nginx/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/nginx/versions.tf +++ b/modules/cloud-config-container/nginx/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-config-container/simple-nva/versions.tf b/modules/cloud-config-container/simple-nva/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-config-container/simple-nva/versions.tf +++ b/modules/cloud-config-container/simple-nva/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-function-v1/versions.tf b/modules/cloud-function-v1/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-function-v1/versions.tf +++ b/modules/cloud-function-v1/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-function-v2/versions.tf b/modules/cloud-function-v2/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-function-v2/versions.tf +++ b/modules/cloud-function-v2/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-identity-group/versions.tf b/modules/cloud-identity-group/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-identity-group/versions.tf +++ b/modules/cloud-identity-group/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloud-run/versions.tf b/modules/cloud-run/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloud-run/versions.tf +++ b/modules/cloud-run/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/cloudsql-instance/versions.tf b/modules/cloudsql-instance/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/cloudsql-instance/versions.tf +++ b/modules/cloudsql-instance/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/compute-mig/versions.tf b/modules/compute-mig/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/compute-mig/versions.tf +++ b/modules/compute-mig/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/compute-vm/versions.tf b/modules/compute-vm/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/compute-vm/versions.tf +++ b/modules/compute-vm/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/container-registry/versions.tf b/modules/container-registry/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/container-registry/versions.tf +++ b/modules/container-registry/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/data-catalog-policy-tag/versions.tf b/modules/data-catalog-policy-tag/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/data-catalog-policy-tag/versions.tf +++ b/modules/data-catalog-policy-tag/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/datafusion/versions.tf b/modules/datafusion/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/datafusion/versions.tf +++ b/modules/datafusion/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/dataplex-datascan/versions.tf b/modules/dataplex-datascan/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/dataplex-datascan/versions.tf +++ b/modules/dataplex-datascan/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/dataplex/versions.tf b/modules/dataplex/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/dataplex/versions.tf +++ b/modules/dataplex/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/dataproc/versions.tf b/modules/dataproc/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/dataproc/versions.tf +++ b/modules/dataproc/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/dns-response-policy/versions.tf b/modules/dns-response-policy/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/dns-response-policy/versions.tf +++ b/modules/dns-response-policy/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/dns/versions.tf b/modules/dns/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/dns/versions.tf +++ b/modules/dns/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/endpoints/versions.tf b/modules/endpoints/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/endpoints/versions.tf +++ b/modules/endpoints/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/folder/versions.tf b/modules/folder/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/folder/versions.tf +++ b/modules/folder/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/gcs/README.md b/modules/gcs/README.md index 2c3a85e30..539d82ce6 100644 --- a/modules/gcs/README.md +++ b/modules/gcs/README.md @@ -53,7 +53,7 @@ module "bucket" { location = "EU" } -# tftest skip e2e +# tftest modules=3 skip e2e ``` ### Example with retention policy and logging diff --git a/modules/gcs/versions.tf b/modules/gcs/versions.tf index 4a2837182..5ec74cff3 100644 --- a/modules/gcs/versions.tf +++ b/modules/gcs/versions.tf @@ -17,13 +17,11 @@ terraform { required_providers { google = { source = "hashicorp/google" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } google-beta = { source = "hashicorp/google-beta" - version = ">= 5.6.0, < 6.0.0" # tftest + version = ">= 5.10.0, < 6.0.0" # tftest } } } - - diff --git a/modules/gcve-private-cloud/README.md b/modules/gcve-private-cloud/README.md index 0e3a9ef7b..ee9f0a100 100644 --- a/modules/gcve-private-cloud/README.md +++ b/modules/gcve-private-cloud/README.md @@ -1,100 +1,134 @@ # Google Cloud VMWare Engine Private Cloud Module -This module implements the creation and management of a Google Cloud VMWare Engine Private Cloud with its management cluster. If configured, it also creates the VMWare engine network or it can work with an existing one. The creation of the private connection with the user VPC requires the execution of the [Google SDK command](https://cloud.google.com/sdk/gcloud/reference/vmware/private-connections/create#--routing-mode) the module provides as an output. +The module manages one or more Google Cloud VMWare Engine Private Clouds. + +It can either create a new VMWare engine network shared between the private clouds or it can use an existing one. The module also creates peering connections to users' VPCs or other VMware engine networks. To understand the limits and to properly configure the vSphere/vSAN subnets CIDR range please refer to the [GCVE public documentation](https://cloud.google.com/vmware-engine/docs/quickstart-networking-requirements). -Be aware that the deployment of this module might require up to 2 hours depending on the selected private cloud target zone. +The deployment might require up to 2 hours, depending on the selected private cloud target zone. - [Limitations](#limitations) - [Basic Private Cloud Creation](#basic-private-cloud-creation) -- [Private Cloud Creation with custom nodes and cores count](#private-cloud-creation-with-custom-nodes-and-cores-count) +- [Customize management cluster configs](#customize-management-cluster-configs) +- [Create additional clusters](#create-additional-clusters) - [Variables](#variables) - [Outputs](#outputs) ## Limitations -At the moment this module doesn't support the following use cases: -- Single node private cloud -- Stretched private cloud + +The module (and the underlying resource) still don't support the creation of stretched (regional) private clouds. ## Basic Private Cloud Creation ```hcl module "gcve-pc" { source = "./fabric/modules/gcve-private-cloud" - name = "gcve-pc" + prefix = "gcve-pc" project_id = "gcve-test-project" - zone = "europe-west8-a" - cidr = "192.168.0.0/24" - private_connections = { + vmw_network_peerings = { transit-conn1 = { - name = "transit-conn1" - network_self_link = "projects/test-prj-gcve-01/global/networks/default" - tenant_host_project = "g39a814990532d10ap-tp" - type = "PRIVATE_SERVICE_ACCESS" - routing_mode = "REGIONAL" + peer_network = "projects/test-prj-gcve-01/global/networks/default" + } + } + + vmw_private_cloud_configs = { + pcc_one = { + cidr = "192.168.0.0/24" + zone = "europe-west8-a" } } } -# tftest modules=1 resources=2 inventory=basic.yaml +# tftest modules=1 resources=3 inventory=basic.yaml ``` -## Private Cloud Creation with custom nodes and cores count + +## Customize management cluster configs + +You can customize the management cluster of each VMware engine private cloud. ```hcl module "gcve-pc" { source = "./fabric/modules/gcve-private-cloud" - name = "gcve-pc" + prefix = "gcve-pc" project_id = "gcve-test-project" - zone = "europe-west8-a" - cidr = "192.168.0.0/24" - management_cluster_config = { - node_type_id = "standard-72" - node_count = 6 - custom_core_count = 28 + vmw_network_peerings = { + transit-conn1 = { + peer_network = "projects/test-prj-gcve-01/global/networks/default" + } } - private_connections = { - transit-conn1 = { - name = "transit-conn1" - network_self_link = "projects/test-prj-gcve-01/global/networks/default" - tenant_host_project = "g39a814990532d10ap-tp" - type = "PRIVATE_SERVICE_ACCESS" - routing_mode = "REGIONAL" + vmw_private_cloud_configs = { + pcc_one = { + cidr = "192.168.0.0/24" + management_cluster_config = { + node_type_id = "standard-72" + node_count = 6 + custom_core_count = 28 + } + zone = "europe-west8-a" } } } -# tftest modules=1 resources=2 inventory=custom.yaml +# tftest modules=1 resources=3 inventory=custom-management.yaml +``` + +## Create additional clusters + +You can optionally create additional clusters in each VMware engine private cloud. + +```hcl +module "gcve-pc" { + source = "./fabric/modules/gcve-private-cloud" + prefix = "gcve-pc" + project_id = "gcve-test-project" + + vmw_network_peerings = { + transit-conn1 = { + peer_network = "projects/test-prj-gcve-01/global/networks/default" + } + } + + vmw_private_cloud_configs = { + pcc_one = { + cidr = "192.168.0.0/24" + additional_cluster_configs = { + test-cluster-one = { + node_type_id = "standard-72" + node_count = 6 + custom_core_count = 28 + } + test-cluster-two = { + node_type_id = "standard-72" + node_count = 4 + custom_core_count = 28 + } + } + zone = "europe-west8-a" + } + } +} +# tftest modules=1 resources=5 inventory=additional-clusters.yaml ``` ## Variables | name | description | type | required | default | |---|---|:---:|:---:|:---:| -| [cidr](variables.tf#L16) | vSphere/vSAN subnets CIDR range. To undersatnd the limits, please refer to [GCVE network requirements](https://cloud.google.com/vmware-engine/docs/quickstart-networking-requirements). | string | ✓ | | -| [name](variables.tf#L42) | Private cloud name. | string | ✓ | | -| [project_id](variables.tf#L84) | Project id. | string | ✓ | | -| [zone](variables.tf#L101) | Private cloud zone. | string | ✓ | | -| [description](variables.tf#L21) | Private cloud description. | string | | "Terraform-managed." | -| [management_cluster_config](variables.tf#L27) | Management cluster configuration. | object({…}) | | {…} | -| [private_connections](variables.tf#L47) | VMWare private connections configuration. It is used to create the gcloud command printed as output. | map(object({…})) | | {} | -| [vmw_network_create](variables.tf#L89) | Create the VMware Engine network. When set to false, it uses a data source to reference an existing VMware Engine network. | bool | | true | -| [vmw_network_description](variables.tf#L95) | VMware Engine network description. | string | | "Terraform-managed." | +| [prefix](variables.tf#L17) | Resources name prefix. | string | ✓ | | +| [project_id](variables.tf#L22) | Project id. | string | ✓ | | +| [vmw_network_config](variables.tf#L27) | VMware Engine network configuration. | object({…}) | | {} | +| [vmw_network_peerings](variables.tf#L37) | The network peerings towards users' VPCs or other VMware Engine networks. The key is the peering name suffix. | map(object({…})) | | {} | +| [vmw_private_cloud_configs](variables.tf#L51) | The VMware private cloud configurations. The key is the unique private cloud name suffix. | map(object({…})) | | {…} | ## Outputs | name | description | sensitive | |---|---|:---:| -| [hcx](outputs.tf#L17) | Details about a HCX Cloud Manager appliance. | | -| [id](outputs.tf#L22) | ID of the private cloud. | | -| [management_cluster](outputs.tf#L27) | Details of the management cluster of the private cloud. | | -| [network_config](outputs.tf#L32) | Details about the network configuration of the private cloud. | | -| [nsx](outputs.tf#L37) | Details about a NSX Manager appliance. | | -| [private-cloud](outputs.tf#L42) | The private cloud resource. | | -| [private_connections_setup](outputs.tf#L47) | Cloud SDK commands for the private connections manual setup. | | -| [state](outputs.tf#L63) | Details about the state of the private cloud. | | -| [vcenter](outputs.tf#L68) | Details about a vCenter Server management appliance. | | +| [vmw_engine_network_config](outputs.tf#L17) | VMware engine network configuration. | | +| [vmw_engine_network_peerings](outputs.tf#L22) | The peerings created towards the user VPC or other VMware engine networks. | | +| [vmw_engine_private_clouds](outputs.tf#L27) | VMware engine private cloud resources. | | diff --git a/modules/gcve-private-cloud/main.tf b/modules/gcve-private-cloud/main.tf index 3235fb29a..9e9579c41 100644 --- a/modules/gcve-private-cloud/main.tf +++ b/modules/gcve-private-cloud/main.tf @@ -15,61 +15,87 @@ */ locals { - region = regex("([a-z]*-[a-z]*[0-9]{1,2})-([a-z])", var.zone)[0] + # Creates a map of additional clusters objects, including their parent private cloud + additional_cluster_configs = merge( + [for pcc_name, pcc in var.vmw_private_cloud_configs + : { for cluster_name, cluster in pcc.additional_cluster_configs + : "${cluster_name}" => merge( + cluster, + { parent = try(google_vmwareengine_private_cloud.vmw_engine_private_clouds[pcc_name].id, null) } + ) + } + ]...) vmw_network = ( - var.vmw_network_create - ? try(google_vmwareengine_network.private-cloud-network.0, null) - : try(data.google_vmwareengine_network.private-cloud-network.0, null) + var.vmw_network_config.create + ? try(google_vmwareengine_network.private_cloud_network.0, null) + : try(data.google_vmwareengine_network.private_cloud_network.0, null) ) - tenant_host_project = { - for k, v in var.private_connections : k => v.tenant_host_project == null - ? regex("(.*)/projects/([a-z0-9-]*)/(.*)", "${data.google_compute_network_peering.psa_peering[k].peer_network}")[1] - : v.tenant_host_project - } } -data "google_vmwareengine_network" "private-cloud-network" { - count = var.vmw_network_create ? 0 : 1 - provider = google-beta - project = var.project_id - name = "${local.region}-default" - location = local.region -} - -data "google_compute_network_peering" "psa_peering" { - for_each = { for k, v in var.private_connections : k => v if v.tenant_host_project == null } - name = each.value.peering_name - network = each.value.network_self_link -} - -resource "google_vmwareengine_private_cloud" "private-cloud" { +resource "google_vmwareengine_network" "private_cloud_network" { provider = google-beta + count = var.vmw_network_config.create ? 1 : 0 project = var.project_id - location = var.zone - name = var.name - description = var.description + name = "${var.prefix}-${var.vmw_network_config.name}" + description = var.vmw_network_config.description + location = "global" + type = "STANDARD" +} + +data "google_vmwareengine_network" "private_cloud_network" { + provider = google-beta + count = var.vmw_network_config.create ? 0 : 1 + project = var.project_id + name = "${var.prefix}-${var.vmw_network_config.name}" + location = "global" +} + +resource "google_vmwareengine_network_peering" "vmw_engine_network_peerings" { + provider = google-beta + for_each = var.vmw_network_peerings + project = var.project_id + name = "${var.prefix}-${each.key}" + description = each.value.description + export_custom_routes = each.value.export_custom_routes + export_custom_routes_with_public_ip = each.value.export_custom_routes_with_public_ip + import_custom_routes = each.value.import_custom_routes + import_custom_routes_with_public_ip = each.value.import_custom_routes_with_public_ip + peer_network = each.value.peer_network + peer_network_type = each.value.peer_to_vmware_engine_network ? "VMWARE_ENGINE_NETWORK" : "STANDARD" + vmware_engine_network = local.vmw_network.id +} + +resource "google_vmwareengine_private_cloud" "vmw_engine_private_clouds" { + provider = google-beta + for_each = var.vmw_private_cloud_configs + project = var.project_id + location = each.value.zone + name = "${var.prefix}-${each.key}" + description = each.value.description network_config { - management_cidr = var.cidr + management_cidr = each.value.cidr vmware_engine_network = local.vmw_network.id } management_cluster { - cluster_id = "${var.name}-mgmt-cluster" + cluster_id = "${var.prefix}-${each.key}-${each.value.management_cluster_config.name}" node_type_configs { - node_type_id = var.management_cluster_config.node_type_id - node_count = var.management_cluster_config.node_count - custom_core_count = var.management_cluster_config.custom_core_count + node_type_id = each.value.management_cluster_config.node_type_id + node_count = each.value.management_cluster_config.node_count + custom_core_count = each.value.management_cluster_config.custom_core_count } } } -resource "google_vmwareengine_network" "private-cloud-network" { - count = var.vmw_network_create ? 1 : 0 - provider = google-beta - project = var.project_id - name = "${local.region}-default" - location = local.region - type = "LEGACY" - description = var.vmw_network_description +resource "google_vmwareengine_cluster" "vmw_engine_additional_clusters" { + provider = google-beta + for_each = local.additional_cluster_configs + name = "${var.prefix}-${each.key}" + parent = each.value.parent + node_type_configs { + custom_core_count = each.value.custom_core_count + node_count = each.value.node_count + node_type_id = each.value.node_type_id + } } diff --git a/modules/gcve-private-cloud/outputs.tf b/modules/gcve-private-cloud/outputs.tf index 55578f6d2..e3812b7f8 100644 --- a/modules/gcve-private-cloud/outputs.tf +++ b/modules/gcve-private-cloud/outputs.tf @@ -14,58 +14,17 @@ * limitations under the License. */ -output "hcx" { - description = "Details about a HCX Cloud Manager appliance." - value = google_vmwareengine_private_cloud.private-cloud.hcx +output "vmw_engine_network_config" { + description = "VMware engine network configuration." + value = local.vmw_network } -output "id" { - description = "ID of the private cloud." - value = google_vmwareengine_private_cloud.private-cloud.id +output "vmw_engine_network_peerings" { + description = "The peerings created towards the user VPC or other VMware engine networks." + value = google_vmwareengine_network_peering.vmw_engine_network_peerings } -output "management_cluster" { - description = "Details of the management cluster of the private cloud." - value = google_vmwareengine_private_cloud.private-cloud.management_cluster -} - -output "network_config" { - description = "Details about the network configuration of the private cloud." - value = google_vmwareengine_private_cloud.private-cloud.network_config -} - -output "nsx" { - description = "Details about a NSX Manager appliance." - value = google_vmwareengine_private_cloud.private-cloud.nsx -} - -output "private-cloud" { - description = "The private cloud resource." - value = google_vmwareengine_private_cloud.private-cloud -} - -output "private_connections_setup" { - description = "Cloud SDK commands for the private connections manual setup." - value = { - for k, v in var.private_connections : k => <